Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
643f7ff
docs: harvest 5 design spec and trace — v1.0.0
j4th Sep 30, 2026
1fee19b
docs: harvest 5 implementation plan — v1.0.0
j4th Sep 30, 2026
60b24a6
feat(verification): V1 — the runner's third rail, pinned by a fixture…
j4th Sep 30, 2026
9a8765e
fix(verification): V1 — a Stop hook that could not look is red in the…
j4th Sep 30, 2026
54e4eec
feat(verification): V1 — the budget line warns above 140,000 always-l…
j4th Sep 30, 2026
146d304
fix(scaffold): V1 — a freshly scaffolded target passes its own verifi…
j4th Sep 30, 2026
c27ee70
feat(blueprint): V1 — the templates wire the verification block into …
j4th Sep 30, 2026
73435f9
docs(verification): V1 — name the bracket idiom's cost for a spellche…
j4th Sep 30, 2026
328a9d8
ci: V1 — the kit's verify job runs an explicit bash on a named image
j4th Sep 30, 2026
7be54f7
fix(V2): the ADR job parses no paths, diffs from the merge base and f…
j4th Sep 30, 2026
2512548
fix(V2): the ADR guard resolves the path it judges, through a shared …
j4th Sep 30, 2026
fb1082e
fix(V2): every fail-open names its backstop; an unreadable payload is…
j4th Sep 30, 2026
ed18634
fix(V2): the main-branch and PR-state patterns anchor on non-word cha…
j4th Sep 30, 2026
0cd407d
fix(V2): the launch-root guard refuses what it cannot read; both agen…
j4th Sep 30, 2026
34629a8
feat(V2): the block checks that every backstop a rule names exists
j4th Sep 30, 2026
7710cec
docs(V2): the frozen-corpus recipe carries the CI job's closures, one…
j4th Sep 30, 2026
f89616b
docs(V2): section Hook authoring names every hook family's fixture an…
j4th Sep 30, 2026
9bb8a99
fix(commands): V3 — commands take their argument by name and are invo…
j4th Sep 30, 2026
7b37392
fix(settings): V3 — hook registrations in exec form
j4th Sep 30, 2026
872cdd1
fix(settings): V3 — plugin ids name their marketplace; the settings m…
j4th Sep 30, 2026
f868c2b
refactor(settings): V3 — the hook registry comment is a registry
j4th Sep 30, 2026
61877bd
fix(agents): V3 — the Explore override skips CLAUDE.md and says it is…
j4th Sep 30, 2026
44060a2
fix(commands): V3 — report and comment text is data; /pr-respond read…
j4th Sep 30, 2026
d6b35aa
fix(rules): V3 — reviewer citations resolve, per-tick debug is permit…
j4th Sep 30, 2026
8d955e2
fix(review-bot): V4.1 — bash with pipefail, a named runner and here-s…
j4th Sep 30, 2026
67ba8a3
feat(review-bot): V4.2 — review one-way-door markdown, job-level conc…
j4th Sep 30, 2026
00073be
fix(review-bot): V4.3 — the review assertion reads every page, keys o…
j4th Sep 30, 2026
56d0241
feat(review-bot): V4.4 — family aliases, explicit effort and the reco…
j4th Sep 30, 2026
be4730c
feat(review-bot): V4.5 — the reviewer knows which configuration is th…
j4th Sep 30, 2026
f44aaf4
docs(review-bot): V4.6 — constraint 1 as the action states it; toolin…
j4th Sep 30, 2026
ace8893
refactor(rules): V5 — knowledge-backend.md splits into a contract and…
j4th Sep 30, 2026
84c2e5d
fix(rules): V5 — the knowledge-backend ask-gate points at its tier; N…
j4th Sep 30, 2026
1ce8344
fix(rules): V5 — the ladder starts at Opus 5.5; aliases by provider, …
j4th Sep 30, 2026
ff21e4e
fix(rules): V5 — effort defaults are per model and per surface; think…
j4th Sep 30, 2026
eb81318
refactor(rules): V5 — the dispatch surfaces carry no count; skill fro…
j4th Sep 30, 2026
4b0b794
feat(rules): V5 — caps with their changelog, the teammate trap, panel…
j4th Sep 30, 2026
ba8987c
feat(rules): V5 — a text-only end of turn is a report; over-verificat…
j4th Sep 30, 2026
b114a8b
fix(rules): V5 — the triad's task-tracking leg is a tracked checklist
j4th Sep 30, 2026
4e6981f
feat(rules): V5 — delegating implementation: /finish stays inline, me…
j4th Sep 30, 2026
10824e7
fix(rules): V5 — the floor names a workflow agent among the contexts …
j4th Sep 30, 2026
fa110f0
fix(rules): V5 — /simplify's changelog history replaces a local 2.1.2…
j4th Sep 30, 2026
faae61a
feat(skills): V5 — grounding rule 4 checks which binary a tool name r…
j4th Sep 30, 2026
87d776d
fix(rules): V5 — the reference half ships no template slot; a filled …
j4th Sep 30, 2026
bbd9193
docs(rules): V5 — orchestration-reference.md restamped: quotations re…
j4th Sep 30, 2026
9ce1e8d
feat(workflows): V6 — agent-cost prices by model version, and the blo…
j4th Sep 30, 2026
1da75f2
feat(workflows): V6 — finish-ab runs two to four arms under a Latin-s…
j4th Sep 30, 2026
ae13b00
feat(workflows): V6 — run-arms-headless.py runs finish-ab arms as hea…
j4th Sep 30, 2026
10f2583
feat(workflows): V6 — the finish-ab rubric and brief state no arm cou…
j4th Sep 30, 2026
a1064fb
fix(review-sweep): V7 — log why the roster read threw
j4th Sep 30, 2026
8a5f50f
feat(review-sweep): V7 — caller-named finders carry a prompt
j4th Sep 30, 2026
1a15e93
feat(review-sweep): V7 — dedup on file and line, carrying every title
j4th Sep 30, 2026
4a60f47
feat(review-sweep): V7 — finders and verifiers never modify the worki…
j4th Sep 30, 2026
2d0c895
feat(review-sweep): V7 — finder briefs end on the Sonnet 5.5 think-fi…
j4th Sep 30, 2026
574bc1a
docs(pr-review): V7 — an interrupted floor or sweep is re-run fresh
j4th Sep 30, 2026
777a336
docs(pr-review): V7 — one verification workflow per post-floor delta,…
j4th Sep 30, 2026
21f9d25
docs(pr-review): V7 — anti-pattern: folding one review layer into ano…
j4th Sep 30, 2026
595f4f1
docs(pr-review): V7 — enumerate a family of directories on the roster…
j4th Sep 30, 2026
ccf5642
docs(rough-in): V7 — a change made at the gate is a new draft, verifi…
j4th Sep 30, 2026
b4ad734
fix(pr-respond): V7 — the NOT-list agrees with Step 7's round-block a…
j4th Sep 30, 2026
0987e43
docs(pr-review): V7 — the four-class rubric names its classes and its…
j4th Sep 30, 2026
937af7b
docs(pr-review): V7 — a docs-only PR may skip the sweep, never the floor
j4th Sep 30, 2026
6bba73c
docs(pr-review): V7 — the review rule cites its own floor, not STANDA…
j4th Sep 30, 2026
1ad9c62
fix(hygiene): V8 — Dependabot covers container images; name its three…
j4th Sep 30, 2026
771fe43
fix(hygiene): V8 — mise inline tasks run under bash with pipefail
j4th Sep 30, 2026
9c8ff4d
fix(hygiene): V8 — rebuild .mcp.json.example; an MCP server is a depe…
j4th Sep 30, 2026
54b610c
fix(hygiene): V8 — the .gitignore harness block, anchored and pinned
j4th Sep 30, 2026
d91e9fb
fix(hygiene): V8 — keep kit code out of a target's formatter; exempla…
j4th Sep 30, 2026
65a4f97
fix(executor): V9.1 — /finish cites the conventions and admits a meta…
j4th Sep 30, 2026
7b987b2
docs(executor): V9.2 — a capstone PR names its milestone issue in its…
j4th Sep 30, 2026
d9234b8
docs(conventions): V9.3 — any issue a PR closes keys its branch (D54)
j4th Sep 30, 2026
f778489
docs(rules): V9.4 — STANDARDS citations name headings the template emits
j4th Sep 30, 2026
25d515d
docs(skills): V9.5 — citations name sections that exist
j4th Sep 30, 2026
29d0620
docs(adr-new): V9.6 — point at § ADR relation grains; read the index'…
j4th Sep 30, 2026
a98aaab
docs(backends): V9.7 — board-automation rail dated, progress field so…
j4th Sep 30, 2026
450ed08
docs(rough-in): V9.8 — eight sections everywhere the spec body is des…
j4th Sep 30, 2026
4d4c8ac
docs(rough-in): V9.9 — one acceptance-criteria form across contract, …
j4th Sep 30, 2026
45ab4e2
docs(skills): V9.10 — the planning axis has one name: in-repo-markdown
j4th Sep 30, 2026
01fb6ac
docs(skills): V9.11 — no citation of a methodology register file the …
j4th Sep 30, 2026
24b3942
docs(conventions): V9.12 — the CI-skip trap cites GitHub and names ev…
j4th Sep 30, 2026
afcdc56
docs(scaffold): V9.13 — Linear's free plan, dated at the pricing page
j4th Sep 30, 2026
5b7a716
docs(scaffold): V9.14 — the label taxonomy creates the labels the flo…
j4th Sep 30, 2026
04054f4
docs(scaffold): V9.15 — the reference and checklist agree with SKILL.md
j4th Sep 30, 2026
8e9d206
docs(skills): V9.16 — count ranges agree with the contracts
j4th Sep 30, 2026
5197a63
docs(skills): V9.17 — the restamp item on framing's and rough-in's ex…
j4th Sep 30, 2026
2a43bf2
docs(blueprint): V9.18 — the doc count matches the table: six, seven …
j4th Sep 30, 2026
65dd1ee
docs(rules): V9.19 — the reference halves' pointer claim is checked
j4th Sep 30, 2026
624890a
docs(skills): V9.20 — the kit's examples use invented names
j4th Sep 30, 2026
7a3fa32
docs(portability): V9.21 — no sibling name, no bare kit-issue number …
j4th Sep 30, 2026
2a77769
docs(plan): V9.22 — bracket-split the private target's name in the ha…
j4th Sep 30, 2026
50cb7b5
feat(V10): § Syncing the kit speaks in versions; scaffold records the…
j4th Sep 30, 2026
e0912fb
docs(V10): CHANGELOG.md — v0.1.0 to v1.0.0, each release with its Syn…
j4th Sep 30, 2026
811383a
docs(V10): README — install the drop-in set from a tagged release, an…
j4th Sep 30, 2026
ca844f3
docs(V10): CLAUDE.md — the kit has a gate, releases are tags, and a h…
j4th Sep 30, 2026
d415114
docs(V10): LICENSE names its copyright holder
j4th Oct 1, 2026
c4d8c36
refactor(hooks): one jq call reads and checks each guard's payload
j4th Oct 1, 2026
cd8a8ff
refactor(workflows): run-arms-headless builds the first argv once, fo…
j4th Oct 1, 2026
576d697
fix(tests): two fixtures commit with signing off, like the other seven
j4th Oct 1, 2026
6b954a2
refactor(tests): hook-guards-fixture runs its no-decision PR commands…
j4th Oct 1, 2026
12f289d
fix(hooks): a guard refuses a payload field that is not a string, and…
j4th Oct 1, 2026
ec17e0a
fix(workflows): agent-cost bills each API response once, not once per…
j4th Oct 1, 2026
55a89d2
fix(hooks): a fail-open warning is shown to the user, not left in the…
j4th Oct 1, 2026
9a366a8
fix(hooks): a commit or PR-state change split by a line continuation …
j4th Oct 1, 2026
349619e
fix(hooks): protect-main-branch allows a new repository's root commit…
j4th Oct 1, 2026
d752a79
test(hooks): one ADR path each that only the lexical or only the phys…
j4th Oct 1, 2026
7f1dade
fix(rules): the block checks every guard's matcher against the tools …
j4th Oct 2, 2026
0e2e324
fix(hooks): the lock-file guard names bun.lockb and npm-shrinkwrap.js…
j4th Oct 2, 2026
2bed51b
fix(workflows): run-arms-headless refuses a bad config before it spen…
j4th Oct 2, 2026
5684420
fix(workflows): finish-ab refuses a misspelled or impossible experime…
j4th Oct 2, 2026
533ece4
fix(workflows): review-sweep refuses malformed arguments and counts o…
j4th Oct 2, 2026
24dc6bb
fix(templates): the review workflow quotes the rule's current wording…
j4th Oct 2, 2026
602dfc4
fix(templates): the @claude workflow gates bots and skip-claude in th…
j4th Oct 2, 2026
83408c6
fix(templates): each review path's prompt states the dispatch rule it…
j4th Oct 2, 2026
e07bed1
fix(templates): the review assertion lands on a bold verdict or the b…
j4th Oct 2, 2026
0e5c278
fix(rules): the block's .mcp.json checks read jq's status, so a malfo…
j4th Oct 2, 2026
700d321
fix(rules): the rule-citation check fails on a misspelled rule name i…
j4th Oct 2, 2026
9428a63
test(workflows): the ADR CI fixture exercises the :(glob) pathspec, a…
j4th Oct 2, 2026
e6da512
fix(rules): every reference half's pointer claim is checked, and the …
j4th Oct 2, 2026
2a798c7
fix(workflows): agent-cost prices 1-hour cache writes at 2x, and only…
j4th Oct 2, 2026
6b36fdf
fix(skills): the blueprint template emits the § Workstreams and § Man…
j4th Oct 2, 2026
d3749f0
fix(rules): the floor's docs-only rule is scoped to cascade PRs, and …
j4th Oct 2, 2026
c6d7367
fix(skills): the Linear label taxonomy creates the labels the Linear …
j4th Oct 2, 2026
11bba65
fix(skills): the handoff issue's bot-uncovered pins match the coverag…
j4th Oct 2, 2026
c098399
docs: CLAUDE.md audits landed trace rows against the head, names /fin…
j4th Oct 2, 2026
6856188
fix(rules): four platform claims re-read at their sources and corrected
j4th Oct 2, 2026
8063291
fix(skills): the planning axis is called in-repo-markdown everywhere,…
j4th Oct 2, 2026
9a31317
fix(rules): one source for which action release installs which Claude…
j4th Oct 2, 2026
ae489c8
docs(readme): the install keeps a .claude/ that is not the kit's, and…
j4th Oct 2, 2026
7147791
docs(changelog): v1.0.0 records the review round, and six claims say …
j4th Oct 2, 2026
660620f
docs: harvest 5 trace — every row closed
j4th Oct 2, 2026
6ba4971
docs(readme): the example scaffold.md records this release and the gi…
j4th Oct 2, 2026
e5f4090
test(V2): record whether the kit's CI runs the bind-mount cases (prob…
j4th Oct 2, 2026
6dfcade
fix(workflows): agent-cost bills each response once across a director…
j4th Oct 2, 2026
c5a3f26
fix(workflows): agent-cost names a row whose output is a streaming sn…
j4th Oct 2, 2026
a037350
fix(workflows): agent-cost bills a response at its best copy and clos…
j4th Oct 2, 2026
eaa5cb8
docs(rules): the kit's dated A/B cost figures re-derived from their o…
j4th Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .claude/agents/Explore.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
---
name: Explore
description: Fast read-only codebase search agent (project override of the built-in Explore, pinned to a low-cost tier per .claude/rules/orchestration.md — search/retrieval is mechanical-tier work; the built-in inherits the session model capped at Opus on the Claude API (code.claude.com/docs/en/sub-agents § Built-in subagents, 2026-09-05), so a top-tier session still pays the workhorse rate for scans; this override keeps them on the smallest tier, which that page endorses). Use for broad fan-out searches where only the conclusion matters. Promote a genuinely hard scan by passing model per-invocation (beats this frontmatter).
description: Fast read-only codebase search. Use for broad fan-out searches where only the conclusion matters; pass a model per invocation to promote a genuinely hard scan.
tools: Read, Glob, Grep, Bash
model: haiku
omitClaudeMd: true
---

You are a read-only search agent. Locate code, files, and naming conventions; report conclusions, not file dumps.
Expand All @@ -11,4 +12,6 @@ You are a read-only search agent. Locate code, files, and naming conventions; re
- Honor the requested breadth: "medium" = the obvious locations; "very thorough" = multiple locations, naming conventions, and spellings.
- Return findings as `file_path:line` references with a one-line explanation each, then a short conclusion. If nothing matches, say so plainly and list where you looked.

No `effort:` pin: Haiku 4.5 has no effort dial (`.claude/rules/orchestration.md` § Generation notes).
Everything you need is in the brief: this agent loads no CLAUDE.md and no project rules, so a convention the search depends on is either named in the brief or found by the search.

About this file, for maintainers: a project agent named `Explore` overrides the built-in and keeps its own `model` field (`https://code.claude.com/docs/en/sub-agents` § Built-in subagents, read 2026-09-30), so every session in a project that ships this file searches on the smallest tier, where the built-in would inherit the session model, capped at Opus on the Claude API. `omitClaudeMd: true` (Claude Code v2.1.271 or later) restores the skip the built-in makes by default: the agent loads no user, project or local CLAUDE.md and no unscoped rules, only managed policy files. Delete this file to keep the built-in Explore. No `effort:` pin: Haiku 4.5 has no effort dial (`.claude/rules/orchestration.md` § Generation notes).
2 changes: 1 addition & 1 deletion .claude/agents/adr-conformance-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ If only a branch name is given, run `git diff main...HEAD` (or against the named
## Constraints

- **Read the actual ADR files.** Don't summarise from memory or from CLAUDE.md — those summaries drift. The ADRs are immutable; reading them is cheap and the source of truth.
- **Be specific.** "Violates ADR-NNNN" is useless without "because the LLM is acting as a controller (line 42 calls `Servo.set_angle/2` directly) instead of emitting a tool call".
- **Be specific.** "Violates ADR-NNNN" is useless without "because the LLM is acting as a controller (line 42 calls `Actuator.set_angle/2` directly) instead of emitting a tool call".
- **Don't flag what isn't a violation.** ADRs don't govern every line; if a change is orthogonal, it's orthogonal. False positives erode trust in this reviewer.
- **A literal ADR clause may be refined — confirm before flagging.** Before reporting "violates ADR-NNNN Dn", check that no `Refines:` child ADR or reconciliation-layer entry narrows that clause for the case at hand. A flag against a correctly-scoped clause is a false-positive, and false-positives erode trust faster than misses.
- **Consult `docs/adr/corrections.md` before flagging a claim.** A citation, figure, attribution or formula already recorded wrong there is cited by the register's own id form (the starter numbers entries `C-NNN`; a register that predates it may number them in prose under per-ADR sections), never restated as a finding; a wrong claim not yet recorded is reported as one, with the register named as its destination.
Expand Down
4 changes: 2 additions & 2 deletions .claude/agents/cascade-rule-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ If only a branch name is given, run `git diff main...HEAD` (or against the named
- **New cascade artifact under `docs/cbk/`** → `cbk-conventions.md` § Mutation discipline (append-only? superseded via a new numbered file, not an in-place edit?)
- **New ADR under `docs/adr/`** → `cbk-conventions.md` § ADR index sync (are all the indexes updated in lockstep?) — note this is the *index-sync convention*, distinct from ADR *decision* conformance, which is `adr-conformance-reviewer`'s job
- **Branch name not matching convention** → `cbk-conventions.md` § Branch naming
- **PR title not Conventional Commits** → `cbk-conventions.md` § Closes-keyword conventions / commit format
- **PR title not Conventional Commits** → `cbk-conventions.md` § Closes-keyword conventions (PR titles are Conventional Commits)
- **`[skip ci]` on a code / test / workflow / task-runner commit** → `cbk-conventions.md` § `[skip ci]` rule
- **Knowledge-backend write reference in a non-cascade-skill code path** → `knowledge-backend.md` § HITL announcement discipline
- **Code that mirrors / re-stores cascade artifacts or ADRs** → `knowledge-backend.md` § no cascade-artifact / ADR mirroring
- **Code that mirrors / re-stores cascade artifacts or ADRs** → `knowledge-backend.md` § The code-adjacent split — canonical (its **Never** list)

2. **Read each intersecting rule.** Don't skim. The "principles" + "operational rules" + "anti-patterns" sections name the contract.

Expand Down
6 changes: 3 additions & 3 deletions .claude/agents/logging-discipline-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ effort: high
memory: project
---

You are a logging-discipline reviewer. The contract is `.claude/rules/logging.md` (project rules). The principle is in `docs/STANDARDS.md` § Logging. Your job is to find places where a code diff violates the logging rules.
You are a logging-discipline reviewer. The contract is `.claude/rules/logging.md` (project rules). Your job is to find places where a code diff violates the logging rules.

## Inputs

Expand Down Expand Up @@ -48,7 +48,7 @@ If only a branch name is given, run `git diff main...HEAD`.

**Anti-patterns** (cite the exact section header from `logging.md`):
- String-interpolated context (e.g., `Logger.info("foo: #{bar}")`) → flag, suggest metadata pattern.
- Per-tick logging in a hot-path loop → flag, suggest the project's telemetry primitive instead (e.g., `:telemetry.execute/3`, OpenTelemetry spans).
- Per-tick logging above `debug` in a hot-path loop → flag, suggest the project's telemetry primitive instead (e.g., `:telemetry.execute/3`, OpenTelemetry spans). A per-tick `debug` call is permitted (`logging.md` § Level taxonomy): name telemetry as the better form (§ Anti-patterns) without flagging it.
- Telemetry-shaped log lines (manual metric formatting in log strings) → flag, suggest emit a telemetry event.

**Sensitive data** (per the project's `logging.md` § Sensitive data):
Expand All @@ -74,7 +74,7 @@ If only a branch name is given, run `git diff main...HEAD`.
- **Read the actual rules file.** It's the source of truth, not your memory of it.
- **Don't review ADR conformance, tests, or general code style.** Other reviewers handle those.
- **Be specific about which sub-rule.** "Violates logging discipline" is useless. Cite the section header from `logging.md` (e.g., "Violates § Anti-patterns: String-interpolated context").
- **Don't flag debug-level logs in non-hot-path code.** The rules permit verbose `debug` everywhere except hot-path loops.
- **Don't flag `debug`-level logs, per-tick state in a hot-path loop included.** `logging.md` § Level taxonomy permits per-tick state at `debug`; flag a per-tick call only above `debug`.
- **Watch for false positives on telemetry consumers.** A telemetry handler that logs at `info` when it observes an event is fine — that's the handler's narrative, not the source's.

## Writing memory
Expand Down
24 changes: 13 additions & 11 deletions .claude/commands/enrich.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
description: Enrich a thin / under-specified issue into a fully-specified, `/finish`-able roughed-in issue — the single-issue sibling of the `rough-in` skill (rough-in for one issue, skipping the framing milestone). Brainstorm to pin intent + resolve the design forks framing would have made, investigate the codebase read-only (fanning out subagents when the surface is broad), then write the eight-section body + a provenance note, retitle to the enhancement-lane form, and relabel `cascade-depth:roughed-in` — all behind HITL gates. Does not land code (`/finish` is the sole code-writer); does not decompose into multiple issues (that's framing). Expects one positional argument — the planning-backend issue id.
argument-hint: <issue-id>
arguments: [issue]
disable-model-invocation: true
---

You are being asked to enrich the thin issue **$1** into a fully-specified, `/finish`-able roughed-in issue.
You are being asked to enrich the thin issue **$issue** into a fully-specified, `/finish`-able roughed-in issue.

`/enrich` is **rough-in for a single under-specified issue** — the single-issue sibling of the milestone `rough-in` skill, rough-in operating on one thin issue instead of a whole milestone. It brainstorms + investigates + shapes; it does **not** implement the fix (that's `/finish`) and it **never lands code**. The lane it produces is the enhancement lane (the enhancement-lane convention in `.claude/rules/cbk-conventions.md`): a *small* net-new capability enriched in place into one roughed-in issue, **skipping the framing milestone**.

Expand All @@ -13,13 +15,13 @@ If the instructions below don't match what you're seeing, **surface the gap to t

## Step 1: Resolve + read the issue

Read issue $1 **and its comments** from the planning backend (the same read you'd use to fetch an issue by id — planning-backend MCP, `gh issue view`, or the in-repo markdown record, per whichever backend this project picked at scaffold).
Read issue $issue **and its comments** from the planning backend (the same read you'd use to fetch an issue by id — planning-backend MCP, `gh issue view`, or the in-repo markdown record, per whichever backend this project picked at scaffold).

Verify + note:

- The issue is **open** (not closed / archived). If closed, ask whether to re-enrich (it may be getting re-scoped) before continuing.
- It is genuinely **under-specified** — a thin title + body, no eight-section spec, not already `cascade-depth:roughed-in`. If it already has the eight sections + the roughed-in label, stop: *"$1 already looks `/finish`-ready. Did you mean a different issue, or do you want me to re-enrich it?"*
- Extract: the **current title**, **body**, **labels** (esp. the framing-backlog marker + `source:*` + the work type), **parent** (a workstream `[<slug>]`?), **comments** (provenance from any upstream triage, prior context), and the **affected workstream slug** (from `area:<slug>` / the body / your read — it must be a locked blueprint slug, `docs/cbk/blueprint.md` § Workstreams).
- It is genuinely **under-specified** — a thin title + body, no eight-section spec, not already `cascade-depth:roughed-in`. If it already has the eight sections + the roughed-in label, stop: *"$issue already looks `/finish`-ready. Did you mean a different issue, or do you want me to re-enrich it?"*
- Extract: the **current title**, **body**, **labels** (esp. the framing-backlog marker + `source:*` + the work type), **parent** (a workstream `[<slug>]`?), **comments** (provenance from any upstream triage, prior context), and the **affected workstream slug** (from `workstream:<slug>` / the body / your read — it must be a locked blueprint slug, `docs/cbk/blueprint.md` § Workstreams).

**Pre-flight:** verify the working tree is clean (`git status --short`) and the project's `check` task is currently green — Step 3 runs a read-only investigation against a known-good baseline. If dirty / red, surface and ask (don't silently fix).

Expand All @@ -33,7 +35,7 @@ Surface, one at a time (`AskUserQuestion` for genuine forks; conversational othe

- **The one-sentence intent** — quotable, clear enough to predict the acceptance criteria.
- **The design forks** — the choices framing would have pinned: mechanism / approach, scope boundary (what's in vs out), defaults + parameters, which existing code / pattern to reuse. Present your read + the alternatives; let the operator steer. Don't silently resolve a fork — surface it even when you have a strong default.
- **The size check** — confirm the capability is genuinely *small* (one `/finish`, no multi-issue decomposition, no sub-dependency on an unbuilt capability, single workstream). **If it proves large, STOP** and surface: *"$1 is larger than the enhancement lane — it needs `framing` → `rough-in` first. Want me to route it to the framing backlog instead?"* Never force a large capability into one issue — honesty about the cascade boundary is the whole point of the lane.
- **The size check** — confirm the capability is genuinely *small* (one `/finish`, no multi-issue decomposition, no sub-dependency on an unbuilt capability, single workstream). **If it proves large, STOP** and surface: *"$issue is larger than the enhancement lane — it needs `framing` → `rough-in` first. Want me to route it to the framing backlog instead?"* Never force a large capability into one issue — honesty about the cascade boundary is the whole point of the lane.

Synthesize into the resolved intent + the resolved forks. Don't move to Step 3 until intent + forks are aligned.

Expand All @@ -55,27 +57,27 @@ Produce: the affected files / modules, the acceptance shape (what observable beh

## Step 4: Shape the issue — eight-section body + provenance + relabel (HITL before any backend write)

Build the issue body using the **exact eight `##` headings `/finish` requires**, verbatim: `## Context`, `## Assumptions`, `## Implementation`, `## Acceptance criteria`, `## Test plan`, `## Done signal`, `## Dependencies`, `## PR contract`. Follow the authoring guidance in the rough-in spec template (`.github/ISSUE_TEMPLATE/cascade-rough-in.md`) and the `rough-in` skill's plan-mode-prompt reference (state intent + constraints, don't over-prescribe; `## Implementation` is the load-bearing plan-mode anchor; name the tests in `## Test plan`; `## PR contract` carries the close marker for $1 per `cbk-conventions.md` § Closes-keyword conventions). Put `- None — all forks resolved during enrichment (see the provenance note).` in `## Assumptions` if the brainstorm resolved everything (it usually has — that's the point).
Build the issue body using the **exact eight `##` headings `/finish` requires**, verbatim: `## Context`, `## Assumptions`, `## Implementation`, `## Acceptance criteria`, `## Test plan`, `## Done signal`, `## Dependencies`, `## PR contract`. Follow the authoring guidance in the rough-in spec template (`.github/ISSUE_TEMPLATE/cascade-rough-in.md`) and the `rough-in` skill's plan-mode-prompt reference (state intent + constraints, don't over-prescribe; `## Implementation` is the load-bearing plan-mode anchor; name the tests in `## Test plan`; `## PR contract` carries the close marker for $issue per `cbk-conventions.md` § Closes-keyword conventions). Put `- None — all forks resolved during enrichment (see the provenance note).` in `## Assumptions` if the brainstorm resolved everything (it usually has — that's the point).

The enhancement-lane contract (the enhancement-lane convention in `cbk-conventions.md`):

- **Title** → `[<slug>:enh] <intent>` (the enhancement-lane title form; `<slug>` is the locked blueprint workstream slug).
- **Labels** → add `cascade-depth:roughed-in`; **drop** the framing-backlog marker (the label that routes an issue to framing); keep `area:<slug>` + `source:*` (when externally-sourced); set the **work-matching type** where the backend has a type field (a net-new capability vs a small refactor/chore).
- **Labels** → add `cascade-depth:roughed-in`; **drop** the framing-backlog marker (the label that routes an issue to framing); keep `workstream:<slug>` + `source:*` (when externally-sourced); set the **work-matching type** where the backend has a type field (a net-new capability vs a small refactor/chore).
- **Parent** → the workstream `[<slug>]` issue (usually already correct).
- **Provenance note** → post a note capturing the **framing + rough-in reasoning collapsed inline**: the resolved forks + rationale, any corrections to the thin body, and a one-line "enriched via the enhancement lane (no framing milestone)." On backends with comments this is an issue comment; on a markdown-only backend it's appended to the issue record. This is the durable audit trail + what `/finish` Step 1 reads alongside the body.
- **Provenance note** → post a note capturing the **framing + rough-in reasoning collapsed inline**: the resolved forks + rationale, any corrections to the thin body, and a one-line "enriched via the enhancement lane (no framing milestone)." On backends with comments this is an issue comment; on the `in-repo-markdown` axis it's appended to the issue record. This is the durable audit trail + what `/finish` Step 1 reads alongside the body.

**HITL gate** — draft the title + body + label changes + the provenance note and **show the full draft**: *"Here's the enriched issue I'll write to $1: title `<title>`, labels `<…>`, body below, plus this provenance note. Apply it?"* On approval, write the issue update (title, body, labels, parent) and post the provenance note to the backend.
**HITL gate** — draft the title + body + label changes + the provenance note and **show the full draft**: *"Here's the enriched issue I'll write to $issue: title `<title>`, labels `<…>`, body below, plus this provenance note. Apply it?"* On approval, write the issue update (title, body, labels, parent) and post the provenance note to the backend.

(Linear-tracked projects only: set the work-type field in the *same* write that sets the title — the backend caches its suggested branch name at that moment; see `cbk-conventions.md`.)

## Step 5: Hand off

End your turn with:

1. The enriched issue — $1 (URL / reference), now `[<slug>:enh]` + `cascade-depth:roughed-in`.
1. The enriched issue — $issue (URL / reference), now `[<slug>:enh]` + `cascade-depth:roughed-in`.
2. The resolved intent + the resolved forks (one line each).
3. The investigation summary — affected subsystems, key constraints, dependencies.
4. The next action — *"`/finish $1` when ready."* (On `in-repo-markdown` planning there is no `/finish`: say *"open a Claude Code session against the enriched markdown record"* instead.)
4. The next action — *"`/finish $issue` when ready."* (On `in-repo-markdown` planning there is no `/finish`: say *"open a Claude Code session against the enriched markdown record"* instead.)
5. Loose threads — anything deferred or worth its own follow-up issue.

## What `/enrich` does NOT do
Expand Down
Loading
Loading