| name | resume-forge |
| description | Use when creating, sourcing, or refining resume problem-solving material โ building compound scenarios, developing problem definitions, crafting solution strategies, or iterating entries until examiner approval. Triggers on ์ด๋ ฅ์ ์ฌ๋ฃ/์์ฌ, ๋ฌธ์ ์ํฉ ๋ง๋ค๊ธฐ, ์๋๋ฆฌ์ค ์์ฑ, compound scenario, ์ด๋ ฅ์ ํญ๋ชฉ ์์ฑ |
Resume Forge
Axis-aware orchestrator boundary: This skill is the axis-aware orchestrator of tech-claim-examiner. It consumes the full examiner schema including INTERNAL fields (verdicts.a1-a5, critical_rule_flags.*, reasoning, evidence_quote) for source-extraction routing and Loop 1/2 gate decisions. The blackbox contract rule that restricts review-resume to PUBLIC fields does not apply here โ see skills/tech-claim-rubric/output-schema.md for full contract.
Collaboratively source, refine, and complete resume problem-solving entries with the user. Two feedback loops progressively elevate quality.
Principles
- Delegate scoring: All evaluation goes to
tech-claim-examiner. This skill only checks pass/fail thresholds
- Free-form discussion: Never force structured choices in AskUserQuestion. Use open-ended questions
- Critical partner: Do not blindly accept user input. Challenge, propose alternatives, surface trade-offs. When the user proposes a content direction change, state your assessment before applying it:
- BAD: User: "ํํฐ์
์ค๊ณ ๋ด์ฉ๋ ๋ฃ์" โ "์ข์, ๋ฐ์ํ ๊ฒ" โ structural_verdict FAIL (scanability low: detail spill)
- GOOD: User: "ํํฐ์
์ค๊ณ ๋ด์ฉ๋ ๋ฃ์" โ "structural_verdict ๊ธฐ์ค์ design rationale ์๋ ๊ตฌํ ๋ํ
์ผ๋ก ์ฝํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค โ ๋ฃ์๊น, ํ ๋ฌธ์ฅ ์ธ๊ธ์ผ๋ก ๊น์ด๋ฅผ ์์ํ ๊น?"
- GOOD (agree): User: "goroutine์ด ์๋๋ผ ์์ฑ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ํต์ฌ ์๋์ผ?" โ "๋ง๋ค, goroutine์ Go ๊ตฌํ์ฒด ๋ํ
์ผ์ด๊ณ ์ค๊ณ ๊ฒฐ์ ์ ์์ฑ ๋ณ๋ ฌ ์ถ๋ก ์ด๋ค" โ ๋ฐ๋ก ๋ฐ์
- Show full text: Always show the complete entry before discussing. Never show fragments
- Guided interview: Ask ONE focused question per turn. With each question, propose 2-3 candidate directions or framings โ show the user what strong material looks like and how to frame their experience. Don't just extract raw facts; coach toward a compelling entry
Workflow
digraph resume_forge {
rankdir=TB;
Setup [shape=box, style=filled, fillcolor=lightblue];
Loop1 [shape=box, label="Loop 1: Problem Definition\na2_causal_honesty == PASS", style=filled, fillcolor=lightyellow];
Loop2 [shape=box, label="Loop 2: Entry approved\n(final_verdict APPROVE && 5์ถ verdict ์ข
ํฉ)", style=filled, fillcolor=lightyellow];
Done [shape=box, label="Save + Update State", style=filled, fillcolor=lightgreen];
Setup -> Loop1;
Loop1 -> Loop2 [label="all passed\nor user skip"];
Loop2 -> Done [label="all passed\nor user skip"];
}
Phase 0: Setup
- Load existing state โ scan
$OMT_DIR/review-resume/ (drafts/, problem-solving/, forge-references/) and check for prior state in $OMT_DIR/state/resume-forge/. Show the user what already exists. Use existing problem-solving/ entries as dedup and differentiation criteria when proposing new scenarios โ never re-propose the same topic; approach similar domains from a different angle
- CRITICAL: Source mining + User interview (ALWAYS, NEVER SKIP) โ The user IS a source. Mine from everywhere until good problems emerge:
- Interview the user: Ask about their hardest problems, biggest wins, what kept them up at night. One question per turn โ with each question, suggest candidate directions: "์ด๋ฐ ํฌ์ธํธ๊ฐ ์์ผ๋ฉด ์ฐจ๋ณํ๋ ๊ฒ ๊ฐ์๋ฐ", "์ด ๊ฐ๋๋ก ํ์ด๋ด๋ฉด ๊ฐํ ๊ฒ ๊ฐ์". Dig deep. Follow up. The user's memory is the richest source
- External sources: company Notion (MCP), Jira/Linear, file system docs, Slack threads, past Claude sessions, reference resumes โ whatever the user can provide access to
- Iterate: propose candidate problems from what you've gathered, get user feedback, mine more, propose again. This loop continues until enough good problems are found โ NOT a one-shot questionnaire
- Save digested analysis to
$OMT_DIR/review-resume/forge-references/. Record filenames in state JSON sources array
- Target count โ AskUserQuestion: how many scenarios? (skip if resuming and count already set)
- Create/update session state โ
$OMT_DIR/state/resume-forge-{sessionId}.json (see State section)
Phase 1: Loop 1 โ Problem Definition
Source mining does NOT stop at Phase 0. If a problem needs more context during Loop 1 or Loop 2, go back to the user, mine more sources, ask deeper questions. Phase 0 is the initial pass โ mining continues throughout.
Iterate per scenario:
digraph loop1 {
rankdir=TB;
draft [shape=box, label="Draft problem\n(domain + user input)"];
discuss [shape=box, label="Discuss with user\n(AskUserQuestion)", style=filled, fillcolor=lightyellow];
confirm [shape=box, label="Confirm with user\n(AskUserQuestion:\n์ด๊ฑธ๋ก ์ ์ถํ ๊น?)", style=filled, fillcolor=lightyellow];
exam [shape=box, label="Submit to\ntech-claim-examiner", style=filled, fillcolor=orange];
check [shape=diamond, label="verdicts.a2_causal_honesty\n== PASS?"];
save [shape=box, label="Save to drafts/", style=filled, fillcolor=lightgreen];
feedback [shape=box, label="Show examiner feedback\n+ propose alternatives\nโ re-discuss", style=filled, fillcolor=lightyellow];
draft -> discuss;
discuss -> confirm;
confirm -> exam [label="user: ์ ์ถ"];
confirm -> discuss [label="user: ์์ง"];
exam -> check;
check -> save [label="yes"];
check -> feedback [label="no"];
feedback -> discuss;
}
Confirmation Gate โ After discussing the problem definition with the user, show the complete draft and ask via AskUserQuestion: "์ด ๋ฌธ์ ์ ์๋ก examiner์๊ฒ ์ ์ถํ ๊น์?" User responds:
- "์ ์ถ" / ํ์ธ: Proceed to examiner
- "์์ง": Return to discuss โ refine together, then confirm again. This is NOT "๋ค์" (skip). "์์ง" means "keep improving this scenario"; "๋ค์" means "skip to next scenario"
User says "๋ค์" (next) โ skip current scenario, move on. Allowed at any point in both Loop 1 and Loop 2. Skipped scenarios stay in their current location (drafts/ or wherever they are) with state unchanged (pending).
Examiner invocation โ tech-claim-examiner subagent_type:
Evaluate the causal honesty of this problem definition.
## Candidate Profile
{user role, experience level, domain}
## Bullet Under Review
{full problem definition + technical challenges}
## Technical Context
{tech stack, system scale, domain background}
Invoke via Agent(subagent_type="tech-claim-examiner", ...). Check verdicts.a2_causal_honesty.verdict in response. PASS = Loop 1 gate cleared.
Phase 2: Loop 2 โ Complete Entry
Pick from drafts/ one by one (skip scenarios where loop2.status == "passed"), fill in solution strategy + results.
User says "๋ค์" โ skip current scenario (stays in drafts/, state remains pending), move to next.
digraph loop2 {
rankdir=TB;
pick [shape=box, label="Pick a draft"];
interview [shape=box, label="Interview: solution strategy\n(AskUserQuestion)", style=filled, fillcolor=lightyellow];
show [shape=box, label="Show full entry\n(problem+challenge+solution+result)"];
confirm [shape=box, label="Confirm with user\n(AskUserQuestion:\n์ด ์ํธ๋ฆฌ๋ก ํ์ ํ ๊น?)", style=filled, fillcolor=lightyellow];
exam [shape=box, label="Submit to\ntech-claim-examiner\n(full Input Format)", style=filled, fillcolor=orange];
check [shape=diamond, label="Final Verdict\nAPPROVE?"];
save [shape=box, label="Save to\nproblem-solving/", style=filled, fillcolor=lightgreen];
e_fail [shape=box, label="Source extraction:\n{a1/a2/a3/a4} FAIL\nOR structural_verdict+co-failure\nโ interview for depth", style=filled, fillcolor=lightyellow];
r_fail [shape=box, label="Readability-only fix:\nstructural_verdict FAIL alone\nโ propose structure fixes", style=filled, fillcolor=lightyellow];
revise [shape=box, label="Regenerate entry\n+ show to user"];
pick -> interview;
interview -> show;
show -> exam [label="dispatch"];
exam -> check;
check -> confirm [label="APPROVE"];
check -> classify [label="REQUEST_CHANGES"];
confirm -> save [label="user: ํ์ "];
confirm -> interview [label="user: ์์ง"];
confirm -> pick [label="user: ๋ค์\n(skip)"];
classify [shape=box, label="Step 1: Classify\n(5์ถ verdict ํจํด)", style=filled, fillcolor=lightyellow];
classify -> r_fail [label="structural_verdict FAIL alone\n(apply immediately)"];
classify -> e_fail [label="{a1/a2/a3/a4} FAIL\nor structural_verdict+co-failure"];
e_fail -> revise;
r_fail -> revise;
revise -> show;
}
Confirmation Gate (post-APPROVE confirm) โ After examiner returns final_verdict == APPROVE, ask via AskUserQuestion: "์ด ์ํธ๋ฆฌ๋ก ํ์ ํ์๊ฒ ์ต๋๊น?" User responds:
- "ํ์ " / ํ์ธ: Save to problem-solving/ and update state
- "์์ง": Return to interview โ dig deeper into solution details, refine the entry, then re-dispatch to examiner. This is NOT "๋ค์" (skip). "์์ง" means "keep improving this entry"; "๋ค์" means "skip to next scenario"
- "๋ค์": Skip current scenario (stays in drafts/, state remains
pending), move to next
Solution interview protocol:
- One question per turn: Never batch multiple questions. Ask a single focused question, wait for the answer, then follow up
- Suggest directions: With each question, propose 2-3 candidate directions or framings based on what you know. Example: "Saga ํจํด์ผ๋ก ๋ช
์์ ์ผ๋ก ๊ตฌํํ ๊ฑด์ง, ์ด๋ฒคํธ ์ฒด์ธ + ์๋ ๋ณด์ ์ด์๋์ง๊ฐ ๊ธฐ์ ์ ๊น์ด๋ฅผ ์ข์ฐํ ๊ฒ ๊ฐ์" โ show what strong material looks like
- Real experience validation: if real, dig deep into specifics; if fabricated, validate technical plausibility
- Alternative surfacing: why this approach was chosen and what alternatives were rejected (and why)
- Trade-off extraction: limitations of chosen approach and why they were accepted
Examiner invocation:
Use the rubric's full Input Format. Missing fields cause loose evaluation.
# Technical Evaluation Request
## Candidate Profile
- Experience: {years} years
- Position: {position}
- Target Company/Role: {company} / {role} (if unknown: "No specific target โ evaluate against big tech standards")
## Bullet Under Review
- Section: Problem-Solving > {scenario title}
- Original: "{MUST be the full original text from the draft file โ never summarize}"
## Technical Context
- Technologies/approaches mentioned in this bullet: {identified directly from bullet text}
- JD-related keywords: {if available from Phase 0 sources, else "N/A"}
- Loop 1 findings: {verdicts.a2_causal_honesty.verdict and any notes from Loop 1}
## Target Company Context
- If known: {company, scale indicators, team size, core values, key challenges}
- If unknown: "No specific target โ evaluate against big tech standards"
## Proposed Alternatives (if re-dispatching after feedback)
### Alternative 1: {summary}
{revised text}
### Alternative 2: {summary}
{revised text}
(On first dispatch: "None โ initial evaluation of the original entry only.")
MUST send the full original text from the draft file. NEVER summarize, paraphrase, or shorten the entry. Less text โ LLM fills gaps with charity โ inflated scores. Read the draft file and copy the full content verbatim.
Invoke via Agent(subagent_type="tech-claim-examiner", ...).
Pass criteria โ ALL must be met:
final_verdict == APPROVE
verdicts.a1_technical_credibility.verdict != FAIL
verdicts.a2_causal_honesty.verdict != FAIL
verdicts.a3_outcome_significance.verdict != FAIL
verdicts.a4_ownership_scope.verdict != FAIL
count(P1 across A1-A4) < 3 โ cumulative P1 ํ์ฉ ์ํ: P1 ์ต๋ 2๊ฐ
structural_verdict โ {PASS, P1}
critical_rule_flags.r_phys.triggered == false
critical_rule_flags.r_cross.triggered == false
(P1 verdicts on any axis do not block APPROVE (subject to the cumulative count(P1) < 3 gate above at L205) but surface in interview_hints. This applies to A1-A4 + structural_verdict uniformly โ formerly only A4 emitted P1.)
On APPROVE: Present entry to user via Confirmation Gate (post-APPROVE). On user "ํ์ ": Remove from drafts/ โ save to problem-solving/. Update state loop2.status to "passed". On user "์์ง": return to interview for further refinement and re-dispatch.
On REQUEST_CHANGES:
Step 1. Classify Feedback (5์ถ verdict ํจํด)
skills/tech-claim-rubric/output-schema.md ยงA5 Co-failure Disambiguation Full Routing Matrix๋ฅผ ์ฐธ์กฐํ์ฌ emitted verdicts์ flags ๊ธฐ๋ฐ์ผ๋ก routing์ ๊ฒฐ์ ํ๋ค. ์ฐ์ ์์ ์:
- r_phys.triggered == true โ Source extraction with impossibility explanation (์ฌ์ฉ์์๊ฒ physically impossible ์์น ์ค๋ช
์์ฒญ)
- r_cross.triggered == true โ Source extraction with contradiction explanation (์ฌ์ฉ์์๊ฒ cross-entry contradiction ์ค๋ช
์์ฒญ)
- count(P1 across A1-A4) >= 3 โ Source extraction via Step 3 Stages 1-4, starting with the weakest P1 axis (ascending strength order)
- {a1, a2, a3, a4} ์ค FAIL ์์ AND structural_verdict โ {PASS, P1} โ per-axis Stage 1-4 Source extraction (FAIL ์ถ interview hints ๊ธฐ๋ฐ depth ๋ณด๊ฐ)
- {a1, a2, a3, a4} ์ค FAIL ์์ AND structural_verdict == FAIL โ Stage 5 multi-axis synthesis (co-failure: axis FAIL + structural FAIL ๋์ ๋ฐ์)
- structural_verdict == FAIL + {a1, a2, a3, a4} ๋ชจ๋ PASS/P1 + count(P1 across A1-A4) < 3 โ Readability-only fix (no interview needed โ ์ฌ๊ตฌ์ฑยท์์ถ๋ง์ผ๋ก ํด๊ฒฐ)
Readability-only fixes can be applied by rearranging/compressing the same material โ apply immediately. Source extraction failures require new depth material โ apply the Source Extraction protocol below.
Step 2. Convert Interview Hints โ Specific Questions
The examiner provides Interview Hints for each FAIL axis. Do NOT use them verbatim โ transform them into questions that include technical context + specific situation + examples:
BAD (abstract):
"Were there any tradeoffs?"
GOOD (specific, with context):
"Redis ๋์
ํ ๋ cache consistency์ response speed ์ฌ์ด์์ ๊ณ ๋ฏผํ ์ ์๋์?
์๋ฅผ ๋ค์ด cache TTL ๊ธฐ์ค์ ์ด๋ป๊ฒ ์ ํ๊ณ , stale data๋ก ๋ฌธ์ ๋ ์ ์?"
Conversion principles:
- Diagnostic context: explain why you are asking this question
- Specific target: target a specific situation/decision/metric, not vague "experience"
- Include examples: help the user recall similar cases
Step 3. Source Extraction (5-Stage)
Progress per axis below PASS (FAIL first, then P1 by ascending strength). One question per turn at each Stage:
| Stage | Trigger | Action |
|---|
| Stage 1 | a1_technical_credibility FAIL or P1 | Named systems / mechanisms ๋ณด๊ฐ: ask specifically about the technical decisions the examiner flagged. If axis-specific questions exhaust without surfacing material โ apply Domain-Informed Source Proposal |
| Stage 2 | a2_causal_honesty FAIL or P1 | Causal chain explicitํ + arithmetic ๊ฒ์ฆ: reframe the question from 3 different angles to surface cause-effect logic. If axis-specific questions exhaust without surfacing material โ apply Domain-Informed Source Proposal |
| Stage 3 | a3_outcome_significance FAIL or P1 | Tech ๋๋ business outcome ์ถ๊ฐ (vanity metric ํํผ): ask about adjacent experience or measurable results. If axis-specific questions exhaust without surfacing material โ apply Domain-Informed Source Proposal |
| Stage 4 | a4_ownership_scope FAIL or P1 | Verb-scope coherence ๋ณด๊ฐ: probe daily work for hidden ownership evidence, monitoring discoveries, operational context. If axis-specific questions exhaust without surfacing material โ apply Domain-Informed Source Proposal |
| Stage 5 | structural_verdict == FAIL + (a1/a2/a3/a4) co-failure | Source extraction ์ข
ํฉ (multi-axis): apply Domain-Informed Source Proposal โ AI synthesizes user's domain/stack and proposes scenarios typical for the context |
Source Quality Check:
At each Stage, verify 3 elements whenever the user provides source material:
| Element | Definition | When absent |
|---|
| Fact | What happened | "I have experience" โ content unknown โ next Stage |
| Context | Why / where / how | Fact alone cannot be shaped into an entry โ ask follow-up |
| Verifiability | Metrics, before/after, measurable outcome | Unverifiable โ examiner FAIL expected โ ask follow-up |
All 3 elements confirmed โ reconstruct entry. Any element missing โ proceed to next Stage.
Domain-Informed Source Proposal
Applicable at: Stages 1-4 (when axis-specific extraction exhausts without surfacing material) AND Stage 5 (co-failure trigger: structural_verdict == FAIL + at least one of a1/a2/a3/a4 FAIL).
When axis-specific questions fail to surface material, the AI acts as a domain expert and proposes concrete sources:
- Synthesize the user's company scale, domain, tech stack, and the specific FAIL axis
- Propose 2-3 scenarios in the form: "In this context, this problem typically occurs โ did you experience something like this?"
- Example: "์ํํ๋งค ์ ์ฐ์ด๋ฉด PG ํ๋ถ ํ์ด๋ฐ์ด๋ ์ ์ฐ ์ฃผ๊ธฐ๊ฐ ์ ๋ง์์ ์ฐจ์ก์ด ์๊ธฐ๋ ์ผ์ด์ค๊ฐ ๋ง์๋ฐ, ์ด๋ฐ ๊ฒฝํ ์๋์?"
- Example: "Go๋ก concurrent processing ํ๋ฉด goroutine leak์ด๋ channel deadlock์ด ํํ๋ฐ, ๊ทธ๋ฐ ์ด์ ๊ฒช์ผ์
จ๋์?"
- User confirms โ use as new source material โ reconstruct entry
- User denies all โ build best entry with current sources โ final dispatch
Step 4. Reconstruct Entry + Re-dispatch
- Incorporate extracted sources + readability-only fixes into a reconstructed entry
- Cognitive depth check (before final emission): verify that the reconstructed entry surfaces at least one concrete decision point โ a rejected alternative, a constraint that forced the approach, or a measurable trade-off. If absent, return to source extraction for the weakest axis below PASS (FAIL first, then P1 by ascending strength) before emitting
- Show full entry to user for visual review (no pre-dispatch confirmation gate โ still in REQUEST_CHANGES iteration; post-APPROVE confirm gate applies only after a future APPROVE)
- Re-dispatch to examiner with the revised entry as Proposed Alternative
- Repeat until APPROVE or user opt-out ("๋ค์")
State stays "pending" until APPROVE.
Storage
$OMT_DIR/review-resume/
โโโ sources/ # review-resume skill: company research, JD analysis (DO NOT USE)
โโโ forge-references/ # resume-forge: digested work history from Notion, Jira, docs, threads, etc.
โ โโโ {kebab-case}.md # e.g. mineiss-project-context.md, jira-key-issues.md
โโโ drafts/ # Loop 1 passed (problem definition only, awaiting Loop 2)
โ โโโ {kebab-case}.md
โโโ problem-solving/ # Loop 2 passed (complete entries, note-system compatible)
โ โโโ {kebab-case}.md
โโโ ...
Draft file format:
---
tags: [go, kafka, resilience]
---
# Scenario Title
- **sub_title**: ...
- **caption**: Company ยท YYYY.MM ~ YYYY.MM
- **skills**: ...
**Problem Definition**
...
**Technical Challenges**
...
Complete entry: follows review-resume/references/note-system.md candidate file format (tags frontmatter + body).
Session State
$OMT_DIR/state/resume-forge-{sessionId}.json (session-scoped state file โ sessionId from Claude's input.sessionId):
{
"session_id": "abc123-def456",
"created_at": "2026-04-10T12:00:00",
"sources": ["existing-notes", "current-resume"],
"target_count": 9,
"scenarios": [
{
"id": "c1-pipeline-throughput",
"title": "Attribute inference pipeline",
"loop1": { "status": "passed", "verdicts": { "a2_causal_honesty": "PASS" } },
"loop2": { "status": "passed", "final_verdict": "APPROVE" }
},
{
"id": "c2-return-workflow",
"title": "Return workflow automation",
"loop1": { "status": "passed", "verdicts": { "a2_causal_honesty": "PASS" } },
"loop2": { "status": "pending" }
}
]
}
Session Recovery
On new session start:
- List
$OMT_DIR/state/resume-forge-*.json and pick the most recent by created_at field
- Read the state JSON. Skip scenarios where
loop1.status == "passed" (go to Loop 2). Skip scenarios where loop2.status == "passed" (fully complete)
- Scan forge-references/ (if directory exists) โ
ls $OMT_DIR/review-resume/forge-references/ โ read the first ~10 lines of each file to understand domain/content. Read in full any reference relevant to the current scenario
- If all scenarios have
loop1.status == "passed", skip directly to Phase 2
- Candidate Profile info (user role, experience): ask the user once in Phase 0 setup, or infer from
caption field in drafts
Cleanup
When all scenarios have loop2.status == "passed", delete the state file ($OMT_DIR/state/resume-forge-{sessionId}.json). All data lives in drafts/ and problem-solving/ โ the state file is only needed during active forging.
Writing Direction
The examiner's core question: "If I hire this person based on this claim, will they actually deliver?"
Entries that pass share these traits:
- "Why this over alternatives?" โ every tech choice has a rejected alternative with a reason
- "What constraints forced this?" โ the problem shape dictated the solution, not the other way around
- "What did you give up?" โ trade-offs are explicit and accepted with justification
- Cascade discovery โ "tried A โ discovered constraint โ pivoted to B" narrative, not "designed the perfect solution upfront"
- Scale-appropriate โ solutions match the actual system scale, not over-engineered for hypothetical load
Entries that fail:
- List technologies without explaining why they were chosen
- Describe the solution without showing the problem's complexity
- Claim results without measurable baselines (before โ after)
- Read like architecture decision records instead of problem-solving stories
Anti-Patterns
| Don't | Why |
|---|
| Force structured choices in AskUserQuestion | Users prefer free-form feedback. Closed questions limit discussion |
| Show problem/solution in fragments | Without full context, discussion is inefficient. Always show complete text |
| Blindly accept user opinions | User says "add X" โ "์ข์ ๋ฐ์ํ ๊ฒ" โ examiner FAIL โ wasted cycle. State your assessment first: agree with reasoning, or flag the risk and propose alternatives |
| Judge examiner scoring criteria yourself | Scoring is the examiner's job. This skill only checks pass/fail |
| Request source extraction without identifying which axis failed | A2 FAIL requires causal chain repair; A1 FAIL requires named systems; routing is axis-specific |
| Use technical terms without verification | Outbox, priority queue, etc. โ align definitions with user to prevent misunderstanding |
| Batch multiple questions in one turn | Cognitive overload โ user answers shallowly or skips hard questions. One focused question + candidate directions per turn |