skills/resume-forge/SKILL.md
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, 이력서 항목 작성
npx skillsauth add toongri/oh-my-toong-playground resume-forgeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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 — seeskills/tech-claim-rubric/output-schema.mdfor full contract.
Collaboratively source, refine, and complete resume problem-solving entries with the user. Two feedback loops progressively elevate quality.
tech-claim-examiner. This skill only checks pass/fail thresholdsdigraph 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"];
}
$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$OMT_DIR/review-resume/forge-references/. Record filenames in state JSON sources array$OMT_DIR/state/resume-forge-{sessionId}.json (see State section)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:
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.
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:
pending), move to nextSolution interview protocol:
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.")
<critical>
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.
</critical>
Invoke via Agent(subagent_type="tech-claim-examiner", ...).
Pass criteria — ALL must be met:
final_verdict == APPROVEverdicts.a1_technical_credibility.verdict != FAILverdicts.a2_causal_honesty.verdict != FAILverdicts.a3_outcome_significance.verdict != FAILverdicts.a4_ownership_scope.verdict != FAILcount(P1 across A1-A4) < 3 ← cumulative P1 허용 상한: P1 최대 2개structural_verdict ∈ {PASS, P1}critical_rule_flags.r_phys.triggered == falsecritical_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을 결정한다. 우선순위 순:
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:
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.
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:
Step 4. Reconstruct Entry + Re-dispatch
State stays "pending" until APPROVE.
$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).
$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" }
}
]
}
On new session start:
$OMT_DIR/state/resume-forge-*.json and pick the most recent by created_at fieldloop1.status == "passed" (go to Loop 2). Skip scenarios where loop2.status == "passed" (fully complete)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 scenarioloop1.status == "passed", skip directly to Phase 2caption field in draftsWhen 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.
The examiner's core question: "If I hire this person based on this claim, will they actually deliver?"
Entries that pass share these traits:
Entries that fail:
| 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 |
tools
Use when creating, refining, or managing requirement-stage PM tickets. Triggers include "요구사항 티켓 만들어", "티켓 정리", "이 요구사항 이슈로", "티켓 써줘", "requirement to ticket", "manage ticket", "file this requirement", "이슈로 만들어", "티켓 작성", "요구사항 이슈화".
development
Autonomous objective-pursuit orchestrator — wraps deep-interview/prometheus/sisyphus, then re-pursues the objective across plan/execute cycles until an objective-level argus completion gate confirms the verification surface is met.
tools
Use at the end of a work session to review the WHOLE session and record entities worth pinning. This is the manual, deliberate complete-sweep review — NOT an automated nudge. Triggers on "wrap up", "wrap-up", "session wrap", "end of session", "what should I pin".
documentation
Use when initializing the pins knowledge graph for the first time in a project. Guides the user through creating pins.yaml (the storage manifest). Triggers on "setup pins", "initialize pins", "create pins.yaml", "first-run pins".