@arbiterforge/ca-pi 0.10.5 → 0.10.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 @@ 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.17.4" src="https://img.shields.io/badge/version-2.17.4-2b7489">
13
+ <img alt="version 2.17.6" src="https://img.shields.io/badge/version-2.17.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-23-555">
16
16
  <img alt="agents" src="https://img.shields.io/badge/agents-19-555">
@@ -117,7 +117,7 @@ Approve the normal plugin trust prompt, open the target repository, and continue
117
117
 
118
118
  ### Codex CLI
119
119
 
120
- The public GitHub-slug flow is **available now**. The repository currently ships `ca-codex 0.9.4`;
120
+ The public GitHub-slug flow is **available now**. The repository currently ships `ca-codex 0.9.6`;
121
121
  the dated end-to-end public-install record discovered `ca-codex 0.2.4` from release `v2.8.13`.
122
122
  Current packaging and shared-core parity are continuously verified, while that dated live-install
123
123
  record stays labeled rather than being silently promoted to evidence for a newer adapter:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbiterforge/ca-pi",
3
- "version": "0.10.5",
3
+ "version": "0.10.7",
4
4
  "license": "AGPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -4,6 +4,18 @@ All notable changes to `ca-pi` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.10.7] - 2026-09-06
8
+
9
+ ### Fixed
10
+
11
+ - Recover an unsettled mode-enter audit row on a repeated request instead of reporting an ineffective posture as a no-op.
12
+
13
+ ## [0.10.6] - 2026-09-06
14
+
15
+ ### Changed
16
+
17
+ - Correct privacy disclosures and align task archival documentation with the established standup-owned policy.
18
+
7
19
  ## [0.10.5] - 2026-09-05
8
20
 
9
21
  ### Fixed
@@ -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.10.5"
14
+ adapter_version = "0.10.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"
@@ -353,13 +353,14 @@ def flip(session_id, mode, root=None, payload=None, host_name=None, now=None):
353
353
  """Attempt to set `session_id`'s mode to `mode`. Returns one of
354
354
  FLIP_FLIPPED / FLIP_NOOP / FLIP_FAILED. Never raises.
355
355
 
356
- AC-6: a flip TO THE ALREADY-ACTIVE mode is a no-op — no write is even
357
- attempted and no audit row is appended, so `overrides.log` is left
358
- byte-identical. This is also the mechanism behind T-14's fail-direction
359
- asymmetry: once a failed flip has left the session's resolved mode
360
- unchanged, any LATER flip back to that same resolved mode is a no-op
361
- under ANY filesystem state — including a markers directory that cannot
362
- be written to at all — because a no-op never touches disk.
356
+ AC-6: a flip TO AN ALREADY-ACTIVE, LEDGER-BACKED mode is a no-op — no
357
+ write is attempted and no audit row is appended, so `overrides.log` is
358
+ left byte-identical. The default arbiter posture needs no authorizing row.
359
+ If a prior non-arbiter write landed but its staged enter row did not, a
360
+ repeat request retries settlement: success reports the effective flip,
361
+ while another failure stays explicit instead of claiming the posture is
362
+ already active. This preserves T-14's fail direction because an unbacked
363
+ non-arbiter marker still cannot authorize persona composition.
363
364
 
364
365
  On a genuine transition the order is deliberate: write first, audit row
365
366
  ONLY on a confirmed write. AC-11's `ledger_backs` exists to catch exactly
@@ -369,7 +370,12 @@ def flip(session_id, mode, root=None, payload=None, host_name=None, now=None):
369
370
  root = root if root is not None else marker_root(payload)
370
371
  current, _diag = current_mode(session_id, root=root, payload=payload)
371
372
  if current == mode:
372
- return FLIP_NOOP
373
+ if mode == MODES[0] or ledger_backs(root, mode, session_id=session_id):
374
+ return FLIP_NOOP
375
+ _settle_dev_close(root, host_name=host_name)
376
+ return (FLIP_FLIPPED
377
+ if ledger_backs(root, mode, session_id=session_id)
378
+ else FLIP_FAILED)
373
379
  if not write_mode(session_id, mode, root=root, payload=payload):
374
380
  return FLIP_FAILED
375
381
  # ADR-0030 position 4: EVERY transition row is staged through the #396
@@ -313,7 +313,7 @@ class Host:
313
313
 
314
314
  name = "claude"
315
315
  adapter_name = "ca"
316
- adapter_version = "2.17.4"
316
+ adapter_version = "2.17.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,
@@ -65,8 +65,9 @@ that names every member, never an implied yes.
65
65
  user; do not auto-flip.
66
66
 
67
67
  6. **Archival sweep — proposed per item, never batched** (B-24). Long-done tasks
68
- accumulate on the board and inflate the in-flight count until it stops meaning
69
- anything. List the done items older than the cutoff, then ask about **each one
68
+ accumulate on the board; they are already excluded from the in-flight count.
69
+ List dated done items strictly more than 14 calendar days old
70
+ (`ARCHIVE_CUTOFF_DAYS`), then ask about **each one
70
71
  separately** and archive only the ones the user says yes to:
71
72
  `"$PY" "<plugin-root>/hooks/taskwrite.py" archive <id>`.
72
73
 
@@ -46,7 +46,13 @@ an ID (`/ca-task start --as <group>.<type> -- "<title>"`) to disambiguate.
46
46
  - Promoting workflow follow-ups in bulk → that is the harvest
47
47
  (`<plugin-root>/includes/harvest.md`), which calls this writer for you.
48
48
  - Reading the board / counts → `/ca-status` (read-only).
49
- - Archiving long-settled done items → deferred (D-2); done items stay in-place for now.
49
+ - Archiving long-settled done items → `/ca-standup` owns the sweep (D-2,
50
+ resolved 2026-07-31). It proposes dated done items strictly more than 14 calendar
51
+ days old and requires a separate yes for each item before invoking
52
+ `<plugin-root>/hooks/taskwrite.py` with `archive <id>`. This is the helper's
53
+ archive verb, not a new public `/ca-task archive` mode. Undated done items are never
54
+ proposed automatically; standup's explicit-request and `--allow-undated` rules
55
+ apply. Declined items stay on the board.
50
56
  - Filing a separate `chore(board)` PR just to flip a task state → task-board transitions
51
57
  (`[x]` done-flip, `[~]` start-flip, new `[ ]` add) ride the **work commit** via
52
58
  commit-gate, co-located atomically with the code that completes, starts, or spawns the