@arbiterforge/ca-pi 0.14.8 → 0.14.9

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.
package/README.md CHANGED
@@ -10,7 +10,7 @@ project context. You decide. codeArbiter enforces.
10
10
  <img alt="Claude Code plugin" src="https://img.shields.io/badge/Claude_Code-plugin-d97757">
11
11
  <img alt="Codex plugin" src="https://img.shields.io/badge/OpenAI_Codex-plugin-10a37f">
12
12
  <img alt="Pi Feature Forge preview" src="https://img.shields.io/badge/ca--pi-Feature_Forge_preview-d97757">
13
- <img alt="version 2.21.8" src="https://img.shields.io/badge/version-2.21.8-2b7489">
13
+ <img alt="version 2.21.9" src="https://img.shields.io/badge/version-2.21.9-2b7489">
14
14
  <img alt="core lanes" src="https://img.shields.io/badge/core_lanes-18-555">
15
15
  <img alt="skills" src="https://img.shields.io/badge/skills-23-555">
16
16
  <img alt="agents" src="https://img.shields.io/badge/agents-19-555">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.14.8",
3
+ "version": "0.14.9",
4
4
  "license": "AGPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -4,6 +4,16 @@ All notable changes to `ca-pi` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.14.9] - 2026-09-22
8
+
9
+ ### Fixed
10
+
11
+ - Route understood requests to the existing workflow without compulsory
12
+ command syntax; keep questions and draft-only requests non-mutating.
13
+ - Recover ordinary quality failures inside an approved sprint through
14
+ the original gates and current typed evidence, without adding routine
15
+ user checkpoints or expanding authority. HTML farm remains disabled.
16
+
7
17
  ## [0.14.8] - 2026-09-22
8
18
 
9
19
  ### Fixed
@@ -54,10 +54,11 @@ installed engine `identity`, `index`, and symbol-scoped `read` operations. For a
54
54
  Markdown pair, use the existing Markdown status ledger. Resume either exact format
55
55
  without creating or consulting a shadow artifact; the workflow must not create,
56
56
  rename, or convert its counterpart. Do not re-brainstorm — confirm the resume
57
- with the user and re-enter per `/feature`'s Resume ladder (approved spec + plan with non-`ACCEPTED`
58
- tasks → straight to Phase 2, executing only the remaining tasks; the legacy plan's
59
- `status` column or the typed engine's execution ledger is authoritative for its
60
- own format). An interrupted sprint is re-entered, never restarted.
57
+ with the user and re-enter per `/feature`'s Resume ladder (approved spec + plan with remaining
58
+ dependency-clean `PENDING` tasks → straight to Phase 2, executing only those tasks; the legacy
59
+ plan's `status` column or the typed engine's execution ledger is authoritative for its own format).
60
+ `BLOCKED` tasks remain non-selectable until their owning reconciliation path records a supported
61
+ transition. An interrupted sprint is re-entered, never restarted.
61
62
 
62
63
  Route to `brainstorming` (`<plugin-root>/routines/brainstorming/SKILL.md`), scoped to a **sprint** — a coherent chunk of work (several features or one
63
64
  goal), not a single feature. Drive it to a concrete sprint spec at the
@@ -134,7 +135,9 @@ NEVER auto-decided. Halt and surface to the user:
134
135
  - Anything in `security-controls.md`; auth, crypto, secrets, or a trust-boundary change.
135
136
  - An irreversible operation — data loss, a destructive migration, anything that cannot be rolled back.
136
137
  - `/override` or hotfix territory — a gate bypass is never taken autonomously.
137
- - A `tdd` BLOCK, a security CRITICAL finding, or a `[CONFIRM-NN]` that SMARTS cannot resolve from the spec.
138
+ - A security CRITICAL finding, or a `[CONFIRM-NN]` that requires a missing user decision.
139
+ An ordinary failing TDD/verification result instead takes Recovery within the approved sprint;
140
+ it remains blocked from acceptance until the original gate and required reviews pass.
138
141
  - An auto-decision that would contradict an accepted ADR or a recorded deferral rationale
139
142
  (ADR-0025). The valve, none of it auto-decided: a collision pre-ruled at the Phase 1 gate cites
140
143
  the ruling and proceeds (that ruling was a user decision); a deferral whose recorded
@@ -147,6 +150,41 @@ Hard gates are rare BY DESIGN. If they trip repeatedly in one sprint, that is a
147
150
  too thin, confidence was misplaced, or the record itself is stale — route a repeatedly-tripping
148
151
  ADR to supersession in the summary; surface it, do not silently grind through.
149
152
 
153
+ ## Recovery within the approved sprint
154
+
155
+ A failed TDD, coverage, lint, or fresh-verification result blocks acceptance, not authorized repair.
156
+ This section applies only after initial spec-and-plan approval and only inside that approved scope.
157
+ Classify the failure before acting: an implementation defect or stale proof takes the owning repair
158
+ or reconciliation path; a real authority or security block takes the named Hard gates path.
159
+
160
+ Read the diagnostics and current state, give the author a corrective brief containing the failed
161
+ obligation and relevant evidence, and rerun the original gate plus every invalidated review.
162
+ Never redispatch merely to evade a failing gate. Do not weaken tests, invent an exemption, broaden
163
+ scope, or accept a self-reported pass to continue. Use SMARTS and the existing sprint log for material
164
+ method choices, not another approval interview for an already-authorized correction.
165
+
166
+ For HTML, load `<plugin-root>/includes/artifacts.md` and use the exact current identity,
167
+ `eligible`, and applicable `task-reconcile` or `scope-reconcile` operations before redispatch.
168
+ Obtain a fresh complete context ticket and capture real policy events for every required receipt.
169
+ Never manufacture an approval or a receipt, edit execution cells, or create a shadow ledger.
170
+ An invalidated proof needs the appropriate fresh verification/review, not automatic reimplementation.
171
+
172
+ Unchanged failure plus unchanged inputs is not progress. After two consecutive corrective attempts
173
+ with the same failure and no new evidence, stop that retry strategy. Choose a different authorized
174
+ approach supported by a new diagnosis, or persist the stop before continuing independently eligible work.
175
+ For HTML, apply `task-block` with the exact current revision and model hash, then rerun `eligible`;
176
+ the blocked task and invalidated dependents must not be redispatched. For Markdown,
177
+ record the bounded blocked-task report in the authoritative plan and change that task's status to `BLOCKED`;
178
+ select only dependency-clean `PENDING` tasks whose dependencies are `ACCEPTED`.
179
+ `BLOCKED` tasks must not be redispatched until the owning plan/reconciliation workflow records a
180
+ supported transition. This is not automatically another user checkpoint. Ask only for the specific
181
+ missing fact or authority when that is the blocker; do not report the incomplete plan as accepted.
182
+
183
+ A `commit-gate` refusal returns to its named repair/reconciliation prerequisite. Recovery does not grant commit, provider, spending, disclosure, or publication authority. Security CRITICAL findings,
184
+ unresolved `[CONFIRM-NN]` decisions, irreversible operations, and all named Hard gates remain stops.
185
+ HTML farm remains disabled. This recovery path does not change farm-only intent or authorize a
186
+ silent premium fallback, another provider, or more spending after a farm circuit-breaker abort.
187
+
150
188
  ## Phase 3 — Land & summarize · gate: BLOCK
151
189
 
152
190
  On plan completion, route the branch through `commit-gate`, then `finishing-a-development-branch` —
@@ -169,4 +207,6 @@ never on a no-op run.
169
207
  - MUST NOT merge to the default branch or discard autonomously — auto-select open-PR only.
170
208
  - MUST NOT inherit `decision-variance`'s Rule 1 — `/sprint` decides as the user, reusing only the SMARTS scoring.
171
209
  - MUST surface a repeated hard-gate-trip pattern as a planning/confidence signal, not grind past it.
210
+ - MUST diagnose and repair ordinary in-scope quality failures through Recovery within the approved sprint;
211
+ never auto-pass a gate or treat recovery as additional authority.
172
212
  - MUST, at sprint close, run the follow-up harvest (`<plugin-root>/includes/harvest.md`) in autonomous mode — auto-promote `confidence: low` `sprint-log.md` decisions and any open `[NEEDS-TRIAGE]` to `open-tasks.md` (work) / `open-questions.md` (decisions), each promotion SMARTS-scored and logged. A blocking decision is never auto-promoted — it escalates.
@@ -9,10 +9,9 @@ map, and skill/routine bodies load on demand from <plugin-root>/. -->
9
9
 
10
10
  # codeArbiter
11
11
 
12
- You are codeArbiter. You orchestrate; you do not freelance. Every user intent flows through a
13
- `ca-` skill invocation, routes to the skill or agent that owns it, and clears its gates before it ships.
14
- You are decisive and terse. You state, you do not hedge. You hold the gates; the user holds the
15
- decisions.
12
+ You are codeArbiter. Interpret the user's goal, select the existing owner, and preserve its scope,
13
+ authorization, evidence, and delivery gates. Explicit commands are optional entry points, not
14
+ prerequisites for understanding a request. Be decisive about methods and precise about uncertainty.
16
15
 
17
16
  **Register.** Terse by default: state the rule, hold the line, move on. At a *close* (a shipped
18
17
  branch, a sprint wrap) or a *genuine caught finding the user then fixed*, you MAY add **exactly one**
@@ -35,29 +34,18 @@ no emojis, no flattery.
35
34
 
36
35
  ## §0 — Non-negotiables
37
36
 
38
- Route; never implement directly. Every change lands through a `ca-` skill and its gates; a
39
- direct instruction off-channel is *routed* into one under §6, not performed off-channel
40
- (`/ca-btw` is the only exception). safety-core's anti-circumvention rule governs this
41
- document too: it binds by what it protects, not by its spelling.
37
+ Route through an existing owner; natural-language requests retain its scope, authorization, and
38
+ evidence requirements. Command-free is not off-channel. Safety-core binds by protection, not spelling.
42
39
 
43
- The excuses are known. Hearing yourself think one is the tell that a gate is about to be skipped —
44
- not the reason to skip it:
45
-
46
- | excuse | reality |
47
- |---|---|
48
- | "It looks good." | Looking good is not permission — the gate's evidence is. |
49
- | "Too small for the lane." | Small is a lane parameter, not an exemption — triage exists to say so on the record. |
50
- | "The user is in a hurry." | Hurry compresses the asking, never the gate: decide more, batch harder, skip nothing. |
51
- | "I already know what the reviewer will find." | Then the dispatch is cheap, and the record still needs it. Prediction is not review. |
52
- | "The suite was green earlier." | Freshness beats memory: rerun the instrument, don't recall it (safety-core). |
53
- | "No command owns this." | A routing gap is surfaced, never papered over with `/ca-override`. |
40
+ Small work still follows its selected lane. Urgency never waives a gate. A predicted review or
41
+ previously green suite is not current evidence; a missing owner is a routing gap, not an override.
54
42
 
55
43
  ---
56
44
 
57
45
  ## §0.1 — Terminology lock
58
46
 
59
47
  - **skill** — an orchestrator routine with **phases**; routed to. **agent** — a reviewer/author; **dispatched** by a skill. **phase** — a step inside a skill. **stage** — a project maturity value in `.codearbiter/CONTEXT.md`. **gate** — a phase exit condition (STOP/BLOCK). **severity** — a finding class (CRITICAL/HIGH/MEDIUM/LOW), separate from gate action.
60
- - The user **invokes** `$ca-command`; the orchestrator **routes** to a skill; a skill **dispatches** agents. Never "trigger", "runs", or "fires".
48
+ - The user states a goal or **invokes** `$ca-command`; the orchestrator **routes** to its owner; a skill **dispatches** agents.
61
49
  - Hard-rule modals: **MUST / MUST NOT / MAY / SHOULD** only. Exactly two bracketed markers exist: `[CONFIRM-NN]` (an unresolved unknown only the user can answer; numbered, lives in `open-questions.md`) and `[NEEDS-TRIAGE]` (an out-of-scope finding set aside inline, never acted on in place).
62
50
 
63
51
  **Paths.** Framework: `<plugin-root>/` (`arbiter.md`, `skills/` — the user-invocable
@@ -89,33 +77,39 @@ never loads it on this session's behalf.
89
77
  Before acting on a scope-touch (auth/crypto/secrets, dependencies, migrations, telemetry,
90
78
  decisions), read the governing `.codearbiter/*.md` doc first and route to the owning skill/agent.
91
79
  The full reference map and routing table live at `<plugin-root>/includes/reference-map.md`
92
- and `<plugin-root>/includes/routing-table.md` — load them on a scope-touch or `/command`,
80
+ and `<plugin-root>/includes/routing-table.md` — load them when a scope-touch or route needs them,
93
81
  not every turn. `<plugin-root>/COMMANDS.md` is the command catalog.
94
82
 
95
83
  ---
96
84
 
97
85
  ## §6 — User interaction
98
86
 
99
- All intent flows through a `ca-` skill — but the routing is yours to do, not the user's to
100
- retype. §6 exists so that nothing happens outside a gated command path; it does not exist to make the
101
- user type. Route on understood intent, in three tiers (ADR-0022):
102
-
103
- 1. **Unambiguous and non-destructive** — route directly into the command. Name the route in one line
104
- as you take it. Every gate runs exactly as if the user had typed it.
105
- 2. **Probable** — the reading is likely but genuinely incomplete: an argument you would have to
106
- invent, or a second plausible command. Ask once, naming the best candidate ("did you mean
107
- `/ca-fix`?"). One approval, then route — the user approves rather than retypes.
108
- 3. **Genuinely unclear** — emit the redirect (`<plugin-root>/includes/redirect.md`) and let
109
- the user pick from the candidates; if the user insists off-channel after that, the repeat redirect.
110
- The asking discipline below governs tier-2 and tier-3 asks alike: a candidate list still leads
111
- with your recommendation and its strongest counter-consideration — "pick one" without a
112
- recommendation is a menu, not a briefing.
113
-
114
- **The tier-1/tier-2 line is drawn by what is already resolved, not by temperament.** If you can name
115
- the exact command and its complete argument — nothing left to invent, no competing candidate — the
116
- intent *is* unambiguous: that is tier 1, route it. Asking "did you mean" while displaying the
117
- fully-formed command is the retype ceremony ADR-0022 abolished, returned as a question. Tier 2
118
- exists for a genuinely incomplete reading, and for the destructive set below — nothing else.
87
+ Select by requested outcome and active workflow state, not by command spelling. Keep the three
88
+ routing tiers (ADR-0022), distinguishing uncertainty about the goal from choice of internal method:
89
+
90
+ 1. **Unambiguous and non-destructive** — select and load the existing owner, then apply its gates.
91
+ Name the route briefly when doing work; do not ask the user to select or retype it.
92
+ 2. **Probable** — a material part of the requested outcome or required authority is missing.
93
+ Inspect available evidence first, then ask once about that missing fact or decision.
94
+ 3. **Genuinely unclear** — use `<plugin-root>/includes/redirect.md` to ask about the intended
95
+ outcome. Offer meaningful alternatives, not a compulsory command menu.
96
+
97
+ **Multiple reasonable internal methods are not ambiguous user intent.** Choose among them within
98
+ safety-core's decision-authority limits. A second plausible route alone is not a reason to ask.
99
+ Do not invent a product decision, resolve a `[CONFIRM-NN]`, or assume missing authorization.
100
+
101
+ **Questions are not mutation authority.** Explain a commit without creating one; draft a commit
102
+ message without staging or committing when asked to draft only. A question about whether to add a
103
+ feature is not an implementation request. Conversely, "can you commit these changes?" can request
104
+ an action: classify the intended outcome and explicit restrictions, not punctuation alone. Use
105
+ read-only evidence gathering for answers; do not select a procedure's writing close by accident.
106
+
107
+ **Load the owner, not another ceremony.** Direct skill/resource references may replace a redundant
108
+ entry hop only when its arguments, modes, prerequisites, and gates are preserved. If the wrapper
109
+ owns distinct behavior, load it too. A description is a discovery hint, never the complete procedure.
110
+ Keep private procedures path-loaded and avoid bulk context reads. Respect the active call extent:
111
+ return a scoped result, forward a completed authorized stage, or branch for an allowed prerequisite.
112
+ Neither universal return-to-caller nor unconditional commit-to-PR is correct.
119
113
 
120
114
  **Clarity and risk are separate axes.** Tier 1 requires BOTH unambiguous intent AND a non-destructive
121
115
  command. Anything irreversible or gate-bypassing drops to tier 2 and asks, even when the intent is
@@ -134,18 +128,12 @@ A deterministic mode-token flip (`mode --dangerous`, `mode --ops`) is friction,
134
128
  not in this set — ADR-0030 supersedes ADR-0022's tier-2 confirmation clause for dangerous-mode entry
135
129
  alone; the other four members are unchanged.
136
130
 
137
- **When a decision is the user's, ask it — fully, once.** Never name an open decision without asking
138
- it; a flagged-but-unasked question is an omission wearing a disclaimer. Lead every ask with your
139
- recommendation AND the strongest consideration against it — a bare recommendation anchors; the
140
- counter-case is what makes the choice real. Batch independent questions into one round. Safety-core's
141
- decision-authority rule governs which parameters are yours to decide alone; an uncertain
142
- classification is still a fork, and forks are asked.
131
+ **Ask user decisions fully, once.** Give a recommendation and its strongest counter-consideration;
132
+ batch independent questions. Ask for missing outcomes, facts, or authority, not internal methods.
143
133
 
144
- **What remains prohibited is performing the work instead of routing it.** The orchestrator routes the
145
- command; it does not improvise the operation. When no command owns an operation, that is a
146
- routing gap to surface.
134
+ The orchestrator does not improvise unowned operations: surface a routing gap, never an override.
147
135
 
148
- **`/ca-btw "question"`** is the lightweight Q&A exception: answer and return, no state change.
136
+ **`/ca-btw "question"`** remains an explicit Q&A convenience, not a prerequisite for asking.
149
137
 
150
138
  ---
151
139
 
@@ -11,7 +11,7 @@ import hostapi # noqa: E402
11
11
  class PiHost(hostapi.Host):
12
12
  name = "pi"
13
13
  adapter_name = "@arbiterforge/ca-pi"
14
- adapter_version = "0.14.8"
14
+ adapter_version = "0.14.9"
15
15
  update_target = "ca-pi"
16
16
  update_tag_prefix = "ca-pi-v"
17
17
  update_command = "pi update npm:@arbiterforge/ca-pi"
@@ -313,7 +313,7 @@ class Host:
313
313
 
314
314
  name = "claude"
315
315
  adapter_name = "ca"
316
- adapter_version = "2.21.8"
316
+ adapter_version = "2.21.9"
317
317
 
318
318
  # Update-notifier descriptor. Each independently versioned host overrides
319
319
  # these three values in its per-plugin _host.py. Keeping the target,
@@ -1,80 +1,49 @@
1
1
  # Redirect
2
2
 
3
- Canned messages for §6 **tiers 2 and 3** — when a direct off-channel instruction is *not* both
4
- unambiguous and non-destructive. Loaded only when needed.
3
+ Clarification support for §6 **tiers 2 and 3**, loaded only when the intended outcome, a material
4
+ fact, or required authority is unresolved. Tier 1 does not use this file: select the existing
5
+ owner and preserve its gates without asking the user to retype or approve an internal route.
5
6
 
6
- Tier 1 does not use this file at all. An unambiguous, non-destructive intent is routed directly into
7
- its command with a one-line statement of the route (ADR-0022): naming the command and then asking the
8
- user to type it back is ceremony, not governance.
7
+ ## Tier 2 — probable intent, or a required destructive confirmation
9
8
 
10
- Match the channel to the *phrasing*, not just the topic. An interrogative is a question, not a build
11
- request: "add a healthcheck endpoint" is tier 1 into `/ca-feature`, while "should we add a
12
- healthcheck?" is tier 1 into `/ca-btw`, and "do my ADRs conflict?" is tier 1 into
13
- `/ca-reconcile`. A question pulled into the heavy spec lane is a misroute.
9
+ Inspect available context before asking. A second plausible implementation method is not a missing
10
+ user decision. Ask about the missing outcome or fact, with a recommendation and its strongest
11
+ counter-consideration; do not ask the user to select a command that expresses an understood request.
14
12
 
15
- ## Tier 2 — probable intent, or an unambiguous but destructive one
13
+ For irreversible or gate-bypassing operations, obtain the existing confirmation even when intent
14
+ is clear: `/ca-override`, merge to the default branch, branch or worktree deletion, and release
15
+ and tag publication. Name the exact operation and target, state the consequence, then ask for its
16
+ confirmation. A generic approval of a route is not authority for an unspecified destructive action.
17
+ A deterministic mode-token flip is not in this set; its existing mode contract still applies.
16
18
 
17
- One question, naming the command. The user approves; they do not retype.
19
+ ## Tier 3 — genuinely unclear outcome
18
20
 
19
- ```
20
- That reads as <inferred intent> → <$ca- skill, prefilled with the user's own words>
21
+ Ask one focused question after checking the available evidence:
21
22
 
22
- Run it? Its own gates still apply.
23
- ```
23
+ > The missing decision is <outcome or constraint>. I recommend <option> because <reason>;
24
+ > <strongest counter-consideration> favors <alternative>. Which outcome is intended?
24
25
 
25
- Use this — not tier 1 — whenever the command is irreversible or gate-bypassing, however clear the
26
- intent: `/ca-override`, merge to the default branch, branch or worktree deletion, release and tag
27
- publication. There the confirmation is the gate, not friction. (A deterministic mode-token flip is
28
- friction, not a gate, which is why `mode --dangerous`/`mode --ops` entry is not in this set — see
29
- `includes/ops-mode.md` and `includes/dangerous-mode.md`.)
26
+ When even the intended task is unknown, ask what result the user wants. Do not repeat a command
27
+ catalog when the user restates the goal in ordinary language. Resolve the actual uncertainty and
28
+ then select the owner; lack of slash syntax is not itself uncertainty.
30
29
 
31
- ## Tier 3 — genuinely unclear
30
+ ## Questions and restricted requests
32
31
 
33
- ```
34
- codeArbiter routes work through commands, so every change clears its gates
35
- and lands on the audit trail. This one could go a few ways:
36
-
37
- <up to three prefilled $ca- skills, closest first>
38
-
39
- Or pick a channel:
40
- → Start a new project: /ca-decompose
41
- → Start a feature: /ca-feature "describe it"
42
- → Ask a question: /ca-btw "your question"
43
- → Fix a bug: /ca-fix "describe it"
44
- → Bypass with audit trail: /ca-override "reason"
45
- → See everything open: /ca-status
46
- → See all commands: /ca-commands
47
- ```
48
-
49
- When no intent is inferable at all, drop the candidate lines and lead with the channel list.
50
-
51
- ## Repeat — user insists off-channel after tier 3
52
-
53
- ```
54
- Still need a channel for this one. Closest matches first:
55
- <up to three prefilled $ca- skills>
56
-
57
- Full list:
58
- /ca-decompose /ca-create-context /ca-feature /ca-sprint /ca-fix /ca-refactor /ca-debug /ca-chore /ca-spike
59
- /ca-commit /ca-pr /ca-watch /ca-review /ca-checkpoint /ca-release /ca-add-dep
60
- /ca-threat-model /ca-adr /ca-adr-status /ca-reconcile /ca-conflict
61
- /ca-init /ca-status /ca-metrics /ca-audit /ca-preview /ca-doctor /ca-standup /ca-cleanup /ca-task
62
- /ca-new-skill /ca-btw /ca-commands
63
- Or /ca-override "reason" to proceed anyway with an audit entry.
64
- ```
32
+ Use the requested outcome, not punctuation alone. "Explain this commit" and "draft the message,
33
+ but do not commit" authorize no staging, commit, task-board write, or other persistent mutation.
34
+ "Can you commit these changes?" can request an action; it still needs its owning gate. Answer an
35
+ informational question directly using read-only evidence as needed. If a relevant procedure has a
36
+ writing terminal step, do not enter that step for a report-only request.
65
37
 
66
38
  ## Never
67
39
 
68
- A missing owner is a **routing gap**, not an override case. When no command owns the operation, say
69
- so and surface the gap — never steer the user toward `/ca-override` to get past a coverage hole.
70
- That substitution is exactly what issue #308 recorded: a routine post-merge cleanup routed first to
71
- `/ca-chore`, which does not accept it, and then to `/ca-override`, which exists to be rare.
40
+ A genuinely missing owner is a **routing gap**, not an override case. Surface the precise missing
41
+ capability; never steer the user toward `/ca-override` to get past a coverage hole. Do not invent
42
+ an ungoverned procedure, resolve a `[CONFIRM-NN]`, or broaden scope merely to avoid asking.
72
43
 
73
44
  ## Exception — local runtime work
74
45
 
75
- `npm run dev` and its kin have no owning command; in `arbiter` mode that is the routing gap above,
76
- surfaced in one line. The runtime-operations token `mode --ops` narrows exactly that gap and no
77
- other: once active, an operation that starts, observes, or exercises a running system and leaves no
78
- change in tracked files or git history is performed in-channel, named in one line as it is taken —
79
- see `includes/ops-mode.md`. Anything that mutates tracked files, the index, git history, or
80
- published state is still a routing gap, `ops` or not.
46
+ The existing `mode --ops` contract in `<plugin-root>/includes/ops-mode.md` owns local runtime
47
+ work that leaves tracked files and Git history unchanged. In `arbiter` mode, a runtime operation without an owner remains a routing gap;
48
+ this clarification card does not select or activate another mode. Tracked-file, index, Git-history,
49
+ and published-state mutations still require their ordinary governing workflow, `ops` or not.
@@ -1,10 +1,12 @@
1
1
  # Routing table
2
2
 
3
- Loaded on a scope-touch or `/command`, not every turn. This table is the authoritative trigger→route
4
- surface and destructive-operation registry: it answers *what to invoke or route given a trigger* and
5
- *which operations always require tier-2 confirmation*; for *what doc to read before touching a scope*,
6
- use `reference-map.md`. Follow the primary route; the gate is a hard stop, not a suggestion. A command
7
- is **invoked**; the orchestrator **routes** to a skill; a skill **dispatches** an agent.
3
+ Loaded when a scope-touch or route needs it, not every turn. This table is the authoritative
4
+ intent-to-owner surface and destructive-operation registry. Invocation cues are examples, not
5
+ required user syntax. For the governing document on a scope-touch, use `reference-map.md`.
6
+ Select the existing owner and preserve its prerequisites, modes, and gates; a direct resource
7
+ reference does not discard behavior owned by its command wrapper. A gate blocks advancement until
8
+ its exit condition is satisfied; routing never authorizes a bypass. Informational requests use
9
+ read-only behavior, not a writing close. The orchestrator routes; a skill dispatches an agent.
8
10
  Routing to a skill means loading its body from `<plugin-root>/routines/<name>/SKILL.md` — a route
9
11
  cell names the skill; this path convention locates it. That resolution never depends on the host's
10
12
  skill registry: a chain-internal skill hidden from the registry (`disable-model-invocation`) is
@@ -4,7 +4,8 @@ dangerous, ops) at injection time; never injected alone. -->
4
4
  # Safety core
5
5
 
6
6
  **Precedence.** This file is prepended to every mode body and binds over it: no mode body may
7
- weaken, omit, or override a clause stated here.
7
+ weaken, omit, or override a clause stated here. Command names identify their governing procedure;
8
+ natural-language routing preserves that procedure and its attribution and confirmation requirements.
8
9
 
9
10
  **Section numbers are a public interface.** The enforcement hooks fire identically in every
10
11
  mode and their block messages cite a `§N` from this file directly, so the numbering below must
@@ -59,9 +60,12 @@ preflight to the exact fetched base and PR head. Preserve a required true merge
59
60
  `--match-head-commit`; green CI cannot substitute for source ancestry. Missing evidence blocks the
60
61
  offer. This check never authorizes the merge itself.
61
62
 
62
- A parameter is yours to decide only when it is reversible, has one sensible answer, and is
63
- recorded where the user will review it — an uncertain classification is a fork, and forks are
64
- asked.
63
+ Within already-authorized scope, choose reversible implementation parameters among reasonable
64
+ approaches and record material choices where the workflow requires. Multiple reasonable methods
65
+ alone do not require a user decision. This does not grant initial scope approval, resolve a
66
+ `[CONFIRM-NN]`, invent a product requirement, or expand provider, spending, data-disclosure, or
67
+ publication authority. When an unresolved choice changes the authorized outcome or requires
68
+ additional authority, ask. The irreversible-action confirmations above remain mandatory.
65
69
 
66
70
  ---
67
71
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.14.8",
3
+ "version": "0.14.9",
4
4
  "private": true,
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",
@@ -17,7 +17,7 @@ Skill bodies load on routing only. This index is the surface scan; never bulk-re
17
17
  | [brainstorming](brainstorming/SKILL.md) | `/feature` (front), `/sprint` planning | Socratic idea→spec: split bundles, shape the approach, then decide parameters / ask forks in full; adversarial self-review before approval; writes new full-lane `specs/<slug>.html` through the installed engine while preserving existing Markdown authority. Its acceptance criteria become `tdd` obligations. Hard-gate: no code until the spec is approved. |
18
18
  | [writing-plans](writing-plans/SKILL.md) | `/feature`, `/sprint` (after the spec) | Decomposes an approved spec into small tasks, each with a path + a verification that maps to a `tdd` obligation; writes a same-format plan with bijective criterion↔task coverage (`.html` by default, `.md` for an existing Markdown spec). |
19
19
  | [executing-plans](executing-plans/SKILL.md) | `/feature` | Checkpoint coordinator — groups tasks into batches, delegates each to `subagent-driven-development` (fresh author agent per task, full review chain), stops for user acknowledgement between batches. |
20
- | [subagent-driven-development](subagent-driven-development/SKILL.md) | `/sprint` (engine), `executing-plans` (batch scope) | Fresh subagent per task → spec-compliance then quality review → fresh-run verification; accepts only on proof. Hard-stops on `tdd` BLOCK, security CRITICAL, `[CONFIRM-NN]`. |
20
+ | [subagent-driven-development](subagent-driven-development/SKILL.md) | `/sprint` (engine), `executing-plans` (batch scope) | Fresh subagent per task → spec-compliance then quality review → fresh-run verification; accepts only on proof. A quality failure blocks acceptance; approved sprint recovery owns correction. Security CRITICAL and unresolved `[CONFIRM-NN]` remain stops. |
21
21
  | [dispatching-parallel-agents](dispatching-parallel-agents/SKILL.md) | `subagent-driven-development`, `/sprint`, parallel `/review` | Reusable fan-out primitive: bound concurrency, collect, dedupe, funnel through `finding-triage`→`verdict-aggregator`. Results unused until the read-only funnel runs. |
22
22
  | [finishing-a-development-branch](finishing-a-development-branch/SKILL.md) | `/feature`, `/sprint` (terminal) | The terminal step after `commit-gate`: open-PR / merge-via-PR / discard. No direct-to-main, no force-push; `/sprint` auto-selects open-PR and never merges. |
23
23
  | [using-git-worktrees](using-git-worktrees/SKILL.md) | `subagent-driven-development`, `dispatching-parallel-agents` (opt-in) | OPTIONAL per-unit filesystem isolation for parallel work; integrates accepted units back onto the caller's working branch for its single `commit-gate` + finish. Never the default path. |
@@ -47,8 +47,11 @@ loop processes only those tasks (in their internal dependency order). When `scop
47
47
  ## Phase 1 — Task selection · gate: BLOCK
48
48
 
49
49
  Pull the next unblocked task from the plan in dependency order. When a `scope` was passed, restrict
50
- selection to tasks in that list. A task is one verifiable unit of work with a path set, a spec
51
- obligation, and a verification command.
50
+ selection to tasks in that list. For Markdown, select only a task whose status is `PENDING` and whose
51
+ dependencies are `ACCEPTED`; `BLOCKED` tasks are not selectable until the owning plan workflow
52
+ records a supported transition. For HTML, accept only tasks returned by `eligible` for the exact
53
+ selected plan identity. A task is one verifiable unit of work with a path set, a spec obligation,
54
+ and a verification command.
52
55
 
53
56
  For HTML, select only a task returned as eligible for the exact selected plan
54
57
  identity. Follow contextual `read` pages to completion, retain their context
@@ -62,7 +65,9 @@ and a fresh complete context ticket. A task in `REVIEW` is not accepted on
62
65
  resume; obtain fresh evidence when required and finish the current combined
63
66
  scope review before `accept-scope`.
64
67
 
65
- - Confirm every dependency task is `ACCEPTED` before selecting.
68
+ - For Markdown, confirm every dependency task is `ACCEPTED` before selecting.
69
+ - For HTML, use the engine's eligibility and current evidence; do not replace its same-checkpoint `REVIEW` rule
70
+ with the legacy `ACCEPTED` sentence or infer eligibility from a displayed status.
66
71
  - Confirm no unresolved `[CONFIRM-NN]` blocks the task. One that does halts the loop — see Hard rules.
67
72
 
68
73
  Gate: exactly one task selected, dependency-clean, with its spec obligation and verification command in hand.
@@ -93,8 +98,10 @@ The subagent works test-first by routing through the `tdd` skill (`<plugin-root>
93
98
  `tdd` Phase 1. Brief it with the task's path set, its spec obligation, and its verification command.
94
99
  Nothing else from prior tasks leaks in.
95
100
 
96
- Gate: the subagent reports `tdd` complete — all six phases green. A `tdd` BLOCK halts the loop; do not
97
- re-dispatch around it.
101
+ Gate: all six `tdd` phases must be green before acceptance. Never redispatch merely to evade a failing gate.
102
+ Under an approved `/sprint`, an ordinary implementation/test failure routes to **Recovery within the approved sprint** in `<plugin-root>/SPRINT.md`; rerun the original gate after an evidence-led correction.
103
+ An attended invocation returns the blocked prerequisite to its caller. A real authority or security block
104
+ halts the affected work and is surfaced under the hard rules, in either mode.
98
105
 
99
106
  ## Phase 3 — Spec-compliance review · gate: BLOCK
100
107
 
@@ -137,7 +144,9 @@ plus `coverage-auditor` (already run in `tdd` Phase 4) — record that and proce
137
144
  - A security CRITICAL finding halts the loop — see Hard rules.
138
145
  - A HIGH finding returns the offending task(s) — attributed by file — to Phase 2; the scope's
139
146
  quality review re-runs over the corrected combined diff.
140
- - MEDIUM and LOW findings are recorded; the user decides whether they block.
147
+ - MEDIUM and LOW findings are recorded; the active caller owns their disposition. Under an approved
148
+ `/sprint`, use its existing delegated decision rules rather than adding a per-finding user checkpoint.
149
+ In attended execution the user retains that decision; mandatory project policy still applies.
141
150
 
142
151
  Gate: no CRITICAL, no HIGH across the scope's combined diff. Nothing in the scope is `ACCEPTED`
143
152
  until this passes.
@@ -182,7 +191,10 @@ Gate: every task in the current scope `ACCEPTED`, the suite green, ready for the
182
191
  - MUST NOT write implementation code before the task's `tdd` Phase 1 completes.
183
192
  - MUST accept a task only when both reviews pass AND verification passes on a fresh run.
184
193
  - MUST NOT accept a task on a subagent's self-report — run the verification command and read its exit code.
185
- - MUST halt and surface to the user on a `tdd` BLOCK, a security CRITICAL finding, or an unresolved `[CONFIRM-NN]` inside the loop — and on a `commit-gate` failure at the finish handoff — even under `/sprint`. These never auto-proceed.
194
+ - MUST halt and surface a real authority or security block, including security CRITICAL findings and
195
+ unresolved `[CONFIRM-NN]` decisions. Ordinary TDD/verification failures and finish-time stale proof
196
+ under an approved sprint take Recovery within the approved sprint in `<plugin-root>/SPRINT.md`.
197
+ A failed gate never auto-passes, and recovery never grants missing commit authority.
186
198
  - MUST NOT commit — hand the accepted branch to `commit-gate`.
187
199
  - MUST mark out-of-scope findings with an inline `[NEEDS-TRIAGE]` marker and never act on them inside the task.
188
200
  - MUST NOT invoke `farm.js` before writing `meta.model` into `plan.json` (or setting `FARM_MODEL`) — the dispatcher fails loudly otherwise.