@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 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.5" src="https://img.shields.io/badge/version-2.25.5-2b7489">
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.17.6",
3
+ "version": "0.17.7",
4
4
  "license": "AGPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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
@@ -6,43 +6,43 @@
6
6
  "binaries": {
7
7
  "darwin/amd64": {
8
8
  "file": "ca-artifact-darwin-amd64",
9
- "sha256": "7b9e95dba78bda2962d1b879c373a835466fe59aa082a3afb6efbc1fb3de454d",
9
+ "sha256": "5214e1062e49aa39cd73868cd9792e7e296a865bb6e86230b17c19dda1ba3b71",
10
10
  "native_tested": true
11
11
  },
12
12
  "darwin/arm64": {
13
13
  "file": "ca-artifact-darwin-arm64",
14
- "sha256": "2469bd38df4e241f19bb443c4388283aaadc0638951a77331b25be81929d4f4c",
14
+ "sha256": "dde6deb178a0e725f8a88b1b30fa6980622b8af3b13fb73261aaaea47eb75a38",
15
15
  "native_tested": true
16
16
  },
17
17
  "linux/amd64": {
18
18
  "file": "ca-artifact-linux-amd64",
19
- "sha256": "cf4116c08afa66426c3b9d78853dfc09b608e05412054b6fe18817a65db96a76",
19
+ "sha256": "ca2d5e0fecac0c99c45dc7576fff7d56af63dbd85decb4cfc54f81621ac90901",
20
20
  "native_tested": true
21
21
  },
22
22
  "linux/arm64": {
23
23
  "file": "ca-artifact-linux-arm64",
24
- "sha256": "b1e92f0d279fe04b61dd287a4b20fc1db4abc3722c0325f5294a55bb1a972895",
24
+ "sha256": "de18df4c499814f6ccfc69efa6bfb6f4bbcd37c2af5dd091727233f1aaf91a39",
25
25
  "native_tested": true
26
26
  },
27
27
  "windows/amd64": {
28
28
  "file": "ca-artifact-windows-amd64.exe",
29
- "sha256": "d8fa783dc8d30c5d48a8c336bca8ee5fd85be4c72629d7ac7246842b89c5135c",
29
+ "sha256": "ddab696f02b946400feac527f747a020b76dbb9e5dd444b0b7d464acbcd3888e",
30
30
  "native_tested": true
31
31
  },
32
32
  "windows/arm64": {
33
33
  "file": "ca-artifact-windows-arm64.exe",
34
- "sha256": "2df30c81eb58d502aa9a146563b9dd725176cac9f907ebf36b73c157e5de2124",
34
+ "sha256": "23689eaa4df71f95bde58b18bc32fab8d4ae709495250ddfd13192fc0427a813",
35
35
  "native_tested": true
36
36
  }
37
37
  },
38
38
  "context_qualification": {
39
39
  "darwin/amd64": {
40
- "source_commit": "7ef1feead876e08e9ad63d5e507a01650488719f",
40
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
41
41
  "workflow": ".github/workflows/ci.yml",
42
- "run_id": "38042731230",
43
- "binary_sha256": "7b9e95dba78bda2962d1b879c373a835466fe59aa082a3afb6efbc1fb3de454d",
44
- "observation_sha256": "c359781d36118baf2ebe6b73bb0ecefb59f4ca500b31a6f7e5baf52474e1127c",
45
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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": "7ef1feead876e08e9ad63d5e507a01650488719f",
56
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
57
57
  "workflow": ".github/workflows/ci.yml",
58
- "run_id": "38042731230",
59
- "binary_sha256": "2469bd38df4e241f19bb443c4388283aaadc0638951a77331b25be81929d4f4c",
60
- "observation_sha256": "2d4c75ec50210c0bbf4b8c9a754a0fd89ee81dc60c9607066cf17c4e1af2050a",
61
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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": "7ef1feead876e08e9ad63d5e507a01650488719f",
72
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
73
73
  "workflow": ".github/workflows/ci.yml",
74
- "run_id": "38042731230",
75
- "binary_sha256": "cf4116c08afa66426c3b9d78853dfc09b608e05412054b6fe18817a65db96a76",
76
- "observation_sha256": "0a57cde8e4f251ee5faf2cd2dc256638622464030cda79988c11295dec6dfec9",
77
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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": "7ef1feead876e08e9ad63d5e507a01650488719f",
88
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
89
89
  "workflow": ".github/workflows/ci.yml",
90
- "run_id": "38042731230",
91
- "binary_sha256": "b1e92f0d279fe04b61dd287a4b20fc1db4abc3722c0325f5294a55bb1a972895",
92
- "observation_sha256": "926d97ef85d2cd9caa658db620c7f135ea5a07873a188f289181a37ae636921d",
93
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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": "7ef1feead876e08e9ad63d5e507a01650488719f",
104
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
105
105
  "workflow": ".github/workflows/ci.yml",
106
- "run_id": "38042731230",
107
- "binary_sha256": "d8fa783dc8d30c5d48a8c336bca8ee5fd85be4c72629d7ac7246842b89c5135c",
108
- "observation_sha256": "70827706a7d231df640f9d4b27b4250f81311bfd89bee11b65ff48b985c1085c",
109
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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": "7ef1feead876e08e9ad63d5e507a01650488719f",
120
+ "source_commit": "91b2cbba46d29d69ea052019acfabf52dc8e3897",
121
121
  "workflow": ".github/workflows/ci.yml",
122
- "run_id": "38042731230",
123
- "binary_sha256": "2df30c81eb58d502aa9a146563b9dd725176cac9f907ebf36b73c157e5de2124",
124
- "observation_sha256": "f15d9d9894d0ae845e14c3bfba1cf1528f1debe166850e9fb0b46aee27d99dbd",
125
- "module_sha256": "fb635481a9bf9a88dbe052c2d738c28c1e3d2a6d741514fc28ac51b6fc8a47b4",
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 any(value.get(key) != identity.get(key) for key in keys):
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
- seen: set[str] = set()
103
+ last_task_id = ""
134
104
  command_count = 0
135
105
  offset, total = 0, None
136
106
  for _ in range(8193):
137
- request = {"artifact_id": artifact_id, "offset": offset, "budget": 16384}
138
- if offset:
139
- request["model_sha256"] = identity["model_sha256"]
140
- page = client.call("outline", request)
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, "records")
143
- if (page.get("offset") != offset or type(page.get("total")) is not int
144
- or page["total"] < offset + len(page["records"])
145
- or total is not None and page["total"] != total):
146
- raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan outline count or offset changed")
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
- tasks = []
149
- for row in page["records"]:
150
- if (not isinstance(row, dict) or not isinstance(row.get("id"), str)
151
- or row["id"] in seen or type(row.get("retired")) is not bool):
152
- raise _artifactlib.ArtifactError("INVALID_RESPONSE", "plan outline contains an invalid or duplicate record")
153
- seen.add(row["id"])
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
- next_offset = page["next_offset"]
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
- if next_offset != expected:
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 outline did not terminate")
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.6"
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.5"
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,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.17.6",
3
+ "version": "0.17.7",
4
4
  "private": true,
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",