From buyoung-skills
Generates structured work-brief Markdown files at docs/briefs/ from planning notes or task descriptions, with sections keyed to Conventional Commits types for downstream coding agents. Supports single-brief and briefset modes for multiple execution contexts.
How this skill is triggered — by the user, by Claude, or both
Slash command
/buyoung-skills:task-brief-creatorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Produce a structured work-brief Markdown document under `docs/briefs/` that a downstream coding agent (or a human engineer) can pick up and execute without re-interviewing the requester.
LICENSETHIRD_PARTY_NOTICES.mdexamples/01-pm-paste-feat.mdexamples/02-rough-typed-fix.mdexamples/03-halt-ambiguous.mdexamples/04-briefset-checkout-i18n.mdexamples/05-stage-4-walkthrough.mdexamples/README.mdreferences/bloat-decomposition.mdreferences/briefset.mdreferences/cold-pickup.mdreferences/stage-4-interview.mdreferences/template.mdreferences/work-types.mdscripts/validate_brief.pyscripts/validate_briefset.pyProduce a structured work-brief Markdown document under docs/briefs/ that a downstream coding agent (or a human engineer) can pick up and execute without re-interviewing the requester.
The brief is the handoff artifact. Its job is to let a coding agent move from first read through completion judgement without re-interviewing the requester — routing it to the right files, fixing the behavior envelope, and pre-answering the questions that would otherwise bounce back.
The brief is an executable work instruction — nothing else. It is not a scope-control memo, not a discussion summary, not a planning note, not a background briefing, not a rationale document. Every section must answer "what does the coding agent do next?" — if a section reads like meeting minutes, negotiation history, or context prose, rewrite it until it routes to files, decisions, or verifiable outcomes. A brief that makes the downstream agent re-interview the requester is a failed brief, regardless of how polished it reads.
"Executable, not discursive" is a prose style rule, not a content reduction rule. It tells you how each bullet should read — direct, action-routing, no rationale prose. It does not tell you to drop distinct concerns, merge unrelated bullets, or summarize the input down to its highlights. A brief that omits a concern from the input is also a failed brief, because the downstream agent will silently miss it. Tight prose, full enumeration: short bullets are fine and encouraged, but every distinct concern from the input and the codebase review must land somewhere in the brief.
This skill operates in one of two output modes:
references/briefset.md; long input, many files, or many related edit points alone never trigger briefset mode.Output-mode selection happens at Stage 1 alongside the ambiguity gate.
In briefset mode, follow the workflow below with the per-stage adaptations in references/briefset.md (parent template, naming, decomposition decision table, dual-validator save).
Stage 4 always runs as a user decision table — after codebase review, gather ambiguous or user-owned decisions and present them in a Markdown table with 순번, 내용, 수정 추천안, and 근거.
Codebase-resolvable technical facts are probed instead of asked, while product intent, scope, acceptance thresholds, sequencing, and ownership decisions are tabled for the user.
The decision table is the default Stage 4 behavior, not a separate mode.
See references/stage-4-interview.md for the full decision classification, codebase-precedence, and termination rules.
Load references only when their decision point arrives:
Do not re-open every reference by habit. The goal is to keep the live context focused on the next decision the coding agent must make.
/task-brief-creator, or similar).순번 / 내용 / 수정 추천안 / 근거 stay exactly as written even when the conversation is in English: Stage 5.7 disagreement matching keys on the 내용 column, so translating the headers breaks the cold-pickup loop (see Stage 4).| Field | Value |
|---|---|
| Directory | docs/briefs/ (relative to the repository root — git rev-parse --show-toplevel when available, otherwise the working directory the session was launched in) |
| Filename | YYYY-MM-DD-<type>-<slug>.md |
YYYY-MM-DD | Today's date on the local system clock |
<type> | Conventional Commits type (see references/work-types.md) |
<slug> | kebab-case short slug, ≤40 chars, derived from the brief title |
| Body format | Markdown, following references/template.md exactly |
Example filename: 2026-04-23-feat-global-hotkey-system.md
If docs/briefs/ does not exist, create it.
If a file with the same name already exists, append -v2, -v3, … until the path is unique — do not overwrite.
For briefset mode, the parent uses YYYY-MM-DD-briefset-<set-slug>.md and children use YYYY-MM-DD-<type>-<set-slug>-NN-<child-slug>.md.
See references/briefset.md for the parent template and naming rules.
The eight required H2 sections are: Work Type, Current State (As-Is), Desired Outcome (To-Be), Scope (with In Scope / Out of Scope H3s), Related Files / Entry Points, Side Effect Checkpoints, Acceptance Criteria, Open Questions.
Optional Constraints may appear between Scope and Related Files / Entry Points when task-specific constraints exist.
Three work types require an additional H2 section between Current State (As-Is) and Desired Outcome (To-Be):
fix → ## Reproductionperf → ## Baseline Measurementrefactor → ## Behavior ContractThese exist because the work type changes the downstream agent's behavior (reproduction-first, measurement-first, behavior-preservation), and the brief must carry the type-specific input that behavior depends on.
The escape hatch when the section legitimately has nothing concrete to capture is a single bullet - N/A — <reason>.
See references/template.md and references/work-types.md for the per-section guidance.
Bullet count is not capped. The rule is cohesion plus completeness, not brevity:
Completeness does not mean "put every discovered issue in scope." When review surfaces many valid concerns, separate them before saving:
In Scope should usually hold the must-fix set plus tightly coupled checks, not the whole discovery list.
Record deferred items in Out of Scope as [deferred] or in Open Questions when the user must decide whether to expand the work.
If more than five independent must-fix concerns remain after this triage, reconsider briefset mode or ask the user to choose the first slice.
Before full codebase review, check whether the input contains enough signal to ground the brief. Use the four-anchor heuristic:
| Anchor | What it answers | Maps to |
|---|---|---|
| PROBLEM | What is wrong or what is changing? | § Current State (As-Is) |
| GOAL | What should be true when it's done? | § Desired Outcome (To-Be) |
| SCOPE | Where does this apply (module, feature area, user surface)? | § In/Out of Scope |
| TARGET | Which part of the system is touched (file, subsystem, layer)? | § Related Files / Entry Points |
Count how many anchors are derivable from the input. Derivable = a reasonable engineer could answer the anchor from the user's input without inventing intent.
All 4 anchors present → CONTINUE to Stage 2.
3 anchors present, TARGET missing → run a narrow target probe before deciding.
Use at most a few rg / glob queries to find likely files, directories, routes, commands, or modules.
If a concrete entry point emerges, CONTINUE.
If not, HALT and ask the user for the target area.
3 anchors present, PROBLEM or GOAL or SCOPE missing → CONTINUE only when the missing anchor can be stated in one concrete sentence derived from the input (write that sentence into the brief; vague fillers like "make it better / cleaner" do not count). Otherwise HALT and ask for that anchor. Detail that survives this check gets filled in Stage 3 via codebase review or Stage 4 via user questions.
2 or fewer anchors present → HALT. Respond in the user's chat language naming exactly which anchors are missing, and ask for more input. Do NOT proceed through Stages 2–6 on an underspecified input. The briefset-mode check below also waits — never split an underspecified input into multiple equally underspecified child briefs. Example halt messages:
English:
I can't ground the brief from this input alone. Missing — PROBLEM (what is being fixed or changed) and TARGET (which area / file / subsystem is touched). Can you paste the spec or add one or two lines?
Korean:
입력만으로는 브리핑 만들기 어려워. 다음이 아직 확인 안 돼 — PROBLEM(뭘 고치거나 바꾸는지)과 TARGET(어느 영역/파일/시스템을 건드리는지). 더 얹어줄래? 기획서 붙여넣거나 한두 줄 더 써주면 돼.
Why halt instead of guess: an underspecified brief is worse than no brief — the downstream agent commits to the wrong problem framing and the rework cost eats the whole savings. Pushing back early is cheaper than producing a confident-looking but wrong document.
Edge case — pasted spec that looks long but is content-light: word count is not a proxy for the four anchors. A 2,000-word product narrative without a concrete PROBLEM or TARGET still halts. Judge by anchor coverage, not length.
See examples/03-halt-ambiguous.md for a worked halt case.
Briefset signal check (after CONTINUE): once anchors clear, also evaluate whether the input describes multiple execution contexts. Do not use file count, line count, input length, or several related edit points as triggers by themselves. Those are supporting evidence only.
If briefset signals are strong, recommend briefset mode and ask the user to choose before Stage 2 instead of switching silently.
If the candidate contexts are fully independent — no ordering, no dependencies, no shared conflict hotspots — recommend separate single-brief invocations (one per task) instead of a briefset: a parent whose coordination sections are all - None — <reason> adds overhead without value.
Use the user's chat language and keep the question short.
Korean example:
다중 브리프로 나누는 것이 권장됩니다. 실행 단위가 독립적이고 순서/병렬 조정이 필요해 보입니다. 어떻게 진행할까요?
- 다중 브리프로 생성
- 단일 브리프로 유지
If the user chooses briefset, continue with references/briefset.md.
If the user chooses single-brief, keep one cohesive brief and document the requested execution ordering in Constraints / Acceptance Criteria as needed.
If the evidence is unclear, default to single-brief mode and let Stage 4 surface the question.
Determine the Conventional Commits type.
Consult references/work-types.md for the full list and per-type behavior hints.
See references/work-types.md for the full type-confirmation routing table (explicit-agree / explicit-conflict / high-confidence implicit / low-confidence implicit).
The goal is enough context to fill Current State (As-Is) and Related Files / Entry Points, not exhaustive exploration.
Use whatever code search / read / symbol tooling fits the host environment and repository guidance — default Grep / Read / Glob, allowed semantic tools, language servers, or a short-lived subagent (e.g. Explore) when parallel lookups or main-context isolation is worth it.
Tool choice is the runtime's call; this stage only fixes the purpose and budget of the review.
Review budget (soft limits):
Open Questions so the downstream agent inherits them rather than having them silently dropped.Strategy:
Active judgement:
Constraints, Out of Scope as [deferred], Side Effect Checkpoints, or Acceptance Criteria.
Ask only when the choice changes product behavior, scope, ownership, or acceptance in a way the requester must own.Current State (As-Is) / Side Effect Checkpoints, and put the intended observable outcome in Desired Outcome (To-Be) / Acceptance Criteria.Evidence discipline:
Contract discipline:
Constraints or Side Effect Checkpoints, not as vague Out of Scope filler.
Good: - [ ] Existing saved sessions with status "pending" still deserialize.
Bad: - [ ] Do not break compatibility.Source-of-truth inputs. When the user provides a checklist, TODO file, review rubric, audit notes, or any document as the source of truth, do not turn it into a representative summary.
If the source document is long, keep a private coverage ledger during review. The ledger does not need to be saved, but every source item must end as one of: in scope, out of scope / deferred, acceptance criterion, side-effect checkpoint, related file, constraint, or open question.
Do not:
Current State (As-Is) or Related Files / Entry Points, skip it.Open Questions instead.After Stage 3 has gathered enough codebase context, collect the remaining ambiguous or user-owned decisions into a Markdown decision table. Stage 4 is not a pre-review guessing interview: ask only after the codebase has been checked enough to state the uncertainty, the recommended change, and the evidence behind it.
Use this exact table shape for user-decision questions:
| 순번 | 내용 | 수정 추천안 | 근거 |
|---|---|---|---|
| 1 | <decision the user must make> | <recommended change to apply to the brief> | <codebase/input evidence and risk> |
Keep these four headers exactly as written, even when the surrounding conversation is not Korean. They are the stable decision-table contract: number, decision content, recommended change, and rationale.
Required gaps to close before drafting:
Decision-table rule. Each row must be a real decision, not a vague status note.
내용 states what the user must decide.
수정 추천안 states the concrete brief change you recommend.
근거 cites the input, codebase finding, existing pattern, or risk.
After the user answers, patch the draft plan in memory before composing the brief.
Full decision classification, table rules, and termination rules live in references/stage-4-interview.md.
Before writing Open Questions:
Open Questions to avoid making an implementation recommendation.
If the answer is a reasonable bounded choice, put that choice directly into Scope, Constraints, Side Effect Checkpoints, or Acceptance Criteria.Open Questions for user-owned decisions only.
Product direction, scope expansion, tradeoffs, acceptance thresholds, ownership, and sequencing can require a question.
Routine implementation choices and weak adjacent signals usually should not.Open Questions: None is acceptable only after this pass.
It means "a downstream agent can proceed without re-interviewing the requester," not "nothing interesting was found."Once Stage 4 closes, compose the final Markdown internally and write it straight to disk — do not paste the full brief into chat first. The user reviews the file in their editor in Stage 6, where real markdown rendering and diff tooling are available.
Compute the filename per the Output Contract above.
Ensure docs/briefs/ exists; create it if not.
Resolve filename collisions by appending -v2, -v3, ….
Render the complete template from references/template.md and write the file (English section headers, English body).
Run the structural validator — a fast smoke test for the template contract:
python3 <skill-dir>/scripts/validate_brief.py docs/briefs/<filename>.md
<skill-dir> is the installed skill package directory — the directory containing this SKILL.md (resolve it from wherever this skill was loaded, e.g. ~/.claude/skills/task-brief-creator or a plugin cache).
Never assume the user's repository contains the script: the brief lives in the user's repo, the validator lives with the skill.
The validator only checks structural conformity (section presence, checklist format, filename pattern, type coherence). It does not judge content quality — that's what the Stage 5.5 downstream interpretation check, Stage 5.6 self-check, Stage 5.7 cold-pickup, and the human review in Stage 6 are for. Passing validator ≠ good brief; failing validator = malformed brief.
After the structural validator passes, run a blind downstream interpretation check before any cold-pickup verification. This is not a review prompt and not a rubric-driven validation prompt. Its purpose is to observe how a fresh downstream agent naturally interprets the saved brief as work to start. This checks direction and intent alignment, not full input coverage; Stage 5.6 remains the coverage and missing-content check.
Spawn a sub-agent and send only a natural work-start request in the user's ordinary style, containing the saved brief path. For briefset mode, include only the briefset parent path. Do not include the original user request, Stage 3 findings, Stage 4 decisions, suspected gaps, validation criteria, expected answer format, or any hint about what might be wrong. Do not ask the sub-agent to "verify", "review", "audit", "compare", or "find missing items".
Example shape only — do not hard-code this sentence:
<brief path> 작업 진행할꺼야. 우선 이 브리프 파일을 확인하고 어떻게 작업할껀지 의도 설명해줘.
Compare the sub-agent's natural interpretation against the user's original request and any user-locked Stage 4 decisions. Treat only material drift as a failure:
If material drift appears, patch the brief in place, re-run the structural validator (validate_brief.py for a single brief, validate_briefset.py for a briefset parent), and run this downstream interpretation check again with the same information boundary.
Do not fix drift by changing the sub-agent prompt.
Fix the brief.
This check is mandatory whenever the host can spawn a sub-agent. Do not downgrade it to a self-check because the brief looks obvious or because Stage 5.6 is clean. The failure being tested is not "did I cover the input?" but "does a fresh agent naturally read the brief the way I intended?"
If the host cannot spawn a sub-agent, report the interpretation check as unavailable in Stage 6. Do not block the workflow waiting for sub-agent support; continue to Stage 5.6 and mark Stage 5.5 as unavailable in the save report. Do not replace it with a self-check; the point is the downstream agent's natural read.
The structural validator confirms the file has the required sections. It does not confirm the file is a complete work instruction. Before handing off in Stage 6, re-read the saved brief from disk and run a content-coverage self-check against the original input plus Stage 3 / Stage 4 findings. This checks whether input and codebase concerns survived into the brief; do not treat a clean Stage 5.5 interpretation as proof that nothing is missing.
The brief is a work instruction, not a summary. Any concern that existed in the input must survive into the brief — possibly reshaped into the right section, never silently dropped. Run this checklist:
Out of Scope as [hard] or [deferred], or in Open Questions when the user must decide.
Two unrelated implementation or verification obligations are never merged into one bullet.Related Files / Entry Points, and every uncertainty raised by the review either appears in Open Questions or was explicitly resolved during Stage 4.Constraints, Side Effect Checkpoints, or Acceptance Criteria; compatibility-sensitive changes are not hidden behind generic wording.only on cold start, ≤ 5KB gzipped, iOS Safari 17+, after move end).
"Executable, not discursive" is a prose rule, not a content rule.Open Questions item is genuinely user-owned.
If the item can be handled by a reasonable recommendation, move it into the brief as a decision, constraint, checkpoint, or deferred item.
If Open Questions says None, the brief has made the necessary calls instead of hiding them.If any check fails, fix the brief in place with Edit, then re-run the structural validator (validate_brief.py for a single brief, validate_briefset.py for a briefset parent).
Because the file changed after Stage 5.5, re-enter the validation chain at Stage 5.5 before running Stage 5.6 again.
Loop until the latest saved file passes Stage 5.5 and Stage 5.6 in order.
The self-check outcome is a separate signal from the structural validator and downstream interpretation check — all are reported in Stage 6. A brief can pass structural validation and still fail this self-check; in that case the file is incomplete even though it is well-formed.
For briefset mode, run the self-check on the parent and on every child independently. The parent's coverage check asks whether every input-implied execution context maps to a child; each child's coverage check uses the same five items above.
The Stage 5.6 self-check is self-evaluated — the same agent that wrote the brief grades it for cold-pickup readiness. That is biased. An untouched sub-agent reading only the original input and the saved brief is the truthful version of the cold-pickup test.
Stage 5.7 runs signal-gated by default — automatically ON only when the brief's workflow signals indicate non-trivial verification value. This avoids spawning sub-agents for trivial briefs while keeping the safety net for complex ones. This skill's contract authorizes the sub-agent spawn when the gate fires; do not skip a gated-ON run based on host defaults like "be conservative about sub-agent cost" or "don't run extra verification unless asked".
Auto-ON triggers (any one fires Stage 5.7):
references/cold-pickup.md before running; Force OFF on the briefset skips the whole set.Open Questions section is non-empty — i.e. it does not consist solely of - None — <reason> (Stage 3 surfaced unresolved uncertainty that survived Stage 4).fix, perf, or refactor — fires regardless of input simplicity. The type-conditional section (Reproduction / Baseline Measurement / Behavior Contract) amplifies drift risk on these types, so cold-pickup pays off even for short inputs. Use Force OFF if you want to skip a one-line fix.Auto-OFF (trivial signals). When none of the auto-ON triggers fire, Stage 5.7 is skipped automatically.
The Stage 6 banner reports the skip with the signal snapshot — cold-pickup skipped: trivial signals (single-brief, stage-4-rows=0, open-questions=none, type=<type>) — so the user can see exactly which gates evaluated to false.
User override. Force ON runs Stage 5.7 despite trivial signals (e.g. run cold-pickup, --cold-pickup, 콜드픽업 강제); Force OFF skips it despite firing signals (e.g. skip cold-pickup, --no-cold-pickup, 콜드픽업 끄기).
The full trigger-phrase lists and the rule for inputs containing both live in references/cold-pickup.md.
Skip on validator failure. Stage 5.7 is also skipped when the Stage 5 structural validator failed — the brief is not yet well-formed enough to verify.
Reasons that are not valid skips when a gate has fired: token budget, latency, inferred host policy, "the brief looks fine". If a gate fires and Stage 5.7 is skipped anyway, the Stage 6 banner is wrong and the loop is broken.
Mechanism — when the gate fires, read references/cold-pickup.md (report schema, pass bookkeeping, routing table, termination triggers, banner formats), then:
Explore or general-purpose sub-agent.
If the host cannot spawn sub-agents, use the Sub-Agent Unavailable Fallback in the reference — never silently skip a gated-ON run.Drift handling. When the report's verdict is needs_changes or blocked, or when any unrejected ask_backs / missing_concerns survive routing — Edit the saved brief in place to close the gap, re-run the structural validator, re-enter Stage 5.5, then Stage 5.6, and only then re-evaluate the Stage 5.7 gate.
Route every ask_backs[*] / missing_concerns[*] through the routing table in the reference before patching, including the disagreement-vs-drift check against answered Stage 4 rows.
Loop until one of the six termination triggers in the reference fires (Regression, Oscillation, Stable findings, Clean pass, No-op pass, Hard cap — evaluated in that priority order).
Cold-pickup never overrides a Stage 4 decision the user already locked, never invents Acceptance Criteria, Side Effect Checkpoints, or Out-of-Scope guardrails the input did not imply, and never silently rewrites Open Questions — drift fixes either resolve a question into another section or leave the question intact for the user.
Reporting. The cold-pickup outcome integrates into the Stage 6 save banner alongside the structural validator, Stage 5.5 downstream interpretation check, and the Stage 5.6 self-check, using the banner phrasings in references/cold-pickup.md.
For briefset mode, the banner uses the collapsed parent + K/N children format from the reference — one summary line plus details only on flagged children, not one line per child.
The brief is on disk. Hand off to the user for review.
Report the path, a one-line summary (work type + title), the structural validator result, the Stage 5.5 downstream interpretation result, the Stage 5.6 self-check result, and the Stage 5.7 cold-pickup result. Use the user's chat language. All four signals are reported together so the user can see whether the file is well-formed, naturally interpreted as intended, complete, and cold-pickup-ready.
English (validator + self-check + cold-pickup passed):
Saved —
docs/briefs/2026-04-23-feat-dark-mode-settings.md(feat: Dark mode toggle in Settings; structural validation passed; downstream interpretation aligned; content self-check passed — major input concerns reflected; cold-pickup terminated withclean_passafter 1 pass (no ask-backs, no missing concerns)). Open it and let me know if anything needs editing.
Banner termination trigger reflects the actual loop outcome — clean_pass (normal), regression, oscillation, stable_findings, no_op, or hard_cap. Any non-clean_pass trigger means residual concerns must follow in the banner as bullet items.
Korean (validator + self-check + cold-pickup passed):
저장 완료 —
docs/briefs/2026-04-23-feat-dark-mode-settings.md(feat: Dark mode toggle in Settings; 구조 검증 통과; downstream 해석 일치; 내용 자체 검증 통과 — 입력의 주요 항목 반영됨; cold-pickupclean_pass로 1회 만에 종료 (ask-back 없음, missing 없음)). 파일 열어보고 고칠 부분 있으면 알려줘.
English (validator + self-check passed, cold-pickup auto-skipped on trivial signals):
Saved —
docs/briefs/2026-04-23-feat-dark-mode-settings.md(feat: Dark mode toggle in Settings; structural validation passed; downstream interpretation aligned; content self-check passed — major input concerns reflected; cold-pickup skipped: trivial signals (single-brief, stage-4-rows=0, open-questions=none, type=feat)). Tell merun cold-pickupor--cold-pickupif you want the sub-agent verification anyway.
English (validator failed):
Saved —
docs/briefs/2026-04-23-feat-dark-mode-settings.md, but the structural validator flagged 2 issue(s): ✗ ✗ The file is on disk. Want me to patch these, or will you edit directly?
Mirror any banner into the user's chat language as the Korean example above shows — translate the prose, keep paths, filenames, and technical fields (trivial signals (...), termination triggers, validator messages) verbatim.
When the structural validator fails, Stage 5.5, Stage 5.6, and Stage 5.7 are skipped — the brief is not yet well-formed enough to run interpretation, content, or cold-pickup checks against.
The banner stays as shown; do not append self-check skipped / cold-pickup skipped lines in this case.
If Stage 5.5 surfaced material interpretation drift that you fixed in place, mention what you patched so the user knows the brief was corrected before handoff (e.g., "downstream interpretation drifted toward API cleanup; clarified UI-only scope, re-validated").
If the structural validator passed but the Stage 5.6 self-check surfaced gaps that you fixed in place, report it the same way (e.g., "self-check found 2 input concerns missing from In Scope; added them, re-validated").
If Stage 5.7 patched the brief after cold-pickup drift, report it the same way (e.g., cold-pickup flagged 2 gap(s); patched in place).
If the user used Force OFF triggers, report cold-pickup skipped per user request.
If Stage 5.7 was auto-skipped because no auto-ON trigger fired, report cold-pickup skipped: trivial signals (...) with the signal snapshot shown in the banner case above.
If the user requests changes, apply them with Edit against the on-disk file.
Do not re-render the full brief into chat — that defeats the point of save-then-review.
Re-run the structural validator after each edit pass, then re-run Stage 5.5 and Stage 5.6, then re-evaluate the Stage 5.7 gate and report the delta.
If the saved single brief contains Open Questions that require a user decision (after any Stage 5.7 patches have landed), present them immediately after the save report using the same four-column decision table from Stage 4:
| 순번 | 내용 | 수정 추천안 | 근거 |
|---|---|---|---|
| 1 | <Open Question requiring user decision> | <recommended patch to apply to the brief> | <why this cannot be delegated safely> |
After the user answers, patch the saved brief in place, move resolved questions into the appropriate sections, leave only genuinely unresolved or delegated questions in Open Questions, re-run the validator plus Stage 5.5 downstream interpretation check and Stage 5.6 self-check, then re-evaluate the Stage 5.7 gate.
The user owns "done." Do not stage or commit the file. Loop on Stage 6 until they explicitly stop.
Why save-then-review: an earlier iteration rendered the full brief in chat for approval before writing to disk.
In hands-on use that flooded the conversation with markdown that renders poorly inside a code fence and was awkward to edit conversationally.
Writing to disk first lets the user review in their editor (real markdown, real diff tools, real inline edits) and lets the validator surface structural issues immediately.
The tradeoff — a file briefly on disk before approval — is neutral: docs/briefs/ is the intended home for these files, and the commit step stays with the user.
See references/template.md for:
The emitted brief is in English. Chat interaction language follows the user's input.
See references/work-types.md for:
See examples/ for worked end-to-end scenarios (input → codebase review → interview → output).
Start with examples/README.md for the index.
scripts/validate_brief.py is a stand-alone Python 3 script (no external deps) that verifies structural conformity of a saved brief.
It runs as step 5 of Stage 5 (save + validate) but can also be run ad-hoc against any existing brief.
Always resolve the script path against <skill-dir> — the installed skill package directory containing this SKILL.md — never against the user's repository:
python3 <skill-dir>/scripts/validate_brief.py \
docs/briefs/2026-04-23-feat-global-hotkey-system.md
Exit codes: 0 pass, 1 structural failure, 2 file I/O error.
Scope of the validator (deliberately structural only):
In Scope / Out of Scope H3s; duplicate H2 sections are rejected.Reproduction / Baseline Measurement / Behavior Contract) present and populated for the matching type.- [ ] format in checklist sections; populated Open Questions with - None — <reason> when no questions remain.Related Files / Entry Points resolve on disk (skipped only when the exact literal token (proposed) appears immediately after that inline-code path).Constraints heading shape.Out of Scope bullets without [hard] or [deferred] classification.
The validator does not judge whether the classification is semantically correct.Out of scope (still on the human): concreteness of bullets, whether Out-of-Scope entries are real guardrails vs. filler, whether entry points are good (the path-existence check only catches fabricated paths, not poorly-chosen ones), whether Acceptance Criteria are measurable, whether the type-conditional section's content is sufficient.
For briefset mode, use scripts/validate_briefset.py on the parent file — it validates the parent structure and re-runs validate_brief.py's checks transitively on every referenced child brief, so one invocation covers the whole set:
python3 <skill-dir>/scripts/validate_briefset.py \
docs/briefs/2026-04-30-briefset-checkout-i18n.md
Same exit codes.
See references/briefset.md for what the parent validator checks and what stays on the human reviewer.
Related Files / Entry Points is mandatory because it is the downstream agent's starting route.
If the codebase review does not surface at least one concrete file, directory, route, command, module, related brief, or confirmed proposed path, ask the user to provide or confirm the entry point before saving the brief.PaymentService interface" is a real guardrail.[deferred] or Open Questions.Out of Scope tells the downstream coding agent what not to do.
Put bounded implementation choices in Constraints, and user-owned unresolved choices in Open Questions.references/briefset.md).
Briefset mode is the supported way to handle multi-context work — do not stuff multiple unrelated tasks into a single brief unless the user explicitly chooses single-brief after the recommendation, and do not nest briefsets (a child cannot become a parent).
When the contexts share no dependency, no ordering, and no conflict hotspot, recommend separate single-brief invocations instead of a briefset (see Stage 1).references/stage-4-interview.md for the table rules and termination conditions.Self-check before invoking Write in Stage 5.
The structural validator catches format errors after the fact; this list catches content gaps it cannot see.
YYYY-MM-DD-<type>-<slug>.md.<type> is one of the ten Conventional Commits types.# [<type>] <title>.Current State (As-Is) and Desired Outcome (To-Be) are both populated and distinguishable.fix / perf / refactor, the type-conditional section (Reproduction / Baseline Measurement / Behavior Contract) is present and populated — - N/A — <reason> if genuinely none.Out of Scope has at least one specific entry (or an explicit "None — self-contained." with rationale).
Use [hard] for must-not-touch guardrails and [deferred] for follow-up work when the distinction matters.Acceptance Criteria are measurable (checkable, not aspirational).Related Files / Entry Points entries are existing repo paths, verified references, or confirmed proposed paths.
Paths under inline-code that are not yet created carry the exact literal token (proposed) immediately after that path so the structural validator does not flag them as fabricated — variants like (proposed edit) are not recognized, and a marker elsewhere in the line does not skip path validation.
Each entry routes the agent's first read or first edit, not just "related file" context.Open Questions uses - None — <reason> only after one active judgement pass: user-owned decisions are asked, reasonable implementation calls are made in the brief, and weak adjacent signals are left for the Stage 6 report instead of becoming questions.Evaluated after Stage 5.5 / 5.6 / 5.7 have run or been skipped, immediately before reporting the Stage 6 banner — these items cannot be checked before Write.
Open Questions / type ∈ {fix, perf, refactor}) OR the user used Force ON triggers.trivial signals (...) snapshot when no auto-ON trigger fired and no Force ON was used.cold-pickup skipped per user request) when Force OFF was used, even if auto-ON triggers would have fired.npx claudepluginhub buyoung/skills --plugin backend-skillsGenerates structured, executable work briefs in caveman prose from planning notes or rough task descriptions, routing downstream agent behavior by Conventional Commits type.
Builds manifests to plan work, scope tasks, spec requirements, and break down complex tasks before coding. Converts needs into deliverables, invariants, and verification criteria for features, bugs, refactors.