@arbiterforge/ca-pi 0.16.1 → 0.16.2
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 +31 -31
- package/package.json +1 -1
- package/plugins/ca-pi/CHANGELOG.md +8 -0
- package/plugins/ca-pi/helpers/artifacts/release.json +18 -18
- package/plugins/ca-pi/hooks/_artifactauthoritylib.py +2 -0
- package/plugins/ca-pi/hooks/_host.py +1 -1
- package/plugins/ca-pi/hooks/_prerequisitelib.py +6 -3
- package/plugins/ca-pi/hooks/_replylib.py +7 -4
- package/plugins/ca-pi/hooks/hostapi.py +1 -1
- package/plugins/ca-pi/includes/artifacts.md +7 -6
- package/plugins/ca-pi/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,25 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
<img src="docs/readme-hero.webp" alt="codeArbiter. Hard gates for agentic coding." width="100%">
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**Open-source governance and hard gates for AI coding agents across Claude Code, Codex CLI, and Pi.**
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
project context. You decide. codeArbiter enforces.
|
|
7
|
+
codeArbiter is a repository-owned governance layer for tests, reviews, security checks, decisions,
|
|
8
|
+
and durable project context. You decide. codeArbiter enforces.
|
|
9
9
|
|
|
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.24.
|
|
13
|
+
<img alt="version 2.24.2" src="https://img.shields.io/badge/version-2.24.2-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-22-555">
|
|
16
16
|
<img alt="agents" src="https://img.shields.io/badge/agents-20-555">
|
|
17
17
|
<img alt="license AGPL v3" src="https://img.shields.io/badge/license-AGPL_v3-3da639">
|
|
18
18
|
|
|
19
|
-
[Start learning](https://
|
|
19
|
+
[Start learning](https://codearbiter.dev/learn/)
|
|
20
20
|
·
|
|
21
|
-
[Install](https://
|
|
21
|
+
[Install](https://codearbiter.dev/getting-started/install/)
|
|
22
22
|
·
|
|
23
|
-
[Browse the reference](https://
|
|
23
|
+
[Browse the reference](https://codearbiter.dev/reference/)
|
|
24
24
|
|
|
25
25
|
<sub>Install it globally. It stays dormant until a repository explicitly opts in.</sub>
|
|
26
26
|
|
|
@@ -54,13 +54,13 @@ takes the full spec, test-first, review, and PR path.
|
|
|
54
54
|
|
|
55
55
|
The Codex path was live-verified on **Codex CLI 0.144.1** with trusted SessionStart injection and a
|
|
56
56
|
real `[H-03]` PreToolUse block. The dated
|
|
57
|
-
[Claude Code + Codex evidence](https://
|
|
57
|
+
[Claude Code + Codex evidence](https://codearbiter.dev/getting-started/claude-code-and-codex/)
|
|
58
58
|
separates continuously verified packaging from the live checks that require a model-backed turn.
|
|
59
59
|
|
|
60
60
|
## See it catch something
|
|
61
61
|
|
|
62
62
|
The landing page includes a
|
|
63
|
-
[faithful replay of a shipped hook invocation](https://
|
|
63
|
+
[faithful replay of a shipped hook invocation](https://codearbiter.dev/#proof).
|
|
64
64
|
It invokes the real `pre-bash.py` guard, records the source digest, proves the blocked command never
|
|
65
65
|
ran, and preserves the exact stderr and audit effect. It does not pretend that a direct hook replay
|
|
66
66
|
proves host discovery or trust.
|
|
@@ -87,7 +87,7 @@ The user owns the decision. The repository keeps the evidence.
|
|
|
87
87
|
## Get running
|
|
88
88
|
|
|
89
89
|
Choose the adapter for the coding host you already use. The
|
|
90
|
-
[host chooser](https://
|
|
90
|
+
[host chooser](https://codearbiter.dev/getting-started/choose-your-host/) covers
|
|
91
91
|
stability, command syntax, trust, and platform differences.
|
|
92
92
|
|
|
93
93
|
| Host | Adapter | Command form | Status |
|
|
@@ -101,7 +101,7 @@ Git 2.45.0+ with `--no-lazy-fetch` on all three governance hosts; unavailable fl
|
|
|
101
101
|
verification with an upgrade prerequisite, never an implicit fetch fallback. Pi also requires Node.js
|
|
102
102
|
22.19+. If Python is missing, Pi installs its final wrappers but blocks mutating calls and points to
|
|
103
103
|
`/ca-doctor`; Claude Code and Codex surface an interpreter breadcrumb instead of silently claiming
|
|
104
|
-
governance is active. The [compatibility matrix](https://
|
|
104
|
+
governance is active. The [compatibility matrix](https://codearbiter.dev/getting-started/compatibility/)
|
|
105
105
|
defines the supported native Git/runtime and linked-worktree boundary; mixed Windows Git and WSL Git
|
|
106
106
|
over one shared repository are not supported.
|
|
107
107
|
|
|
@@ -205,7 +205,7 @@ project to `decompose`. `doctor` must report a healthy interpreter, current payl
|
|
|
205
205
|
live-fire probe before you treat the repository as governed.
|
|
206
206
|
|
|
207
207
|
Follow the complete
|
|
208
|
-
[first-repository walkthrough](https://
|
|
208
|
+
[first-repository walkthrough](https://codearbiter.dev/getting-started/quickstart/)
|
|
209
209
|
for expected output, proof, and recovery.
|
|
210
210
|
|
|
211
211
|
## Practice before using your own repository
|
|
@@ -225,14 +225,14 @@ The site is designed as a continuous path from first contact to source-backed op
|
|
|
225
225
|
|
|
226
226
|
| Need | Start here | You finish able to... |
|
|
227
227
|
|---|---|---|
|
|
228
|
-
| Understand the promise | [What is codeArbiter](https://
|
|
229
|
-
| Choose and install a host | [Start](https://
|
|
230
|
-
| Learn in order | [Learning path](https://
|
|
231
|
-
| Run daily work | [Workflows](https://
|
|
232
|
-
| Understand the model | [Concept map](https://
|
|
233
|
-
| Diagnose a problem | [Troubleshooting](https://
|
|
234
|
-
| Look up exact behavior | [Reference](https://
|
|
235
|
-
| Evaluate preview work | [Feature Forge](https://
|
|
228
|
+
| Understand the promise | [What is codeArbiter](https://codearbiter.dev/overview/) | explain command, route, dispatch, gate, and ship |
|
|
229
|
+
| Choose and install a host | [Start](https://codearbiter.dev/getting-started/choose-your-host/) | install, trust, activate, and verify one adapter |
|
|
230
|
+
| Learn in order | [Learning path](https://codearbiter.dev/learn/) | progress from foundation through the power-user capstone |
|
|
231
|
+
| Run daily work | [Workflows](https://codearbiter.dev/guides/feature-lane/) | select and complete the smallest correct lane |
|
|
232
|
+
| Understand the model | [Concept map](https://codearbiter.dev/concepts/) | trace routing, decisions, context, review, and audit evidence |
|
|
233
|
+
| Diagnose a problem | [Troubleshooting](https://codearbiter.dev/guides/troubleshooting/) | follow a symptom to a deterministic recovery |
|
|
234
|
+
| Look up exact behavior | [Reference](https://codearbiter.dev/reference/) | inspect generated commands, skills, agents, hooks, and configuration |
|
|
235
|
+
| Evaluate preview work | [Feature Forge](https://codearbiter.dev/feature-forge/overview/) | opt in, verify the off switch, and understand the promotion bar |
|
|
236
236
|
|
|
237
237
|
Command, skill, agent, and hook-gate reference pages are generated from shipped source on every site
|
|
238
238
|
build. Hand-authored guides teach the workflow; generated pages define the exact current surface.
|
|
@@ -274,7 +274,7 @@ The project record lives beside the code:
|
|
|
274
274
|
└── overrides.log append-only sanctioned bypass record
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
-
The [.codearbiter directory reference](https://
|
|
277
|
+
The [.codearbiter directory reference](https://codearbiter.dev/codearbiter-directory/)
|
|
278
278
|
explains who creates, reads, and updates every artifact, plus its recovery rules.
|
|
279
279
|
|
|
280
280
|
### The hard gates
|
|
@@ -302,8 +302,8 @@ recommendation. The user still decides.
|
|
|
302
302
|
`/ca:sprint` uses the same lenses for bounded non-hard decisions and writes every call to
|
|
303
303
|
`.codearbiter/sprint-log.md` with a confidence flag. Security boundaries, irreversible operations,
|
|
304
304
|
gate bypasses, merges, and unresolved questions remain true stops. See
|
|
305
|
-
[SMARTS](https://
|
|
306
|
-
[autonomous sprints](https://
|
|
305
|
+
[SMARTS](https://codearbiter.dev/concepts/smarts/) and
|
|
306
|
+
[autonomous sprints](https://codearbiter.dev/guides/autonomous-sprints/).
|
|
307
307
|
|
|
308
308
|
## Core lanes
|
|
309
309
|
|
|
@@ -322,7 +322,7 @@ compatibility routes remain available in the complete reference.
|
|
|
322
322
|
| Operate | `/ca:status`, `/ca:task`, `/ca:doctor`, `/ca:override` | Inspect state, manage the task board, verify enforcement, or log an allowed bypass |
|
|
323
323
|
<!-- core-lane-chooser:end -->
|
|
324
324
|
|
|
325
|
-
[Complete command reference](https://
|
|
325
|
+
[Complete command reference](https://codearbiter.dev/reference/commands/) includes
|
|
326
326
|
advanced operations, compatibility routes, internal protocols, deprecation guidance, and host
|
|
327
327
|
availability. The generated host catalogs remain inspectable in
|
|
328
328
|
[`plugins/ca/COMMANDS.md`](./plugins/ca/COMMANDS.md),
|
|
@@ -348,8 +348,8 @@ The optional `/ca:sprint --farm` preview is a distinct opt-in network feature. I
|
|
|
348
348
|
secret-redacted task context to the OpenAI-compatible endpoint you configure and is inert without
|
|
349
349
|
the flag and provider key.
|
|
350
350
|
|
|
351
|
-
See [Enforcement and Security](https://
|
|
352
|
-
[Hooks Reference](https://
|
|
351
|
+
See [Enforcement and Security](https://codearbiter.dev/enforcement/) and the
|
|
352
|
+
[Hooks Reference](https://codearbiter.dev/hooks/) for the exact event, read,
|
|
353
353
|
write, block, and network contract.
|
|
354
354
|
|
|
355
355
|
### Pi operational contract
|
|
@@ -387,7 +387,7 @@ spending or trust requirements.
|
|
|
387
387
|
| `ca-sandbox` | install the sibling plugin | real untrusted repositories and interactive `--with-claude` use |
|
|
388
388
|
|
|
389
389
|
The source-backed
|
|
390
|
-
[live Forge catalog](https://
|
|
390
|
+
[live Forge catalog](https://codearbiter.dev/feature-forge/whats-in-the-forge/)
|
|
391
391
|
names every opt-in, off switch, dependency, trust boundary, and promotion signal.
|
|
392
392
|
|
|
393
393
|
The farm preview uses one checked-in `farm.js` backend across supported hosts. A Pi-native embedded
|
|
@@ -424,8 +424,8 @@ Update the Claude marketplace explicitly:
|
|
|
424
424
|
|
|
425
425
|
The operator-facing environment-variable catalog, defaults, accepted values, safety boundaries,
|
|
426
426
|
and verification steps live in the
|
|
427
|
-
[Configuration Reference](https://
|
|
428
|
-
Release notes are in the [Changelog](https://
|
|
427
|
+
[Configuration Reference](https://codearbiter.dev/reference/configuration/).
|
|
428
|
+
Release notes are in the [Changelog](https://codearbiter.dev/changelog/).
|
|
429
429
|
|
|
430
430
|
</details>
|
|
431
431
|
|
|
@@ -437,7 +437,7 @@ with Claude Code's plugin manager, run `codex plugin remove ca-codex@codearbiter
|
|
|
437
437
|
`pi remove` with the pinned Git source for Pi. The repository-owned `.codearbiter/` record survives,
|
|
438
438
|
so another supported host can keep using it.
|
|
439
439
|
|
|
440
|
-
Follow [Uninstall and Disable](https://
|
|
440
|
+
Follow [Uninstall and Disable](https://codearbiter.dev/guides/uninstalling/) for
|
|
441
441
|
host-specific removal, pinning, and verification.
|
|
442
442
|
|
|
443
443
|
</details>
|
|
@@ -499,7 +499,7 @@ Inspect the repository, grant project trust, start a fresh Pi session, then run
|
|
|
499
499
|
|
|
500
500
|
codeArbiter v2 is a ground-up rebuild of the earlier vendored `.agents/` framework as a native,
|
|
501
501
|
multi-host plugin system. The complete record is in [`CHANGELOG.md`](./CHANGELOG.md) and the
|
|
502
|
-
[site changelog](https://
|
|
502
|
+
[site changelog](https://codearbiter.dev/changelog/). The v1 implementation
|
|
503
503
|
remains available in early repository history.
|
|
504
504
|
|
|
505
505
|
## License and contributions
|
package/package.json
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to `ca-pi` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.16.2] - 2026-10-04
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Refresh the shared prerequisite deadline and reviewer finding contract.
|
|
12
|
+
- Correct approval guidance: Pi has an input event, but still needs a native
|
|
13
|
+
authority adapter before these workflows can run on Pi.
|
|
14
|
+
|
|
7
15
|
## [0.16.1] - 2026-10-04
|
|
8
16
|
|
|
9
17
|
### Fixed
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
},
|
|
38
38
|
"context_qualification": {
|
|
39
39
|
"darwin/amd64": {
|
|
40
|
-
"source_commit": "
|
|
40
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
41
41
|
"workflow": ".github/workflows/ci.yml",
|
|
42
|
-
"run_id": "
|
|
42
|
+
"run_id": "37265481193",
|
|
43
43
|
"binary_sha256": "27fc51465a79c1525b1300b347cee4d09afde3c7b0d845414659302f5bbca2f7",
|
|
44
|
-
"observation_sha256": "
|
|
44
|
+
"observation_sha256": "d0fb266f27d266e247c38e806336d94f60581a32e6f84602bdcab2ca4caa3e20",
|
|
45
45
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
46
46
|
"native_cases": [
|
|
47
47
|
"TestContextBoundedRender",
|
|
@@ -53,11 +53,11 @@
|
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
55
|
"darwin/arm64": {
|
|
56
|
-
"source_commit": "
|
|
56
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
57
57
|
"workflow": ".github/workflows/ci.yml",
|
|
58
|
-
"run_id": "
|
|
58
|
+
"run_id": "37265481193",
|
|
59
59
|
"binary_sha256": "3a3d61be18eba426db4f260b9cbae0d3d3c89f47efe184395d7f011cc3b4f59a",
|
|
60
|
-
"observation_sha256": "
|
|
60
|
+
"observation_sha256": "f90633dfe08215876ef5dbfd9ebddb2b20c48eb334dc52efb4e10af65216d9fa",
|
|
61
61
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
62
62
|
"native_cases": [
|
|
63
63
|
"TestContextBoundedRender",
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
"linux/amd64": {
|
|
72
|
-
"source_commit": "
|
|
72
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
73
73
|
"workflow": ".github/workflows/ci.yml",
|
|
74
|
-
"run_id": "
|
|
74
|
+
"run_id": "37265481193",
|
|
75
75
|
"binary_sha256": "3b6178bb54d6a19fc56d99f8fced862ae151605a0373297a69e130d3857a8406",
|
|
76
|
-
"observation_sha256": "
|
|
76
|
+
"observation_sha256": "0a58c6c7a8e5673f602398c3a5ac477b00d0477e981e43aa0b36f1061683e412",
|
|
77
77
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
78
78
|
"native_cases": [
|
|
79
79
|
"TestContextBoundedRender",
|
|
@@ -85,11 +85,11 @@
|
|
|
85
85
|
]
|
|
86
86
|
},
|
|
87
87
|
"linux/arm64": {
|
|
88
|
-
"source_commit": "
|
|
88
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
89
89
|
"workflow": ".github/workflows/ci.yml",
|
|
90
|
-
"run_id": "
|
|
90
|
+
"run_id": "37265481193",
|
|
91
91
|
"binary_sha256": "a5259074098932f815f33d3e1dea98e6d9a04277d1ada958469905da67d29437",
|
|
92
|
-
"observation_sha256": "
|
|
92
|
+
"observation_sha256": "9cccf649f682ee7c0d62ed6a0fb4336479eb7f24a9977027811954d77f3c2efe",
|
|
93
93
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
94
94
|
"native_cases": [
|
|
95
95
|
"TestContextBoundedRender",
|
|
@@ -101,11 +101,11 @@
|
|
|
101
101
|
]
|
|
102
102
|
},
|
|
103
103
|
"windows/amd64": {
|
|
104
|
-
"source_commit": "
|
|
104
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
105
105
|
"workflow": ".github/workflows/ci.yml",
|
|
106
|
-
"run_id": "
|
|
106
|
+
"run_id": "37265481193",
|
|
107
107
|
"binary_sha256": "8339c077262f861631631de49bca7cdafec5e0730b9e3676fd2db36f3c119036",
|
|
108
|
-
"observation_sha256": "
|
|
108
|
+
"observation_sha256": "843fdcf7c1f8b171abbb3a6ed0d636a755ccd3898e24a33e7d651daaa1b233fc",
|
|
109
109
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
110
110
|
"native_cases": [
|
|
111
111
|
"TestContextBoundedRender",
|
|
@@ -117,11 +117,11 @@
|
|
|
117
117
|
]
|
|
118
118
|
},
|
|
119
119
|
"windows/arm64": {
|
|
120
|
-
"source_commit": "
|
|
120
|
+
"source_commit": "ed51f5030af5520d5ae67486c3c7776b76bcfae9",
|
|
121
121
|
"workflow": ".github/workflows/ci.yml",
|
|
122
|
-
"run_id": "
|
|
122
|
+
"run_id": "37265481193",
|
|
123
123
|
"binary_sha256": "f7b193cf0d1eb9ecd233bf1588f6290c2fb8bc41ad327918a740beb2099f719c",
|
|
124
|
-
"observation_sha256": "
|
|
124
|
+
"observation_sha256": "72aa77d09842772a7918b1ebd3ba6d2d7ecfefc24256cd557fb66949fef7b0ec",
|
|
125
125
|
"module_sha256": "d5cccd13647e2c3a2a752b94b34dec4d4fc6aec5ced8fb0abce6ec9346ba1a7e",
|
|
126
126
|
"native_cases": [
|
|
127
127
|
"TestContextBoundedRender",
|
|
@@ -1325,6 +1325,8 @@ def _dispatch_prompt(request: dict[str, Any], *, legacy_inline: bool = False) ->
|
|
|
1325
1325
|
"HTML to reconstruct artifact authority. "
|
|
1326
1326
|
"Do not pass if the evidence is missing, unreadable or inconsistent. The locator "
|
|
1327
1327
|
"is a reference to the complete immutable evidence, not replacement authority.\n"
|
|
1328
|
+
"Each finding has exactly severity, code, message; severity must be BLOCK, WARN, or INFO. "
|
|
1329
|
+
"code and message must be non-empty strings. Use an empty findings list when there are none.\n"
|
|
1328
1330
|
)
|
|
1329
1331
|
profile = (
|
|
1330
1332
|
f"Native review profile: {CODEX_NATIVE_V1}. This review was dispatched through "
|
|
@@ -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.16.
|
|
14
|
+
adapter_version = "0.16.2"
|
|
15
15
|
update_target = "ca-pi"
|
|
16
16
|
update_tag_prefix = "ca-pi-v"
|
|
17
17
|
update_command = "pi update npm:@arbiterforge/ca-pi"
|
|
@@ -48,7 +48,7 @@ PENDING_DIR = Path(".codearbiter/.markers/pending-prerequisites")
|
|
|
48
48
|
SOURCE_DIR = Path(".codearbiter/.artifacts/authority-sources")
|
|
49
49
|
FORMAT = "codearbiter.pending-user-prerequisite/0.1.0"
|
|
50
50
|
POLICY = "explicit-user-prerequisite-confirmation/0.1.0"
|
|
51
|
-
CONFIRMATION_LIFETIME_SECONDS =
|
|
51
|
+
CONFIRMATION_LIFETIME_SECONDS = _replylib.CODE_TTL_SECONDS
|
|
52
52
|
CONFIRMATION_RE = re.compile(r"[A-Za-z0-9_-]{12,128}")
|
|
53
53
|
ID_RE = re.compile(r"[A-Z][A-Z0-9_-]{0,127}")
|
|
54
54
|
HOST_RE = re.compile(r"[A-Za-z0-9_-]{1,32}")
|
|
@@ -620,9 +620,12 @@ def arm_user_prerequisite(
|
|
|
620
620
|
"requirement": record["requirement"],
|
|
621
621
|
"review_packet_sha256": packet_sha256,
|
|
622
622
|
"reply": reply,
|
|
623
|
+
"expires_at": pending["expires_at"],
|
|
624
|
+
"expires_at_utc": time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime(pending["expires_at"])),
|
|
623
625
|
**_replylib.offer_code(root, "prerequisite", artifact_id, reply,
|
|
624
626
|
names=[artifact_id, prerequisite_id],
|
|
625
|
-
short_prefix=["satisfy-prerequisite"]
|
|
627
|
+
short_prefix=["satisfy-prerequisite"],
|
|
628
|
+
expires_at=pending["expires_at"]),
|
|
626
629
|
"pending": relative.as_posix(),
|
|
627
630
|
}
|
|
628
631
|
|
|
@@ -652,7 +655,7 @@ def _confirm(
|
|
|
652
655
|
session_id: str,
|
|
653
656
|
now: int,
|
|
654
657
|
) -> dict[str, Any]:
|
|
655
|
-
if now
|
|
658
|
+
if now >= pending["expires_at"]:
|
|
656
659
|
raise PrerequisiteError(
|
|
657
660
|
"EXPIRED_PREREQUISITE", "the prerequisite confirmation request expired"
|
|
658
661
|
)
|
|
@@ -207,7 +207,8 @@ def _write(path: Path, value: dict) -> None:
|
|
|
207
207
|
|
|
208
208
|
|
|
209
209
|
def issue_code(root, route: str, artifact_id: str, full_reply: str, *,
|
|
210
|
-
names: list[str], short_prefix: list[str]
|
|
210
|
+
names: list[str], short_prefix: list[str],
|
|
211
|
+
expires_at: int | None = None) -> dict[str, str]:
|
|
211
212
|
"""Issue a unique four-character code expanding to ``full_reply``."""
|
|
212
213
|
if route not in ROUTES or not isinstance(full_reply, str) or canonicalize(full_reply) != full_reply:
|
|
213
214
|
raise ReplyCodeError("reply code request is invalid")
|
|
@@ -223,20 +224,22 @@ def issue_code(root, route: str, artifact_id: str, full_reply: str, *,
|
|
|
223
224
|
raise ReplyCodeError("no free reply code")
|
|
224
225
|
value = {"format": FORMAT, "route": route, "artifact_id": artifact_id, "repository": repository,
|
|
225
226
|
"short_reply": short, "full_reply": full_reply, "names": list(names),
|
|
226
|
-
"expires_at": int(time.time()) + CODE_TTL_SECONDS}
|
|
227
|
+
"expires_at": int(time.time()) + CODE_TTL_SECONDS if expires_at is None else expires_at}
|
|
227
228
|
value["integrity_sha256"] = _digest(_canonical(value))
|
|
228
229
|
_write(path, value)
|
|
229
230
|
return {"code": code, "short_reply": short}
|
|
230
231
|
|
|
231
232
|
|
|
232
233
|
def offer_code(root, route: str, artifact_id: str, full_reply: str, *,
|
|
233
|
-
names: list[str], short_prefix: list[str]
|
|
234
|
+
names: list[str], short_prefix: list[str],
|
|
235
|
+
expires_at: int | None = None) -> dict[str, str]:
|
|
234
236
|
"""Arm-result fields for a short code; empty when one cannot be issued.
|
|
235
237
|
|
|
236
238
|
The code is a convenience: failing to issue one never blocks arming, and
|
|
237
239
|
the full reply always remains accepted."""
|
|
238
240
|
try:
|
|
239
|
-
issued = issue_code(root, route, artifact_id, full_reply, names=names,
|
|
241
|
+
issued = issue_code(root, route, artifact_id, full_reply, names=names,
|
|
242
|
+
short_prefix=short_prefix, expires_at=expires_at)
|
|
240
243
|
except (ReplyCodeError, OSError):
|
|
241
244
|
return {}
|
|
242
245
|
return {"code": issued["code"], "short_reply": issued["short_reply"]}
|
|
@@ -313,7 +313,7 @@ class Host:
|
|
|
313
313
|
|
|
314
314
|
name = "claude"
|
|
315
315
|
adapter_name = "ca"
|
|
316
|
-
adapter_version = "2.24.
|
|
316
|
+
adapter_version = "2.24.2"
|
|
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,
|
|
@@ -99,9 +99,9 @@ limit or excluding source/test/governance inputs needed for the task.
|
|
|
99
99
|
The existing user, SMARTS, reviewer, or verification boundary must first persist
|
|
100
100
|
its actual policy-owned workflow event as canonical JSON in the reserved
|
|
101
101
|
content-addressed authority-source store. Interactive prompt approval currently
|
|
102
|
-
has production host seams in Claude Code and Codex. Pi 0.
|
|
103
|
-
|
|
104
|
-
adapter; the workflow remains blocked until
|
|
102
|
+
has production host seams in Claude Code and Codex. Pi 1.0.0 exposes an `input`
|
|
103
|
+
event, but codeArbiter has no Pi-native authority adapter. Under Pi do not arm this
|
|
104
|
+
adapter; the workflow remains blocked until that adapter is
|
|
105
105
|
implemented. On Claude Code or Codex, arm the exact current artifact immediately
|
|
106
106
|
before asking the approval question:
|
|
107
107
|
|
|
@@ -180,8 +180,9 @@ current approved plan and prerequisite:
|
|
|
180
180
|
python "<plugin-root>/hooks/_prerequisitelib.py" arm --root "<project-root>" --artifact-id <artifact-id> --prerequisite-id <prerequisite-id>
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
-
Show the returned title, requirement,
|
|
184
|
-
|
|
183
|
+
Show the returned title, requirement, review-packet digest, and `expires_at_utc`
|
|
184
|
+
deadline. The request and its reply code expire together 24 hours after arming.
|
|
185
|
+
Require the returned `short_reply` (`satisfy-prerequisite <code>`) or the full `reply`, with
|
|
185
186
|
the same tolerance and mismatch reporting as approval. The `UserPromptSubmit` hook
|
|
186
187
|
durably records that observed decision before publishing its authority source,
|
|
187
188
|
captures a prerequisite receipt, and applies the existing prerequisite CAS
|
|
@@ -211,7 +212,7 @@ python "<plugin-root>/hooks/_prerequisitelib.py" supersede --root "<project-root
|
|
|
211
212
|
The adapter fixes `authority_kind: user_workflow` and `verdict: satisfied`;
|
|
212
213
|
there is no caller-selected authority or bulk-satisfaction path. SMARTS prerequisite satisfaction remains unsupported; the plan-method producer below does not
|
|
213
214
|
grant prerequisite, security, backend or publication authority. Pi has no
|
|
214
|
-
|
|
215
|
+
prerequisite-capture adapter and must remain blocked. Do not infer eligibility from one satisfied prerequisite:
|
|
215
216
|
rerun `eligible`, and resolve each remaining record independently against the
|
|
216
217
|
new current plan identity.
|
|
217
218
|
|