@arbiterforge/ca-pi 0.18.0 → 0.18.2

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.26.0" src="https://img.shields.io/badge/version-2.26.0-2b7489">
13
+ <img alt="version 2.26.2" src="https://img.shields.io/badge/version-2.26.2-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.18.0",
3
+ "version": "0.18.2",
4
4
  "license": "AGPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -4,6 +4,21 @@ All notable changes to `ca-pi` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.18.2] - 2026-10-12
8
+
9
+ ### Fixed
10
+
11
+ - Allow initialized Windows artifact stores to be observed without write access (#971).
12
+ - Pin the repository, metadata directories, and lock file against replacement while preserving reader/writer exclusion. Missing or unsafe lock state refuses without initialization.
13
+
14
+ ## [0.18.1] - 2026-10-12
15
+
16
+ ### Fixed
17
+
18
+ - Reproduce normal ORT histogram conflicts in guarded legacy block resolution while preserving exact rendering and index/CAS controls (#968).
19
+ - Clarify unknown host qualification and complete the repository-scoped maintenance commands.
20
+
21
+
7
22
  ## [0.18.0] - 2026-10-10
8
23
 
9
24
  ### Changed
@@ -6,43 +6,43 @@
6
6
  "binaries": {
7
7
  "darwin/amd64": {
8
8
  "file": "ca-artifact-darwin-amd64",
9
- "sha256": "e35e21caa147a5e6c9d04fd400b5b4fcdb2d1d9cec9119d70249fcb80aeb3512",
9
+ "sha256": "0641b0b8014cd8498ab81144e631d9712d3eb5224fcd2726e899149d7ade7175",
10
10
  "native_tested": true
11
11
  },
12
12
  "darwin/arm64": {
13
13
  "file": "ca-artifact-darwin-arm64",
14
- "sha256": "dc9157c6ecf48fe05c20351b276ef8c2037847eaedee9dfb88b4f8d0b685b51e",
14
+ "sha256": "9a8bb6a130c8fbd17f0bf20c7f6a9286440e86003ec41eef934fc882a7ae41ca",
15
15
  "native_tested": true
16
16
  },
17
17
  "linux/amd64": {
18
18
  "file": "ca-artifact-linux-amd64",
19
- "sha256": "6fbd763c319d423291832f796515a4c8202d04e8785ea9ce178a495d917049d6",
19
+ "sha256": "c0638efca21039ada655c4ebc488c18500eeb0dbc730dd8cb76d878be8a0878e",
20
20
  "native_tested": true
21
21
  },
22
22
  "linux/arm64": {
23
23
  "file": "ca-artifact-linux-arm64",
24
- "sha256": "2b623d4329665513fb11a99e866e30c579a47172ffd16f6faaae21bf21fda83d",
24
+ "sha256": "204f5f549aa2f75d16f194aba964b14a367c9992d5e0b4cc88c262999141251b",
25
25
  "native_tested": true
26
26
  },
27
27
  "windows/amd64": {
28
28
  "file": "ca-artifact-windows-amd64.exe",
29
- "sha256": "44003f24b77a5cd51b63fe991a8775462619e2b2130c1162d36450a0570970d8",
29
+ "sha256": "1976f22b63679478b1c1f4b5f6b13f1d9ae60c9602e4cbc420073626ce8c20d8",
30
30
  "native_tested": true
31
31
  },
32
32
  "windows/arm64": {
33
33
  "file": "ca-artifact-windows-arm64.exe",
34
- "sha256": "37efc98301beec7c0bf465dee6f4bb48152abef515ae55aa37bff628e969e5bd",
34
+ "sha256": "9d50c8a72029483fc425ac2a27c1f5bfd43362454cc1e8cc8eb28d33ec2fa0db",
35
35
  "native_tested": true
36
36
  }
37
37
  },
38
38
  "context_qualification": {
39
39
  "darwin/amd64": {
40
- "source_commit": "54471947e1622fa35233a0fdc16ab42d05267ecb",
40
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
41
41
  "workflow": ".github/workflows/ci.yml",
42
- "run_id": "38250134924",
43
- "binary_sha256": "e35e21caa147a5e6c9d04fd400b5b4fcdb2d1d9cec9119d70249fcb80aeb3512",
44
- "observation_sha256": "36cbcb4c398592e658bc2e3d249ade3ff650c1aece503aea9f218ad80679e5db",
45
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
42
+ "run_id": "38289702788",
43
+ "binary_sha256": "0641b0b8014cd8498ab81144e631d9712d3eb5224fcd2726e899149d7ade7175",
44
+ "observation_sha256": "3c527a2e9eb02e95c49409e3d71d15632d6e7807a3f74fcc56f9b4808bbe2259",
45
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
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": "54471947e1622fa35233a0fdc16ab42d05267ecb",
56
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
57
57
  "workflow": ".github/workflows/ci.yml",
58
- "run_id": "38250134924",
59
- "binary_sha256": "dc9157c6ecf48fe05c20351b276ef8c2037847eaedee9dfb88b4f8d0b685b51e",
60
- "observation_sha256": "b4f9a083e3772d3296826a40ad8364c4faf046d21af0b7bea7e152eb0bda54df",
61
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
58
+ "run_id": "38289702788",
59
+ "binary_sha256": "9a8bb6a130c8fbd17f0bf20c7f6a9286440e86003ec41eef934fc882a7ae41ca",
60
+ "observation_sha256": "eba5853f45cc7866ff6dcb94059197f753c25f6295a6a45de748a04bf7e273b4",
61
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
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": "54471947e1622fa35233a0fdc16ab42d05267ecb",
72
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
73
73
  "workflow": ".github/workflows/ci.yml",
74
- "run_id": "38250134924",
75
- "binary_sha256": "6fbd763c319d423291832f796515a4c8202d04e8785ea9ce178a495d917049d6",
76
- "observation_sha256": "9b040d91f1775fda353b53130c557882ac3be4b7eeed55ebc83fe39d508ff269",
77
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
74
+ "run_id": "38289702788",
75
+ "binary_sha256": "c0638efca21039ada655c4ebc488c18500eeb0dbc730dd8cb76d878be8a0878e",
76
+ "observation_sha256": "87ac254be4179136dc1f0e02650182dddac6045b28bd2c2e19889abe1af26665",
77
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
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": "54471947e1622fa35233a0fdc16ab42d05267ecb",
88
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
89
89
  "workflow": ".github/workflows/ci.yml",
90
- "run_id": "38250134924",
91
- "binary_sha256": "2b623d4329665513fb11a99e866e30c579a47172ffd16f6faaae21bf21fda83d",
92
- "observation_sha256": "c723a04d24d46eb6f95d5665485bd3cc11d2379be2ebad328b3afc4f66ec6be3",
93
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
90
+ "run_id": "38289702788",
91
+ "binary_sha256": "204f5f549aa2f75d16f194aba964b14a367c9992d5e0b4cc88c262999141251b",
92
+ "observation_sha256": "9459a65d3dac40380fd15e853cf1e16d3d41f7e786c9c31a0de232b4a4b569f5",
93
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
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": "54471947e1622fa35233a0fdc16ab42d05267ecb",
104
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
105
105
  "workflow": ".github/workflows/ci.yml",
106
- "run_id": "38250134924",
107
- "binary_sha256": "44003f24b77a5cd51b63fe991a8775462619e2b2130c1162d36450a0570970d8",
108
- "observation_sha256": "1bbcf5fe0c13648e81c643c976a5f456cd2a3c3bbfe7c9a7642a6cdf8e71c68b",
109
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
106
+ "run_id": "38289702788",
107
+ "binary_sha256": "1976f22b63679478b1c1f4b5f6b13f1d9ae60c9602e4cbc420073626ce8c20d8",
108
+ "observation_sha256": "80800ef282ee480aaeafca21141ee23e2104e5f22948677d020768b7d6cce939",
109
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
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": "54471947e1622fa35233a0fdc16ab42d05267ecb",
120
+ "source_commit": "e33bb87b30d4a3ac3286378ad9ec5bff70140392",
121
121
  "workflow": ".github/workflows/ci.yml",
122
- "run_id": "38250134924",
123
- "binary_sha256": "37efc98301beec7c0bf465dee6f4bb48152abef515ae55aa37bff628e969e5bd",
124
- "observation_sha256": "78f3c133923c66945b84e1b4a9f02a6edbfb357e1be4f7d2e1b8e3123b2b17e2",
125
- "module_sha256": "05b0359c108baf52bd3884c36969febc3f98e53786cf80da757115bee5ac9dc2",
122
+ "run_id": "38289702788",
123
+ "binary_sha256": "9d50c8a72029483fc425ac2a27c1f5bfd43362454cc1e8cc8eb28d33ec2fa0db",
124
+ "observation_sha256": "01a8e1b91794dbed3d618dc20dd7adf0dcc9597bf9c42e0ba14278197a384f74",
125
+ "module_sha256": "4c2f7af945966dbe8e0b31459a87bc1f5ebc40de544a3c42508d824ef82eeb23",
126
126
  "native_cases": [
127
127
  "TestContextBoundedRender",
128
128
  "TestContextDocumentContract",
@@ -366,18 +366,23 @@ def _git_conflict_blocks(root, current, base, ours, theirs):
366
366
  for path, raw in zip(paths, (ours, base, theirs)):
367
367
  path.write_bytes(raw)
368
368
  for name, flag in modes:
369
- args = [git_executable(), "--no-pager", "--no-lazy-fetch", "-c", "core.fsmonitor=false",
370
- "-c", "core.untrackedCache=false", "-c", "merge.conflictStyle=merge",
371
- "merge-file", "--stdout", "--marker-size=" + str(size)]
372
- if flag:
373
- args.append(flag)
374
- for label in labels:
375
- args.extend(("-L", label.decode("utf-8", "strict")))
376
- result = subprocess.run([*args, *(str(path) for path in paths)], cwd=root, env=env,
377
- capture_output=True, shell=False, timeout=30)
378
- _require(len(result.stdout) <= MAX_BYTES, "Git conflict rendering is oversized")
379
- if 1 <= result.returncode <= 127 and result.stdout.replace(b"\r\n", b"\n") == current.replace(b"\r\n", b"\n"):
380
- return payload, name
369
+ # Retain merge-file's historical default and reproduce ORT's
370
+ # histogram alignment, still requiring the complete exact rendering.
371
+ for algorithm in (None, "histogram"):
372
+ args = [git_executable(), "--no-pager", "--no-lazy-fetch", "-c", "core.fsmonitor=false",
373
+ "-c", "core.untrackedCache=false", "-c", "merge.conflictStyle=merge",
374
+ "merge-file", "--stdout", "--marker-size=" + str(size)]
375
+ if flag:
376
+ args.append(flag)
377
+ if algorithm:
378
+ args.append("--diff-algorithm=" + algorithm)
379
+ for label in labels:
380
+ args.extend(("-L", label.decode("utf-8", "strict")))
381
+ result = subprocess.run([*args, *(str(path) for path in paths)], cwd=root, env=env,
382
+ capture_output=True, shell=False, timeout=30)
383
+ _require(len(result.stdout) <= MAX_BYTES, "Git conflict rendering is oversized")
384
+ if 1 <= result.returncode <= 127 and result.stdout.replace(b"\r\n", b"\n") == current.replace(b"\r\n", b"\n"):
385
+ return payload, name
381
386
  raise ResolutionError("worktree is not Git's current three-stage rendering")
382
387
 
383
388
 
@@ -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.18.0"
14
+ adapter_version = "0.18.2"
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.26.0"
316
+ adapter_version = "2.26.2"
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.18.0",
3
+ "version": "0.18.2",
4
4
  "private": true,
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",
@@ -114,16 +114,33 @@ Run an **incremental re-scout for each affected document**, scoped to its select
114
114
  - **Claim still holds → silently re-baseline only that document's provenance record.** Call `_provenancelib.rebaseline(doc_provenance, selected_current_hashes)` where `selected_current_hashes` contains current hashes only for the selected staged paths whose claims in that document were inspected and still hold. Do not re-baseline a path whose claim changed or was not inspected. Stage only `.codearbiter/.provenance/<doc>.json` by explicit path so the re-baselined record rides THIS commit (ADR-0008 ride-along pattern — nothing is surfaced to the user). After staging, re-run the secrets scan from `tech-stack.md` over the newly-staged path(s) — any file staged after Phase 4 must still pass the automated secrets scan before the commit proceeds. A missing current hash (deletion or rename) cannot be silently re-baselined; surface it in Phase 6 for review.
115
115
  - **Claim changed → route to the existing Phase 6 diff-review.** Propose only the affected doc or code-map edit required to reflect its changed claim. The user reviews that edit in the normal diff, and Phase 7 stages approved paths explicitly; do not silently rewrite or add unrelated documentation.
116
116
 
117
- For reviewed legacy code-map metadata, use the shipped fixed-target helper at
118
- `<plugin-root>/hooks/resolve-context-conflict.py`. Run `--root "<project-root>"
119
- inspect-claims`, then `--root "<project-root>" refresh-claims --expected <binding>
120
- --claims <json-array>` with one to four reviewed records containing exactly
117
+ For reviewed legacy code-map metadata in codeArbiter's source layout, use the
118
+ shipped fixed-target helper at `<plugin-root>/hooks/resolve-context-conflict.py`.
119
+ This claim-refresh lane reads all three fixed source manifests:
120
+ `<project-root>/plugins/ca/.claude-plugin/plugin.json`,
121
+ `<project-root>/plugins/ca-codex/.codex-plugin/plugin.json`, and `<project-root>/plugins/ca-pi/package.json`,
122
+ even for a date-only refresh. Other repository layouts and arbitrary manifest
123
+ claims are unsupported.
124
+
125
+ Resolve the interpreter once by presence, then inspect:
126
+
127
+ ```sh
128
+ PY=python3; { command -v python3 >/dev/null 2>&1 && python3 --version >/dev/null 2>&1; } || PY=python
129
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" inspect-claims
130
+ ```
131
+
132
+ Pass the returned `binding` to the same helper and interpreter:
133
+
134
+ ```sh
135
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" refresh-claims --expected '<binding>' --claims '<json-array>'
136
+ ```
137
+
138
+ Supply one to four reviewed records containing exactly
121
139
  `field`, `before`, and `after`. The supported existing fields are `ca_version`,
122
140
  `codex_version`, `pi_version`, and `metadata_date`. Use the inspection's exact
123
141
  current claim as `before`; a version's `after` must match its fixed source
124
- manifest, and the date must match `inspection_date`. Select the interpreter once
125
- by presence and use it for both calls; never retry a failed operation under
126
- another interpreter.
142
+ manifest, and the date must match `inspection_date`. Use the selected interpreter
143
+ for both calls; never retry a failed operation under another interpreter.
127
144
 
128
145
  This operation requires resolved, tracked legacy schema-1 document/provenance
129
146
  and no native or uncertain journal ownership. It binds document, provenance,
@@ -169,9 +169,20 @@ qualification remains unchanged. Re-run the current-head review and CI
169
169
  requirements after integration; previous green evidence does not bind new code.
170
170
 
171
171
  For an explicitly selected per-block resolution, use the same shipped helper
172
- with `--root "<project-root>" inspect-blocks`, then `--root "<project-root>"
173
- resolve-blocks --expected <binding> --choices <json-array>`. Review each block
174
- and supply exactly one `"ours"` or `"theirs"` choice in its displayed order. The
172
+ and the interpreter already selected by presence:
173
+
174
+ ```sh
175
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" inspect-blocks
176
+ ```
177
+
178
+ Pass the returned `binding` to the same helper and interpreter:
179
+
180
+ ```sh
181
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" resolve-blocks --expected '<binding>' --choices '<json-array>'
182
+ ```
183
+
184
+ Review each block and supply exactly one `"ours"` or `"theirs"` choice in its
185
+ displayed order. The
175
186
  inspection returns the block count and side hashes; read the conflict document
176
187
  to review the actual text. This is a separate operation: `restore-head` keeps
177
188
  its original single-block exact-HEAD contract.
@@ -114,16 +114,33 @@ Run an **incremental re-scout for each affected document**, scoped to its select
114
114
  - **Claim still holds → silently re-baseline only that document's provenance record.** Call `_provenancelib.rebaseline(doc_provenance, selected_current_hashes)` where `selected_current_hashes` contains current hashes only for the selected staged paths whose claims in that document were inspected and still hold. Do not re-baseline a path whose claim changed or was not inspected. Stage only `.codearbiter/.provenance/<doc>.json` by explicit path so the re-baselined record rides THIS commit (ADR-0008 ride-along pattern — nothing is surfaced to the user). After staging, re-run the secrets scan from `tech-stack.md` over the newly-staged path(s) — any file staged after Phase 4 must still pass the automated secrets scan before the commit proceeds. A missing current hash (deletion or rename) cannot be silently re-baselined; surface it in Phase 6 for review.
115
115
  - **Claim changed → route to the existing Phase 6 diff-review.** Propose only the affected doc or code-map edit required to reflect its changed claim. The user reviews that edit in the normal diff, and Phase 7 stages approved paths explicitly; do not silently rewrite or add unrelated documentation.
116
116
 
117
- For reviewed legacy code-map metadata, use the shipped fixed-target helper at
118
- `<plugin-root>/hooks/resolve-context-conflict.py`. Run `--root "<project-root>"
119
- inspect-claims`, then `--root "<project-root>" refresh-claims --expected <binding>
120
- --claims <json-array>` with one to four reviewed records containing exactly
117
+ For reviewed legacy code-map metadata in codeArbiter's source layout, use the
118
+ shipped fixed-target helper at `<plugin-root>/hooks/resolve-context-conflict.py`.
119
+ This claim-refresh lane reads all three fixed source manifests:
120
+ `<project-root>/plugins/ca/.claude-plugin/plugin.json`,
121
+ `<project-root>/plugins/ca-codex/.codex-plugin/plugin.json`, and `<project-root>/plugins/ca-pi/package.json`,
122
+ even for a date-only refresh. Other repository layouts and arbitrary manifest
123
+ claims are unsupported.
124
+
125
+ Resolve the interpreter once by presence, then inspect:
126
+
127
+ ```sh
128
+ PY=python3; { command -v python3 >/dev/null 2>&1 && python3 --version >/dev/null 2>&1; } || PY=python
129
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" inspect-claims
130
+ ```
131
+
132
+ Pass the returned `binding` to the same helper and interpreter:
133
+
134
+ ```sh
135
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" refresh-claims --expected '<binding>' --claims '<json-array>'
136
+ ```
137
+
138
+ Supply one to four reviewed records containing exactly
121
139
  `field`, `before`, and `after`. The supported existing fields are `ca_version`,
122
140
  `codex_version`, `pi_version`, and `metadata_date`. Use the inspection's exact
123
141
  current claim as `before`; a version's `after` must match its fixed source
124
- manifest, and the date must match `inspection_date`. Select the interpreter once
125
- by presence and use it for both calls; never retry a failed operation under
126
- another interpreter.
142
+ manifest, and the date must match `inspection_date`. Use the selected interpreter
143
+ for both calls; never retry a failed operation under another interpreter.
127
144
 
128
145
  This operation requires resolved, tracked legacy schema-1 document/provenance
129
146
  and no native or uncertain journal ownership. It binds document, provenance,
@@ -52,8 +52,9 @@ a qualified host.
52
52
  When these prerequisites are unavailable or unknown, report the missing
53
53
  capability before invoking the scaffolder. Keep a fresh repository unactivated
54
54
  and retain every byte of any existing partial state. Name the loaded package,
55
- actual host limitation, selected population route and next missing prerequisite
56
- in the handoff; leave unobserved qualification and prior operation identities
55
+ observed host limitation or explicitly unknown qualification, selected
56
+ population route and next missing prerequisite in the handoff; leave
57
+ unobserved qualification and prior operation identities
57
58
  unknown. Resume on a host only after fresh containment and writer qualification,
58
59
  using the existing interrupted-population recovery procedure. No supported
59
60
  destination is implied by this guidance.
@@ -169,9 +169,20 @@ qualification remains unchanged. Re-run the current-head review and CI
169
169
  requirements after integration; previous green evidence does not bind new code.
170
170
 
171
171
  For an explicitly selected per-block resolution, use the same shipped helper
172
- with `--root "<project-root>" inspect-blocks`, then `--root "<project-root>"
173
- resolve-blocks --expected <binding> --choices <json-array>`. Review each block
174
- and supply exactly one `"ours"` or `"theirs"` choice in its displayed order. The
172
+ and the interpreter already selected by presence:
173
+
174
+ ```sh
175
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" inspect-blocks
176
+ ```
177
+
178
+ Pass the returned `binding` to the same helper and interpreter:
179
+
180
+ ```sh
181
+ "$PY" "<plugin-root>/hooks/resolve-context-conflict.py" --root "<project-root>" resolve-blocks --expected '<binding>' --choices '<json-array>'
182
+ ```
183
+
184
+ Review each block and supply exactly one `"ours"` or `"theirs"` choice in its
185
+ displayed order. The
175
186
  inspection returns the block count and side hashes; read the conflict document
176
187
  to review the actual text. This is a separate operation: `restore-head` keeps
177
188
  its original single-block exact-HEAD contract.