@arbiterforge/ca-pi 0.6.1 → 0.6.3
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 +3 -3
- package/package.json +1 -1
- package/plugins/ca-pi/CHANGELOG.md +18 -0
- package/plugins/ca-pi/extensions/codearbiter-child.js +2 -2
- package/plugins/ca-pi/extensions/codearbiter.js +19 -12
- package/plugins/ca-pi/includes/pi-host-notes.md +4 -2
- package/plugins/ca-pi/skills/ca-doctor/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -163,7 +163,7 @@ pi config
|
|
|
163
163
|
Replace `<version>` with the numeric suffix from the chosen tag while retaining the full
|
|
164
164
|
`ca-pi-v...` tag in the install source.
|
|
165
165
|
|
|
166
|
-
Pi 0.80.5 and Pi 0.
|
|
166
|
+
Pi 0.80.5 and Pi 0.84.1 are the supported hosts for this release line. Generated aliases use `/ca-*`;
|
|
167
167
|
`/skill:ca-*` is the host-native fallback. Every `ca-pi-v*` tag is also published to npm as
|
|
168
168
|
`npm:@arbiterforge/ca-pi` with provenance (ADR-0029); the pinned Git tag remains the reproducible
|
|
169
169
|
install. The [Pi runbook](./docs/pi-parity-testing.md) covers isolated install, trust, verification,
|
|
@@ -505,8 +505,8 @@ implement the Pi adapter, investigate live failures, review older paths, and con
|
|
|
505
505
|
across permissions, Windows process-tree cleanup, provenance, audit integrity, generated-source
|
|
506
506
|
drift, CI contracts, and documentation.
|
|
507
507
|
|
|
508
|
-
The final candidate passed the six Pi platform cells
|
|
509
|
-
and Linux, plus security analysis, CodeQL, shared-core contracts, generated-surface contracts, and
|
|
508
|
+
The final candidate passed the six Pi platform cells — both then-supported Pi versions on Windows,
|
|
509
|
+
macOS, and Linux (versions recorded in the linked artifacts), plus security analysis, CodeQL, shared-core contracts, generated-surface contracts, and
|
|
510
510
|
the repository's final verifier. Sanitized evidence:
|
|
511
511
|
|
|
512
512
|
- [`docs/reports/pi-support/promotion.md`](docs/reports/pi-support/promotion.md)
|
package/package.json
CHANGED
|
@@ -4,6 +4,24 @@ All notable changes to `ca-pi` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.6.3] - 2026-08-10
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Promote the verified Pi host window through exact Pi 0.84.1.
|
|
12
|
+
|
|
13
|
+
## [0.6.2] - 2026-08-10
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Child dispatch protocol accepts the three optional message fields Pi 0.84.x
|
|
18
|
+
added: assistant `rawStopReason` (observed on the live RPC wire, where it
|
|
19
|
+
degraded every 0.84 child dispatch after the first provider turn), assistant
|
|
20
|
+
`deferred` (provider deferred-response handle), and toolResult `usage`. Each
|
|
21
|
+
validates strictly when present; unknown keys still fail closed (ADR-0014).
|
|
22
|
+
Proven by the live isolated-child contract against real Pi 0.84.1 and
|
|
23
|
+
0.80.10.
|
|
24
|
+
|
|
7
25
|
## [0.6.1] - 2026-08-10
|
|
8
26
|
|
|
9
27
|
### Fixed
|
|
@@ -629,7 +629,7 @@ function resolvePythonCommand(platform = process.platform, probe = systemPythonP
|
|
|
629
629
|
}
|
|
630
630
|
|
|
631
631
|
// src/compatibility.ts
|
|
632
|
-
var SUPPORTED_PI_VERSIONS = /* @__PURE__ */ new Set(["0.80.5", "0.
|
|
632
|
+
var SUPPORTED_PI_VERSIONS = /* @__PURE__ */ new Set(["0.80.5", "0.84.1"]);
|
|
633
633
|
var MINIMUM_NODE = [22, 19, 0];
|
|
634
634
|
var SEMVER_PREFIX = /^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/u;
|
|
635
635
|
function atLeast(version, minimum) {
|
|
@@ -644,7 +644,7 @@ function atLeast(version, minimum) {
|
|
|
644
644
|
}
|
|
645
645
|
function compatibilityDirection(input) {
|
|
646
646
|
if (!SUPPORTED_PI_VERSIONS.has(input.piVersion)) {
|
|
647
|
-
return "codeArbiter requires Pi 0.80.5 or 0.
|
|
647
|
+
return "codeArbiter requires Pi 0.80.5 or 0.84.1; install a supported Pi version and run /ca-doctor.";
|
|
648
648
|
}
|
|
649
649
|
if (!atLeast(input.nodeVersion, MINIMUM_NODE)) {
|
|
650
650
|
return "codeArbiter requires Node >=22.19.0 for Pi; upgrade Node and run /ca-doctor.";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var define_CODEARBITER_PI_PERMISSION_POLICY_SURFACES_default = { "ca-plan": "planning-write", codearbiter_background_bash: "background-launch" };
|
|
3
3
|
|
|
4
4
|
// <define:__CODEARBITER_PI_SKILL_EXPANSION_FINGERPRINTS__>
|
|
5
|
-
var define_CODEARBITER_PI_SKILL_EXPANSION_FINGERPRINTS_default = { "0.80.5": "12632f365440b07d5183cff871d889b796a3c711b6b49df20f95d9bc198d6c51", "0.
|
|
5
|
+
var define_CODEARBITER_PI_SKILL_EXPANSION_FINGERPRINTS_default = { "0.80.5": "12632f365440b07d5183cff871d889b796a3c711b6b49df20f95d9bc198d6c51", "0.84.1": "12632f365440b07d5183cff871d889b796a3c711b6b49df20f95d9bc198d6c51" };
|
|
6
6
|
|
|
7
7
|
// <define:__CODEARBITER_PI_TOOL_CLASSES__>
|
|
8
8
|
var define_CODEARBITER_PI_TOOL_CLASSES_default = { bash: "EXEC", codearbiter_background_bash: "EXEC", codearbiter_dispatch: "EXEC", codearbiter_farm_preview: "EXEC", write: "WRITE", edit: "EDIT", read: "READ" };
|
|
@@ -16,7 +16,7 @@ import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL2 } from
|
|
|
16
16
|
import { types as utilTypes9 } from "node:util";
|
|
17
17
|
|
|
18
18
|
// src/compatibility.ts
|
|
19
|
-
var SUPPORTED_PI_VERSIONS = /* @__PURE__ */ new Set(["0.80.5", "0.
|
|
19
|
+
var SUPPORTED_PI_VERSIONS = /* @__PURE__ */ new Set(["0.80.5", "0.84.1"]);
|
|
20
20
|
var MINIMUM_NODE = [22, 19, 0];
|
|
21
21
|
var SEMVER_PREFIX = /^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/u;
|
|
22
22
|
function atLeast(version, minimum) {
|
|
@@ -31,7 +31,7 @@ function atLeast(version, minimum) {
|
|
|
31
31
|
}
|
|
32
32
|
function compatibilityDirection(input) {
|
|
33
33
|
if (!SUPPORTED_PI_VERSIONS.has(input.piVersion)) {
|
|
34
|
-
return "codeArbiter requires Pi 0.80.5 or 0.
|
|
34
|
+
return "codeArbiter requires Pi 0.80.5 or 0.84.1; install a supported Pi version and run /ca-doctor.";
|
|
35
35
|
}
|
|
36
36
|
if (!atLeast(input.nodeVersion, MINIMUM_NODE)) {
|
|
37
37
|
return "codeArbiter requires Node >=22.19.0 for Pi; upgrade Node and run /ca-doctor.";
|
|
@@ -6153,10 +6153,10 @@ async function collectPiDoctorInput(dependencies) {
|
|
|
6153
6153
|
var REMEDIATION = {
|
|
6154
6154
|
package: "Reinstall ca-pi from the approved pinned Git tag, then restart Pi.",
|
|
6155
6155
|
trust: "Run /trust in Pi, inspect the project, grant trust only if you accept it, then start a new session.",
|
|
6156
|
-
version: "Upgrade Pi to 0.80.5 or 0.
|
|
6156
|
+
version: "Upgrade Pi to 0.80.5 or 0.84.1 and Node to >=22.19.0, then restart Pi.",
|
|
6157
6157
|
python: "Upgrade or install Python 3, then run /ca-doctor again.",
|
|
6158
6158
|
core: "Reinstall ca-pi to restore the generated shared core, then run /ca-doctor again.",
|
|
6159
|
-
commands: "Remove conflicting command owners or run Pi 0.80.5/0.
|
|
6159
|
+
commands: "Remove conflicting command owners or run Pi 0.80.5/0.84.1, then restart Pi and run /ca-doctor.",
|
|
6160
6160
|
bridge: "Reinstall ca-pi and Python 3, then run /ca-doctor again.",
|
|
6161
6161
|
child: "Reinstall ca-pi if the hardened child artifact is missing or tampered, then run /ca-doctor again.",
|
|
6162
6162
|
"ambient-marker": "Remove CODEARBITER_SUBAGENT from the parent environment and restart Pi.",
|
|
@@ -6184,7 +6184,7 @@ function diagnosePi(input) {
|
|
|
6184
6184
|
const packageHealthy = input.package.declared && input.package.name === "@arbiterforge/ca-pi" && existsSync(input.package.root) && existsSync(input.package.extensionPath) && samePath2(input.package.extensionPath, expectedExtension) && canonicallyInside(input.package.extensionPath, input.package.root);
|
|
6185
6185
|
const trustHealthy = input.trust.inspected && (!input.trust.required || input.trust.projectTrusted);
|
|
6186
6186
|
const waitingForTrust = input.trust.required && !input.trust.projectTrusted;
|
|
6187
|
-
const versionHealthy = ["0.80.5", "0.
|
|
6187
|
+
const versionHealthy = ["0.80.5", "0.84.1"].includes(input.runtime.piVersion) && atLeast(input.runtime.nodeVersion, [22, 19, 0]);
|
|
6188
6188
|
const piBelowMinimum = !atLeast(input.runtime.piVersion, [0, 80, 5]);
|
|
6189
6189
|
const supportedExpansion = input.commands.expansionVerifiedVersions.includes(input.runtime.piVersion);
|
|
6190
6190
|
const expectedDoctorSkill = resolve9(input.package.root, "skills", "ca-doctor", "SKILL.md");
|
|
@@ -6299,7 +6299,7 @@ function diagnosePi(input) {
|
|
|
6299
6299
|
{
|
|
6300
6300
|
id: "active-dispatch",
|
|
6301
6301
|
state: "degraded",
|
|
6302
|
-
message: "Supported Pi 0.80.5/0.
|
|
6302
|
+
message: "Supported Pi 0.80.5/0.84.1 public extension APIs cannot submit this deterministic self-test through the active dispatcher; the wrapper self-test does not exercise active dispatch.",
|
|
6303
6303
|
remediation: REMEDIATION["active-dispatch"]
|
|
6304
6304
|
}
|
|
6305
6305
|
];
|
|
@@ -7593,6 +7593,13 @@ function validDiagnostic(value) {
|
|
|
7593
7593
|
}
|
|
7594
7594
|
return value.details === void 0 || validOpaqueJson(value.details);
|
|
7595
7595
|
}
|
|
7596
|
+
function validDeferredHandle(value) {
|
|
7597
|
+
return isRecord(value) && exactKeys4(
|
|
7598
|
+
value,
|
|
7599
|
+
["provider", "modelId", "api", "id", "expiresAt", "pollAfterMs", "data"],
|
|
7600
|
+
["provider", "modelId", "api", "id"]
|
|
7601
|
+
) && ["provider", "modelId", "api", "id"].every((key) => boundedString2(value[key])) && (value.expiresAt === void 0 || typeof value.expiresAt === "number" && Number.isFinite(value.expiresAt)) && (value.pollAfterMs === void 0 || typeof value.pollAfterMs === "number" && Number.isFinite(value.pollAfterMs)) && (value.data === void 0 || validOpaqueJson(value.data));
|
|
7602
|
+
}
|
|
7596
7603
|
function validMessage(value) {
|
|
7597
7604
|
if (!isRecord(value) || typeof value.role !== "string") return false;
|
|
7598
7605
|
if (value.role === "user") {
|
|
@@ -7601,16 +7608,16 @@ function validMessage(value) {
|
|
|
7601
7608
|
if (value.role === "assistant") {
|
|
7602
7609
|
return exactKeys4(
|
|
7603
7610
|
value,
|
|
7604
|
-
["role", "content", "api", "provider", "model", "responseModel", "responseId", "diagnostics", "usage", "stopReason", "errorMessage", "timestamp"],
|
|
7611
|
+
["role", "content", "api", "provider", "model", "responseModel", "responseId", "diagnostics", "usage", "stopReason", "errorMessage", "rawStopReason", "deferred", "timestamp"],
|
|
7605
7612
|
["role", "content", "api", "provider", "model", "usage", "stopReason", "timestamp"]
|
|
7606
|
-
) && validContent(value.content, "assistant") && ["api", "provider", "model", "stopReason"].every((key) => typeof value[key] === "string") && (value.responseModel === void 0 || boundedString2(value.responseModel)) && (value.responseId === void 0 || boundedString2(value.responseId)) && (value.errorMessage === void 0 || boundedString2(value.errorMessage)) && (value.diagnostics === void 0 || Array.isArray(value.diagnostics) && value.diagnostics.length <= MAX_JSON_ARRAY && value.diagnostics.every(validDiagnostic)) && validUsage(value.usage) && typeof value.timestamp === "number" && Number.isFinite(value.timestamp);
|
|
7613
|
+
) && validContent(value.content, "assistant") && ["api", "provider", "model", "stopReason"].every((key) => typeof value[key] === "string") && (value.responseModel === void 0 || boundedString2(value.responseModel)) && (value.responseId === void 0 || boundedString2(value.responseId)) && (value.errorMessage === void 0 || boundedString2(value.errorMessage)) && (value.rawStopReason === void 0 || boundedString2(value.rawStopReason)) && (value.deferred === void 0 || validDeferredHandle(value.deferred)) && (value.diagnostics === void 0 || Array.isArray(value.diagnostics) && value.diagnostics.length <= MAX_JSON_ARRAY && value.diagnostics.every(validDiagnostic)) && validUsage(value.usage) && typeof value.timestamp === "number" && Number.isFinite(value.timestamp);
|
|
7607
7614
|
}
|
|
7608
7615
|
if (value.role === "toolResult") {
|
|
7609
7616
|
return exactKeys4(
|
|
7610
7617
|
value,
|
|
7611
|
-
["role", "toolCallId", "toolName", "content", "details", "isError", "timestamp"],
|
|
7618
|
+
["role", "toolCallId", "toolName", "content", "details", "isError", "usage", "timestamp"],
|
|
7612
7619
|
["role", "toolCallId", "toolName", "content", "isError", "timestamp"]
|
|
7613
|
-
) && typeof value.toolCallId === "string" && typeof value.toolName === "string" && validContent(value.content, "toolResult") && (value.details === void 0 || validOpaqueJson(value.details)) && typeof value.isError === "boolean" && typeof value.timestamp === "number" && Number.isFinite(value.timestamp);
|
|
7620
|
+
) && typeof value.toolCallId === "string" && typeof value.toolName === "string" && validContent(value.content, "toolResult") && (value.details === void 0 || validOpaqueJson(value.details)) && (value.usage === void 0 || validUsage(value.usage)) && typeof value.isError === "boolean" && typeof value.timestamp === "number" && Number.isFinite(value.timestamp);
|
|
7614
7621
|
}
|
|
7615
7622
|
return false;
|
|
7616
7623
|
}
|
|
@@ -9722,7 +9729,7 @@ async function codeArbiterPi(pi) {
|
|
|
9722
9729
|
activeTools: pi.getActiveTools(),
|
|
9723
9730
|
allTools: pi.getAllTools(),
|
|
9724
9731
|
expansionFingerprints,
|
|
9725
|
-
childFingerprint: "
|
|
9732
|
+
childFingerprint: "c9573777b4c59abfb4adbe6879fc03de7f7962327d97c378c2fb71d300a4e22f"
|
|
9726
9733
|
});
|
|
9727
9734
|
const wrapperSelfTest = await runPiWrapperSelfTest({
|
|
9728
9735
|
enabled: enabledForDoctor,
|
|
@@ -65,5 +65,7 @@ file maps those actions to Pi's extension API.
|
|
|
65
65
|
operator-launched Pi CLI, imported module, package root, and reported version.
|
|
66
66
|
It does not prove publisher authenticity. Verify the source separately with
|
|
67
67
|
`pi list` and `pi config`.
|
|
68
|
-
- Supported promotion targets are Pi 0.80.5 and Pi 0.
|
|
69
|
-
|
|
68
|
+
- Supported promotion targets are Pi 0.80.5 and Pi 0.84.1. The package is
|
|
69
|
+
published as `npm:@arbiterforge/ca-pi` on every `ca-pi-v*` tag (ADR-0029);
|
|
70
|
+
the pinned Git tag remains the reproducible install. A Pi-native embedded
|
|
71
|
+
farm worker is a future spike, not an installed dependency.
|
|
@@ -21,7 +21,7 @@ remediation.
|
|
|
21
21
|
Pi bash wrapper. The exact shared-core `[H-03]` block is healthy and cannot stage files; execution
|
|
22
22
|
or a different block is unhealthy. This self-test does not traverse Pi's active dispatcher. Do not
|
|
23
23
|
rerun or respell it.
|
|
24
|
-
4. Its `active-dispatch` row remains degraded because supported Pi 0.80.5/0.
|
|
24
|
+
4. Its `active-dispatch` row remains degraded because supported Pi 0.80.5/0.84.1 public extension
|
|
25
25
|
APIs cannot submit that deterministic call through the active dispatcher. PI-AC-28 remains blocked
|
|
26
26
|
until supported-version real-host promotion/CI evidence closes the gap.
|
|
27
27
|
|