@unbrained/pm-cli 2026.10.7 → 2026.10.8

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.
Files changed (107) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +15 -0
  3. package/dist/cli-bundle/bundle-manifest.json +152 -152
  4. package/dist/cli-bundle/chunks/chunk-34L2BS2Z.js +3 -0
  5. package/dist/cli-bundle/chunks/chunk-FOLSEOJ2.js +20 -0
  6. package/dist/cli-bundle/chunks/{chunk-A4QWRU7D.js → chunk-HFCIAXLP.js} +5 -5
  7. package/dist/cli-bundle/chunks/chunk-JDTBPW4Y.js +2 -0
  8. package/dist/cli-bundle/chunks/{chunk-TG3IOQUG.js → chunk-K6E2FFUT.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-VU77O6HC.js → chunk-L7U5FSZ5.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-N2PFAWVV.js → chunk-MJVRF67I.js} +3 -3
  11. package/dist/cli-bundle/chunks/{chunk-GJ2OJKRM.js → chunk-OG66KEOF.js} +79 -79
  12. package/dist/cli-bundle/chunks/{chunk-MOXX7D3F.js → chunk-RCFZ6H2Y.js} +2 -2
  13. package/dist/cli-bundle/chunks/chunk-TNU56MZI.js +8 -0
  14. package/dist/cli-bundle/chunks/chunk-UGFN5NJ2.js +2 -0
  15. package/dist/cli-bundle/chunks/{chunk-TON7H63A.js → chunk-ZBVAZ7XX.js} +53 -52
  16. package/dist/cli-bundle/chunks/{chunk-DWH555SN.js → chunk-ZHIMZ65M.js} +16 -16
  17. package/dist/cli-bundle/chunks/{register-list-query-CBJELTDX.js → register-list-query-PYVSPGPV.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-mutation-JRH6EGSE.js → register-mutation-WXP3YLIN.js} +2 -2
  19. package/dist/cli-bundle/chunks/register-operations-WL25C3NP.js +2 -0
  20. package/dist/cli-bundle/chunks/register-setup-PFKYNEQI.js +2 -0
  21. package/dist/cli-bundle/focused-chunks/chunk-2KSPGWLH.js +20 -0
  22. package/dist/cli-bundle/focused-chunks/{chunk-PBNQZV33.js → chunk-6TKAFFEB.js} +2 -2
  23. package/dist/cli-bundle/focused-chunks/{chunk-EPOCI7ZX.js → chunk-A3W6HFFO.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-2YICTWWA.js → chunk-BDT5EALU.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-3BKRCR57.js → chunk-DRHJOG5X.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-XIGFEA3W.js → chunk-EOUORVJA.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/chunk-F2ME5MJY.js +3 -0
  28. package/dist/cli-bundle/focused-chunks/{chunk-QY4Z23QC.js → chunk-L3CZNKZE.js} +11 -11
  29. package/dist/cli-bundle/focused-chunks/{chunk-QEYEDXRI.js → chunk-LZQGEVKT.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-FWWFCLDM.js → chunk-MW2TQHZ3.js} +60 -59
  31. package/dist/cli-bundle/focused-chunks/{chunk-HMG5F5EC.js → chunk-OLCJ2PJS.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-SIR5RFJX.js → chunk-OSKXYRYZ.js} +27 -27
  33. package/dist/cli-bundle/focused-chunks/{chunk-NRSA5ZB2.js → chunk-PBPPIGUL.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-7X3QD5V4.js → chunk-PEBOVLEG.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-4FKCHJGV.js → chunk-V3EPBB6V.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-3NSZ5C4A.js → chunk-XT7JAVHI.js} +2 -2
  37. package/dist/cli-bundle/main.js +2 -2
  38. package/dist/cli-bundle/sdk-authoring.js +1 -1
  39. package/dist/cli-bundle/sdk-contracts.js +1 -1
  40. package/dist/cli-bundle/sdk-core.js +2 -2
  41. package/dist/cli-bundle/sdk-governance.js +1 -1
  42. package/dist/cli-bundle/sdk-graph.js +1 -1
  43. package/dist/cli-bundle/sdk-merge.js +51 -50
  44. package/dist/cli-bundle/sdk-query.js +1 -1
  45. package/dist/cli-bundle/sdk-runtime.js +1 -1
  46. package/dist/cli-bundle/sdk-testing.js +1 -1
  47. package/dist/cli-bundle/sdk.js +4 -4
  48. package/dist/core/extensions/item-fields.d.ts +6 -1
  49. package/dist/core/extensions/item-fields.js +1 -1
  50. package/dist/core/fs/fs-utils.d.ts +19 -4
  51. package/dist/core/fs/fs-utils.js +2 -2
  52. package/dist/core/lock/lock.d.ts +9 -2
  53. package/dist/core/lock/lock.js +2 -2
  54. package/dist/core/store/settings.js +2 -2
  55. package/dist/core/telemetry/runtime.d.ts +1 -1
  56. package/dist/core/telemetry/runtime.js +4 -4
  57. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  58. package/dist/sdk/governance/health.js +2 -2
  59. package/dist/sdk/history-repair.js +1 -1
  60. package/dist/sdk/item-transaction.js +1 -1
  61. package/dist/sdk/merge/abandoned-receipts.js +1 -1
  62. package/dist/sdk/merge/driver.js +1 -1
  63. package/dist/sdk/merge/install.js +3 -2
  64. package/dist/sdk/merge/receipt-operation.d.ts +5 -5
  65. package/dist/sdk/merge/receipt-operation.js +1 -1
  66. package/dist/sdk/merge/receipts.d.ts +1 -1
  67. package/dist/sdk/merge/receipts.js +3 -3
  68. package/dist/sdk/merge/worktree-config.d.ts +2 -0
  69. package/dist/sdk/merge/worktree-config.js +1 -1
  70. package/dist/sdk/public-surface.json +1 -1
  71. package/docs/BUILD_AND_RELEASE_ACCEPTANCE.md +36 -100
  72. package/docs/MERGE_SAFETY.md +61 -6
  73. package/docs/PACKED_FIRST_RUN.md +26 -42
  74. package/docs/README.md +1 -0
  75. package/docs/SDK_AUDITED_MUTATIONS.md +18 -0
  76. package/docs/SDK_STORAGE_LIFECYCLE.md +35 -0
  77. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
  78. package/marketplace.json +2 -2
  79. package/package.json +1 -1
  80. package/packages/pm-beads/package.json +1 -1
  81. package/packages/pm-calendar/package.json +1 -1
  82. package/packages/pm-command-kit/package.json +1 -1
  83. package/packages/pm-digital-twin/package.json +1 -1
  84. package/packages/pm-governance-audit/package.json +1 -1
  85. package/packages/pm-guide-shell/package.json +1 -1
  86. package/packages/pm-kanban/package.json +1 -1
  87. package/packages/pm-lifecycle-hooks/package.json +1 -1
  88. package/packages/pm-linked-test-adapters/package.json +1 -1
  89. package/packages/pm-search-advanced/package.json +1 -1
  90. package/packages/pm-templates/package.json +1 -1
  91. package/packages/pm-todos/package.json +1 -1
  92. package/packages/pm-vcs/package.json +1 -1
  93. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  94. package/plugins/pm-claude/package.json +2 -2
  95. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  96. package/plugins/pm-codex/package.json +2 -2
  97. package/plugins/pm-codex/plugin.json +1 -1
  98. package/runtime-dependencies.json +2 -2
  99. package/dist/cli-bundle/chunks/chunk-754AV3DC.js +0 -8
  100. package/dist/cli-bundle/chunks/chunk-CEM35QB2.js +0 -2
  101. package/dist/cli-bundle/chunks/chunk-CMIU2NDK.js +0 -20
  102. package/dist/cli-bundle/chunks/chunk-GSQK3VUT.js +0 -2
  103. package/dist/cli-bundle/chunks/chunk-WUOFG4JY.js +0 -3
  104. package/dist/cli-bundle/chunks/register-operations-FYV7CUBF.js +0 -2
  105. package/dist/cli-bundle/chunks/register-setup-M5VO6JUH.js +0 -2
  106. package/dist/cli-bundle/focused-chunks/chunk-3RJ4VK7U.js +0 -3
  107. package/dist/cli-bundle/focused-chunks/chunk-H5VREEUE.js +0 -20
@@ -1,115 +1,51 @@
1
1
  # Build generations and registry acceptance
2
2
 
3
- Tracked by [pm-cxc4jc](../.agents/pm/tasks/pm-cxc4jc.toon) and
4
- [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon). Ownership recovery and temporary
5
- workspace lifecycle follow-ups are
6
- [pm-63i8nr](../.agents/pm/tasks/pm-63i8nr.toon) and
3
+ Trackers: [pm-cxc4jc](../.agents/pm/tasks/pm-cxc4jc.toon),
4
+ [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
5
+ [pm-63i8nr](../.agents/pm/tasks/pm-63i8nr.toon),
7
6
  [pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
8
7
 
9
- ## Complete build ownership
8
+ ## Build ownership
10
9
 
11
- `pnpm build` owns one checkout-local lease from build-cache preparation through
12
- TypeScript compilation, bundling, and finalization. The sandboxed test runner
13
- uses the same lease for the entire test and coverage session. A second producer
14
- or consumer waits up to twenty minutes instead of reading partially rewritten
15
- JavaScript. The lease is under `.cache/build-lease`; its owner receipt records a
16
- process identifier and an opaque inheritance token.
10
+ Build/test/coverage sessions own `.cache/build-lease` through completion;
11
+ other producers/consumers wait twenty minutes. Nested readers inherit a verified
12
+ PID/token receipt; nested builds require independent workspaces. Direct stages
13
+ and arbitrary `dist` reads bypass this protocol.
17
14
 
18
- Nested read-only test runners inherit the verified live-owner receipt. Starting
19
- a build inside a test session is refused: rebuilding shared artifacts while
20
- other test workers consume them would violate the generation boundary. Fixtures
21
- that exercise the build orchestrator must use independent temporary workspaces.
15
+ Leases never expire or get stolen. Two matching reads proving PID absence fail
16
+ promptly with recovery guidance. Missing/malformed/changing/ambiguous receipts
17
+ use the timeout; PID reuse is ambiguous. Inspect owner and children before
18
+ abandoned-lease removal. Failed builds leave `.cache/build-incomplete`; prebuilt
19
+ tests refuse it until a successful build.
22
20
 
23
- The lease never expires based on its age and is never automatically stolen.
24
- While waiting, the runner probes the recorded owner's process identifier. If
25
- the process is definitively absent and a second read confirms the same owner,
26
- it fails promptly with the receipt path and recovery instructions. Missing,
27
- malformed, changing, and permission-ambiguous receipts remain protected and use
28
- the ordinary acquisition timeout. PID reuse can make a departed owner appear
29
- live; the probe is a conservative diagnostic, not proof of process identity.
30
- After an interrupted process, inspect the owner and its children before removing
31
- an abandoned lease. A failed build leaves `.cache/build-incomplete`; prebuilt
32
- tests refuse that generation until a successful `pnpm build` clears the marker.
33
- Direct invocations of individual build stages or arbitrary reads of `dist` do
34
- not participate in this protocol. Use the build and test entrypoints for
35
- concurrent validation.
21
+ Interrupts stop the child and stage admission, allowing five seconds for
22
+ settlement, lease release and cleanup; unsettled children retain storage.
23
+ Subprocess tests cover build/prebuilt paths and installer exits bypassing
24
+ `finally`. [Storage lifecycle](SDK_STORAGE_LIFECYCLE.md) defines retention and
25
+ platform limits.
36
26
 
37
- ## Owned temporary workspaces
27
+ ## Registry acceptance
38
28
 
39
- Package smoke, external-package smoke, package-first dogfood, contract snapshots,
40
- plugin MCP smoke, and the sandboxed test runner register their temporary roots
41
- with the shared lifecycle helper. Release preparation, installed-agent and
42
- published-package verification, compatibility checks, isolated regression
43
- controls, context evaluation, intent calibration, refusal probes, and the point
44
- and context read benchmarks also register their owned roots. Normal completion
45
- releases the registration after cleanup. Synchronous
46
- workspaces also clean on process exit, including uncaught failure. SIGINT and
47
- SIGTERM run registered cleanup before returning exit codes 130 and 143.
29
+ Release publishes once, chooses the registry's closest older calendar version
30
+ and runs the same eleven-step session against control then candidate in separate
31
+ roots. Linux/macOS/Windows cover npm local/global and Bun local. Installed CLI/SDK
32
+ and selected runtimes have two-minute step deadlines, bounded output and token
33
+ receipts. Synthetic telemetry/external reporting are disabled.
48
34
 
49
- An asynchronous producer must provide bounded shutdown. The plugin harness
50
- waits for its MCP child to close before removing its workspace; shutdown failure
51
- retains the directory and reports its path. An abrupt exit cannot await that
52
- shutdown, so it also retains asynchronous workspaces. Explicit keep-temp modes
53
- do not register cleanup. No cleanup scans or deletes unrelated temporary roots.
35
+ Control failure indicates harness/environment problems; candidate-only failure
36
+ requires regression investigation. Both block advertisement, which requires every
37
+ matrix leg. Artifacts name manager/step. Immutable versions are never republished;
38
+ exact-tag recovery retains the reviewed control selector. Parent deadlines cover
39
+ preparation and publish/verify/advertise.
54
40
 
55
- The test runner stops its active build or test child on interruption, closes
56
- admission to later stages, and waits up to five seconds for the runner to settle.
57
- That wait includes release of its build lease and ordinary cleanup. If the child
58
- does not stop, the workspace is retained and its location is reported. A signal
59
- must never remove files still being used by a test process. Real subprocess
60
- regressions exercise both build-enabled and prebuilt execution, alongside
61
- installer failures that call `process.exit` and therefore bypass `finally`.
62
-
63
- Package-first dogfood disables telemetry for its synthetic child commands so
64
- detached flush workers cannot recreate the workspace after cleanup. Dedicated
65
- telemetry acceptance and the live Sentry/telemetry gate verify delivery.
66
-
67
- Release-note integration fixtures own their changelog, generator location, and
68
- Git lookup directory. Both a dated-only changelog and an Unreleased section are
69
- tested against the same real over-budget tracker. Release preparation can
70
- therefore regenerate the checkout changelog without changing test inputs.
71
-
72
- These handlers cannot run after SIGKILL, power loss, or Windows forced process
73
- termination. Native signal acceptance runs on Unix; callback and normal-exit
74
- contracts also run on Windows. The remaining script-wide migration stays tracked
75
- by pm-p5u6 rather than treating these covered entrypoints as complete adoption.
76
-
77
- ## Published candidate and control
78
-
79
- The Release workflow publishes npm artifacts once, verifies executors, and
80
- selects the closest older calendar version from the public registry inventory.
81
- It then runs the same eleven-step agent session against the control first and
82
- the candidate second in independent temporary installation roots.
83
-
84
- The matrix covers Linux, macOS, and Windows with npm local, npm global, and Bun
85
- local installations. Each session initializes, orients, creates, claims,
86
- annotates, links evidence, closes, validates, reads the closed item and context,
87
- and verifies a complete corpus read through the installed public SDK. Each
88
- subprocess has a two-minute deadline; command output has per-step bounds and the
89
- report records estimated token cost. Telemetry and external error reporting are
90
- disabled in these acceptance workspaces.
91
-
92
- GitHub release advertisement is a separate job that depends on every matrix
93
- leg succeeding. A failed control identifies a harness or environment problem;
94
- a passing control followed by a failing candidate identifies a candidate
95
- regression to investigate. Neither failure permits advertisement. Reports are
96
- retained as workflow artifacts; failures also name the manager and failing step.
97
- Existing npm versions are never republished during exact-tag recovery.
98
-
99
- The prepublication artifact gate accepts both npm's array report and npm 12's
100
- package-keyed report. It requires exactly one artifact, validates keyed package
101
- identity, and applies the same file, source-map, and size limits to either shape.
102
- Exact-tag recovery preserves the reviewed control selector before checking out
103
- older unpublished source. The automatic-release parent budgets the complete
104
- publish, acceptance, and advertisement sequence plus its preparation work.
105
-
106
- Run the same comparison locally:
41
+ The artifact gate validates one npm array/keyed receipt, identity and size/file/map
42
+ limits. Release-note fixtures own generator/changelog/Git roots, isolating
43
+ dated/Unreleased over-budget cases from checkout regeneration.
107
44
 
108
45
  ```bash
109
- npm run release:verify-installed-agent -- --version 2026.9.16 --previous-version 2026.9.15 --manager npm --global --json
110
- npm run release:verify-installed-agent -- --version 2026.9.16 --previous-version 2026.9.15 --manager bun --json
46
+ npm run release:verify-installed-agent -- --version "$CANDIDATE" --previous-version "$CONTROL" --manager npm --global --json
47
+ npm run release:verify-installed-agent -- --version "$CANDIDATE" --previous-version "$CONTROL" --manager bun --json
111
48
  ```
112
49
 
113
- Use `npm run` on Windows so the verifier receives the actual npm JavaScript
114
- entrypoint. CLI and SDK execution use the installed package and the selected
115
- runtime rather than assuming shell shim names.
50
+ Set both versions. Windows `npm run` supplies npm's JavaScript entrypoint.
51
+ See [packed first run](PACKED_FIRST_RUN.md) and [release policy](RELEASING.md).
@@ -74,7 +74,18 @@ Health and validation name `pm merge install` as the repair command for missing
74
74
  or drifted drivers. This upgrade behavior is tracked by
75
75
  [pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon).
76
76
 
77
- The installer publishes the shared `.gitattributes` fence only after the clone-local driver commands are configured. If the repository Git config is read-only or another Git process holds its lock, the command returns the stable `merge_git_config_unwritable` error with recovery guidance and leaves an absent fence absent. Use `pm merge install --dry-run --json` to inspect the contract in intentionally read-only workspaces.
77
+ The installer publishes the shared `.gitattributes` fence only after the
78
+ clone-local driver commands are configured. Matching definitions are read
79
+ without rewriting Git configuration. Concurrent pm installers coordinate
80
+ through a clone-local lock shared by its worktrees. Each required Git write
81
+ waits up to five seconds for Git's native config-file lock, with capped backoff;
82
+ it never removes another writer's lock. Persistent contention, malformed
83
+ configuration, and permission failures return the stable
84
+ `merge_git_config_unwritable` error with recovery guidance and leave an absent
85
+ fence absent. This behavior is tracked by
86
+ [pm-gh1424](../.agents/pm/issues/pm-gh1424.toon).
87
+ Use `pm merge install --dry-run --json` to inspect the contract in
88
+ intentionally read-only workspaces.
78
89
 
79
90
  ### Independent worktree runtimes
80
91
 
@@ -177,7 +188,20 @@ and `hash_only`, while the clone-local receipt remains `clone_local`. This lets
177
188
  a fresh-clone reviewer recover ordinary control-plane decisions without
178
189
  publishing titles, descriptions, custom statuses, or other potentially private
179
190
  content. When both copies exist the SDK deduplicates them and prefers the
180
- locally recoverable copy:
191
+ locally recoverable values. After immutable provenance matches, durable
192
+ reconciled state takes precedence over a stale clone-local pending copy only
193
+ when verified item history contains a sealed `merge_reconcile` event with the
194
+ same complete receipt summary and disposition. An absent, unreadable, invalid,
195
+ unsealed, or mismatched audit keeps the receipt pending in memory; inspection
196
+ rewrites neither receipt nor history. History is verified once per affected
197
+ item in each receipt scan.
198
+ Copy provenance includes normalized `requested_preference_applied`, so copies
199
+ that disagree on whether preference participated cannot share lifecycle state
200
+ even if history matches one copy. Inspection reports `copy_provenance_mismatch`,
201
+ and settlement refuses before either receipt is written. Legacy omission uses
202
+ the declared conflict policy's default participation value.
203
+ A local reconciled copy paired with a pending durable copy remains pending,
204
+ so an interrupted settlement can finish its durable write:
181
205
 
182
206
  ```bash
183
207
  pm merge report
@@ -249,18 +273,33 @@ does not recover the original private value.
249
273
 
250
274
  ## Receipts from an aborted rebase
251
275
 
252
- Tracked by [pm-466m0j](../.agents/pm/issues/pm-466m0j.toon). New receipts
253
- created during a rebase capture only its original commit and item blob in the
254
- typed `MergeReceiptOperation` contract. After aborting, run:
276
+ Tracked by [pm-466m0j](../.agents/pm/issues/pm-466m0j.toon) and
277
+ [pm-gh1405](../.agents/pm/issues/pm-gh1405.toon). New receipts created during a
278
+ merge or rebase capture only its operation kind, original commit, and item blob
279
+ in the typed `MergeReceiptOperation` contract. A plain merge captures these
280
+ before Git publishes `MERGE_HEAD`: Git must supply its `GITHEAD_<incoming object
281
+ ID>` driver environment signal, `HEAD` must equal `ORIG_HEAD`, and the
282
+ driver's ours input must hash to the item blob at that commit. Missing or
283
+ ambiguous coordinates are omitted. Matching origin references and bytes alone
284
+ cannot identify a plain merge: cherry-pick and revert also invoke content
285
+ drivers. Without Git's incoming-head signal, those receipts remain unresolved
286
+ and cannot receive a plain-merge abandonment audit. Branch labels from the
287
+ driver environment are never persisted. After aborting, run:
255
288
 
256
289
  ```bash
257
290
  pm merge reconcile --dry-run --json
258
- pm merge reconcile --message "Record restored original rebase state" --json
291
+ pm merge reconcile --message "Record restored original Git state" --json
259
292
  ```
260
293
 
294
+ SDK consumers that exhaustively handle `MergeReceiptOperation.kind` must
295
+ accept both `rebase` and `merge`. Existing rebase coordinates and receipt
296
+ version remain valid; no stored receipt migration is required.
297
+
261
298
  Settlement requires Git to have left every active merge/rebase/cherry-pick/revert
262
299
  operation, HEAD to match the original commit, and the item in HEAD, index, and
263
300
  working tree to match the original blob. The item history must already be clean.
301
+ Requiring the original HEAD also rules out a new commit incorporating the
302
+ abandoned merge's other branch.
264
303
  The history transaction rechecks the proof against its exact protected item
265
304
  snapshot. Apply appends an explicit `merge_reconcile` event with
266
305
  `abandoned_receipts` and the reason `original_git_state_restored`; it then marks
@@ -271,6 +310,22 @@ If receipt persistence fails after the audit commits, retry reuses the identical
271
310
  verified disposition and finishes the receipt writes without appending another
272
311
  audit event. An unrelated earlier audit does not satisfy this check.
273
312
 
313
+ The driver-created `merge-receipts/<receipt-id>.json` sidecar can remain
314
+ untracked after Git aborts. After reviewed settlement, commit that privacy-safe
315
+ sidecar together with the item's new history audit. Reconciliation preserves
316
+ the durable evidence for other worktrees instead of deleting the sidecar.
317
+
318
+ Applied-merge settlement has the same retry contract, tracked by
319
+ [pm-gh1390](../.agents/pm/issues/pm-gh1390.toon). The current item must still
320
+ satisfy authoritative receipt proof; only an identical receipt context in a
321
+ sealed event from reanchored, verified history suppresses a repeated provenance
322
+ event. Matching unsealed legacy context receives a new sealed audit while its
323
+ original entry remains intact. This also works with
324
+ durable-only evidence in another worktree. Once that worktree commits the
325
+ settled sidecar and history, a receiving worktree's stale local pending receipt
326
+ cannot reopen it. A subsequent `pm merge reconcile` leaves all three files
327
+ unchanged.
328
+
274
329
  Old receipts without operation coordinates remain pending for ordinary review.
275
330
  Tracked `merge-receipts/` sidecars are durable provenance and must remain tracked.
276
331
  Deleting or ignoring them would lose the evidence needed by other clones.
@@ -1,50 +1,34 @@
1
1
  # Packed First-Run Acceptance
2
2
 
3
- Tracked by [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
4
- [pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon), and
5
- [pm-07m41m](../.agents/pm/issues/pm-07m41m.toon).
3
+ Trackers: [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
4
+ [pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon),
5
+ [pm-07m41m](../.agents/pm/issues/pm-07m41m.toon),
6
+ [pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
6
7
 
7
- The `Packed first run` CI matrix installs the same tarball globally into an
8
- isolated npm prefix on Ubuntu, macOS, and Windows, using Node 22.18.0 and Node 24.
9
- It executes the installed `pm` shim before passing the installed package directory
10
- to the acceptance harness:
8
+ CI globally installs one tarball in isolated npm prefixes on Ubuntu/macOS/Windows
9
+ with Node 22.18.0 and 24, runs the installed `pm` shim, then invokes:
11
10
 
12
11
  ```bash
13
12
  node scripts/release/packed-first-run.mjs /path/to/installed/@unbrained/pm-cli
14
13
  ```
15
14
 
16
- The harness extracts the first three commands from the installed README's
17
- `60 Second Example` section. It executes `init`, `create`, and `list` in a
18
- temporary Git workspace, requires nonempty output below 4,096 characters per
19
- command, and checks that the created item was persisted. Missing sections,
20
- reordered commands, unsupported shell expressions, and unbalanced quotes fail.
21
- Arguments are passed directly to the installed CLI without a shell.
22
-
23
- Two branches then append independent comments through that CLI. A real Git merge
24
- must preserve both comments and their history. The installed reconciliation and
25
- strict history verifier must succeed. The installed MCP server must complete an
26
- initialize round trip and advertise the installed package version. An additional
27
- mutation enables telemetry only against a loopback HTTP collector. The harness
28
- acknowledges detached delivery batches until it receives `command_finish`, then
29
- verifies the physical queue is empty and a successful flush is recorded.
30
- One 30-second deadline covers the entire collection, including incomplete request
31
- bodies; an initial `command_start` batch alone cannot satisfy acceptance.
32
- It removes inherited inline-flush and
33
- test-runner overrides so this exercises the real detached process. Other commands
34
- and MCP keep telemetry disabled; the install and workspace use isolated home
35
- and global tracker directories.
36
-
37
- MCP cleanup waits for process closure before removing its workspace. It allows
38
- five seconds after SIGTERM, then sends SIGKILL and allows five more seconds. If
39
- the child still does not close, the harness fails with captured diagnostics and
40
- retains that workspace rather than attempting removal while it is in use.
41
-
42
- The separate runtime-upgrade regression installs drivers through an absolute
43
- runtime symlink, removes the original runtime directory, retargets the symlink,
44
- and performs a real Git merge. It verifies the upgrade failure from GitHub #1248
45
- without altering any developer runtime or repository.
46
-
47
- This matrix proves the packed artifact's first-run behavior. Registry propagation,
48
- npm/Bun installed agent sessions, npx/bunx execution, production telemetry, and
49
- previous-release compatibility remain separate acceptance claims under the
50
- [release workflow](RELEASING.md).
15
+ | Journey | Required observation |
16
+ | --- | --- |
17
+ | Installed README | Ordered init/create/list from `60 Second Example`; missing/reordered commands, unsupported expressions or unbalanced quotes fail. No shell execution. |
18
+ | Persistence | Each command returns nonempty output below 4,096 characters; the created item exists. |
19
+ | Branch merge | Independent comments survive a real Git merge; reconciliation and strict history verification succeed. |
20
+ | MCP | Initialization advertises the installed version. |
21
+ | Telemetry | A loopback collector receives detached `command_finish`; queue empties and successful flush persists. One 90-second deadline includes incomplete bodies; start alone cannot pass. |
22
+
23
+ Detached delivery removes inherited inline/test overrides; other commands/MCP
24
+ disable telemetry. Home/global roots are isolated. Interrupts stop stage admission
25
+ and collection, waiting five seconds for disposal. CLI errors await actual closure.
26
+ MCP waits five seconds after SIGTERM, then SIGKILL plus five more; failure retains
27
+ storage/diagnostics. [Storage lifecycle](SDK_STORAGE_LIFECYCLE.md) defines ownership
28
+ and abrupt-exit limits.
29
+
30
+ A separate #1248 regression removes/retargets an owned runtime symlink and performs
31
+ a real Git merge, preserving developer runtimes.
32
+
33
+ Registry propagation, npm/Bun sessions, npx/bunx, production telemetry and previous
34
+ compatibility have separate [release acceptance](BUILD_AND_RELEASE_ACCEPTANCE.md).
package/docs/README.md CHANGED
@@ -98,6 +98,7 @@ pm guide release --json
98
98
  - [Extension Lifecycle Contracts](EXTENSION_LIFECYCLE.md) - source identity, durable migrations, and scoped preflight ownership.
99
99
  - [Extension Author Contracts](EXTENSION_AUTHOR_CONTRACTS.md) - the stability guarantees and contract surface package authors build against.
100
100
  - [SDK](SDK.md) - public import surfaces and typed authoring examples.
101
+ - [SDK Storage Lifecycle](SDK_STORAGE_LIFECYCLE.md) - existing-parent writes, background worker lifetimes, and temporary acceptance producers.
101
102
  - [SDK Item Creation and Recovery](SDK_CREATE_AND_RECOVERY.md) - typed deterministic conflicts, resolved identity, actionable refusals, and amount-limited producer cursors.
102
103
  - [Audited SDK Settings and Item Updates](SDK_AUDITED_MUTATIONS.md) - extension-owned settings changes, replay-safe previews, and full-item JSON annotation integrity.
103
104
  - [SDK execution and recovery contracts](SDK_EXECUTION_CONTRACTS.md): schema-driven scheduling, handoff, and command recovery.
@@ -4,6 +4,24 @@ The extension settings contract is tracked by
4
4
  [pm-wtqltn](../.agents/pm/issues/pm-wtqltn.toon). Full-item JSON annotation
5
5
  integrity is tracked by [pm-2589e6](../.agents/pm/issues/pm-2589e6.toon).
6
6
  Canonical previews are tracked by [pm-2sef82](../.agents/pm/features/pm-2sef82.toon).
7
+ Preview path refusals are tracked by
8
+ [pm-preview-path-refusal](../.agents/pm/issues/pm-preview-path-refusal.toon).
9
+
10
+ ## Transaction preview storage
11
+
12
+ Item mutation and completion previews inspect a staged copy of the configured
13
+ tracker storage without changing source items or bootstrapping source schemas.
14
+ Linked entries, special files and directories configured as files are refused
15
+ with `transaction_preview_non_regular_file` (CLI exit `2`). SDK callers receive
16
+ a `PmCliError` with the same code and repair guidance in `context.nextSteps`.
17
+ The producer diagnostic omits discovered filesystem paths. Inspect the configured
18
+ settings, schema, session and item storage, restore the intended regular files and directories,
19
+ then retry the original dry run.
20
+
21
+ Entry and opened-descriptor checks enforce the same contract. Persistent native
22
+ filesystem failures, including missing link targets and permission errors, keep
23
+ their original codes. These checks require stable, trusted ancestors; they do
24
+ not guarantee protection against hostile concurrent path redirection.
7
25
 
8
26
  ## Extension settings
9
27
 
@@ -0,0 +1,35 @@
1
+ # SDK Storage Lifecycle
2
+
3
+ Tracked by [pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
4
+
5
+ Detached telemetry reads existing settings without scaffolding schemas/identity.
6
+ Locks, queue/state rewrites and event/OTLP completion preserve owner-removed
7
+ storage. Delivery stays best effort/nonblocking; foreground defaults create parents.
8
+
9
+ ```typescript
10
+ import { acquireLock, writeFileAtomic } from "@unbrained/pm-cli/sdk";
11
+
12
+ const policy = { createParentDirectories: false };
13
+ const release = await acquireLock(root, "job", 60, "worker", false, true, 5000, policy);
14
+ try {
15
+ await writeFileAtomic(resultPath, serializedResult, policy);
16
+ } finally {
17
+ await release();
18
+ }
19
+ ```
20
+
21
+ Owners initialize lock/result parents; absence fails without recreation. The
22
+ policy cannot pin identity or prevent symlink/replacement races. Extension lock
23
+ overrides own their lifecycle.
24
+
25
+ Async scripts use `registerTempOperation`: signal children, check after
26
+ uncancellable SDK work, `finish` after finally disposal. Interrupts close admission
27
+ and await completion; timeout retains evidence. Sync scripts use
28
+ `registerTempCleanup`. Normal failure, SIGINT/SIGTERM (130/143), explicit retention
29
+ and caller-owned roots are covered; unrelated roots survive. Abrupt exits retain
30
+ async work. SIGKILL/power loss/Windows forced termination cannot run handlers.
31
+ Unix tests cover signals; Windows covers callbacks/normal exit.
32
+
33
+ Real storage, HTTP/OTLP, Git and subprocess regressions complement
34
+ [build/registry acceptance](BUILD_AND_RELEASE_ACCEPTANCE.md) and
35
+ [packed first run](PACKED_FIRST_RUN.md).
@@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`.
4
4
 
5
5
  Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
6
6
 
7
- - Catalog error codes: 395
7
+ - Catalog error codes: 396
8
8
  - Executable error codes: 19
9
9
  - Executable-code ratchet floor: 18
10
10
  - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
11
- - Uncovered error codes: 376
12
- - Coverage fraction: 0.048101
11
+ - Uncovered error codes: 377
12
+ - Coverage fraction: 0.047980
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 117
15
15
 
@@ -324,6 +324,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
324
324
  | `tracker_root_not_directory` | `tracker_root_not_directory` | executable | owned_state | 1 |
325
325
  | `tracker_root_unreadable` | `tracker_root_unreadable` | executable | owned_state | 1 |
326
326
  | `transaction_preview_external_schema` | `transaction_preview_external_schema` | uncovered | none | 0 |
327
+ | `transaction_preview_non_regular_file` | `transaction_preview_non_regular_file` | uncovered | none | 0 |
327
328
  | `transaction_preview_snapshot_changed` | `transaction_preview_snapshot_changed` | uncovered | none | 0 |
328
329
  | `type_duplicate` | `type_duplicate` | uncovered | none | 0 |
329
330
  | `type_invalid` | `type_invalid` | uncovered | none | 0 |
package/marketplace.json CHANGED
@@ -5,13 +5,13 @@
5
5
  "url": "https://github.com/unbraind/pm-cli"
6
6
  },
7
7
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
8
- "version": "2026.10.7",
8
+ "version": "2026.10.8",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "pm-claude",
12
12
  "source": "./plugins/pm-claude",
13
13
  "description": "Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
14
- "version": "2026.10.7",
14
+ "version": "2026.10.8",
15
15
  "author": {
16
16
  "name": "unbrained",
17
17
  "url": "https://github.com/unbraind/pm-cli"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for calendar and agenda views.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-command-kit",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for guide and shell completion workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-kanban",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-lifecycle-hooks",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package demonstrating safe lifecycle hook registration.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-linked-test-adapters",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for optional linked-test run management adapters and reporters.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-search-advanced",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for semantic, hybrid, and reindex search workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-templates",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for reusable create templates.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-todos",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for Todo markdown import and export.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-vcs-sdk-exemplar",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.",
@@ -3,7 +3,7 @@
3
3
  "name": "pm-claude",
4
4
  "displayName": "pm CLI",
5
5
  "description": "Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.",
6
- "version": "2026.10.7",
6
+ "version": "2026.10.8",
7
7
  "author": {
8
8
  "name": "unbrained",
9
9
  "url": "https://github.com/unbraind/pm-cli"
@@ -2,8 +2,8 @@
2
2
  "name": "pm-claude-runtime",
3
3
  "private": true,
4
4
  "type": "module",
5
- "version": "2026.10.7",
5
+ "version": "2026.10.8",
6
6
  "dependencies": {
7
- "@unbrained/pm-cli": "2026.10.7"
7
+ "@unbrained/pm-cli": "2026.10.8"
8
8
  }
9
9
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-codex",
3
- "version": "2026.10.7",
3
+ "version": "2026.10.8",
4
4
  "description": "Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.",
5
5
  "author": {
6
6
  "name": "unbrained",