Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
1e1b003
docs(plan): harvest 3 P4 — the github-issues axis, after the draft, d…
j4th Sep 7, 2026
e654e94
feat(scaffold): the .github starters with their bodies — issue forms …
j4th Sep 7, 2026
1cc4f6c
fix(conventions): the required-checks trap as one symptom with three …
j4th Sep 7, 2026
e6ca6db
feat(cascade): the roadmap — a freely mutable status surface blueprin…
j4th Sep 7, 2026
9f3173d
feat(blueprint): the review workflows as templates with their seven c…
j4th Sep 7, 2026
326367e
feat(finish): the PR body is the audit surface for the PR's life; the…
j4th Sep 7, 2026
3a84e14
feat(records): the Extends grain and the relation slots; the correcti…
j4th Sep 7, 2026
8af9d52
feat(conventions): settle-window depth — age is necessary not suffici…
j4th Sep 7, 2026
f2455e7
feat(phases): the cascade-events index template scaffold creates and …
j4th Sep 7, 2026
5e8b019
chore(kit): verification pins for P4, index and README sweep, test cases
j4th Sep 7, 2026
5ca58ec
refactor(framing): the verdict-first corpus is stated once, in rough-…
j4th Sep 7, 2026
414411a
refactor(commands): the three commands cite tooling.md for the symbol…
j4th Sep 7, 2026
ee8f9b3
refactor(rules): the docs-only exception is stated once in pr-review.…
j4th Sep 7, 2026
3aa2e8d
fix(conventions): the blueprint mutation row names its three append-o…
j4th Sep 7, 2026
3397926
refactor(conventions): the two new Quick reference rows are pointers …
j4th Sep 7, 2026
e20fab4
refactor(blueprint): the review workflow template states its two lear…
j4th Sep 7, 2026
96a36ad
style(kit): single blank line at two section boundaries (simplify: si…
j4th Sep 7, 2026
cdf7651
style(records): the Refine-versus-Extend test reads in normal word or…
j4th Sep 7, 2026
512c88e
style(conventions): the deliverable trap's converse stated directly (…
j4th Sep 7, 2026
9e7dccd
refactor(conventions): § Licensing moves to the path-scoped reference…
j4th Sep 7, 2026
176e633
refactor(skills): the gh shape has one home — rough-in's commit refer…
j4th Sep 7, 2026
84395c6
docs(kit): the dependabot example says what it shares with the scaffo…
j4th Sep 7, 2026
98fc3f6
test(kit): one verification assertion per P4 invariant, each with its…
j4th Sep 7, 2026
8d66e61
fix(kit): the adr-new bullet no longer cites the section the architec…
j4th Sep 7, 2026
c3d661c
docs(kit): every platform claim the diff added carries its page and d…
j4th Sep 7, 2026
53ba33b
revert(records): ADR-0000 stays as written — the decision-versus-clai…
j4th Sep 7, 2026
838f7c8
feat(blueprint): the review workflow records its start, lets the acti…
j4th Sep 7, 2026
190b5d1
test(kit): the verification pins Tasks 1–5 named — the starters and t…
j4th Sep 7, 2026
2cdaaf0
docs(skills): the phase-exit checklists carry the new outputs — scaff…
j4th Sep 7, 2026
4a3bc1f
test(kit): the backward sweep has its line under the executor's tests…
j4th Sep 7, 2026
939991a
style(skills): single blank line after the gh-shape subsections (revi…
j4th Sep 7, 2026
8b4a091
fix(blueprint): the re-trigger label step checks the PR's labels inst…
j4th Sep 7, 2026
a26544a
fix(rough-in): the gh shape stops at the first failed command — set -…
j4th Sep 7, 2026
a8e9bfa
docs(scaffold): the detection matrix reads the MCP server's tool list…
j4th Sep 7, 2026
4fbf9d7
docs(adr-new): inputs are proposed from context in one exchange and o…
j4th Sep 7, 2026
0db183d
refactor(conventions): the ADR relation grains (Refine, clause-scoped…
j4th Sep 7, 2026
237d527
refactor(conventions): the required-checks trap's three causes move t…
j4th Sep 7, 2026
053d011
docs(hooks): the launch-root guard's Timing states what a real dispat…
j4th Sep 7, 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
3 changes: 2 additions & 1 deletion .claude/agents/adr-conformance-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ If only a branch name is given, run `git diff main...HEAD` (or against the named
- **A boundary impl** (e.g., a new backend, driver, or adapter) → the ADR that defines the behaviour/interface
- **A new top-level module or service** → architectural ADRs about layering, hot-path vs cold-path placement, or extension seams

3. **Read each intersecting ADR — and follow its `Refines:` / `Supersedes:` chain.** Don't skim; the "Decision" and "Consequences" sections are the contract. If an intersecting ADR is refined or partially superseded by a later one (named in the index, or in a child's `Refines:` / `Supersedes:` field), **load the child too**. A *refiner* narrows a parent clause to a scoped reading *without* superseding it (the parent stays Accepted); a *partial supersession* replaces one named clause while the rest of the parent stands. A parent's literal clause is often narrower in practice than it reads — the scoped reading in the chain is authoritative.
3. **Read each intersecting ADR — and follow its `Refines:` / `Extends:` / `Supersedes:` chain.** Don't skim; the "Decision" and "Consequences" sections are the contract. If an intersecting ADR is refined or partially superseded by a later one (named in the index, or in a child's `Refines:` / `Supersedes:` field), **load the child too**. A *refiner* narrows a parent clause to a scoped reading *without* superseding it (the parent stays Accepted); a *partial supersession* replaces one named clause while the rest of the parent stands. An *extender* adds an obligation beside a parent clause that stays satisfied — the asymmetric case: the parent passes unchanged while the child can fail, so a diff clean against the parent is not clean until every extender is checked. A parent's literal clause is often narrower in practice than it reads — the scoped reading in the chain is authoritative.

**Also read the project's reconciliation layer, if one exists.** Some projects keep a buildable reconciliation document that turns frozen upstream references + charter ADRs into the as-built spec; a scoped reading there is authoritative for the build. Read it before flagging an apparent ADR-literal violation.

Expand All @@ -52,6 +52,7 @@ If only a branch name is given, run `git diff main...HEAD` (or against the named
- **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".
- **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 its `C-` number, never restated as a finding; a wrong claim not yet recorded is reported as one, with the register named as its destination.
- **Don't propose new ADRs.** That's an `/adr-new` invocation, not a review finding.
- **Don't review style, tests, or logging.** Other reviewers cover those. Stay scoped to ADR conformance.

Expand Down
2 changes: 1 addition & 1 deletion .claude/agents/cascade-rule-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The `adr-conformance-reviewer` covers ADRs in `docs/adr/`. The `logging-discipli

The contracts I check for compliance:

Every file under `.claude/rules/` **except** `logging.md` (the logging reviewer's) and the `pr-review.md` pair (the rubric I apply, not a contract I check the diff against). That set is derived, not enumerated — a rule added, split or renamed is in scope the moment it lands. Today it is: `testing.md` (three-regime testing; the named tests trace to acceptance criteria), `cbk-conventions.md` and `cbk-conventions-reference.md` (branch naming, title prefixes, close markers, the `[skip ci]` rule, mutation discipline, workstream slug stability), `simplification.md`, `knowledge-backend.md` (writes HITL-gated and default-SKIP; the repo is canonical for code and cascade artifacts), `workflows.md`, `tooling.md`, `orchestration.md` and `orchestration-reference.md`. Read the reference half of a split rule when the contract's pointer names the section the diff touches.
Every file under `.claude/rules/` **except** `logging.md` (the logging reviewer's) and the `pr-review.md` pair (the rubric I apply, not a contract I check the diff against). That set is derived, not enumerated — a rule added, split or renamed is in scope the moment it lands. Today it is: `testing.md` (three-regime testing; the named tests trace to acceptance criteria), `cbk-conventions.md` and `cbk-conventions-reference.md` (branch naming including the issue-less form, title prefixes, close markers, the `[skip ci]` rule, mutation discipline, workstream slug stability, and the reference half's § Licensing, § Dependency settle-window and § .gitignore anchoring), `simplification.md`, `knowledge-backend.md` (writes HITL-gated and default-SKIP; the repo is canonical for code and cascade artifacts), `workflows.md`, `tooling.md`, `orchestration.md` and `orchestration-reference.md`. Read the reference half of a split rule when the contract's pointer names the section the diff touches.

Out of scope (handled by other reviewers):
- `.claude/rules/logging.md` → `logging-discipline-reviewer`
Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/enrich.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Synthesize into the resolved intent + the resolved forks. Don't move to Step 3 u

A read-only investigation, like `/finish`'s plan-mode research — **do not write code here.** Ground the resolved forks in the actual code: the files / symbols the issue touches, the constraints (ADRs, `.claude/rules/*`, `docs/STANDARDS.md`), the dependencies, and the gotchas.

- `Grep` / `Glob` for the surface; find-references / symbol-info / call-site tooling for the blast radius; documentation-lookup tooling to confirm a library's actual behavior; read-only data/schema inspection when the issue is data-shaped.
- `Grep` / `Glob` for the surface; find-references / symbol info / call sites for the blast radius (which tool: `tooling.md` § Code intelligence); documentation-lookup tooling to confirm a library's actual behavior; read-only data/schema inspection when the issue is data-shaped.

**Scale the investigation to the surface — when the tooling is available:**

Expand Down
8 changes: 7 additions & 1 deletion .claude/commands/finish-procedure.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ The principle for Steps 8–9: **the executor handles findings the codebase need
- **Defer (N)** — `<verbatim rationale> — conflicts with <ADR / scope / framing>`.
- **Reject (N)** — one-line dismissal.

**The roadmap row, before `gh pr create`** — where the project keeps `docs/cbk/ROADMAP.md` and the spec names the flip: update the row and `## Now` on this branch as the last commit (`docs(cascade):`, no CI-skip marker — it is HEAD at the flip), with the PR number predicted from the shared issue-and-PR sequence (GitHub's REST API considers every pull request an issue and its issue endpoints return both — `https://docs.github.com/en/rest/issues/issues`, read 2026-09-06 — so the newest number across both is the last item of an issues listing) (`gh api 'repos/{owner}/{repo}/issues?state=all&sort=created&direction=desc&per_page=1'` plus one) and checked against the number `gh pr create` returns; one correcting commit on a mismatch; never a separate PR (the contract, item 8).

If `gh pr create --draft` fails (auth, missing scope, draft PRs disabled, rate limit, PR already exists for this branch), stop and surface the failure with per-step status.

## Step 11: Hand off
Expand All @@ -199,8 +201,12 @@ If any finding was classified **Defer** because it would conflict with an ADR or

**Roll-forward offer** (HITL). If the run surfaced deferred context that a *later* unit of work will need — TODOs, contract facts the next issue depends on, intentional omissions, or a follow-up worth its own issue — **offer** to post a roll-forward comment **wherever it's relevant**: the next issue, a sibling, a downstream milestone issue, a meta-issue, or a brand-new follow-up. Do **not** hardwire it to "the next issue." Default to posting **post-merge** unless the deferred context blocks another issue's start. If nothing was deferred, skip this silently.

**Backward sweep** (HITL offer, beside the roll-forward). What this run landed can make a sibling spec's *absence* claim false — "no adapter exists yet", "the table is not wired". The candidate set is closed: the open siblings under the same parent issue carrying `cascade-depth:roughed-in`, read in **one** call (`gh api repos/{owner}/{repo}/issues/{parent}/sub_issues` on github-issues, the parent's children on linear) and capped by the milestone's R-count — never the whole backlog. Check absence claims only, and verify each by **running the body's own command** (its grep, its test, its probe), not by recalling what this run did. Separate the two kinds: a claim this landing falsified (report it, with the commit) from a claim that was false when written (report it as a spec defect). **Default to not reporting** — a claim that still holds is not mentioned. The repair is rough-in's in-place body refresh, offered to the operator; this run never edits an issue body. An empty sweep is a one-line pass — `backward sweep: N siblings, no absence claim falsified` — never an omitted line.

**Optional learning-runbook write to Notion** (only when knowledge backend = `notion` is configured for this repo, per `.cascade/backends.toml`): if this execution surfaced a learning that would be a useful durable cross-project runbook entry (e.g., a non-obvious gotcha with the stack, a recipe for a recurring task spanning repos, a corrected understanding of an external system's behavior), prompt the operator: *"Want to promote this learning to a Notion runbook page under the Engineering Wiki? Defaults to SKIP."* Defaults to **SKIP**. Per `.claude/rules/knowledge-backend.md` § "When to write" — this is the rare opt-in path; HITL-gated; never default. If the operator opts in, announce the planned write (title, parent, body preview) before committing. This step is gated to genuinely cross-project learnings only — local-to-the-PR observations stay in the PR body and the hand-off summary, not in Notion.

**Post-merge checklist** (the hand-off ends with it; the operator runs it after the merge): `git switch main && git pull --ff-only && git fetch --prune`; post the drafted roll-forwards; close the meta-issues the close marker did not; append the frame's `## Rough-in events` row when this PR was the milestone's capstone; flip the roadmap row if Step 10 did not; the next runnable command, read off the roadmap. A research milestone's capstone is the verdict artifact — name it and its owner.

Do not call `gh pr ready` and do not merge — those remain the user's calls. The user's draft-review pass is where Surface findings get decided; they can ask you to apply any of them in the PR-feedback-loop turn, or wave them through.

## What `/finish` does NOT do
Expand All @@ -209,7 +215,7 @@ Do not call `gh pr ready` and do not merge — those remain the user's calls. Th
- **Does not handle re-rough-in.** Surface the need and return to chat for the rough-in skill.
- **Does not auto-create dependent issues.** If the work reveals a missing sub-sub-issue, surface and return to chat for rough-in.
- **Does not bypass dependencies.** Refuse to proceed when dependencies are unmet.
- **Does not modify cascade artifacts** (`docs/cbk/blueprint.md`, `docs/cbk/frame-NN.md`, etc.). Those are produced by chat-skill cascade phases.
- **Does not modify cascade artifacts** (`docs/cbk/blueprint.md`, `docs/cbk/frame-NN.md`, etc.). Those are produced by chat-skill cascade phases. *The status surfaces are carved out: `docs/cbk/ROADMAP.md`'s row and a frame's `## Rough-in events` table are not cascade events; Step 10 flips the row on this branch when the spec names it, the post-merge checklist otherwise (the contract wins where the two differ).*
- **Does not modify ADRs.** ADRs are immutable once accepted; revisions happen via new ADRs that supersede the old (chat-skill territory, not `/finish`).
- **Does not make workstream-level or framing-level decisions.** Those belong to upstream cascade phases (blueprint, framing, rough-in).
- **Does not skip `/simplify` or `pr-review-toolkit:review-pr`.** The simplify and review passes both run before the PR opens; the simplify pass is non-negotiable per `docs/STANDARDS.md` § Step 4, and the review-toolkit findings are auto-triaged with the four-class rubric (Apply for correctness/validity/defensive; Surface for taste/style; Defer/Reject for conflicts and agent errors). The one exception is an explicit break-glass marker (Step 1), which waives exactly the `pr-review-toolkit:review-pr` half and is recorded on that skill's `## Review gate` line. The orchestrated sweep supplements the two skills and never substitutes for either.
Expand Down
Loading
Loading