@arbiterforge/ca-pi 0.18.4 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/plugins/ca-pi/CHANGELOG.md +63 -0
  4. package/plugins/ca-pi/COMMANDS.md +2 -2
  5. package/plugins/ca-pi/SKILLS.md +5 -5
  6. package/plugins/ca-pi/SPRINT.md +44 -230
  7. package/plugins/ca-pi/agents/backend-author.md +5 -5
  8. package/plugins/ca-pi/agents/checkpoint-aggregator.md +7 -0
  9. package/plugins/ca-pi/agents/frontend-author.md +5 -5
  10. package/plugins/ca-pi/agents/grader.md +5 -4
  11. package/plugins/ca-pi/agents/infra-author.md +6 -7
  12. package/plugins/ca-pi/agents/scout.md +25 -24
  13. package/plugins/ca-pi/arbiter.md +6 -4
  14. package/plugins/ca-pi/generated/command-catalog.json +5 -5
  15. package/plugins/ca-pi/helpers/artifacts/ca-artifact-darwin-amd64 +0 -0
  16. package/plugins/ca-pi/helpers/artifacts/ca-artifact-darwin-arm64 +0 -0
  17. package/plugins/ca-pi/helpers/artifacts/ca-artifact-linux-amd64 +0 -0
  18. package/plugins/ca-pi/helpers/artifacts/ca-artifact-linux-arm64 +0 -0
  19. package/plugins/ca-pi/helpers/artifacts/ca-artifact-windows-amd64.exe +0 -0
  20. package/plugins/ca-pi/helpers/artifacts/ca-artifact-windows-arm64.exe +0 -0
  21. package/plugins/ca-pi/helpers/artifacts/release.json +37 -37
  22. package/plugins/ca-pi/hooks/_approvallib.py +41 -0
  23. package/plugins/ca-pi/hooks/_artifactlib.py +61 -115
  24. package/plugins/ca-pi/hooks/_artifactpromptlib.py +12 -12
  25. package/plugins/ca-pi/hooks/_bashguardlib.py +66 -4
  26. package/plugins/ca-pi/hooks/_contextselectlib.py +38 -35
  27. package/plugins/ca-pi/hooks/_contextwriterlib.py +114 -0
  28. package/plugins/ca-pi/hooks/_host.py +1 -1
  29. package/plugins/ca-pi/hooks/_prerequisitelib.py +35 -0
  30. package/plugins/ca-pi/hooks/_provenancelib.py +107 -1
  31. package/plugins/ca-pi/hooks/_readinjectlib.py +21 -7
  32. package/plugins/ca-pi/hooks/_reconciliationlib.py +167 -2
  33. package/plugins/ca-pi/hooks/_releaselib.py +6 -6
  34. package/plugins/ca-pi/hooks/_sprintapprovallib.py +52 -2
  35. package/plugins/ca-pi/hooks/artifact-reconcile.py +13 -4
  36. package/plugins/ca-pi/hooks/hostapi.py +1 -1
  37. package/plugins/ca-pi/hooks/init-codearbiter.py +34 -5
  38. package/plugins/ca-pi/includes/artifacts-attestation.md +434 -0
  39. package/plugins/ca-pi/includes/artifacts.md +138 -492
  40. package/plugins/ca-pi/includes/author-tdd-workflow.md +32 -21
  41. package/plugins/ca-pi/includes/fresh-verification.md +14 -12
  42. package/plugins/ca-pi/includes/harvest.md +3 -3
  43. package/plugins/ca-pi/includes/reference-map.md +1 -1
  44. package/plugins/ca-pi/includes/routing-table.md +3 -3
  45. package/plugins/ca-pi/includes/smarts/core.md +93 -17
  46. package/plugins/ca-pi/includes/smarts/lenses.md +115 -0
  47. package/plugins/ca-pi/includes/sprint-authority.md +6 -1
  48. package/plugins/ca-pi/includes/verification-boundary.md +11 -2
  49. package/plugins/ca-pi/package.json +1 -1
  50. package/plugins/ca-pi/routines/INDEX.md +8 -8
  51. package/plugins/ca-pi/routines/brainstorming/SKILL.md +71 -202
  52. package/plugins/ca-pi/routines/commit-gate/SKILL.md +60 -25
  53. package/plugins/ca-pi/routines/context-check/SKILL.md +89 -53
  54. package/plugins/ca-pi/routines/context-creation/SKILL.md +114 -220
  55. package/plugins/ca-pi/routines/debug/SKILL.md +1 -0
  56. package/plugins/ca-pi/routines/decision-variance/references/analysis.md +5 -2
  57. package/plugins/ca-pi/routines/decompose/SKILL.md +139 -167
  58. package/plugins/ca-pi/routines/executing-plans/SKILL.md +38 -136
  59. package/plugins/ca-pi/routines/finishing-a-development-branch/SKILL.md +45 -55
  60. package/plugins/ca-pi/routines/refactor/SKILL.md +33 -12
  61. package/plugins/ca-pi/routines/release/SKILL.md +1 -1
  62. package/plugins/ca-pi/routines/subagent-driven-development/SKILL.md +88 -230
  63. package/plugins/ca-pi/routines/tdd/SKILL.md +115 -228
  64. package/plugins/ca-pi/routines/writing-plans/SKILL.md +112 -174
  65. package/plugins/ca-pi/skills/ca-audit/SKILL.md +2 -2
  66. package/plugins/ca-pi/skills/ca-checkpoint/SKILL.md +1 -1
  67. package/plugins/ca-pi/skills/ca-commit/SKILL.md +60 -25
  68. package/plugins/ca-pi/skills/ca-context-check/SKILL.md +89 -53
  69. package/plugins/ca-pi/skills/ca-create-context/SKILL.md +114 -220
  70. package/plugins/ca-pi/skills/ca-debug/SKILL.md +1 -0
  71. package/plugins/ca-pi/skills/ca-decompose/SKILL.md +139 -167
  72. package/plugins/ca-pi/skills/ca-feature/SKILL.md +28 -38
  73. package/plugins/ca-pi/skills/ca-fix/SKILL.md +21 -9
  74. package/plugins/ca-pi/skills/ca-init/SKILL.md +18 -40
  75. package/plugins/ca-pi/skills/ca-pr/SKILL.md +45 -55
  76. package/plugins/ca-pi/skills/ca-refactor/SKILL.md +33 -12
  77. package/plugins/ca-pi/skills/ca-release/SKILL.md +1 -1
  78. package/plugins/ca-pi/skills/ca-review/SKILL.md +5 -8
  79. package/plugins/ca-pi/skills/ca-sprint/SKILL.md +11 -25
  80. package/plugins/ca-pi/skills/ca-status/SKILL.md +15 -6
@@ -27,51 +27,29 @@ An initialized refresh is routed through `/ca-status drift` and the existing
27
27
  `context-check` owner after an explicit scoped or full selection; `--brownfield`
28
28
  keeps its initial-population lock.
29
29
 
30
- ### Brownfield host prerequisites
31
-
32
- For repositories with existing source, every scaffold and populator step in
33
- the Procedure below is conditional on observing these prerequisites first.
34
- This applies to both `--brownfield` and the default auto-detection route.
35
- When qualification is unavailable or unknown, stop here and issue the handoff
36
- described below. Do not execute the later Procedure steps or enter brownfield
37
- population through the When NOT to use section.
38
-
39
- Scaffolding enables governance and may install Git hooks before population.
40
- It does not qualify the host for context extraction. Before selecting
41
- `--brownfield` or automatically routing existing source to brownfield
42
- population, inspect the installed
43
- context-creation containment profile in
44
- `<plugin-root>/routines/context-creation/SKILL.md`, under that exact heading.
45
- The active host needs an observed context-specific child profile with enforced
46
- read-only containment and report delivery, plus the existing native context
47
- writer and approval support. Ordinary unrestricted collaboration agents on
48
- Codex desktop/Windows do not satisfy that requirement. The repository-only
49
- Claude preparation fixture is neither a shipped consumer route nor proof of
50
- a qualified host.
51
-
52
- When these prerequisites are unavailable or unknown, report the missing
53
- capability before invoking the scaffolder. Keep a fresh repository unactivated
54
- and retain every byte of any existing partial state. Name the loaded package,
55
- observed host limitation or explicitly unknown qualification, selected
56
- population route and next missing prerequisite in the handoff; leave
57
- unobserved qualification and prior operation identities
58
- unknown. Resume on a host only after fresh containment and writer qualification,
59
- using the existing interrupted-population recovery procedure. No supported
60
- destination is implied by this guidance.
61
-
62
- This is a workflow preflight. The low-level scaffolder has no native scout
63
- capability attestation input and does not enforce or prove this assessment.
64
- Its successful exit, `--check` inventory or enabled stub never establishes
65
- population readiness. Do not fabricate a profile, receipt, context document
66
- or initialization sentinel to pass the later gates.
30
+ ### Brownfield preparation
31
+
32
+ Confirm the intended repository, existing state, selected outcome and actual
33
+ host permissions before activation. Scaffolding enables governance and may
34
+ install Git hooks; it does not prove context correctness or host enforcement.
35
+ For existing source, use bounded inspection and the safe installed context
36
+ writer in `<plugin-root>/routines/context-creation/SKILL.md`. Scoped agents are
37
+ optional. Ordinary native Windows work does not require a special scout sandbox,
38
+ profile attestation or per-document artifact approval.
39
+
40
+ If a real host permission or the installed safe writer is unavailable, report
41
+ the exact operation and retain current state. Continue independent authorized
42
+ inspection; do not fabricate a profile, receipt, context document or initialized
43
+ marker. Successful scaffold or `--check` output is inventory, not evidence that
44
+ population or a live host probe completed.
67
45
 
68
46
  The two flags are mutually exclusive and neither may combine with `--check`. `--stage N` may
69
- accompany one only while `.codearbiter/CONTEXT.md` is absent: after any required brownfield preflight,
47
+ accompany one only while `.codearbiter/CONTEXT.md` is absent: after checking the repository and host permissions,
70
48
  scaffold at that stage, then enter the
71
49
  selected workflow. When an uninitialized stub already exists, skip the refusing scaffolder and enter
72
50
  the selected workflow directly. An initialized marker or source-shape mismatch retains the selected
73
51
  legacy workflow's BLOCK. Without an explicit strategy, continue with the unchanged auto-detection
74
- procedure below only after any required brownfield preflight.
52
+ procedure below under the same repository and host permissions.
75
53
  <!-- catalog-command-modes:end -->
76
54
 
77
55
  ## Procedure
@@ -106,7 +84,7 @@ below remain in force for repositories that already opted in.
106
84
  `open-tasks.md`, `open-questions.md`, `overrides.log` (audit header), and `last-checkpoint` (`0`).
107
85
 
108
86
  3. **Then route to the populator** — the stub is not yet usable:
109
- - **Source code already exists** in the repo → route to `/ca-create-context` (brownfield: scouts
87
+ - **Source code already exists** in the repo → route to `/ca-create-context` (brownfield: bounded inspection and optional agents
110
88
  read the codebase and synthesize the full context, writing the initialization sentinel).
111
89
  - **Greenfield** (no meaningful source) → route to `/ca-decompose` (layered interview).
112
90
 
@@ -45,14 +45,14 @@ branch-finish request, assemble state and ask for the terminal choice, not a com
45
45
  An already-recorded explicit choice remains effective for its unchanged scope;
46
46
  revalidate evidence, not the wording of the user's request.
47
47
 
48
- All PR creation and terminal actions below require the current-head commit gate.
48
+ PR creation and terminal actions below require applicable current-head verification.
49
49
  Watch and cleanup return from their own paths before reaching that requirement.
50
50
 
51
51
  ## Pre-flight
52
52
 
53
53
  Read these, or STOP and surface the gap — never guess the branch name or the default branch:
54
54
 
55
- - `<project-root>/.codearbiter/CONTEXT.md` — the default-branch name and project context.
55
+ - `<project-root>/.codearbiter/CONTEXT.md` — project context. Resolve the working branch and default target from Git or repository metadata.
56
56
  - The discovered authoritative spec/plan pair for the pipeline, when `/feature`
57
57
  or `/sprint` produced one. Use the exact selected `.md` or `.html` plan as the
58
58
  yardstick for "is the work complete." Re-run the private bridge resolver
@@ -61,23 +61,21 @@ Read these, or STOP and surface the gap — never guess the branch name or the d
61
61
  for HTML and obtain HTML plan state only through the installed engine
62
62
  `identity`, `index`, and symbol-scoped `read` operations. The finishing step
63
63
  must not create, convert, or consult a counterpart.
64
- - `<project-root>/.codearbiter/last-checkpoint` — the most recent gate results; confirms `commit-gate` cleared on this branch.
64
+ - The observed commit/check results for this branch: checked source identity, commands and cwd, outcomes, and applicable review findings.
65
65
  - `<plugin-root>/includes/verification-boundary.md` — the exact-head hosted-CI evidence required before merge.
66
66
 
67
- For an HTML pair, query the engine `identity` and `eligible` again after process
68
- recreation. Require `all_accepted_and_current: true` for the exact spec and plan
69
- identities, with their acceptance receipts still bound in engine state and the
70
- commit-gate proof. Finalization must not parse rendered HTML and must not consult
71
- a shadow Markdown ledger; displayed labels, status words, checkboxes, or digests
72
- cannot establish completion.
67
+ For an HTML pair, query `identity` and `eligible` after process
68
+ recreation and read the actual work and check results. `eligible` is advisory
69
+ scheduling; `DONE` means implementation progress, not a verified release.
70
+ Report unfinished work, missing or failing tests, and any outstanding
71
+ decisions, rather than requiring an artifact acceptance receipt simply to
72
+ prepare or open an authorized PR. Do not scrape HTML or invent receipts.
73
+ `_preflight_current_acceptance` remains an **explicit historical proof query**,
74
+ not the mandatory permission gate for opening a PR or preparing a branch.
75
+ Real Git/host authorization, current applicable check results, independent security
76
+ controls and exact-head hosted CI before merge still apply.
73
77
 
74
- Enforce that requirement by invoking the installed bridge's
75
- `_preflight_current_acceptance` with the exact `_resolve_workflow_pair` result,
76
- repository-bound client, and engine-returned spec/plan IDs. Carry its returned
77
- identity/receipt proof into state assembly. Any refusal blocks terminal options;
78
- do not recreate the proof from the PR description, checkpoint prose, or labels.
79
-
80
- `commit-gate` MUST have cleared on the current HEAD. If it has not, this skill does not run — return to it.
78
+ Establish applicable verification for the current HEAD. Reuse observed results whose checked source and inputs still match. For a committed branch, derive paths and obligations from the explicit base-to-HEAD diff and run missing or affected checks under `verification-boundary.md`, followed by the review matrix below. Bind secrets scanning and specialized security/migration checks to that same base-to-HEAD subject. An empty staged set does not establish branch coverage. Report these read-only readiness results without creating commit markers. This verification does not invoke commit-only phases or create a commit. Authorized uncommitted work uses `commit-gate` before delivery.
81
79
 
82
80
  ## Phase 1 — State assembly · gate: BLOCK
83
81
 
@@ -85,7 +83,7 @@ Assemble the facts the decision needs. Nothing is presented until all are in han
85
83
 
86
84
  - **Branch** — the current branch name and its base. Confirm it is NOT the default branch; if HEAD is the default branch, STOP — there is nothing to finish and merge-to-default is forbidden.
87
85
  - **Diff summary** — files changed, insertions/deletions, and the commit list since the base. Read it, do not paraphrase from memory.
88
- - **Gate results** — `commit-gate` outcome and the `last-checkpoint` record. Surface any open `[NEEDS-TRIAGE]` markers left in the diff as out-of-scope findings.
86
+ - **Check results** — observed commands, source identity, outcomes and relevant review conclusions for the current HEAD. Mark missing or inapplicable evidence as pending. Surface any open `[NEEDS-TRIAGE]` findings.
89
87
  - **Plan delta** — when a plan exists, state which plan items the branch satisfied and which remain open. Open items are surfaced, not hidden.
90
88
  - **ADR source ancestry** — when `.codearbiter/decisions/adr-lifecycle.jsonl` exists, select
91
89
  the merge method from the exact fetched target commit and PR head commit. Run the installed verifier:
@@ -199,18 +197,27 @@ contributor-source, native-qualification and no-bypass requirements above apply.
199
197
  ### Open-PR procedure
200
198
 
201
199
  Run this procedure only for the selected open-PR or merge-via-PR action, after the
202
- current-head commit and acceptance preflight. It is shared by direct PR requests
200
+ current-head verification and authorized commit handling. It is shared by direct PR requests
203
201
  and caller handoffs; it is not a second host-command invocation.
204
202
 
205
- 1. **Confirm the commit gate cleared** this session (`commit-gate` green, or `/ca-commit` completed).
206
- 2. **Path matrix** — inspect the diff and dispatch the reviewer agents the change demands:
203
+ 1. **Confirm current-head readiness** from the applicable observed checks and review assembled in Phase 1. If a commit is needed, use `commit-gate` under the existing authorization.
204
+ 2. **Review coverage** — inspect the base-to-HEAD diff and identify the required review subjects:
207
205
  - auth / crypto / middleware paths → `auth-crypto-reviewer` + `security-reviewer`
206
+ - CI / deployment / infrastructure paths → `security-reviewer`
208
207
  - migration files → `migration-reviewer`
209
208
  - dependency manifests → `dependency-reviewer`
210
- - all paths → `coverage-auditor`
211
- 3. **Run reviewers** in parallel where there are no dependencies.
209
+ - executable source or verification-contract changes → `coverage-auditor`
210
+ - prose-only changes → applicable documentation/reference checks
211
+ Reuse inspected review conclusions when their source, requirements, findings and
212
+ verification inputs still cover this subject. A commit, PR handoff or new receipt
213
+ identity alone does not require redispatch. A newly failing check or relevant edit
214
+ requires reassessing the affected conclusions. Honor an explicit request for a
215
+ fresh independent review.
216
+ 3. **Run missing or affected reviews** in parallel where there are no dependencies.
217
+ If existing reviews cover every required subject, proceed with those results.
212
218
  4. **BLOCK check** — any CRITICAL or HIGH finding STOPs the flow; present it and do not draft the PR.
213
- Correct within existing scope and authority, then re-run the commit and review gates.
219
+ Correct within existing scope and authority, then rerun affected checks and reviews.
220
+ Reuse unaffected evidence and invoke commit handling only for changes needing a commit.
214
221
  Do not require the user to repeat command spellings; no unresolved blocker is waived.
215
222
  5. **Stage the PR** once all BLOCK findings clear: concise title; summary of what changed and why; a
216
223
  bulleted test plan; a conflict-hierarchy tradeoff citation for any non-obvious tradeoff; a link to
@@ -231,39 +238,22 @@ and caller handoffs; it is not a second host-command invocation.
231
238
  `/ca-watch <new-PR>`. When `enabled` is false, do nothing here — the user can still run `/ca-watch`
232
239
  ad-hoc. Never enable the flag on the user's behalf.
233
240
 
234
- ## Phase 4 — Receipt · gate: BLOCK
235
-
236
- The loop has been a chain of gates the user watched clear. End it on its most rewarding beat, not in
237
- silence. Emit a tight **Receipt** — a win summary that reflects the prevention back, drawn ONLY from
238
- the state Phase 1 already assembled plus `<project-root>/.codearbiter/last-checkpoint`. This is
239
- **not a fresh audit-trail crawl** — no new log scan, no `git` archaeology. If a field has no data in
240
- hand, omit the line rather than go digging.
241
-
242
- Report only what the assembled state supports:
243
-
244
- - **Obligations covered** — the count of `tdd` obligations that reached `COVERED` on this branch.
245
- - **Gates that fired and what each caught** — the gates that BLOCKed and then cleared, named with the
246
- specific thing caught (an untested seam, a scope-creep file set aside), not a bare gate name.
247
- - **SMARTS decisions the user made** — the architectural forks the user resolved, one line each.
248
- - **Secrets / regressions prevented** — credential findings and behavioral-proof mismatches the gates
249
- stopped before they shipped.
250
- - **Suite time** — the wall-clock of the verifying run, from the gate results in hand.
251
-
252
- Close with **exactly one** warm, synthesizing sentence (per the orchestrator register) that reflects
253
- the run back — synthesized for this branch, not the register's canned example. One sentence, earned,
254
- never on a no-op close.
241
+ ## Phase 4 — Delivery report
255
242
 
256
- Gate: the Receipt is emitted from in-hand state (no fresh crawl), and the close carries at most one
257
- warm sentence.
243
+ Use the Phase 1 state and the observed action result. Report the commit/PR identity,
244
+ implemented scope, applicable checks and review outcomes, and remaining work.
245
+ Include suite time when observed. Keep implementation, verification, merge and
246
+ publication distinct. Do not perform a fresh audit-trail crawl to embellish the
247
+ report or infer verification from a checkpoint counter.
258
248
 
259
249
  ## Hard rules
260
250
 
261
- - MUST NOT merge directly to the default branch or force-push — every change lands through a PR.
262
- - MUST NOT auto-merge under `/sprint`; auto-select "open PR" and surface the merge decision to the user.
263
- - MUST NOT discard a branch without explicit user confirmation that names the branch.
264
- - MUST NOT delete un-pushed commits silently — STOP and report the loss before any discard.
265
- - MUST NOT run before `commit-gate` has cleared on the current HEAD.
266
- - MUST NOT merge without the repository merge-readiness aggregate passing for the PR's current exact head; missing, stale, cancelled, mismatched, pending, or red hosted evidence blocks.
267
- - MUST NOT guess the branch or default-branch name — read `CONTEXT.md` or STOP.
268
- - MUST draw the Receipt only from Phase 1 state + `last-checkpoint` — never a fresh audit-trail crawl — and never build a rolling cross-branch "saves" tally.
269
- - MUST keep the close to at most one warm sentence; never on a no-op close.
251
+ - Preserve the selected branch and exact reviewed head; every merge goes through a PR.
252
+ - Merge requires explicit authorization. Never force-push.
253
+ - MUST NOT auto-merge under `/sprint`; its terminal action is an open PR.
254
+ - MUST NOT discard a branch without explicit user confirmation naming it.
255
+ - MUST NOT delete un-pushed commits silently.
256
+ - Required current-head checks and review must pass before claiming readiness. Missing evidence stays pending.
257
+ - Merge requires the repository's passing merge-readiness aggregate for the PR's current exact head.
258
+ - Read branch and target identities from Git; do not guess them.
259
+ - Report only observed actions and applicable evidence.
@@ -8,13 +8,13 @@ argument-hint: "<surface and motivation>"
8
8
 
9
9
  Select this owning procedure for a behavior-preserving restructure, whether requested
10
10
  in plain language or through `/refactor`. Entry syntax is not an additional gate;
11
- the approved-surface, parity, and verification requirements below still apply.
11
+ the authorized scope, parity, and verification requirements below still apply.
12
12
  Externally observable behavior before equals after, proven rather than assumed.
13
13
 
14
14
  ## Entry boundaries
15
15
 
16
16
  - Identify both the surface and the motivation. Phase 1 owns the precise surface
17
- table and its approval; knowing a command name does not establish either.
17
+ table under existing authorization. Ask only about a missing consequential scope decision.
18
18
  - New behavior, including a new error path, side effect, or public method beyond
19
19
  a Phase 3 seam, belongs to `/feature`. Incorrect existing behavior belongs to `/fix`.
20
20
  - An explanation-only question stays in the non-mutating question-answer path,
@@ -36,7 +36,9 @@ The working tree MUST be clean over the named surface before Phase 1. A dirty su
36
36
 
37
37
  ## Phase 1 — Surface identification · gate: BLOCK
38
38
 
39
- Enumerate the exact blast radius before any other work. Restate the planned refactor in one sentence and confirm it back to the user, then record a surface table:
39
+ Inspect the requested refactor and record its precise surface before restructuring.
40
+ Present the table and continue when the existing request covers it; no second
41
+ signoff is required. Ask only about a genuinely unresolved scope or outcome:
40
42
 
41
43
  - Files (repo-relative paths).
42
44
  - Top-level symbols touched — function, class, and exported member names.
@@ -45,7 +47,10 @@ Enumerate the exact blast radius before any other work. Restate the planned refa
45
47
 
46
48
  Reject vague surfaces. "the auth module", "the user service", "some helpers in utils" are categories, not surfaces. A surface is acceptable only when a reader could grep the repo for the listed symbols and arrive at the same file set. The table is the parity contract for Phases 2–6.
47
49
 
48
- Gate: a precise, complete surface table, user-signed-off. A vague or category-level surface does not pass — "the functions `signToken`, `verifyToken`, and `rotateKey` in `src/auth/tokens.ts`" passes; "the auth module" does not.
50
+ Gate: a precise, complete surface table covered by existing user authorization.
51
+ Resolve category-level requests through source inspection where their outcome is
52
+ clear. Ask only when inspection exposes a consequential missing choice. Include
53
+ necessary consumer updates within the requested restructure and record their scope.
49
54
 
50
55
  ## Phase 2 — Behavioral parity coverage proof · gate: BLOCK
51
56
 
@@ -65,7 +70,7 @@ Where the surface has no coverage tooling, take the no-tooling exemption in
65
70
  section that omits a command for this surface — and the per-symbol direct-test proof stands alone.
66
71
  Without that citation the phase STOPs rather than passing on an unverifiable claim.
67
72
 
68
- If surface coverage is below the maturity threshold on any required metric, OR any public method has zero direct tests, halt and route to the `tdd` skill (`<plugin-root>/routines/tdd/SKILL.md`) Phase 1 to backfill obligations and red tests for the uncovered surface. Resume Phase 2 only after the backfill is green.
73
+ If surface coverage is below the maturity threshold on any required metric, or a public method has no direct test, use the characterization/backfill approach in `<plugin-root>/routines/tdd/SKILL.md`. Add tests for the existing behavior and run them before restructuring; initially passing tests establish the baseline. Use a meaningful isolated negative control where needed to check the oracle. Record the passing post-backfill baseline, including test identities and assertions. Resume with that measured coverage and preserve the baseline assertions through implementation.
69
74
 
70
75
  Gate: surface coverage at or above the maturity threshold on every required metric in the declared coverage profile, the shared critical-path evidence present, AND every public method backed by a direct test. Otherwise backfill via `tdd` Phase 1 before retrying.
71
76
 
@@ -79,33 +84,49 @@ Gate: either "No new seams", or failing seam tests with all pre-existing tests s
79
84
 
80
85
  ## Phase 4 — Implementation · gate: BLOCK
81
86
 
87
+ **Strategy choice (conditional).** Only when materially distinct restructuring strategies exist (for
88
+ example, extract-and-delegate versus move-and-rename), and only after the Phase 1 surface table and
89
+ the Phase 2 parity proof are settled, run a SMARTS comparison per
90
+ `<plugin-root>/includes/smarts/core.md` inline to choose between them. The choice never widens the
91
+ surface table or relaxes a parity or coverage gate. One evident strategy gets no SMARTS table.
92
+
82
93
  Apply the restructure with zero behavior change, to the conventions in `coding-standards.md`. Confine every edit to the surface table. Acceptable edits: rename symbols (with consumer updates); extract or inline functions and methods; move symbols between files; replace an internal implementation with an equivalent one; collapse or split modules where the public interface is preserved.
83
94
 
84
95
  Unacceptable inside a refactor: adding a behavior, branch, error path, or side effect; changing the value any public method returns for any pre-existing input; adding a public method beyond a Phase 3 seam; changing observable order of operations (event emission, logging, IO). Classify the resulting staged diff against `commit-gate` classification criteria — a diff that classifies as `feat` is not a refactor; halt and route to `tdd`.
85
96
 
86
- Gate: the refactor confined to the surface table, with any Phase 3 seam tests now green. BLOCK if the diff classifies as `feat`, or if any edit falls outside the Phase 1 surface table without an explicit user-approved amendment.
97
+ Gate: the refactor remains within the authorized outcome, with any Phase 3 seam
98
+ tests now green. Maintain the surface table for discovered consumer updates within
99
+ that scope. BLOCK if the diff classifies as `feat` or requires a scope expansion
100
+ without the actual owner's authorization.
87
101
 
88
102
  ## Phase 5 — Parity verification · gate: BLOCK
89
103
 
90
- Run every impact-bounded local parity test identified in Phase 2, following `verification-boundary.md`. Each MUST pass with NO modification to its source — inspect the diff and confirm zero edits to any pre-existing test file. A modified pre-existing test is, by definition, evidence the surface's observable behavior changed: revert it. If it cannot pass after revert, the refactor introduced a behavior change and is routed to `tdd` as a feature or fix. Phase 3 seam tests (if any) MUST pass. Record the pass/fail tally and any modified-test detection. The exhaustive pre-existing suite remains a required exact-head hosted-CI merge gate.
104
+ Run the impact-bounded parity tests recorded in the post-backfill Phase 2 baseline,
105
+ following `verification-boundary.md`. Compare test changes made during implementation
106
+ against that baseline, including characterization cases added to existing test files.
107
+ Preserve their assertions. Necessary import or symbol-reference updates must retain
108
+ the same behavioral oracle. If implementation requires changing an expected result,
109
+ resolve the behavior change through the feature or fix owner. Phase 3 seam tests
110
+ must also pass. Record current results and any permitted mechanical test changes.
91
111
 
92
- Gate: scoped parity tests green with zero pre-existing tests modified. BLOCK if any pre-existing test was modified to pass, or if any applicable test fails; the branch still MUST NOT merge until exhaustive exact-head hosted CI passes.
112
+ Gate: baseline parity and new seam checks pass with preserved behavioral assertions.
113
+ The exhaustive pre-existing suite remains an exact-head hosted-CI merge requirement.
93
114
 
94
115
  ## Phase 6 — Lint and coverage · gate: BLOCK
95
116
 
96
117
  Run lint, the type-check if the project is statically typed, and coverage, all from `tech-stack.md`. Resolve every lint and type error. Confirm surface coverage remains at or above the maturity threshold on every required metric in the same declared coverage profile. A refactor MUST NOT reduce coverage of the surface it touched on any required metric or drop its critical-path evidence.
97
118
 
98
- Where the surface has no coverage tooling, the same clause as Phase 2 applies — the no-tooling exemption in `<plugin-root>/includes/maturity-coverage.md`, citation included — and parity is verified through Phase 5's unmodified pre-existing tests alone. Phase 2 and Phase 6 MUST NOT give different answers about the same surface, which is why both defer to the one shared clause rather than restating its conditions.
119
+ Where the surface has no coverage tooling, the same clause as Phase 2 applies — the no-tooling exemption in `<plugin-root>/includes/maturity-coverage.md`, citation included — and parity is verified through Phase 5's post-backfill baseline and preserved behavioral assertions. Phase 2 and Phase 6 MUST NOT give different answers about the same surface, which is why both defer to the one shared clause rather than restating its conditions.
99
120
 
100
121
  Gate: clean lint and type-check, zero errors, and no coverage regression on the named surface. "Mostly passes" is not passing — this is what clears the path to `commit-gate`.
101
122
 
102
123
  ## Hard rules
103
124
 
104
- - MUST NOT begin Phase 2 without a precise, user-signed-off surface table.
125
+ - MUST identify the precise surface and existing authorization before Phase 2; do not request duplicate signoff.
105
126
  - MUST NOT proceed past Phase 2 if surface coverage is below the maturity threshold or any public method has zero direct tests — route to `tdd` Phase 1 to backfill.
106
127
  - MUST NOT introduce new behavior in Phase 4. A diff that classifies as `feat` under `commit-gate` is not a refactor.
107
- - MUST NOT modify any pre-existing test to make it pass. A modified test is a behavior change.
128
+ - MUST NOT weaken a baseline assertion to make the refactor pass. Mechanical test-reference changes must preserve the behavioral oracle.
108
129
  - MUST NOT reduce coverage of the named surface during the refactor.
109
- - MUST NOT extend the surface mid-flight without an explicit user-approved amendment to the Phase 1 table.
130
+ - MUST keep the surface table current and obtain authorization for a material scope expansion or changed outcome.
110
131
  - MUST NOT inline-suppress a lint rule to clear Phase 6, and never to bypass a security-relevant rule.
111
132
  - MUST NOT guess the test, coverage, lint, or type-check command — read `tech-stack.md` or STOP.
@@ -342,7 +342,7 @@ Derive the bump mechanically from the commit log; do not guess it.
342
342
  **For the footer-completeness rule below, an accepted `[RECONCILED]` row counts as footer-complete.** That is not an auto-fill or a relaxation for ordinary missing footers: it is an explicit repository declaration bound to one exact commit already on the freshly fetched default branch, and every unlisted or unprovable commit remains `[NEEDS-TRIAGE]`. An unpublished commit must be amended or rebased instead and MUST NOT be added to the ledger. A reconciliation for a published commit lands through a normal reviewed commit, after which this lane restarts so its clean-tree and fresh-origin gates cover the policy change. When step 5 composes the changelog, it uses the exact helper-printed reconciliation text in the group selected by the commit's unchanged type; it does not reword or re-derive the note.
343
343
  3. **Verify footer completeness for the already-established `$EFFECTIVE_WINDOW` before touching anything else — never after.** On a first release, step 0 has already proposed and confirmed the adoption floor before classification; do not classify the raw full-history `$WINDOW` first and then try to narrow it here. The sole sanctioned exception is Back-fill's own canonical first-release shape (step 0's note, step 1's check): there, `$EFFECTIVE_WINDOW` may still be substituted to `HEAD` at step 1, but only through that step's OWN presented confirm-or-replace gate, before this step ever runs — a confirmed widen at the documented point of use, not an unconfirmed narrowing performed HERE. `adoption-commit` takes the oldest line of its newest-first input, so considering both candidate files identifies whichever adoption happened first. The confirmed boundary commit itself remains included, including when it is the root commit. Over that effective window, every `feat`/`fix`/`perf`/`refactor` commit (the full harvested set step 5 rolls into the changelog, not just `feat`/`fix`) MUST carry a `CHANGELOG:` footer. **This obligation is wider than those four types, regardless of type: any commit `classify_commit` marks `breaking` — an unfootered `chore!:`, `docs!:`, `test!:`, or `ci!:` included — is caught here too**, because `classify_window`'s `missing_footer` set keys on each row's own `bump != "none"`, not a fixed type list, so a footer-incomplete breaking commit of any type is already BLOCKed at this step, before step 5 ever composes a changelog. **A missing footer on any one of them is a BLOCK**, not a soft finding: surface EVERY offending commit as its own `[NEEDS-TRIAGE]` line in the release report presented to the user (one line per commit missing the footer, `<short-sha> <subject>` — never a single collapsed `[NEEDS-TRIAGE]` when more than one commit is at fault, and never written to any file: the report is its only destination) and STOP here — never auto-fill it, and never tag a changelog that silently drops a user-visible change. **The remedy is the operator's to choose:** first check whether the commit is already published with `git -C "$PROJECT_ROOT" merge-base --is-ancestor <sha> "origin/$DEFAULT_BRANCH"`. An unpublished commit may be amended or rebased; a published one must not be rewritten or force-pushed. If a listed commit genuinely has nothing user-facing to say, reclassify its type instead of leaving it half-classified. Never invent footer text on the author's behalf. Checking before step 4 bumps any file means a blocked release leaves no partial manifest bump. A `CHANGELOG:` footer on a `test`/`docs`/`chore`/`ci` commit is harvested by step 5 rather than silently discarded, but does not by itself create a bump.
344
344
  4. **Apply the step-2 classification to `$BASE_VERSION` through the policy-aware helper, never by eye.** Capture step 2's first line verbatim as `$BUMP`. For `LAST_TAG=<none>` with the numeric-sequence manifest exactly at `$INITIAL_VERSION`, run `DERIVATION_BASE="<none>"; COMPARISON_BASE="<none>"`; otherwise run `DERIVATION_BASE=$BASE_VERSION; COMPARISON_BASE=$BASE_VERSION`. Then run `VERSION=$("$PY" "<plugin-root>/hooks/_releaselib.py" derive-version "$DERIVATION_BASE" "$BUMP" "$VERSION_POLICY" "$INITIAL_VERSION")` and set `RELEASE_TAG=${TAG_PREFIX}${VERSION}` once for every later tag, notes, asset, and publication command. This preserves SemVer's patch/minor/major arithmetic while `numeric-sequence` advances its final component exactly once for any bumping classification; `none`, an unknown policy, or an invalid base STOPs. Confirm the result mechanically with `"$PY" "<plugin-root>/hooks/_releaselib.py" version-greater "$VERSION" "$COMPARISON_BASE" "$VERSION_POLICY" "$INITIAL_VERSION"`. The helper treats `<none>` as the empty numeric sequence only for this first-release comparison. Exit 1 means equal or lower; exit 2 means policy-invalid input. For compatibility, this is the policy-general replacement for the legacy `semver-greater <derived> $BASE_VERSION` check and keeps its remedy: re-derive from `$BASE_VERSION` rather than raising the bump. `$BASE_VERSION` already accounts for the tag and every manifest, including the first-release sentinel case. Bringing every manifest to the derived version still happens once in step 6; describing that write here too would be one action described two ways. Present the version and per-commit classification to the user for confirmation.
345
- 5. Derive the release date **once** — `RELEASE_DATE=$(date +%F)` — and reuse that single value for the changelog header, the Phase-2 `Released-at:` footer, and the Phase-3 Release; never hand-type the date a second time (`release_dates_consistent` verifies the changelog-header date equals the `Released-at:` date). Roll the `CHANGELOG:` footers from each `feat` / `fix` / `perf` / `refactor` commit into a new `## [${VERSION}] — $RELEASE_DATE` section in `$CHANGELOG` (the Keep-a-Changelog bracket heading this guard matches, not the bare `v`-prefixed form), grouped Added (`feat`) / Fixed (`fix`) / Performance (`perf`) / Changed (`refactor`, matching this repository's own changelog convention for non-user-facing-but-notable work). **A commit whose classification marks `breaking` true — the `!` bang after the type/scope or a `BREAKING CHANGE:`/`BREAKING-CHANGE:` footer, exactly the flag `classify-window` already computes and never re-derived here — rolls into its own `### Breaking` group instead of its type group, placed first among the section's groups.** A `feat!` no longer lands under `### Added` indistinguishable from an ordinary feature, and a breaking `chore!:` (which has no type group of its own) still gets one; an ordinary nonbreaking commit is never placed in `### Breaking`, and a commit already in `### Breaking` is never also duplicated into its type group. This is the same composed section text Phase 2's `<message-file>` and Phase 3's `<Phase-1 section file>` both read back (below), so `### Breaking` is visible in the changelog, the tag message, and the Release notes without a second composition pass. **Also harvest a `CHANGELOG:` footer from any `test`/`docs`/`chore`/`ci` commit that carries one**, into the same section's Changed group: its type says "not user-visible" but its footer is the more specific, deliberately-authored signal, and dropping it because of the type would be exactly the silent discard this guard exists to prevent (measured against this repository's own history, where such footers are a recurring, intentional pattern, not a mistake to reject). This harvesting rule does not by itself force a release — if the whole window is non-bumping, step 2's STOP still applies even when a non-bumping commit in it carries a footer; widening what a bare footer alone can trigger is out of scope here. Prior sections stay intact. Create the file with a `# Changelog` heading if absent. The changelog is a user-facing deliverable: apply `<plugin-root>/includes/anti-slop-design/core.md` §3.A (no prose-separator em-dashes in the entry prose) and §3.B (copy self-audit), and `<plugin-root>/includes/anti-slop-design/medium-documents.md` §7.A.1 changelog guidance, to each rolled entry. **Home for the composed section (MEDIUM, adversarial review 2026-07-31, previously unspecified):** besides landing in `$CHANGELOG` itself, this same section text is what Phase 2's `<message-file>` and Phase 3's `<Phase-1 section file>` both read back — write it to a scratch file created OUTSIDE the working tree (e.g. `mktemp`), never anywhere under the repo. A copy left inside the tree would either dirty the clean-tree state Pre-flight already required (this skill never re-runs Pre-flight mid-phase to notice) or, under a `payload: .` row, be swept straight into the very release window it is composing. Discard the scratch file once Phase 3 no longer needs it; it is working state, not a deliverable. **This scratch file is not required to survive across a session boundary** (HIGH, blind exercise run 19): `resume_publish` below explicitly permits Phase 3 to run in a LATER invocation than the one that composed this section — by design, since a fresh publish and a resumed one share the same Phase-3 authorization gate — and by then a `mktemp` file from a prior session is normally already gone. Phase 3 step 2 does not assume it survived; it reconstructs the same text mechanically from `$CHANGELOG` instead.
345
+ 5. Derive the release date **once** — `RELEASE_DATE=$(date +%F)` — and reuse that single value for the changelog header, the Phase-2 `Released-at:` footer, and the Phase-3 Release; never hand-type the date a second time (`release_dates_consistent` verifies the changelog-header date equals the `Released-at:` date). Roll the `CHANGELOG:` footers from each `feat` / `fix` / `perf` / `refactor` commit into a new `## [${VERSION}] — $RELEASE_DATE` section in `$CHANGELOG` (the Keep-a-Changelog bracket heading this guard matches, not the bare `v`-prefixed form), grouped Added (`feat`) / Fixed (`fix`) / Performance (`perf`) / Changed (`refactor`, matching this repository's own changelog convention for non-user-facing-but-notable work). **A commit whose classification marks `breaking` true — the `!` bang after the type/scope or a `BREAKING CHANGE:`/`BREAKING-CHANGE:` footer, exactly the flag `classify-window` already computes and never re-derived here — rolls into its own `### Breaking` group instead of its type group, placed first among the section's groups.** A `feat!` no longer lands under `### Added` indistinguishable from an ordinary feature, and a breaking `chore!:` (which has no type group of its own) still gets one; an ordinary nonbreaking commit is never placed in `### Breaking`, and a commit already in `### Breaking` is never also duplicated into its type group. This is the same composed section text Phase 2's `<message-file>` and Phase 3's `<Phase-1 section file>` both read back (below), so `### Breaking` is visible in the changelog, the tag message, and the Release notes without a second composition pass. **Also harvest a `CHANGELOG:` footer from any `test`/`docs`/`chore`/`ci` commit that carries one**, into the same section's Changed group: its type says "not user-visible" but its footer is the more specific, deliberately-authored signal, and dropping it because of the type would be exactly the silent discard this guard exists to prevent (measured against this repository's own history, where such footers are a recurring, intentional pattern, not a mistake to reject). This harvesting rule does not by itself force a release — if the whole window is non-bumping, step 2's STOP still applies even when a non-bumping commit in it carries a footer; widening what a bare footer alone can trigger is out of scope here. Keep an existing `## [Unreleased]` section at the top of the release sections. Insert the new version section below its complete body and above prior released versions; never place a released version above the Unreleased marker. Prior sections stay intact. Create the file with a `# Changelog` heading if absent. The changelog is a user-facing deliverable: apply `<plugin-root>/includes/anti-slop-design/core.md` §3.A (no prose-separator em-dashes in the entry prose) and §3.B (copy self-audit), and `<plugin-root>/includes/anti-slop-design/medium-documents.md` §7.A.1 changelog guidance, to each rolled entry. **Home for the composed section (MEDIUM, adversarial review 2026-07-31, previously unspecified):** besides landing in `$CHANGELOG` itself, this same section text is what Phase 2's `<message-file>` and Phase 3's `<Phase-1 section file>` both read back — write it to a scratch file created OUTSIDE the working tree (e.g. `mktemp`), never anywhere under the repo. A copy left inside the tree would either dirty the clean-tree state Pre-flight already required (this skill never re-runs Pre-flight mid-phase to notice) or, under a `payload: .` row, be swept straight into the very release window it is composing. Discard the scratch file once Phase 3 no longer needs it; it is working state, not a deliverable. **This scratch file is not required to survive across a session boundary** (HIGH, blind exercise run 19): `resume_publish` below explicitly permits Phase 3 to run in a LATER invocation than the one that composed this section — by design, since a fresh publish and a resumed one share the same Phase-3 authorization gate — and by then a `mktemp` file from a prior session is normally already gone. Phase 3 step 2 does not assume it survived; it reconstructs the same text mechanically from `$CHANGELOG` instead.
346
346
  6. **Sync `$TARGET`'s release surfaces to the repo — mechanically derived, never typed.** In this order; each sub-step depends on the one before it.
347
347
 
348
348
  **6a. Update the manifests.** Set every path in `$MANIFEST` to the derived version, **except a path also listed in `$GENERATED_MANIFEST`** — that one is never hand-edited; run the row's declared `generate` command (when declared) to regenerate it instead.
@@ -8,9 +8,7 @@ argument-hint: "[path | #<pr> | <pr-url>] (defaults to the current diff)"
8
8
 
9
9
  Read-only review of a change. Routes to `dispatching-parallel-agents` (`<plugin-root>/routines/dispatching-parallel-agents/SKILL.md`): dispatches the reviewer fleet by path matrix, dedupes, then funnels through `finding-triage` → `verdict-aggregator` to a single in-memory verdict. No code is modified.
10
10
 
11
- **The change under review does not have to be yours.** `/ca-review #123` reviews an inbound pull request through the same fleet, the same matrix, and the same triage. That is the point of issue #80: a tool that only reviews the diff you just wrote is a linter for authors, not a gate for a team, and reviewing code you did NOT write is where a governance gate earns its keep.
12
-
13
- It is an ARGUMENT, not a second command. The scope resolver already took one, the fleet is scope-agnostic, and every phase downstream operates on a diff regardless of where it came from — so a `/ca-review-pr` would be a whole public surface (catalog, three host projections, README counts, sidebar) whose only distinguishing feature is where the diff was fetched from.
11
+ `/ca-review #123` reviews an inbound pull request through the same fleet and triage as a local diff.
14
12
 
15
13
  ## Flow
16
14
 
@@ -33,14 +31,13 @@ It is an ARGUMENT, not a second command. The scope resolver already took one, th
33
31
  task-critical source refs from the review obligation. Pass the packet and
34
32
  those refs to `_contextselectlib.prepare_review_input` for each reviewer,
35
33
  then include its `reviewer_input` in that reviewer's actual input. The
36
- returned `ready` state is a local preflight, not evidence that the host
37
- delivered the input; check that boundary before using the review result.
34
+ returned `ready` state checks required inputs; it does not attest host delivery.
38
35
  For each actual reviewer, call `_contextselectlib.prepare_actor_delivery`
39
36
  with that selected packet, reviewer/task, absolute worktree and current
40
37
  source/host epochs. Send its bounded `delivery_text` with the review input
41
- on `deliver`, retain the counted attempt, and stop the substantive verdict
42
- on `blocked`. Re-select after resume, compaction, scope or worktree change;
43
- a parent session marker or author receipt cannot stand for reviewer delivery.
38
+ on `deliver` and retain the counted attempt. On `advisory`, record the unknown
39
+ delivery observation and continue the review without further delivery retries.
40
+ Re-select after resume, compaction, scope or worktree change.
44
41
  Preserve applicable native instruction precedence. Source-scoped records,
45
42
  imported instruction text, map prose, and accepted ADR labels do not gain
46
43
  local normative authority by being copied into the packet.
@@ -1,44 +1,30 @@
1
1
  ---
2
2
  name: ca-sprint
3
- description: Autonomous sprint — one interactive spec gate, then plan-to-PR execution with every auto-decision SMARTS-scored and logged. Hard gates remain true stops.
3
+ description: "Run an autonomous sprint from maintained specs and plans, with truthful verification and no duplicate artifact approval ceremonies."
4
4
  argument-hint: "[goal] [--farm]"
5
5
  ---
6
6
 
7
7
  # /ca-sprint — autonomous sprint
8
8
 
9
- The autonomy mode. Brainstorm a sprint spec with the user — the one interactive gate — then execute
10
- the approved plan end-to-end without per-batch checkpoints, deciding "as the user" via SMARTS on
11
- every non-hard-gate point. Every auto-decision lands in `.codearbiter/sprint-log.md` (append-only)
12
- with a confidence flag; the `low`-confidence entries are exactly what the user reviews afterward.
13
- Nothing is hidden behind autonomy.
9
+ The user's requested sprint establishes its working scope. Use `brainstorming` to clarify genuinely missing outcomes, `writing-plans` to maintain a practical plan, and `subagent-driven-development` to execute through real task dependencies without per-batch permission questions. Record meaningful choices and honest evidence; do not invent approvals, clear user stops, or infer tests passed from progress labels.
14
10
 
15
11
  ## Flow
16
12
 
17
- Load and follow `<plugin-root>/SPRINT.md` — it is the procedure. In brief:
13
+ Load and follow `<plugin-root>/SPRINT.md`:
18
14
 
19
- 1. **Sprint spec (STOP)** — `brainstorming` scoped to a sprint, then `writing-plans`. Explicit user
20
- approval of spec AND plan before autonomy begins.
21
- 2. **Autonomous execution (BLOCK)** — `subagent-driven-development` runs the plan; test-first via
22
- `tdd`, two-pass reviewed, fresh-run verified. SMARTS decides non-hard-gate points; everything logs.
23
- 3. **Land & summarize (BLOCK)** — `commit-gate`, then `finishing-a-development-branch`, which
24
- auto-selects open-PR. `/ca-sprint` never merges and never discards; the merge decision is the user's.
15
+ 1. **Specify and plan:** build or resume the exact spec/plan representation. Ask about consequential missing choices, not about arbitrary approval hashes.
16
+ 2. **Execute:** work through task-scoped prerequisites and coherent batches, implement or delegate where useful, and check changed behavior. Retry affected failures without restarting a reviewer fleet.
17
+ 3. **Report and deliver:** show actual results, pending checks, and open choices. Use the existing authorized `commit-gate` and PR handoff; opening a PR does not authorize merging or publishing.
25
18
 
26
- Hard gates — `security-controls`, crypto/secrets/auth, irreversible ops, `/override`, an
27
- unresolvable `[CONFIRM-NN]`, merge-to-default — are NEVER auto-decided. They halt and surface.
19
+ Real host/tool permissions, explicit security policy, irreversible operation limits and user stops remain intact. Artifact `DONE` means implementation reported complete, not independently verified acceptance.
28
20
 
29
21
  ## Arguments
30
22
 
31
- - **`"goal"`** — seed for the sprint-spec brainstorm.
32
- - **`--farm`** — cost-arbitrage backend: cheap workers implement under the same gates; Claude still
33
- authors spec, failing tests, plan, and reviews everything. Pre-flights `FARM_API_KEY`.
23
+ - **Goal:** intended sprint outcome and scope.
24
+ - **`--farm`:** separately requested legacy Markdown preview backend; obey its provider, budget and circuit-breaker boundaries. HTML farm is disabled, and failure does not authorize a silent backend switch.
34
25
 
35
26
  ## Routes to
36
27
 
37
- `<plugin-root>/SPRINT.md` (mode body), which routes through `brainstorming`,
38
- `writing-plans`, `subagent-driven-development`, `commit-gate`, `finishing-a-development-branch`.
28
+ `<plugin-root>/SPRINT.md` routes through `brainstorming`, `writing-plans`, `subagent-driven-development`, `commit-gate`, and `finishing-a-development-branch`.
39
29
 
40
- ## When NOT to use
41
-
42
- - A single feature with human checkpoints → `/ca-feature`.
43
- - Work whose spec cannot be made concrete up front — the one interactive gate is load-bearing;
44
- a thin spec makes hard-gate stops frequent instead of rare.
30
+ For a single bounded feature, use `/ca-feature`. No repetitive initial spec approval interview is implied by either entry.
@@ -30,10 +30,19 @@ reset.
30
30
  The orchestrator reads and presents:
31
31
 
32
32
  1. **Stage** — the `stage:` maturity value from `<project-root>/.codearbiter/CONTEXT.md` frontmatter.
33
- 2. **Pipelines** — every slug in `<project-root>/.codearbiter/specs/` and `plans/`, with how
34
- far each got: spec awaiting approval, spec approved / no plan, plan in progress (`ACCEPTED` count
35
- vs. total from the plan's status column), or complete. An interrupted pipeline is resumable via
36
- `/ca-feature` — say so on its line.
33
+ 2. **Pipelines** — every slug in `<project-root>/.codearbiter/specs/` and `plans/`, preserving
34
+ its existing representation. For HTML, use the installed engine's bounded structured reads
35
+ (`identity`, `index`, symbol-scoped `read`, or `task-context`) through
36
+ `<plugin-root>/includes/artifacts.md`; do not read rendered markup or execute verification
37
+ to obtain status. For Markdown, read its actual status ledger without creating a counterpart.
38
+ Report a spec with no plan, implementation in progress, or implementation complete. Count
39
+ `DONE` and historical `ACCEPTED` toward implementation completion while retaining their
40
+ distinct labels. Show verification separately: pending, failed, unknown, or the recorded result
41
+ and its applicability when available. Completion alone does not establish a passing check,
42
+ current acceptance, review, or release. Report missing/unreadable state as unknown, not complete.
43
+ A draft spec or plan is not awaiting permission. Show a genuine unresolved product decision,
44
+ explicit user checkpoint, or `BLOCKED` stop with its actual reason; status never clears it.
45
+ An interrupted pipeline is resumable via `/ca-feature` — say so on its line.
37
46
  3. **Open tasks** — the in-flight count from `<project-root>/.codearbiter/open-tasks.md`
38
47
  (top-level `- ` bullets excluding done `- [x]`; the same `_taskboardlib` count the
39
48
  SessionStart hook uses).
@@ -51,8 +60,8 @@ The orchestrator reads and presents:
51
60
  Stage: N
52
61
  Branch: <current branch>
53
62
  Pipelines:
54
- <slug> plan 3/7 ACCEPTED — resume with /ca-feature "<slug>"
55
- <slug> spec approved, no plan
63
+ <slug> implementation 3/7 complete (2 DONE, 1 historical ACCEPTED); verification unknown — resume with /ca-feature "<slug>"
64
+ <slug> spec present, no plan
56
65
  Open tasks: N
57
66
  Open questions: N ([CONFIRM-NN] unresolved)
58
67
  Overrides since last checkpoint: N