Building a Deterministic JD Analyser: Grounded in the GFE Skill System
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:
- The Problem: Traditional JD analysis tools either rely on expensive LLMs or use arbitrary "skill" inventories
- The Insight: The GFE Skill System already defines 174 concrete tasks—we should match against those, not invent skills
- The Architecture: A serverless Netlify function using pattern matching against actual task specifications
- 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:
| Approach | Example | Problem |
|---|---|---|
| Invented Skill | "Data Analysis" | What level? What domain? How measured? |
| GFE Task | F-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:
| Level | Name | Focus | Time Horizon |
|---|---|---|---|
| L0 | Apprentice | Execute defined tasks, build fundamentals | Daily tasks |
| L1 | Practitioner | Own processes, contribute to improvements | Weekly cycles |
| L2 | Architect | Design systems, optimize performance | Monthly/Quarterly |
| L3 | Strategist | Drive cross-functional initiatives | Annual planning |
| L4 | Partner | Shape organizational direction | Multi-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:
| Domain | Task Count | ID Prefix | Example |
|---|---|---|---|
| Marketing | 67 tasks | M-### | M-001: Clean Contact Lists |
| Sales | 69 tasks | S-### | S-001: Qualify Inbound Leads |
| Finance | 38 tasks | F-### | F-001: Process Invoices |
Each task specification includes:
{
"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 ID | Process Name | Primary KPI |
|---|---|---|
| PROC-REV-DEMAND-GEN-01 | Demand Generation Pipeline | KPI-MKT-MQL-01 |
| PROC-REV-DEAL-CLOSING-01 | Pipeline Management | KPI-REV-WIN-01 |
| PROC-FIN-REPORTING-01 | Financial Reporting | KPI-FIN-REPORT-01 |
| PROC-REV-CUSTOMER-SUCCESS-01 | Customer Success Programs | KPI-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:
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
| Aspect | LLM Approach | Deterministic Approach |
|---|---|---|
| Cost | $0.01-0.10 per call | $0.00 per call |
| Consistency | Varies between calls | Same input → same output |
| Explainability | "The model thinks..." | "Matched keywords: X, Y, Z" |
| Grounding | Invents skills | Maps to real GFE tasks |
| Latency | 1-5 seconds | <100ms |
| Offline capable | No | Yes |
3.4 Serverless Function Implementation
The Netlify function handles multipart form data (supporting file uploads and text):
// 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:
{
"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:
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
| Challenge | Solution |
|---|---|
| SSR hydration errors | Client-side only form rendering |
| Multipart file parsing | Busboy library for Node.js |
| Email notification failures | Properly awaited async fetch calls |
| Level name confusion | Direct mapping from spec JSON files |
| Keyword coverage | Expanded keywords from task descriptions |
Part 6: Business Value & Use Cases
6.1 Primary Use Cases
- Hiring Managers: Analyze JDs to ensure role clarity and appropriate leveling
- Recruiters: Map candidate experience to GFE task competencies
- HR Teams: Standardize job architecture across the organization
- 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
| Feature | Status | Impact |
|---|---|---|
| PDF resume parsing | Planned | Match candidates to tasks |
| Batch JD analysis | Planned | Analyze entire job architecture |
| Gap analysis | Planned | Compare JD to ideal role profile |
| Process recommendations | In Progress | Suggest missing process coverage |
| Multilingual support | Planned | Support 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)
| ID | Title | Level |
|---|---|---|
| M-001 | Clean Contact Lists | L0 |
| M-002 | Schedule Social Posts | L0 |
| M-003 | Monitor Campaign Metrics | L1 |
| M-004 | Create Landing Pages | L1 |
| M-005 | Design Email Templates | L1 |
| ... | ... | ... |
Sales Tasks (69 total)
| ID | Title | Level |
|---|---|---|
| S-001 | Qualify Inbound Leads | L1 |
| S-002 | Conduct Discovery Calls | L1 |
| S-003 | Prepare Proposals | L1 |
| S-015 | Negotiate Contract Terms | L2 |
| S-030 | Manage Key Accounts | L2 |
| ... | ... | ... |
Finance Tasks (38 total)
| ID | Title | Level |
|---|---|---|
| F-001 | Process Invoices | L0 |
| F-002 | Reconcile Accounts | L1 |
| F-012 | Prepare Variance Reports | L1 |
| F-025 | Build Financial Models | L2 |
| F-035 | Lead Budget Planning | L3 |
| ... | ... | ... |
Full task specifications available in the GFE Skill System repository.
Appendix B: API Reference
Endpoint
POST https://growthflowengineering.xyz/.netlify/functions/jd-analyserRequest (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
| jdText | string | Yes | Job description text |
| company | string | Yes | Company name |
| string | Yes | Contact email | |
| name | string | No | Contact name |
| jdFile | file | No | JD file (PDF/DOCX) |
Response
{
"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:
- Costs nothing to run (no LLM API calls)
- Produces consistent results (deterministic matching)
- Explains its reasoning (shows matched keywords)
- 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.

