@arbiterforge/ca-pi 0.17.6 → 0.17.7
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 +8 -0
- 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 +36 -36
- package/plugins/ca-pi/hooks/_approvallib.py +32 -64
- package/plugins/ca-pi/hooks/_host.py +1 -1
- package/plugins/ca-pi/hooks/hostapi.py +1 -1
- package/plugins/ca-pi/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ and durable 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.25.
|
|
13
|
+
<img alt="version 2.25.6" src="https://img.shields.io/badge/version-2.25.6-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">
|
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.17.7] - 2026-10-10
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Carry the shared bounded verification projection and approval preflight checks,
|
|
12
|
+
retaining complete command definitions, source snapshot ordering and full plan
|
|
13
|
+
identity freshness. Pi verification and review authority remain unsupported.
|
|
14
|
+
|
|
7
15
|
## [0.17.6] - 2026-10-10
|
|
8
16
|
|
|
9
17
|
### Fixed
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -6,43 +6,43 @@
|
|
|
6
6
|
"binaries": {
|
|
7
7
|
"darwin/amd64": {
|
|
8
8
|
"file": "ca-artifact-darwin-amd64",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "5214e1062e49aa39cd73868cd9792e7e296a865bb6e86230b17c19dda1ba3b71",
|
|
10
10
|
"native_tested": true
|
|
11
11
|
},
|
|
12
12
|
"darwin/arm64": {
|
|
13
13
|
"file": "ca-artifact-darwin-arm64",
|
|
14
|
-
"sha256": "
|
|
14
|
+
"sha256": "dde6deb178a0e725f8a88b1b30fa6980622b8af3b13fb73261aaaea47eb75a38",
|
|
15
15
|
"native_tested": true
|
|
16
16
|
},
|
|
17
17
|
"linux/amd64": {
|
|
18
18
|
"file": "ca-artifact-linux-amd64",
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "ca2d5e0fecac0c99c45dc7576fff7d56af63dbd85decb4cfc54f81621ac90901",
|
|
20
20
|
"native_tested": true
|
|
21
21
|
},
|
|
22
22
|
"linux/arm64": {
|
|
23
23
|
"file": "ca-artifact-linux-arm64",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "de18df4c499814f6ccfc69efa6bfb6f4bbcd37c2af5dd091727233f1aaf91a39",
|
|
25
25
|
"native_tested": true
|
|
26
26
|
},
|
|
27
27
|
"windows/amd64": {
|
|
28
28
|
"file": "ca-artifact-windows-amd64.exe",
|
|
29
|
-
"sha256": "
|
|
29
|
+
"sha256": "ddab696f02b946400feac527f747a020b76dbb9e5dd444b0b7d464acbcd3888e",
|
|
30
30
|
"native_tested": true
|
|
31
31
|
},
|
|
32
32
|
"windows/arm64": {
|
|
33
33
|
"file": "ca-artifact-windows-arm64.exe",
|
|
34
|
-
"sha256": "
|
|
34
|
+
"sha256": "23689eaa4df71f95bde58b18bc32fab8d4ae709495250ddfd13192fc0427a813",
|
|
35
35
|
"native_tested": true
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"context_qualification": {
|
|
39
39
|
"darwin/amd64": {
|
|
40
|
-
"source_commit": "
|
|
40
|
+
"source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
41
41
|
"workflow": ".github/workflows/ci.yml",
|
|
42
|
-
"run_id": "
|
|
43
|
-
"binary_sha256": "
|
|
44
|
-
"observation_sha256": "
|
|
45
|
-
"module_sha256": "
|
|
42
|
+
"run_id": "38199172149",
|
|
43
|
+
"binary_sha256": "5214e1062e49aa39cd73868cd9792e7e296a865bb6e86230b17c19dda1ba3b71",
|
|
44
|
+
"observation_sha256": "1c6f01fc33af2fabbd15633dbd1f5313208dd6eb754d00a1a17d80287f656a37",
|
|
45
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
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": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
57
57
|
"workflow": ".github/workflows/ci.yml",
|
|
58
|
-
"run_id": "
|
|
59
|
-
"binary_sha256": "
|
|
60
|
-
"observation_sha256": "
|
|
61
|
-
"module_sha256": "
|
|
58
|
+
"run_id": "38199172149",
|
|
59
|
+
"binary_sha256": "dde6deb178a0e725f8a88b1b30fa6980622b8af3b13fb73261aaaea47eb75a38",
|
|
60
|
+
"observation_sha256": "94f984c74dd5a906bd5ea8ad03c2efe2e561c1e19e3574bb2825e353531c138d",
|
|
61
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
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": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
73
73
|
"workflow": ".github/workflows/ci.yml",
|
|
74
|
-
"run_id": "
|
|
75
|
-
"binary_sha256": "
|
|
76
|
-
"observation_sha256": "
|
|
77
|
-
"module_sha256": "
|
|
74
|
+
"run_id": "38199172149",
|
|
75
|
+
"binary_sha256": "ca2d5e0fecac0c99c45dc7576fff7d56af63dbd85decb4cfc54f81621ac90901",
|
|
76
|
+
"observation_sha256": "ba2155d373bbfd6e4469aa4e240cb1f06a6ac93823d9b6958ae8c0053a4d4a61",
|
|
77
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
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": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
89
89
|
"workflow": ".github/workflows/ci.yml",
|
|
90
|
-
"run_id": "
|
|
91
|
-
"binary_sha256": "
|
|
92
|
-
"observation_sha256": "
|
|
93
|
-
"module_sha256": "
|
|
90
|
+
"run_id": "38199172149",
|
|
91
|
+
"binary_sha256": "de18df4c499814f6ccfc69efa6bfb6f4bbcd37c2af5dd091727233f1aaf91a39",
|
|
92
|
+
"observation_sha256": "fd52f870338809a6dca3a0f1367130af716fbe463c1f7715e775bed2307508f3",
|
|
93
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
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": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
105
105
|
"workflow": ".github/workflows/ci.yml",
|
|
106
|
-
"run_id": "
|
|
107
|
-
"binary_sha256": "
|
|
108
|
-
"observation_sha256": "
|
|
109
|
-
"module_sha256": "
|
|
106
|
+
"run_id": "38199172149",
|
|
107
|
+
"binary_sha256": "ddab696f02b946400feac527f747a020b76dbb9e5dd444b0b7d464acbcd3888e",
|
|
108
|
+
"observation_sha256": "fcfedfe79d6b914347674538c432dad334da8d06794d138ec295c1568e3ef158",
|
|
109
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
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": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
|
|
121
121
|
"workflow": ".github/workflows/ci.yml",
|
|
122
|
-
"run_id": "
|
|
123
|
-
"binary_sha256": "
|
|
124
|
-
"observation_sha256": "
|
|
125
|
-
"module_sha256": "
|
|
122
|
+
"run_id": "38199172149",
|
|
123
|
+
"binary_sha256": "23689eaa4df71f95bde58b18bc32fab8d4ae709495250ddfd13192fc0427a813",
|
|
124
|
+
"observation_sha256": "3ea32af39b84aaf1ccfbda2063c2c2c3031f205f838b52e3fc2b03ae00f3e392",
|
|
125
|
+
"module_sha256": "1aea76bc4dc8b54b368dccc80c3a1133b403b5915018fdcb6018f1a3913fe66c",
|
|
126
126
|
"native_cases": [
|
|
127
127
|
"TestContextBoundedRender",
|
|
128
128
|
"TestContextDocumentContract",
|
|
@@ -93,70 +93,44 @@ def _preflight_plan_verification(client: Any, identity: dict[str, Any]) -> dict[
|
|
|
93
93
|
artifact_id = identity["artifact_id"]
|
|
94
94
|
|
|
95
95
|
def same_identity(value: dict[str, Any]) -> None:
|
|
96
|
-
if not isinstance(value, dict) or
|
|
96
|
+
if not isinstance(value, dict) or type(value.get("revision")) is not int:
|
|
97
|
+
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan verification identity is malformed")
|
|
98
|
+
if any(value.get(key) != identity.get(key) for key in keys):
|
|
97
99
|
raise _artifactlib.ArtifactError("STALE_PLAN_PREFLIGHT", "plan identity changed during verification preflight; reread the complete current plan")
|
|
98
100
|
|
|
99
|
-
def task_records(ids: list[str]):
|
|
100
|
-
for start in range(0, len(ids), 128):
|
|
101
|
-
selected = ids[start:start + 128]
|
|
102
|
-
offset = 0
|
|
103
|
-
for _ in range(len(selected)):
|
|
104
|
-
page = client.call("read-batch", {
|
|
105
|
-
"artifact_id": artifact_id, "symbols": selected,
|
|
106
|
-
"model_sha256": identity["model_sha256"], "offset": offset, "budget": 16384,
|
|
107
|
-
})
|
|
108
|
-
same_identity(page)
|
|
109
|
-
_artifactlib.ArtifactClient._check_page(page, offset, "records")
|
|
110
|
-
records = page["records"]
|
|
111
|
-
end = offset + len(records)
|
|
112
|
-
if (page.get("mode") != "exact" or page.get("context_complete") is not False
|
|
113
|
-
or type(page.get("offset")) is not int or page["offset"] != offset
|
|
114
|
-
or type(page.get("total")) is not int or page["total"] != len(selected)
|
|
115
|
-
or not records or end > len(selected)
|
|
116
|
-
or page["next_offset"] != (end if end < len(selected) else None)):
|
|
117
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan task batch count, offset or completeness changed")
|
|
118
|
-
for expected_id, row in zip(selected[offset:end], records):
|
|
119
|
-
if (not isinstance(row, dict) or row.get("id") != expected_id
|
|
120
|
-
or row.get("kind") != "tasks" or row.get("retired") is not False
|
|
121
|
-
or not isinstance(row.get("record"), dict) or row["record"].get("id") != expected_id):
|
|
122
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan task batch contains an invalid or unexpected record")
|
|
123
|
-
yield row["record"]
|
|
124
|
-
if page["next_offset"] is None:
|
|
125
|
-
break
|
|
126
|
-
offset = end
|
|
127
|
-
else:
|
|
128
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan task batch did not terminate")
|
|
129
|
-
|
|
130
|
-
same_identity(client.call("identity", {"artifact_id": artifact_id}))
|
|
131
101
|
root = _artifactlib._trusted_directory(client.root, "UNSAFE_ROOT")
|
|
132
102
|
diagnostics: list[str] = []
|
|
133
|
-
|
|
103
|
+
last_task_id = ""
|
|
134
104
|
command_count = 0
|
|
135
105
|
offset, total = 0, None
|
|
136
106
|
for _ in range(8193):
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
107
|
+
try:
|
|
108
|
+
page = client.call("plan-verification", {
|
|
109
|
+
"artifact_id": artifact_id, "expected": {key: identity[key] for key in keys},
|
|
110
|
+
"offset": offset, "budget": 16384,
|
|
111
|
+
})
|
|
112
|
+
except _artifactlib.ArtifactError as exc:
|
|
113
|
+
if exc.code == "STALE_CURSOR":
|
|
114
|
+
raise _artifactlib.ArtifactError("STALE_PLAN_PREFLIGHT", "plan identity changed during verification preflight; reread the complete current plan") from exc
|
|
115
|
+
raise
|
|
141
116
|
same_identity(page)
|
|
142
|
-
_artifactlib.ArtifactClient._check_page(page, offset, "
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
117
|
+
_artifactlib.ArtifactClient._check_page(page, offset, "tasks")
|
|
118
|
+
tasks = page["tasks"]
|
|
119
|
+
end = offset + len(tasks)
|
|
120
|
+
if (page.get("context_complete") is not False
|
|
121
|
+
or type(page.get("offset")) is not int or page["offset"] != offset
|
|
122
|
+
or type(page.get("total")) is not int or page["total"] < end
|
|
123
|
+
or total is not None and page["total"] != total
|
|
124
|
+
or not tasks and page["total"] != 0
|
|
125
|
+
or page["next_offset"] != (end if end < page["total"] else None)):
|
|
126
|
+
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan verification count, offset or completeness changed")
|
|
147
127
|
total = page["total"]
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
or
|
|
152
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan
|
|
153
|
-
|
|
154
|
-
if row.get("kind") != "tasks" or row["retired"]:
|
|
155
|
-
continue
|
|
156
|
-
tasks.append(row["id"])
|
|
157
|
-
for task in task_records(tasks):
|
|
158
|
-
if not isinstance(task.get("verification"), list) or not task["verification"]:
|
|
159
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan task lacks complete verification definitions")
|
|
128
|
+
for task in tasks:
|
|
129
|
+
if (not isinstance(task, dict) or set(task) != {"id", "verification"}
|
|
130
|
+
or not isinstance(task.get("id"), str) or task["id"] <= last_task_id
|
|
131
|
+
or not isinstance(task.get("verification"), list) or not task["verification"]):
|
|
132
|
+
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan verification contains an invalid, unordered or incomplete task")
|
|
133
|
+
last_task_id = task["id"]
|
|
160
134
|
for number, definition in enumerate(task["verification"], 1):
|
|
161
135
|
command_count += 1
|
|
162
136
|
try:
|
|
@@ -177,17 +151,11 @@ def _preflight_plan_verification(client: Any, identity: dict[str, Any]) -> dict[
|
|
|
177
151
|
except (_artifactlib.ArtifactError, _artifactauthoritylib.AuthorityError) as exc:
|
|
178
152
|
argv = definition.get("argv") if isinstance(definition, dict) else None
|
|
179
153
|
diagnostics.append(f"{task['id']} verification[{number}] {json.dumps(argv, ensure_ascii=True)}: {exc}")
|
|
180
|
-
|
|
181
|
-
expected = offset + len(page["records"])
|
|
182
|
-
if next_offset is None:
|
|
183
|
-
if expected != total:
|
|
184
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan outline ended before every record was inspected")
|
|
154
|
+
if page["next_offset"] is None:
|
|
185
155
|
break
|
|
186
|
-
|
|
187
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan outline skipped records")
|
|
188
|
-
offset = next_offset
|
|
156
|
+
offset = end
|
|
189
157
|
else:
|
|
190
|
-
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan
|
|
158
|
+
raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan verification did not terminate")
|
|
191
159
|
try:
|
|
192
160
|
snapshot = client.call("snapshot", {"artifact_id": artifact_id})
|
|
193
161
|
except _artifactlib.ArtifactError as exc:
|
|
@@ -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.17.
|
|
14
|
+
adapter_version = "0.17.7"
|
|
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.25.
|
|
316
|
+
adapter_version = "2.25.6"
|
|
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,
|