@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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/plugins/ca-pi/CHANGELOG.md +63 -0
- package/plugins/ca-pi/COMMANDS.md +2 -2
- package/plugins/ca-pi/SKILLS.md +5 -5
- package/plugins/ca-pi/SPRINT.md +44 -230
- package/plugins/ca-pi/agents/backend-author.md +5 -5
- package/plugins/ca-pi/agents/checkpoint-aggregator.md +7 -0
- package/plugins/ca-pi/agents/frontend-author.md +5 -5
- package/plugins/ca-pi/agents/grader.md +5 -4
- package/plugins/ca-pi/agents/infra-author.md +6 -7
- package/plugins/ca-pi/agents/scout.md +25 -24
- package/plugins/ca-pi/arbiter.md +6 -4
- package/plugins/ca-pi/generated/command-catalog.json +5 -5
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-darwin-amd64 +0 -0
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-darwin-arm64 +0 -0
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-linux-amd64 +0 -0
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-linux-arm64 +0 -0
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-windows-amd64.exe +0 -0
- package/plugins/ca-pi/helpers/artifacts/ca-artifact-windows-arm64.exe +0 -0
- package/plugins/ca-pi/helpers/artifacts/release.json +37 -37
- package/plugins/ca-pi/hooks/_approvallib.py +41 -0
- package/plugins/ca-pi/hooks/_artifactlib.py +61 -115
- package/plugins/ca-pi/hooks/_artifactpromptlib.py +12 -12
- package/plugins/ca-pi/hooks/_bashguardlib.py +66 -4
- package/plugins/ca-pi/hooks/_contextselectlib.py +38 -35
- package/plugins/ca-pi/hooks/_contextwriterlib.py +114 -0
- package/plugins/ca-pi/hooks/_host.py +1 -1
- package/plugins/ca-pi/hooks/_prerequisitelib.py +35 -0
- package/plugins/ca-pi/hooks/_provenancelib.py +107 -1
- package/plugins/ca-pi/hooks/_readinjectlib.py +21 -7
- package/plugins/ca-pi/hooks/_reconciliationlib.py +167 -2
- package/plugins/ca-pi/hooks/_releaselib.py +6 -6
- package/plugins/ca-pi/hooks/_sprintapprovallib.py +52 -2
- package/plugins/ca-pi/hooks/artifact-reconcile.py +13 -4
- package/plugins/ca-pi/hooks/hostapi.py +1 -1
- package/plugins/ca-pi/hooks/init-codearbiter.py +34 -5
- package/plugins/ca-pi/includes/artifacts-attestation.md +434 -0
- package/plugins/ca-pi/includes/artifacts.md +138 -492
- package/plugins/ca-pi/includes/author-tdd-workflow.md +32 -21
- package/plugins/ca-pi/includes/fresh-verification.md +14 -12
- package/plugins/ca-pi/includes/harvest.md +3 -3
- package/plugins/ca-pi/includes/reference-map.md +1 -1
- package/plugins/ca-pi/includes/routing-table.md +3 -3
- package/plugins/ca-pi/includes/smarts/core.md +93 -17
- package/plugins/ca-pi/includes/smarts/lenses.md +115 -0
- package/plugins/ca-pi/includes/sprint-authority.md +6 -1
- package/plugins/ca-pi/includes/verification-boundary.md +11 -2
- package/plugins/ca-pi/package.json +1 -1
- package/plugins/ca-pi/routines/INDEX.md +8 -8
- package/plugins/ca-pi/routines/brainstorming/SKILL.md +71 -202
- package/plugins/ca-pi/routines/commit-gate/SKILL.md +60 -25
- package/plugins/ca-pi/routines/context-check/SKILL.md +89 -53
- package/plugins/ca-pi/routines/context-creation/SKILL.md +114 -220
- package/plugins/ca-pi/routines/debug/SKILL.md +1 -0
- package/plugins/ca-pi/routines/decision-variance/references/analysis.md +5 -2
- package/plugins/ca-pi/routines/decompose/SKILL.md +139 -167
- package/plugins/ca-pi/routines/executing-plans/SKILL.md +38 -136
- package/plugins/ca-pi/routines/finishing-a-development-branch/SKILL.md +45 -55
- package/plugins/ca-pi/routines/refactor/SKILL.md +33 -12
- package/plugins/ca-pi/routines/release/SKILL.md +1 -1
- package/plugins/ca-pi/routines/subagent-driven-development/SKILL.md +88 -230
- package/plugins/ca-pi/routines/tdd/SKILL.md +115 -228
- package/plugins/ca-pi/routines/writing-plans/SKILL.md +112 -174
- package/plugins/ca-pi/skills/ca-audit/SKILL.md +2 -2
- package/plugins/ca-pi/skills/ca-checkpoint/SKILL.md +1 -1
- package/plugins/ca-pi/skills/ca-commit/SKILL.md +60 -25
- package/plugins/ca-pi/skills/ca-context-check/SKILL.md +89 -53
- package/plugins/ca-pi/skills/ca-create-context/SKILL.md +114 -220
- package/plugins/ca-pi/skills/ca-debug/SKILL.md +1 -0
- package/plugins/ca-pi/skills/ca-decompose/SKILL.md +139 -167
- package/plugins/ca-pi/skills/ca-feature/SKILL.md +28 -38
- package/plugins/ca-pi/skills/ca-fix/SKILL.md +21 -9
- package/plugins/ca-pi/skills/ca-init/SKILL.md +18 -40
- package/plugins/ca-pi/skills/ca-pr/SKILL.md +45 -55
- package/plugins/ca-pi/skills/ca-refactor/SKILL.md +33 -12
- package/plugins/ca-pi/skills/ca-release/SKILL.md +1 -1
- package/plugins/ca-pi/skills/ca-review/SKILL.md +5 -8
- package/plugins/ca-pi/skills/ca-sprint/SKILL.md +11 -25
- package/plugins/ca-pi/skills/ca-status/SKILL.md +15 -6
|
@@ -9,12 +9,11 @@ model: sonnet
|
|
|
9
9
|
|
|
10
10
|
# Infrastructure Author Agent
|
|
11
11
|
|
|
12
|
-
Infrastructure implementation executor.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
right reason before implementation. Do not fabricate a feature artifact for a fix.
|
|
12
|
+
Infrastructure implementation executor. Use the caller's scoped obligations and
|
|
13
|
+
selected verification approach: agreed feature criteria, an authorized bug-origin
|
|
14
|
+
regression obligation, or the refactor's approved surface and parity contract.
|
|
15
|
+
For `/fix`, observe target RED before repair. Do not fabricate a feature artifact
|
|
16
|
+
for a fix. Return scoped results; stage only when assigned and authorized.
|
|
18
17
|
|
|
19
18
|
## Required Reading at the Start of Every Task
|
|
20
19
|
|
|
@@ -22,7 +21,7 @@ Read in full before writing any infrastructure code:
|
|
|
22
21
|
|
|
23
22
|
1. `<project-root>/.codearbiter/tech-stack.md` — IaC tool (OpenTofu, Ansible, Helm, etc.), container runtime, CI/CD system, approved registries
|
|
24
23
|
2. `<project-root>/.codearbiter/security-controls.md` — security boundaries, approved secrets store, compliance requirements affecting infrastructure
|
|
25
|
-
3. `<plugin-root>/includes/author-tdd-workflow.md` —
|
|
24
|
+
3. `<plugin-root>/includes/author-tdd-workflow.md` — route-specific verification and the authorized handoff.
|
|
26
25
|
|
|
27
26
|
## Security Rules
|
|
28
27
|
|
|
@@ -18,28 +18,24 @@ Dispatched by `decision-variance` and `context-creation` to scan an assigned cod
|
|
|
18
18
|
- Codebase sections have natural ownership boundaries that map to scout assignments.
|
|
19
19
|
- Parallel evidence gathering across multiple areas is needed.
|
|
20
20
|
|
|
21
|
-
Under ~50 files, `decision-variance` scans inline.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
on the orchestrator not reading raw source.
|
|
21
|
+
Under ~50 files, `decision-variance` scans inline. `context-creation` uses
|
|
22
|
+
direct bounded inspection or optional scoped agents according to the work.
|
|
23
|
+
Six logical categories do not require six children or parallel execution.
|
|
25
24
|
|
|
26
25
|
## Context-creation assignment
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
the versioned closed report envelope accepted by `_contextreportlib`, bound to
|
|
41
|
-
its assignment, attempt, snapshot and scope. A trusted read-only hash collector
|
|
42
|
-
must supply each cited digest when the restricted child has no Bash.
|
|
27
|
+
Read only the assigned source scope and return a bounded evidence report.
|
|
28
|
+
Respect actual host permissions, excluded paths and secret-handling rules.
|
|
29
|
+
The role's tools and read-only instructions are not evidence of containment;
|
|
30
|
+
do not claim a trusted sandbox, independent verification or authority from
|
|
31
|
+
this role label. A separately required host restriction remains binding.
|
|
32
|
+
Do not modify files, execute repository scripts or spawn further agents.
|
|
33
|
+
|
|
34
|
+
Name the assignment, inspected paths and source identity, citations/digests,
|
|
35
|
+
coverage, unknowns and conflicts. The parent can directly inspect a necessary
|
|
36
|
+
source or resolve a missing report. Use `_contextreportlib`'s closed envelope
|
|
37
|
+
when the caller selects that structured transport; do not invent an envelope
|
|
38
|
+
or receipt to make direct inspection appear delegated.
|
|
43
39
|
|
|
44
40
|
For context-creation, report each assigned category even when the search finds
|
|
45
41
|
no match. Use the closed outcome vocabulary: `observed`, `not_applicable`,
|
|
@@ -83,7 +79,13 @@ Constraints:
|
|
|
83
79
|
|
|
84
80
|
Decision-variance scouts return this exact format.
|
|
85
81
|
|
|
86
|
-
**Hash field:** For decision-variance assignments, emit each cited file's
|
|
82
|
+
**Hash field:** For decision-variance assignments, emit each cited file's
|
|
83
|
+
`git hash-object <path>` oid in the `hash` field. Context assignments retain
|
|
84
|
+
the actual collector and digest method, distinguishing `git-blob-normalized-sha1`
|
|
85
|
+
from `sha256-raw`. Do not substitute a snapshot checksum for a cited file's
|
|
86
|
+
observed digest. A source hash binds bytes, not semantic correctness. Missing
|
|
87
|
+
digests remain unknown until a permitted read obtains them; no secret values
|
|
88
|
+
or raw excerpts belong in the report.
|
|
87
89
|
|
|
88
90
|
```markdown
|
|
89
91
|
# Scout Report — <scope>
|
|
@@ -120,9 +122,8 @@ The scout reports file path and line number only — no code excerpts, quoted te
|
|
|
120
122
|
1. **Signal-to-noise** — excerpts grow unbounded under load; entire files get pasted "for context" and reports become unreadable.
|
|
121
123
|
2. **Sensitive content** — scaffold may carry secrets, internal URLs, cloud account IDs, credentials, hostnames. Quoting those leaks them into the dispatching skill's working files.
|
|
122
124
|
|
|
123
|
-
When
|
|
124
|
-
|
|
125
|
-
scout reports.
|
|
125
|
+
When either owning workflow needs actual content, it may read the necessary
|
|
126
|
+
source directly under the same host permissions and secret-handling boundaries.
|
|
126
127
|
|
|
127
128
|
## Scout Confidence Levels
|
|
128
129
|
|
|
@@ -138,7 +139,7 @@ The scout MUST NOT:
|
|
|
138
139
|
|
|
139
140
|
1. **Judge correctness.** "This looks wrong" is not the scout's call.
|
|
140
141
|
2. **Compare scope against artifacts.** The scout has no knowledge of them.
|
|
141
|
-
3. **Speculate beyond evidence.** No
|
|
142
|
+
3. **Speculate beyond evidence.** No match → report the searched scope and limits, not universal absence.
|
|
142
143
|
4. **Modify files.** Read-only.
|
|
143
144
|
5. **Spawn further subagents.** Only the dispatching skill spawns subagents.
|
|
144
145
|
6. **Include excerpts, quotes, or pasted content.** File path and line number only.
|
package/plugins/ca-pi/arbiter.md
CHANGED
|
@@ -27,7 +27,7 @@ no emojis, no flattery.
|
|
|
27
27
|
- MUST NOT commit without `commit-gate` completing, or while the test suite is red. Sole exception: a `spike/*` branch (via `/spike`), which can never merge or PR.
|
|
28
28
|
- MUST NOT resolve a `[CONFIRM-NN]` by guessing.
|
|
29
29
|
- MUST NOT redefine domain vocabulary without updating `.codearbiter/CONTEXT.md`.
|
|
30
|
-
- MUST log every `/override`,
|
|
30
|
+
- MUST log every `/override`, material sprint decisions, and every mode transition (`mode --dangerous`, `mode --ops`, and the return to `mode --arbiter`) to the `.codearbiter/` audit trail.
|
|
31
31
|
- MUST load skill/routine bodies on invocation only; the `INDEX.md` files are the surface scan. No bulk reads.
|
|
32
32
|
|
|
33
33
|
---
|
|
@@ -61,9 +61,11 @@ Before dispatching roles, editing audit files, or using native compaction, load
|
|
|
61
61
|
|
|
62
62
|
**Loaded fully on invocation, never acted on from memory:**
|
|
63
63
|
|
|
64
|
-
- `/ca-sprint` — autonomous sprint: load and follow `<plugin-root>/SPRINT.md`.
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
- `/ca-sprint` — autonomous sprint: load and follow `<plugin-root>/SPRINT.md`. Maintain
|
|
65
|
+
the agreed spec and plan under the existing authorization, implement useful work, and report
|
|
66
|
+
actual checks. Ask about consequential unresolved choices and respect explicit user checkpoints;
|
|
67
|
+
artifact state adds no permission gate. Use SMARTS for difficult trade-offs when useful and log
|
|
68
|
+
material sprint decisions. A trailing `--farm` flag passes through to `SPRINT.md`.
|
|
67
69
|
|
|
68
70
|
A gates-off posture is a deterministic `mode --dangerous` token flip, intercepted before this
|
|
69
71
|
document is ever loaded for that turn — not a command, and not routed here. `includes/dangerous-mode.md`
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
"context-check": {
|
|
145
145
|
"name": "context-check",
|
|
146
|
-
"description": "
|
|
146
|
+
"description": "Inspect context drift and refresh selected source-backed documents under existing authorization.",
|
|
147
147
|
"skillPath": "skills/ca-context-check/SKILL.md",
|
|
148
148
|
"visibility": "alias",
|
|
149
149
|
"workflow": "operate",
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
},
|
|
153
153
|
"create-context": {
|
|
154
154
|
"name": "create-context",
|
|
155
|
-
"description": "Build project context
|
|
155
|
+
"description": "Build source-backed project context through bounded inspection, optional agents, and safe selected writes.",
|
|
156
156
|
"skillPath": "skills/ca-create-context/SKILL.md",
|
|
157
157
|
"visibility": "alias",
|
|
158
158
|
"workflow": "initialize",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
},
|
|
171
171
|
"decompose": {
|
|
172
172
|
"name": "decompose",
|
|
173
|
-
"description": "Develop greenfield
|
|
173
|
+
"description": "Develop greenfield context from a durable interview and initialize it through the native context writer.",
|
|
174
174
|
"skillPath": "skills/ca-decompose/SKILL.md",
|
|
175
175
|
"visibility": "alias",
|
|
176
176
|
"workflow": "initialize",
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
},
|
|
189
189
|
"feature": {
|
|
190
190
|
"name": "feature",
|
|
191
|
-
"description": "
|
|
191
|
+
"description": "Build an authorized feature from a maintained specification, testable criteria and useful plan, without duplicating user approval.",
|
|
192
192
|
"skillPath": "skills/ca-feature/SKILL.md",
|
|
193
193
|
"visibility": "core",
|
|
194
194
|
"workflow": "change",
|
|
@@ -311,7 +311,7 @@
|
|
|
311
311
|
},
|
|
312
312
|
"sprint": {
|
|
313
313
|
"name": "sprint",
|
|
314
|
-
"description": "
|
|
314
|
+
"description": "Run an autonomous sprint from maintained specs and plans, with truthful verification and no duplicate artifact approval ceremonies.",
|
|
315
315
|
"skillPath": "skills/ca-sprint/SKILL.md",
|
|
316
316
|
"visibility": "core",
|
|
317
317
|
"workflow": "change",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -2,47 +2,47 @@
|
|
|
2
2
|
"format": "codearbiter.artifact-release/0.1.0",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"protocol": "codearbiter.artifact-api/0.1.0",
|
|
5
|
-
"schema_version": "0.3.
|
|
5
|
+
"schema_version": "0.3.2",
|
|
6
6
|
"binaries": {
|
|
7
7
|
"darwin/amd64": {
|
|
8
8
|
"file": "ca-artifact-darwin-amd64",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "ca6dc89a106f4b79eb2ab992eb7617c79742f88eb3d5d9b0444102ecf3f23ed3",
|
|
10
10
|
"native_tested": true
|
|
11
11
|
},
|
|
12
12
|
"darwin/arm64": {
|
|
13
13
|
"file": "ca-artifact-darwin-arm64",
|
|
14
|
-
"sha256": "
|
|
14
|
+
"sha256": "04dae5874b003fb5530a460c3d9ce6da8284ca7bbfb886e6b6591d0e2980934d",
|
|
15
15
|
"native_tested": true
|
|
16
16
|
},
|
|
17
17
|
"linux/amd64": {
|
|
18
18
|
"file": "ca-artifact-linux-amd64",
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "1b2d858cf64e7774cbc2abf8abe7921c5f9fe147fcee796e70dbe38478272847",
|
|
20
20
|
"native_tested": true
|
|
21
21
|
},
|
|
22
22
|
"linux/arm64": {
|
|
23
23
|
"file": "ca-artifact-linux-arm64",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "37e592fb61297850b17e2cd6c603a203143940b42b04e7a285f081b0d9d848e5",
|
|
25
25
|
"native_tested": true
|
|
26
26
|
},
|
|
27
27
|
"windows/amd64": {
|
|
28
28
|
"file": "ca-artifact-windows-amd64.exe",
|
|
29
|
-
"sha256": "
|
|
29
|
+
"sha256": "4f4b3f4cf0ab7230f9cd577a3310a293007af1126913224c8e6103438aaafc8b",
|
|
30
30
|
"native_tested": true
|
|
31
31
|
},
|
|
32
32
|
"windows/arm64": {
|
|
33
33
|
"file": "ca-artifact-windows-arm64.exe",
|
|
34
|
-
"sha256": "
|
|
34
|
+
"sha256": "855bfbd1c628a0b76cfa5bdf7d6ff392fb55e49dba23efb13e2a7a26d9e5ccb4",
|
|
35
35
|
"native_tested": true
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"context_qualification": {
|
|
39
39
|
"darwin/amd64": {
|
|
40
|
-
"source_commit": "
|
|
40
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
41
41
|
"workflow": ".github/workflows/ci.yml",
|
|
42
|
-
"run_id": "
|
|
43
|
-
"binary_sha256": "
|
|
44
|
-
"observation_sha256": "
|
|
45
|
-
"module_sha256": "
|
|
42
|
+
"run_id": "39097065693",
|
|
43
|
+
"binary_sha256": "ca6dc89a106f4b79eb2ab992eb7617c79742f88eb3d5d9b0444102ecf3f23ed3",
|
|
44
|
+
"observation_sha256": "178ac16ede5052a25eff69597ef2c6ab30439bcfd3d9127a1189e9eaa7a6147e",
|
|
45
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
46
46
|
"native_cases": [
|
|
47
47
|
"TestContextBoundedRender",
|
|
48
48
|
"TestContextDocumentContract",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
55
|
"darwin/arm64": {
|
|
56
|
-
"source_commit": "
|
|
56
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
57
57
|
"workflow": ".github/workflows/ci.yml",
|
|
58
|
-
"run_id": "
|
|
59
|
-
"binary_sha256": "
|
|
60
|
-
"observation_sha256": "
|
|
61
|
-
"module_sha256": "
|
|
58
|
+
"run_id": "39097065693",
|
|
59
|
+
"binary_sha256": "04dae5874b003fb5530a460c3d9ce6da8284ca7bbfb886e6b6591d0e2980934d",
|
|
60
|
+
"observation_sha256": "c7a246aafb77097d60704ecae57abcd7a8786078144de3549475684cd93c1fc2",
|
|
61
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
62
62
|
"native_cases": [
|
|
63
63
|
"TestContextBoundedRender",
|
|
64
64
|
"TestContextDocumentContract",
|
|
@@ -69,12 +69,12 @@
|
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
"linux/amd64": {
|
|
72
|
-
"source_commit": "
|
|
72
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
73
73
|
"workflow": ".github/workflows/ci.yml",
|
|
74
|
-
"run_id": "
|
|
75
|
-
"binary_sha256": "
|
|
76
|
-
"observation_sha256": "
|
|
77
|
-
"module_sha256": "
|
|
74
|
+
"run_id": "39097065693",
|
|
75
|
+
"binary_sha256": "1b2d858cf64e7774cbc2abf8abe7921c5f9fe147fcee796e70dbe38478272847",
|
|
76
|
+
"observation_sha256": "f2725ba4c6ef48d36fb92962ef1fc6b00871e057a3234010ab0066a844bf21fd",
|
|
77
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
78
78
|
"native_cases": [
|
|
79
79
|
"TestContextBoundedRender",
|
|
80
80
|
"TestContextDocumentContract",
|
|
@@ -85,12 +85,12 @@
|
|
|
85
85
|
]
|
|
86
86
|
},
|
|
87
87
|
"linux/arm64": {
|
|
88
|
-
"source_commit": "
|
|
88
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
89
89
|
"workflow": ".github/workflows/ci.yml",
|
|
90
|
-
"run_id": "
|
|
91
|
-
"binary_sha256": "
|
|
92
|
-
"observation_sha256": "
|
|
93
|
-
"module_sha256": "
|
|
90
|
+
"run_id": "39097065693",
|
|
91
|
+
"binary_sha256": "37e592fb61297850b17e2cd6c603a203143940b42b04e7a285f081b0d9d848e5",
|
|
92
|
+
"observation_sha256": "3c0cae7073c8e7cf7ba6e40da4a04fad9d623a87914e44dac3b6e329d0dd020a",
|
|
93
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
94
94
|
"native_cases": [
|
|
95
95
|
"TestContextBoundedRender",
|
|
96
96
|
"TestContextDocumentContract",
|
|
@@ -101,12 +101,12 @@
|
|
|
101
101
|
]
|
|
102
102
|
},
|
|
103
103
|
"windows/amd64": {
|
|
104
|
-
"source_commit": "
|
|
104
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
105
105
|
"workflow": ".github/workflows/ci.yml",
|
|
106
|
-
"run_id": "
|
|
107
|
-
"binary_sha256": "
|
|
108
|
-
"observation_sha256": "
|
|
109
|
-
"module_sha256": "
|
|
106
|
+
"run_id": "39097065693",
|
|
107
|
+
"binary_sha256": "4f4b3f4cf0ab7230f9cd577a3310a293007af1126913224c8e6103438aaafc8b",
|
|
108
|
+
"observation_sha256": "3ad94468cbd6eaf40500b525859923feaa5fbb120f91b3aadcc08b08ae837fc9",
|
|
109
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
110
110
|
"native_cases": [
|
|
111
111
|
"TestContextBoundedRender",
|
|
112
112
|
"TestContextDocumentContract",
|
|
@@ -117,12 +117,12 @@
|
|
|
117
117
|
]
|
|
118
118
|
},
|
|
119
119
|
"windows/arm64": {
|
|
120
|
-
"source_commit": "
|
|
120
|
+
"source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
|
|
121
121
|
"workflow": ".github/workflows/ci.yml",
|
|
122
|
-
"run_id": "
|
|
123
|
-
"binary_sha256": "
|
|
124
|
-
"observation_sha256": "
|
|
125
|
-
"module_sha256": "
|
|
122
|
+
"run_id": "39097065693",
|
|
123
|
+
"binary_sha256": "855bfbd1c628a0b76cfa5bdf7d6ff392fb55e49dba23efb13e2a7a26d9e5ccb4",
|
|
124
|
+
"observation_sha256": "8f594d61907c66818ddae106e859c6ba437713ca4c049468425558751ddb9697",
|
|
125
|
+
"module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
|
|
126
126
|
"native_cases": [
|
|
127
127
|
"TestContextBoundedRender",
|
|
128
128
|
"TestContextDocumentContract",
|
|
@@ -345,6 +345,38 @@ def cancel_user_approval(root: str | Path, artifact_id: str) -> dict[str, Any]:
|
|
|
345
345
|
return {"artifact_id": artifact_id, "cancelled": True}
|
|
346
346
|
|
|
347
347
|
|
|
348
|
+
def retire_unanswered_user_approval(
|
|
349
|
+
root: str | Path, artifact_id: str, *, reason: str,
|
|
350
|
+
) -> dict[str, Any]:
|
|
351
|
+
"""Retire only an unsubmitted historical paired prompt, not an approval.
|
|
352
|
+
|
|
353
|
+
The older single-artifact 0.1 marker cannot establish whether a reply
|
|
354
|
+
was captured and its write outcome lost. It is therefore not eligible
|
|
355
|
+
for this automatic cleanup. The paired adapter serializes cancellation
|
|
356
|
+
against the genuine reply consumer and checks the durable submission.
|
|
357
|
+
"""
|
|
358
|
+
if (not isinstance(artifact_id, str) or re.fullmatch(r"[A-Z][A-Z0-9-]{1,79}", artifact_id) is None
|
|
359
|
+
or not isinstance(reason, str) or not reason.strip()
|
|
360
|
+
or len(reason.encode("utf-8")) > 2048):
|
|
361
|
+
raise ApprovalError("INVALID_RETIREMENT", "retirement requires a valid artifact ID and bounded nonblank reason")
|
|
362
|
+
root = Path(root).resolve(strict=True)
|
|
363
|
+
pending = _load_pending(root)
|
|
364
|
+
if pending is None or pending["artifact_id"] != artifact_id:
|
|
365
|
+
raise ApprovalError("NO_PENDING_APPROVAL", "no matching pending approval request")
|
|
366
|
+
if pending["format"] != "codearbiter.pending-user-approval/0.2.0":
|
|
367
|
+
raise ApprovalError("LEGACY_APPROVAL_RECOVERY_REQUIRED",
|
|
368
|
+
"single-artifact pending state cannot prove a user reply was unsubmitted")
|
|
369
|
+
import _sprintapprovallib
|
|
370
|
+
# Uses the existing private per-repository lock and independently checks
|
|
371
|
+
# the current marker and durable submission before deleting either route.
|
|
372
|
+
_sprintapprovallib.cancel(root, pending)
|
|
373
|
+
return {
|
|
374
|
+
"artifact_id": artifact_id, "disposition": "unanswered_prompt_superseded",
|
|
375
|
+
"reason": reason.strip(), "authority_granted": False, "mutation_attempted": False,
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
|
|
348
380
|
def consume_user_approval(
|
|
349
381
|
root: str | Path,
|
|
350
382
|
client: Any,
|
|
@@ -489,6 +521,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
489
521
|
cancel = sub.add_parser("cancel")
|
|
490
522
|
cancel.add_argument("--root", required=True)
|
|
491
523
|
cancel.add_argument("--artifact-id", required=True)
|
|
524
|
+
retire = sub.add_parser("retire")
|
|
525
|
+
retire.add_argument("--root", required=True)
|
|
526
|
+
retire.add_argument("--artifact-id", required=True)
|
|
527
|
+
retire.add_argument("--reason", required=True)
|
|
492
528
|
pair = sub.add_parser("arm-sprint")
|
|
493
529
|
pair.add_argument("--root", required=True)
|
|
494
530
|
pair.add_argument("--spec-id", required=True)
|
|
@@ -504,6 +540,11 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
504
540
|
if args.command == "cancel":
|
|
505
541
|
print(json.dumps(cancel_user_approval(args.root, args.artifact_id)))
|
|
506
542
|
return 0
|
|
543
|
+
if args.command == "retire":
|
|
544
|
+
print(json.dumps(retire_unanswered_user_approval(
|
|
545
|
+
args.root, args.artifact_id, reason=args.reason,
|
|
546
|
+
)))
|
|
547
|
+
return 0
|
|
507
548
|
client = _artifactlib.ArtifactClient(
|
|
508
549
|
args.root, _artifactlib.helper_installation(__file__)
|
|
509
550
|
)
|