feat: rebuild evidence-first application workflow
This commit is contained in:
@@ -1,241 +1,90 @@
|
||||
---
|
||||
description: Generate a tailored resume/CV from a JD
|
||||
user-invocable: true
|
||||
name: make-resume
|
||||
description: Generate a tailored evidence-first resume from a real job description. Use for new applications to assess hard qualifications and role fit before writing, select International Tech or Swiss/DACH format, plan canonical achievements, generate LaTeX, validate claims, compile, and record the application decision.
|
||||
---
|
||||
|
||||
# /make-resume
|
||||
# Generate a Resume
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
## Input
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- File path (e.g., `JDs/*.txt`) → read that file for the JD
|
||||
- A URL → this is NOT a JD, it's a pointer. Fetch the real posting text first (see JD Integrity below), save it verbatim to `JDs/<company>_<role>.txt`, then proceed.
|
||||
- Text after the path starting with "Focus:"/"Emphasize:"/"Downplay:" → focus directive
|
||||
- "Quick:" prefix → Quick Mode (see below)
|
||||
- Empty → ask the user for the JD
|
||||
- Inline JD text (no file path) → save to `JDs/temp_<company>.txt`, proceed normally
|
||||
Accept a JD file, pasted JD, or URL. Obtain the real posting text before analysis. If it cannot be retrieved, ask the user to paste it; never reconstruct it.
|
||||
|
||||
**JD Integrity (read `shared_ops.md` → "JD Integrity"):** The JD must be the real posting, verbatim. NEVER invent, reconstruct, paraphrase, or infer JD content. `WebFetch` is JS-blind on careers boards — use the job_scout Playwright recipe in `shared_ops.md` to scrape JS-gated postings. If you cannot get the real text, STOP and ask the user to paste it. Do not proceed on a guessed JD.
|
||||
## Phase 0 — Canonical and JD Preflight
|
||||
|
||||
---
|
||||
1. Read `resume_builder/reference/shared_ops.md`.
|
||||
2. Read `resume_builder/canonical/claims.json` completely.
|
||||
3. Read `config.md`, `AGENTS.md`, `application_strategy.md`, `resume_reference.md`, and `critique_framework.md`.
|
||||
4. Run `python resume_builder/helpers/validate_resume_system.py`.
|
||||
5. Verify and save the verbatim JD; record source/date/status.
|
||||
6. Create the output folder and session from `session_file_template.md`.
|
||||
|
||||
## Safety Rules (ALWAYS ENFORCED)
|
||||
## Phase 1 — Fit Gate Before Writing
|
||||
|
||||
**Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
Build a requirement table with Required/Preferred and Direct/Adjacent/Gap/Constraint classifications. Cite canonical claim IDs for every Direct or Adjacent match.
|
||||
|
||||
Read `config.md` Provenance Flags before generating any content. Verify every claim against that table.
|
||||
Compute Evidence Fit and identify hard gates using `critique_framework.md`. Then assign:
|
||||
|
||||
- **JD is ground truth — use the real posting verbatim. NEVER reconstruct, invent, or infer a JD** (see `shared_ops.md` → JD Integrity). If you can't get the real text, STOP and ask the user to paste it.
|
||||
- Use the email from `config.md` Personal Info in all outputs
|
||||
- Resume bullets: ALL variable bullets are 2L (CV: 2L/3L mix OK, check `config.md` Document Preferences)
|
||||
- Source ALL bullet content from `resume_builder/experience/` files. Never fabricate.
|
||||
- Run `python3 resume_builder/helpers/char_count.py` after each section — the tool is authoritative
|
||||
- Core.
|
||||
- Adjacent.
|
||||
- Stretch.
|
||||
- No-go.
|
||||
|
||||
---
|
||||
Record Channel Strength and a warm-channel action for Core roles.
|
||||
|
||||
## User Input During Execution
|
||||
Stop and present the fit decision before resume planning when:
|
||||
|
||||
If the user provides feedback, corrections, or suggestions at any point:
|
||||
1. Acknowledge the input immediately
|
||||
2. If it affects an already-written section: go back, fix it, re-run char count gate
|
||||
3. If it changes the bullet plan: update session file Bullet Plan
|
||||
4. If it's a question: answer it, then continue from current step
|
||||
5. Never restart a phase — resume from current position
|
||||
- a hard gate fails;
|
||||
- the role is Stretch;
|
||||
- the selected cohort category is already full;
|
||||
- a practical constraint is unresolved.
|
||||
|
||||
---
|
||||
Proceed on a no-go only after the user explicitly overrides the stated reason. An override does not change the fit classification.
|
||||
|
||||
## Startup
|
||||
## Phase 2 — Audience and Content Plan
|
||||
|
||||
Read `resume_builder/reference/shared_ops.md` for session startup, file derivation, and organization protocols.
|
||||
Select International Tech by default. Use Swiss/DACH or Employer-specific format only when the employer/context supports it.
|
||||
|
||||
Then:
|
||||
1. Read `AGENTS.md` — check Active Sessions and KB Corrections
|
||||
2. Read `config.md` — load Provenance Flags, email, document preferences, role types
|
||||
3. If session file exists for this JD:
|
||||
- Read session file, check Status
|
||||
- Phase 0: DONE, Phase 1: PENDING → resume at Phase 1
|
||||
- Phase 1: DONE → resume at Budget Gate
|
||||
- Phase 2: IN_PROGRESS → read .tex, check what sections exist, resume from checkpoint
|
||||
- Phase 2: DONE → "Resume already done. Run /make-cl next." Show next command. Stop.
|
||||
4. If no session file: proceed to Phase 0
|
||||
Read the matching role bundle, `skills_taxonomy.md`, `achievement_reframing_guide.md`, and only the experience files needed for selected claims.
|
||||
|
||||
---
|
||||
Plan:
|
||||
|
||||
## Quick Mode
|
||||
- Optional 2--3 line summary.
|
||||
- Four to six evidence-backed skills lines.
|
||||
- Swisscom 4--5 bullets.
|
||||
- Bosch 3--4 bullets.
|
||||
- Zero or one bullet for each older role.
|
||||
- Normally 11--14 bullets total, with no page-fill quota.
|
||||
|
||||
Trigger: `$ARGUMENTS` starts with "Quick:"
|
||||
For each proposed bullet show canonical ID, evidence type, scope, and why it belongs. Identify any impact metric that still needs user confirmation.
|
||||
|
||||
Defaults:
|
||||
- Select all HIGH priority achievements from bundle's Priority Matrix as 2L
|
||||
- Fill remaining budget with MEDIUM priority in Priority Matrix order
|
||||
- Default format: 2-page resume (unless JD clearly requires CV)
|
||||
- Skip Phase 0 STOP and Phase 1 STOP
|
||||
- Keep Budget Gate (auto-pass if within target) and end-of-resume STOP
|
||||
- Run all phases with progress commentary instead of interactive stops
|
||||
Apply `cl_reference.md` and propose `Cover Letter Decision: YES/NO` with one reason.
|
||||
|
||||
---
|
||||
Present the plan and wait for explicit user confirmation before generation.
|
||||
|
||||
## Phase 0: Research & Session Setup
|
||||
## Phase 3 — Generate
|
||||
|
||||
**Read these files:**
|
||||
1. The JD — the **real posting text**, verbatim. If `$ARGUMENTS` was a URL or the posting is on a JS-gated board, scrape it with the Playwright recipe in `shared_ops.md` (JD Integrity) BEFORE this step and save to `JDs/`/`output/<FolderName>/JD_<name>.txt`. If you cannot obtain the real text, STOP and ask the user to paste it — do NOT reconstruct or infer it.
|
||||
2. `resume_builder/reference/resume_reference.md` — Budget Card, Section Specs, Char Limits, Page Budgets
|
||||
3. `config.md` — Role-Type Decision Tree to identify the matching bundle
|
||||
Copy `resume.cls` and `resume_template.tex` into the output folder. For a Swiss/DACH audience, also read `resume_template_dach.tex` as an audience-policy overlay; it is not a standalone document. Write fresh content from canonical claims and experience records; never copy a historical output.
|
||||
|
||||
**Web Search (MANDATORY — 2-3 searches).** Load WebSearch via ToolSearch first.
|
||||
1. `[Company] research & development [key JD domain]` — products, recent projects
|
||||
2. `[Company] [specific technology from JD]` — concrete hooks for cover letter
|
||||
3. `[Company] careers [role type] culture` OR recent news — hiring context
|
||||
Rules:
|
||||
|
||||
If web search returns no results: use JD text + training knowledge. Flag: "Web search returned limited results — CL hooks may be generic."
|
||||
- Employer, formal/transparent title, dates and location come first.
|
||||
- Do not use tailored themes as job titles.
|
||||
- Mix natural bullet lengths.
|
||||
- Use only verified metrics and outcomes.
|
||||
- Preserve allowed verbs and ownership scope.
|
||||
- Never add a skill to mirror the JD.
|
||||
- Certifications appear once.
|
||||
|
||||
**Produce all of these (reference `resume_builder/reference/session_file_template.md` for format):**
|
||||
- **JD Analysis** — classify every requirement as Direct / Bridge (with confidence) / Gap. Extract ATS keywords by category.
|
||||
- **Company Context** — mission, role purpose, culture signals, "why them" angle (from web research)
|
||||
- **Framing Strategy** — lead narrative, reframing map, emphasize/downplay, CL hooks, user focus directives
|
||||
- **Critique Context** — reviewer persona, competitive landscape, domain vocabulary
|
||||
- **Cover Letter Plan** — institution type, paragraph structure, hooks, jargon level
|
||||
## Phase 4 — Validate and Inspect
|
||||
|
||||
**Create output folder:**
|
||||
Derive folder name from JD filename: `JDs/JD_Acme.txt` → `output/Acme/`
|
||||
```bash
|
||||
mkdir -p output/<FolderName>/
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex>
|
||||
```
|
||||
Write session file to `output/<FolderName>/session_<name>.md` (NOT flat `output/`).
|
||||
All subsequent output files go in this folder.
|
||||
|
||||
**Verify completeness:** Re-read the session file. Confirm these 8 sections are non-empty: JD Info, Requirements table, ATS Keywords, Gap Assessment, Company Context, Framing Strategy, Critique Context, Cover Letter Plan. Fill any missing section before presenting.
|
||||
Fix every failure. Compile the LaTeX, inspect both pages, and run `pdftotext` to verify parsing and information order. Do not add filler to reduce whitespace.
|
||||
|
||||
**Write memory pointer** to `AGENTS.md` Active Sessions.
|
||||
Update the session with the as-built content, validation results, page count, cover-letter decision, and next action.
|
||||
|
||||
**Update session file Status:** `Phase 0: DONE`
|
||||
|
||||
Progress: "Searching for [company] + [domain]..." / "JD analysis: X/Y requirements direct match, Z bridges, W gaps"
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present: research summary, role type + bundle, format, framing strategy.
|
||||
Ask user to confirm: (1) role type + bundle, (2) format, (3) framing strategy.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
Proceeding without confirmation misaligns the entire resume and requires full regeneration.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Plan Bullets
|
||||
|
||||
**Re-read `output/<FolderName>/session_<name>.md`** — specifically Framing Strategy and ATS Keywords.
|
||||
|
||||
**Read:**
|
||||
1. The matching bundle from `config.md` Role Types → `resume_builder/bundles/bundle_[role_type].md` — Section 1 (Priority Matrix)
|
||||
- For hybrid JDs: read both bundles. Use primary for Priority Matrix, secondary for Reframing Map on 1-2 bridging bullets.
|
||||
2. All experience files from `resume_builder/experience/`
|
||||
3. `resume_builder/support/achievement_reframing_guide.md`
|
||||
4. `resume_builder/support/skills_taxonomy.md`
|
||||
5. `resume_builder/support/pub_metadata.md`
|
||||
|
||||
**Present one table per position:**
|
||||
|
||||
**[Position Name] (Budget: N-M bullets, ~X-Y rendered lines)**
|
||||
|
||||
| | ID | Achievement | Variant | Lines | JD Match |
|
||||
|---|---|-------------|---------|-------|----------|
|
||||
| * | P1-1 | [short description] | 2L | 2 | Direct |
|
||||
| * | P1-5 | [short description] | 2L | 2 | Direct |
|
||||
| o | P1-3 | [short description] | 2L | 2 | Bridge |
|
||||
| x | P1-7 | [short description] | -- | -- | Weak |
|
||||
|
||||
**Legend:** `*` = recommended (HIGH on Priority Matrix + Direct JD match) | `o` = available (MEDIUM priority or Bridge match) | `x` = not recommended (LOW priority or Gap)
|
||||
|
||||
**After all positions, show:**
|
||||
- Recommended set total vs budget (from Quick Budget Card in resume_reference.md)
|
||||
- Remaining budget slots and what could fill them
|
||||
- Forced exclusions per provenance flags
|
||||
- Focus directive impact (what changed vs Priority Matrix defaults)
|
||||
- CV: confirm first bullet of first experience is 2L (page 1 rule)
|
||||
|
||||
**Update session file** — write Bullet Plan tables. Status: `Phase 1: DONE (N bullets confirmed)`
|
||||
|
||||
Progress: "Reading experience files for bullet candidates..." / "Recommending N bullets per position"
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present bullet plan. Wait for user to confirm/modify selections.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
If you proceed without confirmation, you will generate bullets the user didn't approve.
|
||||
**Update session file with confirmed plan before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Budget Gate (AFTER user confirms bullet plan, BEFORE Phase 2)
|
||||
|
||||
**Re-read session file Bullet Plan section** to verify confirmed counts.
|
||||
|
||||
- Check budget targets from `resume_builder/reference/resume_reference.md` Budget Card.
|
||||
- Show: `Budget: [N] bullets vs target [T]. PASS/FAIL`
|
||||
- **FAIL = do not proceed. Reconcile with user first.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Generate
|
||||
|
||||
**Re-read to restore context after compaction:**
|
||||
1. `output/<FolderName>/session_<name>.md` (framing + confirmed bullet plan)
|
||||
2. `resume_builder/reference/critical_rules.md` — Character Limits, Bold Width Penalty, Orphan rules
|
||||
3. `resume_builder/support/ai_fingerprint_rules.md` — Banned words, structural rules, post-gen checklist
|
||||
|
||||
**Read template:** `resume_builder/templates/resume_template.tex` or `cv_template.tex` + `.cls`
|
||||
FIXED sections (from `config.md` FIXED Sections) are template-locked — only generate VARIABLE sections (Summary, Skills, Experience bullets/headers).
|
||||
|
||||
**Read section specs:** `resume_builder/reference/resume_reference.md` — Section-by-Section Specs for your format
|
||||
|
||||
**Generate section by section** (follow Section-by-Section Specs):
|
||||
1. Summary → check against session framing strategy
|
||||
- Update Status → `Phase 2: Summary DONE`
|
||||
2. Technical Skills
|
||||
- Update Status → `Phase 2: Skills DONE`
|
||||
3. Each position's bullets → **CHAR COUNT GATE after each position**
|
||||
- Position titles: bold theme + date must fit ONE line (see resume_reference.md). If wrapping, shorten title.
|
||||
- After each position: Update Status → `Phase 2: [Position] DONE`
|
||||
4. **PAGE FILL GATE after all experience**
|
||||
|
||||
Save .tex to `output/<FolderName>/e2e_<name>_resume.tex` or `_cv.tex`
|
||||
|
||||
**Update session file** — add Output Files.
|
||||
|
||||
Progress: "Writing Position 1 bullets (6 of 7)..." / "Bullet 4 is SHORT at 184 chars — padding" / "Compiling resume... 2 pages OK"
|
||||
|
||||
### CHAR COUNT GATE (per position)
|
||||
```bash
|
||||
python3 resume_builder/helpers/char_count.py -f [resume|cv] output/<FolderName>/[file].tex
|
||||
```
|
||||
No OVER violations. Last line of 2L bullets >= 70% fill. **Fix before next position.**
|
||||
|
||||
### PAGE FILL GATE
|
||||
Resume: <= 3 lines white space on last page. CV: check rendered line target from resume_reference.md. **If FAIL: add/trim variable bullets.**
|
||||
|
||||
### COMPILE GATE
|
||||
```bash
|
||||
pdflatex -interaction=nonstopmode -output-directory=output/<FolderName> output/<FolderName>/e2e_<name>_resume.tex
|
||||
```
|
||||
Verify page counts match `config.md` Document Preferences. Use the Read tool to view compiled PDF — check orphans, header wrapping, page fill. **If FAIL: fix variable content, recompile.**
|
||||
|
||||
Run the Post-Generation Verification checklist from `resume_builder/reference/resume_reference.md` before proceeding.
|
||||
|
||||
Update Status → `Phase 2: Compile DONE`
|
||||
|
||||
---
|
||||
|
||||
## End of /make-resume
|
||||
|
||||
Update session file Status:
|
||||
- `Resume: DONE`
|
||||
- `Cover Letter: PENDING`
|
||||
- `Critique: PENDING`
|
||||
- `Next: /make-cl output/<FolderName>/session_<name>.md`
|
||||
- `Next Critique: /critique output/<FolderName>/session_<name>.md`
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Present: resume compilation summary (pages, char count results, any violations fixed).
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
"Resume compiled and verified. Next steps:
|
||||
1. /clear
|
||||
2. [exact /make-cl command with session file path]"
|
||||
Present the finished resume and the original Evidence Fit classification. Wait for approval. If the cover-letter decision is YES, point to `/make-cl`; otherwise point directly to `/critique`.
|
||||
|
||||
Reference in New Issue
Block a user