Skip to content

Building a Deterministic JD Analyser: Grounded in the GFE Skill System

Authors: GrowthFlow Engineering Team
Version: 2.0
Last Updated: January 2025
Status: Production

Executive Summary

This whitepaper documents the development journey of the GFE JD Analyser—a deterministic tool that analyses job descriptions and maps them to the GFE Skill System's 174 tasks across Marketing, Sales, and Finance domains.

What began as an LLM-powered experiment evolved into a principled, rule-based system grounded in real task specifications. This document covers:

  1. The Problem: Traditional JD analysis tools either rely on expensive LLMs or use arbitrary "skill" inventories
  2. The Insight: The GFE Skill System already defines 174 concrete tasks—we should match against those, not invent skills
  3. The Architecture: A serverless Netlify function using pattern matching against actual task specifications
  4. The Taxonomy: Complete explanation of the GFE Skill System's structure (Levels, Tasks, Processes, KPIs, ValuationOps)

Part 1: The Problem Space

1.1 Traditional JD Analysis Approaches

Most job description analysis tools fall into two categories:

LLM-Dependent Approaches

  • Send JD text to GPT/Claude/Gemini and ask it to "extract skills"
  • Results are non-deterministic and vary between calls
  • Expensive at scale (API costs compound)
  • Skills invented on-the-fly with no standardized taxonomy

Keyword-Matching Approaches

  • Match against arbitrary lists like "Excel", "Communication", "Leadership"
  • No hierarchy or leveling
  • No connection to business outcomes
  • Misses context ("Excel" for a finance role ≠ "Excel" for an admin role)

1.2 The Key Insight

The GFE Skill System already solves this problem. It defines 174 concrete tasks with:

  • Clear domain assignments (Marketing, Sales, Finance)
  • Level designations (L0-L4) indicating seniority
  • KPI linkages connecting tasks to measurable outcomes
  • Process mappings showing how tasks fit into business workflows

Why invent skills when we have tasks?

A "skill" is abstract and subjective. A task is concrete and verifiable:

ApproachExampleProblem
Invented Skill"Data Analysis"What level? What domain? How measured?
GFE TaskF-012: Prepare Variance Reports (L1, Finance)Clear level, domain, linked to KPI-FIN-VAR-01

Part 2: The GFE Skill System Deep Dive

2.1 The Five Levels

The GFE Skill System defines five levels, each with clear progression expectations:

LevelNameFocusTime Horizon
L0ApprenticeExecute defined tasks, build fundamentalsDaily tasks
L1PractitionerOwn processes, contribute to improvementsWeekly cycles
L2ArchitectDesign systems, optimize performanceMonthly/Quarterly
L3StrategistDrive cross-functional initiativesAnnual planning
L4PartnerShape organizational directionMulti-year vision

2.2 The LEO Framework

Each level has expectations across three dimensions (Learning, Earning, Org-Building):

┌─────────────────────────────────────────────────────────────┐
│                    LEO Framework                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   Learning (25%)     │   Earning (60%)    │  Org-Building   │
│   ─────────────────  │   ──────────────   │  (15%)          │
│   • Self-study       │   • Task delivery  │  • Mentoring    │
│   • Certifications   │   • KPI impact     │  • Process docs │
│   • Peer learning    │   • Revenue contrib│  • Team growth  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Each domain (Marketing, Sales, Finance) has specific LEO expectations per level.

2.3 The 174 Tasks

Tasks are the atomic units of the GFE Skill System. Here's the distribution:

DomainTask CountID PrefixExample
Marketing67 tasksM-###M-001: Clean Contact Lists
Sales69 tasksS-###S-001: Qualify Inbound Leads
Finance38 tasksF-###F-001: Process Invoices

Each task specification includes:

json
{
  "id": "S-015",
  "title": "Negotiate Contract Terms",
  "domain": "sales",
  "level": 2,
  "description": "Lead contract negotiations with prospects...",
  "kpi_links": ["KPI-REV-WIN-01", "KPI-REV-DEAL-01"],
  "owner": "Account Executive",
  "process_id": "PROC-REV-DEAL-CLOSING-01"
}

2.4 The 44 Processes

Tasks group into processes—business workflows with primary KPIs:

Process IDProcess NamePrimary KPI
PROC-REV-DEMAND-GEN-01Demand Generation PipelineKPI-MKT-MQL-01
PROC-REV-DEAL-CLOSING-01Pipeline ManagementKPI-REV-WIN-01
PROC-FIN-REPORTING-01Financial ReportingKPI-FIN-REPORT-01
PROC-REV-CUSTOMER-SUCCESS-01Customer Success ProgramsKPI-REV-NRR-01

2.5 ValuationOps Layers

The ultimate purpose: every task connects to company valuation through six layers:

┌────────────────────────────────────────────────────────────────┐
│                   ValuationOps Layers                          │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│   Layer 1: Revenue        → Top-line growth (ARR, MRR)         │
│   Layer 2: EBITDA         → Operational profitability          │
│   Layer 3: Cash           → Working capital, collections       │
│   Layer 4: FCF            → Free cash flow generation          │
│   Layer 5: Story          → Market narrative, positioning      │
│   Layer 6: Valuation      → Multiple expansion, exit value     │
│                                                                │
│   Tasks → Processes → KPIs → ValuationOps Layers               │
│                                                                │
└────────────────────────────────────────────────────────────────┘

Part 3: Technical Architecture

3.1 System Overview

┌─────────────────────────────────────────────────────────────────┐
│                    JD Analyser Architecture                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌──────────┐     ┌────────────────┐     ┌────────────────┐    │
│   │  User    │────▶│  VitePress     │────▶│  Netlify       │    │
│   │  Browser │     │  Landing Page  │     │  Function      │    │
│   └──────────┘     └────────────────┘     └────────────────┘    │
│                                                 │                │
│                                                 ▼                │
│                                    ┌────────────────────────┐   │
│                                    │  Embedded Task         │   │
│                                    │  Taxonomy (174 tasks)  │   │
│                                    └────────────────────────┘   │
│                                                 │                │
│                                                 ▼                │
│                                    ┌────────────────────────┐   │
│                                    │  Pattern Matching      │   │
│                                    │  Engine                │   │
│                                    └────────────────────────┘   │
│                                                 │                │
│                                                 ▼                │
│                                    ┌────────────────────────┐   │
│                                    │  Structured Analysis   │   │
│                                    │  Report                │   │
│                                    └────────────────────────┘   │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

3.2 The Pattern Matching Engine

Instead of LLM inference, we use deterministic keyword pattern matching:

javascript
const TASK_TAXONOMY = {
  "S-001": {
    title: "Qualify Inbound Leads",
    domain: "sales",
    level: 1,
    description: "Review and qualify incoming leads...",
    keywords: ["qualify", "inbound", "lead", "qualification", "mql", "bant"],
    kpi_links: ["KPI-REV-MQL-01"],
    process_id: "PROC-REV-DEMAND-GEN-01"
  },
  // ... 173 more tasks
};

function matchTasksToJD(jdText) {
  const normalizedJD = jdText.toLowerCase();
  const matches = [];
  
  for (const [taskId, task] of Object.entries(TASK_TAXONOMY)) {
    let score = 0;
    let matchedKeywords = [];
    
    for (const keyword of task.keywords) {
      if (normalizedJD.includes(keyword.toLowerCase())) {
        score++;
        matchedKeywords.push(keyword);
      }
    }
    
    if (score > 0) {
      matches.push({
        taskId,
        ...task,
        score,
        matchedKeywords
      });
    }
  }
  
  return matches.sort((a, b) => b.score - a.score);
}

3.3 Why Deterministic > LLM for This Use Case

AspectLLM ApproachDeterministic Approach
Cost$0.01-0.10 per call$0.00 per call
ConsistencyVaries between callsSame input → same output
Explainability"The model thinks...""Matched keywords: X, Y, Z"
GroundingInvents skillsMaps to real GFE tasks
Latency1-5 seconds<100ms
Offline capableNoYes

3.4 Serverless Function Implementation

The Netlify function handles multipart form data (supporting file uploads and text):

javascript
// Key components:
// 1. Busboy for multipart parsing (file + form fields)
// 2. Embedded TASK_TAXONOMY with all 174 tasks
// 3. Pattern matching engine
// 4. Email notification for lead capture (MailerSend)
// 5. Structured JSON response

exports.handler = async (event) => {
  // Parse form data
  const { jdText, company, email, name } = await parseFormData(event);
  
  // Match against taxonomy
  const matchedTasks = matchTasksToJD(jdText);
  
  // Build analysis
  const analysis = buildAnalysis(matchedTasks);
  
  // Send lead notification (non-blocking)
  sendLeadNotification({ company, email, name, matchedTasks });
  
  return {
    statusCode: 200,
    body: JSON.stringify(analysis)
  };
};

Part 4: Analysis Output Structure

4.1 Response Format

The analyser returns a structured response:

json
{
  "summary": {
    "totalMatches": 23,
    "domains": {
      "marketing": 8,
      "sales": 12,
      "finance": 3
    },
    "levels": {
      "L0-Apprentice": 3,
      "L1-Practitioner": 10,
      "L2-Architect": 7,
      "L3-Strategist": 3
    },
    "inferredSeniority": "L1-L2 (Practitioner to Architect)",
    "primaryDomain": "Sales"
  },
  "matchedTasks": [
    {
      "taskId": "S-015",
      "title": "Negotiate Contract Terms",
      "domain": "sales",
      "level": 2,
      "levelName": "Architect",
      "score": 5,
      "matchedKeywords": ["negotiate", "contract", "terms", "pricing", "deal"],
      "kpi_links": ["KPI-REV-WIN-01"],
      "process_id": "PROC-REV-DEAL-CLOSING-01"
    }
    // ... more matches
  ],
  "recommendations": {
    "hiringLevel": "L2 (Architect)",
    "primaryFocus": "Sales Operations with Deal Management",
    "keyProcesses": ["PROC-REV-DEAL-CLOSING-01", "PROC-REV-FORECAST-01"],
    "valuationImpact": "Revenue Layer - Direct impact on win rates and deal velocity"
  }
}

4.2 Level Inference Logic

The system infers seniority based on matched task levels:

javascript
function inferSeniority(matchedTasks) {
  const levelCounts = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0 };
  
  matchedTasks.forEach(task => {
    levelCounts[task.level]++;
  });
  
  // Weight higher-level tasks more heavily
  const weightedScore = 
    levelCounts[0] * 1 +
    levelCounts[1] * 2 +
    levelCounts[2] * 4 +
    levelCounts[3] * 8 +
    levelCounts[4] * 16;
  
  const avgLevel = weightedScore / matchedTasks.length;
  
  // Map to level range
  if (avgLevel < 1.5) return "L0-L1 (Apprentice to Practitioner)";
  if (avgLevel < 3) return "L1-L2 (Practitioner to Architect)";
  if (avgLevel < 6) return "L2-L3 (Architect to Strategist)";
  return "L3-L4 (Strategist to Partner)";
}

Part 5: Development Journey

5.1 Phase 1: LLM-Based Approach (Failed)

Initial Implementation:

  • Used Gemini API to analyze JDs
  • Prompt engineering to extract "skills"
  • Hit rate limits immediately (429 errors)
  • Free tier quota exhausted in testing

Lesson Learned: LLMs are expensive for high-volume, deterministic tasks.

5.2 Phase 2: Deterministic with Invented Skills (Wrong)

Second Attempt:

  • Created pattern matching with arbitrary skill clusters
  • Used generic level names (Observer, Executor, Expert)
  • No connection to actual GFE specifications

Lesson Learned: We were reinventing what already existed.

5.3 Phase 3: Grounded in GFE Specs (Correct)

Final Implementation:

  • Studied actual GFE Skill System specs
  • Extracted all 174 tasks with metadata
  • Embedded complete taxonomy in function
  • Used real level names (Apprentice → Partner)
  • Connected tasks to processes, KPIs, ValuationOps

Key Insight: Don't abstract—ground in reality.

5.4 Technical Challenges Solved

ChallengeSolution
SSR hydration errorsClient-side only form rendering
Multipart file parsingBusboy library for Node.js
Email notification failuresProperly awaited async fetch calls
Level name confusionDirect mapping from spec JSON files
Keyword coverageExpanded keywords from task descriptions

Part 6: Business Value & Use Cases

6.1 Primary Use Cases

  1. Hiring Managers: Analyze JDs to ensure role clarity and appropriate leveling
  2. Recruiters: Map candidate experience to GFE task competencies
  3. HR Teams: Standardize job architecture across the organization
  4. Candidates: Understand role expectations in GFE taxonomy terms

6.2 Integration Points

The JD Analyser can integrate with:

  • ATS Systems: Auto-tag roles with GFE task IDs
  • Performance Management: Link role to expected KPI contributions
  • Learning Platforms: Generate training paths based on task gaps
  • Compensation Frameworks: Level-based pay bands

6.3 Lead Generation Value

Every analysis submission captures:

  • Company name
  • Contact email
  • Role type being analyzed
  • Matched task profile

This enables targeted outreach for GrowthFlow Engineering consulting services.


Part 7: Future Roadmap

7.1 Planned Enhancements

FeatureStatusImpact
PDF resume parsingPlannedMatch candidates to tasks
Batch JD analysisPlannedAnalyze entire job architecture
Gap analysisPlannedCompare JD to ideal role profile
Process recommendationsIn ProgressSuggest missing process coverage
Multilingual supportPlannedSupport DE, FR, ES JDs

7.2 Integration Opportunities

  • GrowthQuiz: Connect to growth mindset assessment
  • Skill Builder: Generate training recommendations
  • Team Planner: Analyze team composition against task coverage

Appendix A: Complete Task Reference

Marketing Tasks (67 total)

IDTitleLevel
M-001Clean Contact ListsL0
M-002Schedule Social PostsL0
M-003Monitor Campaign MetricsL1
M-004Create Landing PagesL1
M-005Design Email TemplatesL1
.........

Sales Tasks (69 total)

IDTitleLevel
S-001Qualify Inbound LeadsL1
S-002Conduct Discovery CallsL1
S-003Prepare ProposalsL1
S-015Negotiate Contract TermsL2
S-030Manage Key AccountsL2
.........

Finance Tasks (38 total)

IDTitleLevel
F-001Process InvoicesL0
F-002Reconcile AccountsL1
F-012Prepare Variance ReportsL1
F-025Build Financial ModelsL2
F-035Lead Budget PlanningL3
.........

Full task specifications available in the GFE Skill System repository.


Appendix B: API Reference

Endpoint

POST https://growthflowengineering.xyz/.netlify/functions/jd-analyser

Request (multipart/form-data)

FieldTypeRequiredDescription
jdTextstringYesJob description text
companystringYesCompany name
emailstringYesContact email
namestringNoContact name
jdFilefileNoJD file (PDF/DOCX)

Response

json
{
  "success": true,
  "analysis": {
    "summary": { ... },
    "matchedTasks": [ ... ],
    "recommendations": { ... }
  }
}

Conclusion

The GFE JD Analyser demonstrates a fundamental principle: grounded systems beat generic AI.

By embedding the actual GFE Skill System taxonomy—174 tasks, 44 processes, 5 levels—we created a tool that:

  1. Costs nothing to run (no LLM API calls)
  2. Produces consistent results (deterministic matching)
  3. Explains its reasoning (shows matched keywords)
  4. Connects to business value (tasks → processes → KPIs → ValuationOps)

This is the future of domain-specific AI: systems grounded in real taxonomies, not black-box models inventing skills on the fly.


Try the JD Analyser

Analyse Your Job Description →

Get instant insights into role requirements mapped to the GFE Skill System.


For questions or partnership inquiries, contact the GrowthFlow Engineering team.