@arbiterforge/ca-pi 0.20.0 → 0.21.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 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 3.1.0" src="https://img.shields.io/badge/version-3.1.0-2b7489">
13
+ <img alt="version 3.2.0" src="https://img.shields.io/badge/version-3.2.0-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.20.0",
3
+ "version": "0.21.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -4,6 +4,19 @@ All notable changes to `ca-pi` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.21.0] - 2026-10-18
8
+
9
+ ### Added
10
+
11
+ - A new `init-store` engine operation creates a checkout's local artifact store metadata on purpose, and only that. On Windows, a fresh clone or worktree reports `NO_LOCAL_STORE` on every read until the store exists; the host bridge now runs `init-store` once and retries the read once, so `/feature` and `/sprint` resume work in a new checkout. Reads themselves still never write, and a read-only checkout still gets `NO_LOCAL_STORE`.
12
+
13
+ ## [0.20.1] - 2026-10-18
14
+
15
+ ### Fixed
16
+
17
+ - A spec whose design had only one sane approach recorded its SMARTS rationale with not-applicable filler for every rationale part, because the rationale convention listed all parts unconditionally. The convention now applies the multi-part rationale only when a comparison ran; a single-option choice records exactly one block, its one-line statement and reason. Found by a live `/feature` run.
18
+ - The SMARTS rationale convention and the spec-compliance reviewer no longer describe the rationale as belonging to an "approved" spec, since 3.0.0 retired spec approval.
19
+
7
20
  ## [0.20.0] - 2026-10-17
8
21
 
9
22
  ### Added
@@ -6,43 +6,43 @@
6
6
  "binaries": {
7
7
  "darwin/amd64": {
8
8
  "file": "ca-artifact-darwin-amd64",
9
- "sha256": "ca6dc89a106f4b79eb2ab992eb7617c79742f88eb3d5d9b0444102ecf3f23ed3",
9
+ "sha256": "882fefc23bd4b07dcf8f954a2e3cdaecffe210d8bd95e190d2864d9eb77aa339",
10
10
  "native_tested": true
11
11
  },
12
12
  "darwin/arm64": {
13
13
  "file": "ca-artifact-darwin-arm64",
14
- "sha256": "04dae5874b003fb5530a460c3d9ce6da8284ca7bbfb886e6b6591d0e2980934d",
14
+ "sha256": "8f51bd9848e4b0441eea50c8f4e2da9892164be0488ca3959a8dc900dc295020",
15
15
  "native_tested": true
16
16
  },
17
17
  "linux/amd64": {
18
18
  "file": "ca-artifact-linux-amd64",
19
- "sha256": "1b2d858cf64e7774cbc2abf8abe7921c5f9fe147fcee796e70dbe38478272847",
19
+ "sha256": "0f24a4f79a2554c37deabf9ec81d6dfbceb45030f4bea3cfabc33dc51ed1d582",
20
20
  "native_tested": true
21
21
  },
22
22
  "linux/arm64": {
23
23
  "file": "ca-artifact-linux-arm64",
24
- "sha256": "37e592fb61297850b17e2cd6c603a203143940b42b04e7a285f081b0d9d848e5",
24
+ "sha256": "c7cb1e636b3abd3284a7fbc3354bdc556414aec2aacc92665431118f723a86b0",
25
25
  "native_tested": true
26
26
  },
27
27
  "windows/amd64": {
28
28
  "file": "ca-artifact-windows-amd64.exe",
29
- "sha256": "4f4b3f4cf0ab7230f9cd577a3310a293007af1126913224c8e6103438aaafc8b",
29
+ "sha256": "7bfdc9a86320e38932d84ee3fef6d088d548809b16dfc17dd648f64e4105471b",
30
30
  "native_tested": true
31
31
  },
32
32
  "windows/arm64": {
33
33
  "file": "ca-artifact-windows-arm64.exe",
34
- "sha256": "855bfbd1c628a0b76cfa5bdf7d6ff392fb55e49dba23efb13e2a7a26d9e5ccb4",
34
+ "sha256": "095bf92bca707c0027c54e929b1d08c62cb97b0b2888cfbe07a3ea49ea0fb8b3",
35
35
  "native_tested": true
36
36
  }
37
37
  },
38
38
  "context_qualification": {
39
39
  "darwin/amd64": {
40
- "source_commit": "44149055d1ca136e191f79136244f0d3a2b1a461",
40
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
41
41
  "workflow": ".github/workflows/ci.yml",
42
- "run_id": "39097065693",
43
- "binary_sha256": "ca6dc89a106f4b79eb2ab992eb7617c79742f88eb3d5d9b0444102ecf3f23ed3",
44
- "observation_sha256": "178ac16ede5052a25eff69597ef2c6ab30439bcfd3d9127a1189e9eaa7a6147e",
45
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
42
+ "run_id": "39186858332",
43
+ "binary_sha256": "882fefc23bd4b07dcf8f954a2e3cdaecffe210d8bd95e190d2864d9eb77aa339",
44
+ "observation_sha256": "fdeac588d567329a64b6315456d8c47e060c70dbe9355d76be3c07ec40bd8705",
45
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
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": "44149055d1ca136e191f79136244f0d3a2b1a461",
56
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
57
57
  "workflow": ".github/workflows/ci.yml",
58
- "run_id": "39097065693",
59
- "binary_sha256": "04dae5874b003fb5530a460c3d9ce6da8284ca7bbfb886e6b6591d0e2980934d",
60
- "observation_sha256": "c7a246aafb77097d60704ecae57abcd7a8786078144de3549475684cd93c1fc2",
61
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
58
+ "run_id": "39186858332",
59
+ "binary_sha256": "8f51bd9848e4b0441eea50c8f4e2da9892164be0488ca3959a8dc900dc295020",
60
+ "observation_sha256": "f4b6ff84048f95a0c36ba839caad39a15ac493305b7212b5597333ed6e59c9f0",
61
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
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": "44149055d1ca136e191f79136244f0d3a2b1a461",
72
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
73
73
  "workflow": ".github/workflows/ci.yml",
74
- "run_id": "39097065693",
75
- "binary_sha256": "1b2d858cf64e7774cbc2abf8abe7921c5f9fe147fcee796e70dbe38478272847",
76
- "observation_sha256": "f2725ba4c6ef48d36fb92962ef1fc6b00871e057a3234010ab0066a844bf21fd",
77
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
74
+ "run_id": "39186858332",
75
+ "binary_sha256": "0f24a4f79a2554c37deabf9ec81d6dfbceb45030f4bea3cfabc33dc51ed1d582",
76
+ "observation_sha256": "15afed41ddcddfccecc0a49875e5f7b1b8a69e80311f06b5f351e4e0dc02db7d",
77
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
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": "44149055d1ca136e191f79136244f0d3a2b1a461",
88
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
89
89
  "workflow": ".github/workflows/ci.yml",
90
- "run_id": "39097065693",
91
- "binary_sha256": "37e592fb61297850b17e2cd6c603a203143940b42b04e7a285f081b0d9d848e5",
92
- "observation_sha256": "3c0cae7073c8e7cf7ba6e40da4a04fad9d623a87914e44dac3b6e329d0dd020a",
93
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
90
+ "run_id": "39186858332",
91
+ "binary_sha256": "c7cb1e636b3abd3284a7fbc3354bdc556414aec2aacc92665431118f723a86b0",
92
+ "observation_sha256": "5a6a057bcd8a1a194d890a24c570a21d37029e418bcc856b66acf5b69357ba9f",
93
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
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": "44149055d1ca136e191f79136244f0d3a2b1a461",
104
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
105
105
  "workflow": ".github/workflows/ci.yml",
106
- "run_id": "39097065693",
107
- "binary_sha256": "4f4b3f4cf0ab7230f9cd577a3310a293007af1126913224c8e6103438aaafc8b",
108
- "observation_sha256": "3ad94468cbd6eaf40500b525859923feaa5fbb120f91b3aadcc08b08ae837fc9",
109
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
106
+ "run_id": "39186858332",
107
+ "binary_sha256": "7bfdc9a86320e38932d84ee3fef6d088d548809b16dfc17dd648f64e4105471b",
108
+ "observation_sha256": "fc8ec82f4212b5f35e3ed2ef59691f3542facfca9482c44daaeb2a79ffe06e57",
109
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
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": "44149055d1ca136e191f79136244f0d3a2b1a461",
120
+ "source_commit": "020f67947c4c0fb299a9e9d77a9b9354e3ff2ed4",
121
121
  "workflow": ".github/workflows/ci.yml",
122
- "run_id": "39097065693",
123
- "binary_sha256": "855bfbd1c628a0b76cfa5bdf7d6ff392fb55e49dba23efb13e2a7a26d9e5ccb4",
124
- "observation_sha256": "8f594d61907c66818ddae106e859c6ba437713ca4c049468425558751ddb9697",
125
- "module_sha256": "a34f09f52c52145624e87c1d5e3850c822dd1ca54c346c5ad63802f6e5a0d0b3",
122
+ "run_id": "39186858332",
123
+ "binary_sha256": "095bf92bca707c0027c54e929b1d08c62cb97b0b2888cfbe07a3ea49ea0fb8b3",
124
+ "observation_sha256": "60a3b695097d8be6dee2c61e452e31b624a393526675bfd16f092222dee87bf6",
125
+ "module_sha256": "b39a694ff5283a97c62d532a8abc25a8a47101baa7dfc025bffc90c1da9d9144",
126
126
  "native_cases": [
127
127
  "TestContextBoundedRender",
128
128
  "TestContextDocumentContract",
@@ -977,10 +977,14 @@ def _engine_timeout() -> float:
977
977
 
978
978
 
979
979
  class ArtifactClient:
980
- def __init__(self, root: str | Path, installation: str | Path, *, timeout: float | None = None):
980
+ def __init__(self, root: str | Path, installation: str | Path, *, timeout: float | None = None,
981
+ initialize_store: bool = True):
981
982
  self.root = _trusted_directory(root, "UNSAFE_ROOT")
982
983
  self.installation = _trusted_directory(installation, "CAPABILITY_MISSING")
983
984
  self.timeout = _engine_timeout() if timeout is None else timeout
985
+ # A fresh clone or worktree has no local store, and reads never create
986
+ # one. With this set, the client creates it once through init-store.
987
+ self.initialize_store = initialize_store
984
988
 
985
989
  def workflow_preflight(self) -> dict[str, object]:
986
990
  """Read fresh installed prerequisites; never attest live host authority."""
@@ -1074,6 +1078,22 @@ class ArtifactClient:
1074
1078
  raise
1075
1079
 
1076
1080
  def call(self, operation: str, request: dict[str, Any] | None = None, *, permit_invalid: bool = False) -> dict:
1081
+ try:
1082
+ return self._exchange(operation, request, permit_invalid)
1083
+ except ArtifactError as exc:
1084
+ if exc.code != "NO_LOCAL_STORE" or operation == "init-store" or not self.initialize_store:
1085
+ raise
1086
+ # One explicit initialization, then one retry of the original request.
1087
+ try:
1088
+ self._exchange("init-store", {}, False)
1089
+ except ArtifactError as refused:
1090
+ raise ArtifactError(
1091
+ "NO_LOCAL_STORE",
1092
+ f"local artifact store is absent and initialization was refused ({refused.code})",
1093
+ ) from refused
1094
+ return self._exchange(operation, request, permit_invalid)
1095
+
1096
+ def _exchange(self, operation: str, request: dict[str, Any] | None, permit_invalid: bool) -> dict:
1077
1097
  if not re.fullmatch(r"[a-z][a-z-]{0,39}", operation):
1078
1098
  raise ArtifactError("UNKNOWN_OPERATION", "invalid internal operation name")
1079
1099
  if operation in {"context-preview", "context-finalize-preview", "context-apply"}:
@@ -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.20.0"
14
+ adapter_version = "0.21.0"
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 = "3.1.0"
316
+ adapter_version = "3.2.0"
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,
@@ -138,17 +138,19 @@ analysis; they supplement, never replace it, and never become a seventh lens.
138
138
 
139
139
  ## Design rationale record
140
140
 
141
- An approved full-lane spec keeps a concise SMARTS design rationale; it is design evidence, not a
141
+ A full-lane spec keeps a concise SMARTS design rationale; it is design evidence, not a
142
142
  source of execution authority. For a typed HTML spec, write it through the existing mutation
143
143
  operations with this convention, with no spec-schema change:
144
144
 
145
145
  - the chosen approach and its trade-off live in the existing `approach` record (`choice`, `tradeoff`);
146
146
  - a `decisions` record carries each material decision the SMARTS pass settled, and `approach.binding_decision_refs` cites it;
147
- - one `sections` record with the fixed id `SEC-SMARTS` (title "SMARTS design rationale") holds one block each for: alternatives considered or the single-option statement; decisive lenses; material Weak and Unknown observations, each Unknown with its missing observation and whether it is decision-critical; load-bearing assumptions; non-SMARTS considerations; and priority evidence when one influenced the recommendation.
147
+ - When a comparison ran, one `sections` record with the fixed id `SEC-SMARTS` (title "SMARTS design rationale") holds one block each for: alternatives considered or the single-option statement; decisive lenses; material Weak and Unknown observations, each Unknown with its missing observation and whether it is decision-critical; load-bearing assumptions; non-SMARTS considerations; and priority evidence when one influenced the recommendation.
148
+ - A single-option choice holds exactly one `SEC-SMARTS` block: its one-line statement and reason, with no other part. Do not pad it with not-applicable lens, assumption or constraint entries.
148
149
 
149
150
  Read the rationale back with the existing read operations; never hand-edit or parse rendered HTML.
150
151
  A legacy Markdown spec keeps the rationale in one stable `## SMARTS design rationale` section that
151
- carries the same parts in the same order.
152
+ carries the same parts in the same order when a comparison ran, or the single-option statement and
153
+ its reason alone.
152
154
 
153
155
  ## Worked example
154
156
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "private": true,
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",