@arbiterforge/ca-pi 0.14.7 → 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 +1 -1
- package/package.json +1 -1
- package/plugins/ca-pi/CHANGELOG.md +38 -0
- package/plugins/ca-pi/SPRINT.md +45 -5
- package/plugins/ca-pi/arbiter.md +39 -51
- package/plugins/ca-pi/hooks/_host.py +1 -1
- package/plugins/ca-pi/hooks/_releaselib.py +274 -12
- package/plugins/ca-pi/hooks/hostapi.py +1 -1
- package/plugins/ca-pi/hooks/releasehash.py +17 -4
- package/plugins/ca-pi/includes/redirect.md +32 -63
- package/plugins/ca-pi/includes/routing-table.md +7 -5
- package/plugins/ca-pi/includes/safety-core.md +8 -4
- package/plugins/ca-pi/package.json +1 -1
- package/plugins/ca-pi/routines/INDEX.md +1 -1
- package/plugins/ca-pi/routines/release/SKILL.md +89 -26
- package/plugins/ca-pi/routines/subagent-driven-development/SKILL.md +19 -7
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.
|
|
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
|
@@ -4,6 +4,44 @@ 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
|
+
|
|
17
|
+
## [0.14.8] - 2026-09-22
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Bound the internal release-tree Git status probe with a timeout so it
|
|
22
|
+
reports an actionable failure instead of hanging or being mistaken for a
|
|
23
|
+
mutation (#627).
|
|
24
|
+
- Disambiguate `releasehash`'s overloaded exit code so malformed usage and an
|
|
25
|
+
unknown target each report their own outcome instead of both reading as
|
|
26
|
+
"never confirmed" (#627).
|
|
27
|
+
- Refuse a release baseline that does not resolve as a verified ancestor of
|
|
28
|
+
the candidate's history, before any release edit, closing a silent
|
|
29
|
+
version-retargeting gap (#570).
|
|
30
|
+
- Fail before any back-fill or release tracked-file write when the routed
|
|
31
|
+
commit-gate's prerequisites or branch restrictions are unmet, and correct
|
|
32
|
+
back-fill's "never again" claim to be checkout/file-scoped rather than
|
|
33
|
+
project-global (#570).
|
|
34
|
+
- Make Back-fill declare and publish an operator-authored exact-SHA changelog
|
|
35
|
+
reconciliation ledger before first-release re-entry, so published
|
|
36
|
+
pre-footer history can release without rewriting commits or weakening the
|
|
37
|
+
footer gate (#570).
|
|
38
|
+
- Surface `feat!`, `feat(scope)!`, and `BREAKING CHANGE:` commits with an
|
|
39
|
+
explicit Breaking marker in composed release notes, and prefer the first
|
|
40
|
+
breaking entry for a major-bump headline (#570).
|
|
41
|
+
- Restructure the release skill's monolithic Phase-2 procedure into named,
|
|
42
|
+
ordered, behavior-preserving substeps with an invariant-to-test
|
|
43
|
+
traceability map (#623).
|
|
44
|
+
|
|
7
45
|
## [0.14.7] - 2026-09-20
|
|
8
46
|
|
|
9
47
|
### Fixed
|
package/plugins/ca-pi/SPRINT.md
CHANGED
|
@@ -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
|
|
58
|
-
tasks → straight to Phase 2, executing only
|
|
59
|
-
`status` column or the typed engine's execution ledger is authoritative for its
|
|
60
|
-
|
|
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
|
|
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.
|
package/plugins/ca-pi/arbiter.md
CHANGED
|
@@ -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.
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
39
|
-
|
|
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
|
-
|
|
44
|
-
not
|
|
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
|
|
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
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
**
|
|
138
|
-
|
|
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
|
-
|
|
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"`**
|
|
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.
|
|
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"
|