@arbiterforge/ca-pi 0.16.5 → 0.16.6
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 +10 -0
- package/plugins/ca-pi/helpers/artifacts/release.json +18 -18
- package/plugins/ca-pi/hooks/_artifactauthoritylib.py +16 -10
- 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.24.
|
|
13
|
+
<img alt="version 2.24.5" src="https://img.shields.io/badge/version-2.24.5-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,16 @@ All notable changes to `ca-pi` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.16.6] - 2026-10-05
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Publish a review whose reply contains non-ASCII text (an em dash, accented or emoji
|
|
12
|
+
characters). The authority adapter hashed the observation payload and producer
|
|
13
|
+
result as ASCII-escaped JSON while the engine hashes raw UTF-8, so such a review
|
|
14
|
+
failed with `OBSERVATION_UNVERIFIED`. Observation digests now use the engine's
|
|
15
|
+
canonical form.
|
|
16
|
+
|
|
7
17
|
## [0.16.5] - 2026-10-05
|
|
8
18
|
|
|
9
19
|
### Changed
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
},
|
|
38
38
|
"context_qualification": {
|
|
39
39
|
"darwin/amd64": {
|
|
40
|
-
"source_commit": "
|
|
40
|
+
"source_commit": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
41
41
|
"workflow": ".github/workflows/ci.yml",
|
|
42
|
-
"run_id": "
|
|
42
|
+
"run_id": "37623035385",
|
|
43
43
|
"binary_sha256": "5670d20116a3c846f539b82e8db49a68509016c3dda4a147126c0d85e63e484a",
|
|
44
|
-
"observation_sha256": "
|
|
44
|
+
"observation_sha256": "2329112713771cc95c19bad6b0350b0a37eeebf067ab2d9c14fa6c03c2f3121b",
|
|
45
45
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
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": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
57
57
|
"workflow": ".github/workflows/ci.yml",
|
|
58
|
-
"run_id": "
|
|
58
|
+
"run_id": "37623035385",
|
|
59
59
|
"binary_sha256": "dbc911004289993da4d720113906baba12f1afa510894f850a042869c9af918b",
|
|
60
|
-
"observation_sha256": "
|
|
60
|
+
"observation_sha256": "1bb537709ab07417e7d0a1c61527d426bf9e583db7ea939523e88c9e2b7cc97d",
|
|
61
61
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
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": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
73
73
|
"workflow": ".github/workflows/ci.yml",
|
|
74
|
-
"run_id": "
|
|
74
|
+
"run_id": "37623035385",
|
|
75
75
|
"binary_sha256": "9e13efce9499ea895a60fe7461a6234e258ac1ad836f1e9272cce7dfc88bb0d4",
|
|
76
|
-
"observation_sha256": "
|
|
76
|
+
"observation_sha256": "6f295c8569f441a8bdfc02492b2962f182be62561d6911be7e5819c114aa7a78",
|
|
77
77
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
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": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
89
89
|
"workflow": ".github/workflows/ci.yml",
|
|
90
|
-
"run_id": "
|
|
90
|
+
"run_id": "37623035385",
|
|
91
91
|
"binary_sha256": "e527ac09363a15c2c70cfe92b1a051ee645c3ce528cafccdfc5349e16bcf34e8",
|
|
92
|
-
"observation_sha256": "
|
|
92
|
+
"observation_sha256": "7b0b251ac87d6ae31c1d9fe6622f6f316474ccde2ebbce153e380e296cb02097",
|
|
93
93
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
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": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
105
105
|
"workflow": ".github/workflows/ci.yml",
|
|
106
|
-
"run_id": "
|
|
106
|
+
"run_id": "37623035385",
|
|
107
107
|
"binary_sha256": "c545c16d9aad8968e6616a5749500ee56e7907bab97fc9aefa7e02204162e2cb",
|
|
108
|
-
"observation_sha256": "
|
|
108
|
+
"observation_sha256": "531460c5014621590d9e5afd3c455cb66c88e5d32a137b8c8c92559c29a8523e",
|
|
109
109
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
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": "49aed5b5c4f78d3e8fcf359c2b9e43472068ebb1",
|
|
121
121
|
"workflow": ".github/workflows/ci.yml",
|
|
122
|
-
"run_id": "
|
|
122
|
+
"run_id": "37623035385",
|
|
123
123
|
"binary_sha256": "0bc2c45ab2eff641ae2f493016f2a0828d2757c9670be645b2c7366d3a86c9f3",
|
|
124
|
-
"observation_sha256": "
|
|
124
|
+
"observation_sha256": "020ff24e68e25f62d65151c8d476a3abb8a2aba5bb01fc0558e526c777461bf3",
|
|
125
125
|
"module_sha256": "f4b15732c8d1066be412718753670f3aeedc9ac668447919bb903db2eedace10",
|
|
126
126
|
"native_cases": [
|
|
127
127
|
"TestContextBoundedRender",
|
|
@@ -141,7 +141,7 @@ def _canonical(value: Any) -> bytes:
|
|
|
141
141
|
raise AuthorityError("INVALID_AUTHORITY_STATE", "state is not finite JSON") from exc
|
|
142
142
|
|
|
143
143
|
|
|
144
|
-
def _native_context_canonical(value: Any) -> bytes:
|
|
144
|
+
def _native_context_canonical(value: Any, code: str = "INVALID_EVIDENCE_CONTEXT") -> bytes:
|
|
145
145
|
"""Match the artifact engine's safe-integer, UTF-16-key-order JSON bytes."""
|
|
146
146
|
def ordered(item: Any, depth: int) -> Any:
|
|
147
147
|
if depth > 64:
|
|
@@ -172,7 +172,13 @@ def _native_context_canonical(value: Any) -> bytes:
|
|
|
172
172
|
raise ValueError("context exceeds native byte limit")
|
|
173
173
|
return raw
|
|
174
174
|
except (TypeError, ValueError, UnicodeError, RecursionError) as exc:
|
|
175
|
-
raise AuthorityError(
|
|
175
|
+
raise AuthorityError(code, "value is outside native canonical JSON") from exc
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _engine_digest(value: Any) -> str:
|
|
179
|
+
"""Digest a value exactly as the engine's canonical.Hash does: raw UTF-8,
|
|
180
|
+
never ASCII-escaped, so non-ASCII text binds to the same digest."""
|
|
181
|
+
return _digest(_native_context_canonical(value, "INVALID_AUTHORITY_STATE"))
|
|
176
182
|
|
|
177
183
|
|
|
178
184
|
def _digest(data: bytes) -> str:
|
|
@@ -2106,11 +2112,11 @@ def _closed_observation(
|
|
|
2106
2112
|
"subject": request["context"]["subject"],
|
|
2107
2113
|
"context_ref": request["context_ref"],
|
|
2108
2114
|
"context_sha256": request["context_sha256"],
|
|
2109
|
-
"payload_sha256":
|
|
2115
|
+
"payload_sha256": _engine_digest(payload),
|
|
2110
2116
|
"producer_profile": producer_profile,
|
|
2111
2117
|
"producer_run_id": producer_run_id,
|
|
2112
2118
|
"producer_result": producer_result,
|
|
2113
|
-
"producer_result_sha256":
|
|
2119
|
+
"producer_result_sha256": _engine_digest(producer_result),
|
|
2114
2120
|
}
|
|
2115
2121
|
|
|
2116
2122
|
|
|
@@ -2163,11 +2169,11 @@ def capture_user_prompt(
|
|
|
2163
2169
|
"subject": subject,
|
|
2164
2170
|
"context_ref": context_ref,
|
|
2165
2171
|
"context_sha256": context_sha256,
|
|
2166
|
-
"payload_sha256":
|
|
2172
|
+
"payload_sha256": _engine_digest(event.get("payload")),
|
|
2167
2173
|
"producer_profile": "host-user-prompt/0.1.0",
|
|
2168
2174
|
"producer_run_id": producer_run_id,
|
|
2169
2175
|
"producer_result": producer_result,
|
|
2170
|
-
"producer_result_sha256":
|
|
2176
|
+
"producer_result_sha256": _engine_digest(producer_result),
|
|
2171
2177
|
}
|
|
2172
2178
|
observation_raw = _canonical(observation)
|
|
2173
2179
|
observation_sha256 = _digest(observation_raw)
|
|
@@ -2213,12 +2219,12 @@ def _context_preview_context(root: Path, client: Any, preview: dict[str, Any], p
|
|
|
2213
2219
|
"record_id": "CONTEXT-" + preview["document_id"].upper(),
|
|
2214
2220
|
"normative_sha256": binding}
|
|
2215
2221
|
if (
|
|
2216
|
-
_digest(raw) != context_hash or raw !=
|
|
2222
|
+
_digest(raw) != context_hash or raw != _native_context_canonical(context, "INVALID_CONTEXT_AUTHORITY")
|
|
2217
2223
|
or context.get("activity") != CONTEXT_ROUTE
|
|
2218
2224
|
or context.get("preview") != preview
|
|
2219
2225
|
or context.get("subject") != subject
|
|
2220
2226
|
or context.get("record") != {"preview_binding_sha256": binding}
|
|
2221
|
-
or context.get("record_sha256") !=
|
|
2227
|
+
or context.get("record_sha256") != _engine_digest(context.get("record"))
|
|
2222
2228
|
or context.get("input_sha256") != binding
|
|
2223
2229
|
or context.get("prompt_sha256") != _digest(prompt.encode("utf-8"))
|
|
2224
2230
|
or result.get("subject") != subject
|
|
@@ -2302,9 +2308,9 @@ def capture_context_preview(root: str | Path, client: Any, prompt: str, *, host:
|
|
|
2302
2308
|
observation = {
|
|
2303
2309
|
"format": OBSERVATION_FORMAT, "kind": CONTEXT_ROUTE,
|
|
2304
2310
|
"subject": context["subject"], "context_ref": context_ref,
|
|
2305
|
-
"context_sha256": context_hash, "payload_sha256":
|
|
2311
|
+
"context_sha256": context_hash, "payload_sha256": _engine_digest(payload),
|
|
2306
2312
|
"producer_profile": "host-user-context-preview/0.1.0", "producer_run_id": producer_run_id,
|
|
2307
|
-
"producer_result": producer_result, "producer_result_sha256":
|
|
2313
|
+
"producer_result": producer_result, "producer_result_sha256": _engine_digest(producer_result),
|
|
2308
2314
|
}
|
|
2309
2315
|
observation_raw = _canonical(observation)
|
|
2310
2316
|
observation_hash = _digest(observation_raw)
|
|
@@ -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.6"
|
|
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.24.
|
|
316
|
+
adapter_version = "2.24.5"
|
|
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,
|