@unbrained/pm-cli 2026.8.28 → 2026.8.30

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 (98) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +30 -0
  3. package/dist/cli-bundle/bundle-manifest.json +125 -125
  4. package/dist/cli-bundle/chunks/{chunk-E73FDIWT.js → chunk-2MKLQL2E.js} +2 -2
  5. package/dist/cli-bundle/chunks/{chunk-NTXZHRKA.js → chunk-2UETTHY6.js} +46 -46
  6. package/dist/cli-bundle/chunks/{chunk-FEVBFFCQ.js → chunk-3TEF3HM5.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-BY2FQ2NI.js → chunk-7SKMLSMX.js} +2 -2
  8. package/dist/cli-bundle/chunks/chunk-7X6OZEIV.js +34 -0
  9. package/dist/cli-bundle/chunks/{chunk-M7OXRQE3.js → chunk-CMIEDWAY.js} +50 -50
  10. package/dist/cli-bundle/chunks/{chunk-XWEQGHHG.js → chunk-GNWPTEBW.js} +64 -61
  11. package/dist/cli-bundle/chunks/{chunk-X2RROGZE.js → chunk-MTTKAUBX.js} +2 -2
  12. package/dist/cli-bundle/chunks/chunk-N6OR6FAR.js +13 -0
  13. package/dist/cli-bundle/chunks/{chunk-NBCBFVZI.js → chunk-TGNAA66W.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-QE6WQXFO.js → chunk-WS2GJQVG.js} +2 -2
  15. package/dist/cli-bundle/chunks/{register-list-query-J35ZPQQ5.js → register-list-query-OMKJ5ONN.js} +2 -2
  16. package/dist/cli-bundle/chunks/{register-mutation-J6XJJOGU.js → register-mutation-QBSNCOY3.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-operations-AE3JEMFT.js → register-operations-UC77FQZC.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-setup-OQERLLWE.js → register-setup-GLQ5SYV3.js} +2 -2
  19. package/dist/cli-bundle/focused-chunks/{chunk-HC7ODMH3.js → chunk-3AVAWVZA.js} +2 -2
  20. package/dist/cli-bundle/focused-chunks/chunk-3UMBF26I.js +158 -0
  21. package/dist/cli-bundle/focused-chunks/{chunk-YVVZ3LQ6.js → chunk-73EDXGYE.js} +16 -15
  22. package/dist/cli-bundle/focused-chunks/chunk-AXZ5AJAF.js +50 -0
  23. package/dist/cli-bundle/focused-chunks/{chunk-AHAM2HAU.js → chunk-G6PATS5E.js} +3 -3
  24. package/dist/cli-bundle/focused-chunks/chunk-RKOKG43G.js +2 -0
  25. package/dist/cli-bundle/focused-chunks/chunk-TDK3OCX3.js +2 -0
  26. package/dist/cli-bundle/focused-chunks/{chunk-FC2AXLB5.js → chunk-XXOWRJZ5.js} +2 -2
  27. package/dist/cli-bundle/main.js +2 -2
  28. package/dist/cli-bundle/sdk-contracts.js +1 -1
  29. package/dist/cli-bundle/sdk-core.js +31 -32
  30. package/dist/cli-bundle/sdk-governance.js +1 -1
  31. package/dist/cli-bundle/sdk-graph.js +1 -1
  32. package/dist/cli-bundle/sdk-merge.js +34 -32
  33. package/dist/cli-bundle/sdk-query.js +1 -1
  34. package/dist/cli-bundle/sdk-runtime.js +1 -1
  35. package/dist/cli-bundle/sdk-testing.js +1 -1
  36. package/dist/cli-bundle/sdk.js +8 -8
  37. package/dist/core/diagnostics/remediation.js +16 -6
  38. package/dist/core/history/drift-scan.d.ts +2 -0
  39. package/dist/core/history/drift-scan.js +72 -36
  40. package/dist/core/history/history.d.ts +3 -3
  41. package/dist/core/history/history.js +5 -5
  42. package/dist/core/history/replay.d.ts +1 -1
  43. package/dist/core/history/replay.js +50 -19
  44. package/dist/core/item/actionability.d.ts +7 -1
  45. package/dist/core/item/actionability.js +44 -11
  46. package/dist/core/item/dependency-reference.d.ts +10 -0
  47. package/dist/core/item/dependency-reference.js +21 -0
  48. package/dist/core/item/parse.d.ts +4 -0
  49. package/dist/core/item/parse.js +38 -16
  50. package/dist/core/shared/author.js +69 -17
  51. package/dist/sdk/dependency-provenance.d.ts +51 -2
  52. package/dist/sdk/dependency-provenance.js +91 -7
  53. package/dist/sdk/extension/install-sources.d.ts +1 -7
  54. package/dist/sdk/extension/install-sources.js +94 -33
  55. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +50 -14
  56. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +62 -26
  57. package/dist/sdk/governance/health.js +86 -22
  58. package/dist/sdk/governance/validate-history-drift.js +5 -2
  59. package/dist/sdk/graph/assembly.js +51 -22
  60. package/dist/sdk/history-repair.d.ts +1 -1
  61. package/dist/sdk/history-repair.js +20 -10
  62. package/dist/sdk/lifecycle/create.js +43 -19
  63. package/dist/sdk/linked-artifacts.js +21 -31
  64. package/dist/sdk/merge/reconcile.js +3 -16
  65. package/dist/sdk/query/next.d.ts +6 -0
  66. package/dist/sdk/query/next.js +7 -2
  67. package/dist/sdk/test/entry.d.ts +1 -1
  68. package/dist/sdk/test/entry.js +5 -9
  69. package/dist/sdk/test/execution.d.ts +3 -0
  70. package/dist/sdk/test/execution.js +54 -13
  71. package/docs/CONTEXT_RECOVERY_PRIMITIVES.md +67 -0
  72. package/docs/MERGE_SAFETY.md +23 -10
  73. package/docs/README.md +1 -0
  74. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +10 -4
  75. package/marketplace.json +2 -2
  76. package/package.json +8 -8
  77. package/packages/pm-beads/package.json +1 -1
  78. package/packages/pm-calendar/package.json +1 -1
  79. package/packages/pm-command-kit/package.json +1 -1
  80. package/packages/pm-digital-twin/package.json +1 -1
  81. package/packages/pm-governance-audit/package.json +1 -1
  82. package/packages/pm-guide-shell/package.json +1 -1
  83. package/packages/pm-kanban/package.json +1 -1
  84. package/packages/pm-lifecycle-hooks/package.json +1 -1
  85. package/packages/pm-linked-test-adapters/package.json +1 -1
  86. package/packages/pm-search-advanced/package.json +1 -1
  87. package/packages/pm-templates/package.json +1 -1
  88. package/packages/pm-todos/package.json +1 -1
  89. package/packages/pm-vcs/package.json +1 -1
  90. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  91. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  92. package/sdk/public-surface.json +100 -11
  93. package/dist/cli-bundle/chunks/chunk-TIQ6AMH2.js +0 -13
  94. package/dist/cli-bundle/chunks/chunk-XRVVYRRO.js +0 -35
  95. package/dist/cli-bundle/focused-chunks/chunk-4ZDRZYYJ.js +0 -50
  96. package/dist/cli-bundle/focused-chunks/chunk-XDPYBQCF.js +0 -156
  97. package/dist/cli-bundle/focused-chunks/chunk-Y5A7SJJ7.js +0 -2
  98. package/dist/cli-bundle/focused-chunks/chunk-YJLDHJOD.js +0 -2
@@ -0,0 +1,67 @@
1
+ # Context Integrity and Recovery Primitives
2
+
3
+ Tracker: [pm-hu92i3](../.agents/pm/issues/pm-hu92i3.toon), [pm-nc94mk](../.agents/pm/issues/pm-nc94mk.toon), [pm-xrjy8o](../.agents/pm/issues/pm-xrjy8o.toon), [pm-f60039](../.agents/pm/issues/pm-f60039.toon), [pm-2qahia](../.agents/pm/issues/pm-2qahia.toon), [pm-z1z96w](../.agents/pm/issues/pm-z1z96w.toon), [pm-yhle2e](../.agents/pm/issues/pm-yhle2e.toon), [pm-t7wl00](../.agents/pm/issues/pm-t7wl00.toon), [pm-hiqlkh](../.agents/pm/issues/pm-hiqlkh.toon), [pm-ntnv4k](../.agents/pm/issues/pm-ntnv4k.toon), [pm-sxg7wl](../.agents/pm/issues/pm-sxg7wl.toon), [pm-xspd](../.agents/pm/chores/pm-xspd.toon)
4
+
5
+ `project management = context management`: a successful command is useful only when the context it records and later returns is truthful, lossless, and actionable. These SDK-owned primitives are shared by the CLI and package integrations.
6
+
7
+ ## Lossless structured values
8
+
9
+ CSV-style structured metadata preserves whitespace following literal commas. An escaped comma (`\,`) is consumed as one literal comma. Prefer quoted or structured forms when a value itself contains delimiters:
10
+
11
+ ```bash
12
+ pm files pm-123 --add 'path="docs/name,with-comma.md",scope=project'
13
+ pm update pm-123 --annotation 'key=summary,value=Alpha\, beta'
14
+ ```
15
+
16
+ Bare comma-separated file and documentation paths are refused because the CLI cannot know whether the comma separates two paths or belongs to one filename. Repeat the option for multiple values. A linked-test command followed by a structured tuple, such as `command,scope=project`, is refused for the same reason; use `command=<value>,scope=project`.
17
+
18
+ ## Linked path write receipts
19
+
20
+ `pm files --add`, `pm docs --add`, and path migrations validate the resulting paths when the mutation changes stored metadata. The result includes `validation.missing_paths`, `validation.non_file_paths`, and `validation.remote_references`. Missing local paths remain permitted as deliberate forward references, but they are visible in the write receipt instead of becoming silent durable context.
21
+
22
+ ## Executed-test evidence
23
+
24
+ A linked runner command carrying a name filter must execute at least one test. An explicit zero-test runner summary is classified as `failure_category: empty_run`, even when the process exits zero. A zero-pass count alone is not an empty-run receipt when the runner reports a positive test count. Filtered commands without either positive execution evidence or an explicit zero-test signal fail closed as `missing_positive_execution_receipt`; unfiltered commands retain the explicit `--fail-on-empty-test-run` policy.
25
+
26
+ ## External blockers
27
+
28
+ URL and named external locators are not dangling local item identifiers. Validation excludes them from local dangling-reference remediation, and graph assembly materializes them as external predecessor nodes. Until an integration resolves the remote state, `pm next` retains the blocker and reports:
29
+
30
+ - `external: true`
31
+ - `blocked_since`: the holder's conservative last-mutation timestamp
32
+ - `resolver: null`
33
+
34
+ This makes an unverifiable or stale dependency visible without suggesting destructive removal.
35
+
36
+ Packages can add provider-specific resolution without coupling core to GitHub, Jira, Linear, or another service. Register an `ExternalDependencyResolver` through the public SDK and dispose it when the package deactivates. The SDK normalizes lifecycle state to `open`, `closed`, or `unknown`; caps remote titles at 240 characters and evidence locators at 2,048 characters; records `checked_at` plus the registered resolver name; and treats only trusted `closed` evidence as resolved. Provider errors and unsupported locators fail closed so another registered resolver can handle the reference or the blocker remains explicitly unverifiable.
37
+
38
+ ## Package-manager receipt compatibility
39
+
40
+ The npm package source accepts both documented receipt families:
41
+
42
+ - npm 11: an array of package receipt objects
43
+ - npm 12: an object keyed by package name
44
+
45
+ When multiple entries exist, the SDK selects the requested package by key or `name`. A well-formed but unsupported or ambiguous JSON value fails with `npm_pack_json_shape_unsupported`; filename-only fallback is used only for genuinely non-JSON legacy output.
46
+
47
+ ## History and merge recovery
48
+
49
+ History hash capability 3 distinguishes the current canonical writer surface from older epoch-2 writers while retaining readers for epochs 1 and 2. An unsupported epoch is version skew, not permission to reinterpret or silently normalize history.
50
+
51
+ Health keeps the metadata-only cache path for clean history streams. A cached hash mismatch, chain mismatch, or writer-version skew is only a candidate: health rereads canonical item sources and verifies stream content hashes before reporting corruption. The `history_drift` details expose `cache_confirmation` candidate, confirmed, and resolved-false-positive item sets, while `cache_hit_verification: metadata_then_content_hash` identifies the authoritative fallback. Drift-cache envelopes also carry the current item-hash capability, so a runtime with incompatible hash semantics rebuilds the cache instead of trusting it.
52
+
53
+ Merge reconciliation may consume a durable hash-only receipt without `--force` only when its canonical item path, complete declared-field set, and every merged-value hash exactly match the current item snapshot. Raw discarded values remain clone-local. Any incomplete or mismatched proof fails closed.
54
+
55
+ ## Strict-create recovery
56
+
57
+ When strict governance requires a collection, the recovery bundle lists the truthful empty declaration before an example that adds metadata:
58
+
59
+ ```text
60
+ --clear-deps, --dep, --create-mode progressive
61
+ ```
62
+
63
+ The same contract covers comments, docs, events, files, learnings, notes, reminders, tests, and type options. Agents should never invent an edge or evidence row merely to satisfy a required-field gate.
64
+
65
+ ## Duplication gates
66
+
67
+ `pnpm lint:duplicates` runs both the repository-wide clone gate and a lower-line production-source profile. The source profile covers `src`, `packages`, and `plugins` so a compact clone reported by hosted analysis cannot hide below the broader repository threshold.
@@ -3,7 +3,9 @@
3
3
  Tracked by [pm-wc1r](../.agents/pm/features/pm-wc1r.toon), with the integrity and concurrency fixes [pm-9q2t](../.agents/pm/issues/pm-9q2t.toon), [pm-cxyv](../.agents/pm/issues/pm-cxyv.toon), [pm-gpo7](../.agents/pm/issues/pm-gpo7.toon), [pm-m3nl](../.agents/pm/issues/pm-m3nl.toon), [pm-wwfd](../.agents/pm/issues/pm-wwfd.toon), and [pm-xdn6](../.agents/pm/issues/pm-xdn6.toon). Fresh-init fence ownership is tracked by [pm-1w3ljt](../.agents/pm/issues/pm-1w3ljt.toon); runtime-cache index governance by [pm-hous](../.agents/pm/issues/pm-hous.toon); local allocation safety by [pm-khdq](../.agents/pm/issues/pm-khdq.toon); fence-coverage completeness and drift detection by [pm-i4fx](../.agents/pm/issues/pm-i4fx.toon); package-defined item coverage by [pm-5rexki](../.agents/pm/issues/pm-5rexki.toon); non-item JSON coverage by [pm-gjicmx](../.agents/pm/issues/pm-gjicmx.toon); portable driver identity by [pm-w91mvg](../.agents/pm/issues/pm-w91mvg.toon); pending receipt validation by [pm-ysqb6n](../.agents/pm/issues/pm-ysqb6n.toon); receipt classification by [pm-jtwsct](../.agents/pm/issues/pm-jtwsct.toon); direction-independent item conflict selection by [pm-dlx7v7](../.agents/pm/issues/pm-dlx7v7.toon); corrected reconciliation guidance by [pm-lwmstb](../.agents/pm/issues/pm-lwmstb.toon); cross-branch id collision safety by [pm-pibw](../.agents/pm/issues/pm-pibw.toon); auditable merge history by [pm-9j2r3b](../.agents/pm/tasks/pm-9j2r3b.toon); durable conflict decisions by [pm-rh98vo](../.agents/pm/issues/pm-rh98vo.toon); continuous conformance by [pm-76dnfg](../.agents/pm/tasks/pm-76dnfg.toon); workspace-wide CI enforcement by [pm-pdr8t1](../.agents/pm/tasks/pm-pdr8t1.toon); post-merge reconciliation by [pm-mfkv92](../.agents/pm/issues/pm-mfkv92.toon); linked-command execution trust by [pm-ed28wi](../.agents/pm/issues/pm-ed28wi.toon); this repository's own adoption by [pm-iwsj](../.agents/pm/chores/pm-iwsj.toon).
4
4
 
5
5
  Lossless receipt health gating is tracked by
6
- [pm-baksix](../.agents/pm/issues/pm-baksix.toon).
6
+ [pm-baksix](../.agents/pm/issues/pm-baksix.toon), and executable remediation
7
+ that performs settlement is tracked by
8
+ [pm-r0p3at](../.agents/pm/issues/pm-r0p3at.toon).
7
9
 
8
10
  pm stores project context as reviewable repository files. Concurrent agents can therefore use ordinary branches and worktrees, but tracker artifacts need semantic merge behavior: raw line merging cannot preserve TOON collection counts, JSON object structure, or append-only history hash chains.
9
11
 
@@ -116,7 +118,7 @@ After every branch merge that touches `.agents/pm`, run:
116
118
  ```bash
117
119
  pm merge reconcile --dry-run --json
118
120
  pm merge reconcile --message "Reconcile merged tracker histories" --json
119
- # Required only after every discarded field has been reviewed or re-applied:
121
+ # Required only to accept a receipt that lacks qualifying exact hash proof:
120
122
  pm merge reconcile --force --message "Accept reviewed merge decisions" --json
121
123
  ```
122
124
 
@@ -125,10 +127,10 @@ Lossless receipts do not become discarded-value decisions and reconcile without
125
127
  `--force`, but `pm health` reports `merge_receipts_pending:<n>` and remains
126
128
  non-green until the apply pass settles them. `pm history-repair` cannot clear
127
129
  that receipt finding. When a drifted item also has a pending receipt, the
128
- `history_drift` remediation map prioritizes `pm merge reconcile --dry-run` only
130
+ `history_drift` remediation map prioritizes `pm merge reconcile` only
129
131
  when canonical item path, changed-field, and merged-value hash evidence all
130
132
  attribute that finding to one or more receipts loaded from the clone-local Git
131
- evidence store. Every field declared by each receipt must match its current merged-value
133
+ evidence store or the authoritative durable receipt store. Every field declared by each receipt must match its current merged-value
132
134
  hash, even when only a subset appears in the history reconciliation diff.
133
135
  Disjoint valid receipts may collectively cover a multi-field reconciliation;
134
136
  the audit and settlement then retain every individually proven receipt id.
@@ -136,22 +138,33 @@ Serialized source claims are ignored. Receipt readers validate the complete
136
138
  bounded schema, safe identifiers, filename and item-path identity, timestamps,
137
139
  and bounded decision structure before a sidecar enters health or
138
140
  reconciliation. Reads use size-preflighted, no-follow regular-file descriptors;
139
- durable decisions must retain hash-only values. Legacy or durable-only receipts,
141
+ durable decisions must retain hash-only values. Qualifying durable-only receipts
142
+ are reloaded from the authoritative store and accepted only after exact canonical
143
+ item path, declared-field, and merged-value hash verification. Legacy receipts,
140
144
  receipts whose declared fields disagree with their hashes, same-item tampering,
141
145
  and drift on unrelated items fail closed to the normal `pm history-repair`
142
- guidance. Health indexes clone-local evidence once by item and reconciliation
146
+ guidance. Health indexes authoritative evidence once by item and reconciliation
143
147
  uses the same per-item groups with a fixed receipt-only worker pool, so committed
144
148
  sidecars cannot amplify drift scans into unbounded parallel repair work.
149
+ The machine-executable remediation names the apply command because `--dry-run`
150
+ returns a successful preview without changing the red health state. Operators
151
+ may still run the documented dry-run first; agents that execute the remediation
152
+ field verbatim perform the settlement instead of entering a successful no-op
153
+ loop.
145
154
  Apply-mode reconciliation repeats the same proof against the exact
146
155
  item snapshot used by the audited history rewrite. The audit event and
147
156
  settlement include only the individually proven receipt id, so one valid receipt
148
157
  cannot authorize an untrusted same-item sibling. Failed or unproven receipts
149
158
  remain pending unless the coordinator explicitly reviews and supplies `--force`.
150
159
  Receipts with discarded scalar values retain the distinct
151
- `merge_decisions_unreviewed:<n>` finding, and the apply pass refuses them unless
152
- the coordinator explicitly supplies `--force` after review. This prevents a
153
- routine history repair from hiding unfinished reconciliation or silently
154
- accepting data loss.
160
+ `merge_decisions_unreviewed:<n>` finding. Matching authoritative hash proof
161
+ allows those receipts to settle without `--force`; without qualifying proof,
162
+ the apply pass refuses them until the coordinator explicitly supplies `--force`
163
+ after review. The `history_drift_merge_receipt` remediation may therefore emit
164
+ an unforced apply command that clears `merge_decisions_unreviewed` when the
165
+ receipt proves the exact current merged values. This prevents routine repair
166
+ from hiding unfinished reconciliation while avoiding redundant force for an
167
+ already-proven canonical snapshot.
155
168
  It exits nonzero while either merge-critical validation check is non-green, so
156
169
  CI and explicit post-merge hooks cannot approve unresolved receipts or drift.
157
170
  The apply pass uses the audited history rewrite boundary to append a
package/docs/README.md CHANGED
@@ -68,6 +68,7 @@ pm guide release --json
68
68
  - [Recurrence and Executable Recovery Contracts](RECURRENCE_RECOVERY_CONTRACTS.md) - terminal-item recurrence, duplicate-intake routing, capability-aware reindex recovery, and target-aware generated test guidance.
69
69
  - [Trustworthy Context and Evidence Contracts](TRUSTWORTHY_CONTEXT_EVIDENCE.md) - full-record assurance, graph composition, boolean health rows, lossless linked-test removal, and role-labelled recovery.
70
70
  - [Context Integrity Contracts](CONTEXT_INTEGRITY_CONTRACTS.md) - sparse-read identity, closed extension manifests, lossless remote docs, direction-locked graph impact, and cross-version history epochs.
71
+ - [Context Integrity and Recovery Primitives](CONTEXT_RECOVERY_PRIMITIVES.md) - lossless metadata, write-time link receipts, executed-test evidence, external blockers, npm receipts, history capabilities, and truthful recovery.
71
72
  - [SDK Evidence Traceability and Integrity](SDK_EVIDENCE_TRACEABILITY.md) - reverse source-to-item lookup, atomic evidence replacement, no-op history, linked-test collision classification, and telemetry drain receipts.
72
73
  - [SDK Context and Evidence Contracts](SDK_CONTEXT_EVIDENCE_CONTRACTS.md) - material omission receipts, scoped preflight activation, truthful merge preference, claim-race classification, and versioned history hashes.
73
74
  - [Reproducible Workspaces and Snapshots](REPRODUCIBLE_WORKSPACES.md) - deterministic SDK recipes and content-addressed authoritative tracker restore points.
@@ -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: 347
7
+ - Catalog error codes: 353
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: 328
12
- - Coverage fraction: 0.054755
11
+ - Uncovered error codes: 334
12
+ - Coverage fraction: 0.053824
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 94
15
15
 
@@ -30,6 +30,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
30
30
  | `annotation_transposed_subcommand` | `annotation_transposed_subcommand` | uncovered | none | 0 |
31
31
  | `append_empty_body` | `append_empty_body` | uncovered | none | 0 |
32
32
  | `assurance_registry_invalid` | `assurance_registry_invalid` | uncovered | none | 0 |
33
+ | `bare_comma_entry_ambiguous` | `bare_comma_entry_ambiguous` | uncovered | none | 0 |
33
34
  | `body_file_conflicts_with_body` | `body_file_conflicts_with_body` | uncovered | none | 0 |
34
35
  | `body_file_missing_path` | `body_file_missing_path` | uncovered | none | 0 |
35
36
  | `body_file_unreadable` | `body_file_unreadable` | uncovered | none | 0 |
@@ -115,6 +116,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
115
116
  | `history_drift_merge_receipt` | `history_drift_merge_receipt` | uncovered | none | 0 |
116
117
  | `history_drift_missing_stream` | `history_drift_missing_stream` | uncovered | none | 0 |
117
118
  | `history_drift_unreadable_stream` | `history_drift_unreadable_stream` | uncovered | none | 0 |
119
+ | `history_drift_version_skew` | `history_drift_version_skew` | uncovered | none | 0 |
118
120
  | `history_merge_conflict_markers_detected` | `merge_conflict_markers_detected` | uncovered | none | 0 |
119
121
  | `history_stream_over_compact_threshold` | `history_stream_over_compact_threshold` | uncovered | none | 0 |
120
122
  | `history_target_out_of_range` | `history_target_out_of_range` | uncovered | none | 0 |
@@ -185,7 +187,6 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
185
187
  | `merge_git_config_unwritable` | `merge_git_config_unwritable` | uncovered | none | 0 |
186
188
  | `merge_receipt_evidence_invalid` | `merge_receipt_evidence_invalid` | uncovered | none | 0 |
187
189
  | `merge_receipts_pending` | `merge_receipts_pending` | uncovered | none | 0 |
188
- | `merge_reconcile_discards_require_acceptance` | `merge_reconcile_discards_require_acceptance` | uncovered | none | 0 |
189
190
  | `merge_reconcile_receipt_evidence_untrusted` | `merge_reconcile_receipt_evidence_untrusted` | uncovered | none | 0 |
190
191
  | `merge_root_not_found` | `merge_root_not_found` | uncovered | none | 0 |
191
192
  | `missing_allowed_values` | `missing_allowed_values` | uncovered | none | 0 |
@@ -198,6 +199,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
198
199
  | `missing_observation` | `missing_observation` | uncovered | none | 0 |
199
200
  | `missing_observed_signature` | `missing_observed_signature` | uncovered | none | 0 |
200
201
  | `missing_parameter_alias` | `missing_parameter_alias` | uncovered | none | 0 |
202
+ | `missing_positive_execution_receipt` | `missing_positive_execution_receipt` | uncovered | none | 0 |
201
203
  | `missing_probe` | `missing_probe` | uncovered | none | 0 |
202
204
  | `missing_required_argument` | `missing_required_argument` | executable | grammar | 57 |
203
205
  | `missing_required_option` | `missing_required_option` | uncovered | none | 0 |
@@ -214,6 +216,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
214
216
  | `no_update_fields` | `no_update_fields` | uncovered | none | 0 |
215
217
  | `no_version_bounds_declared` | `no_version_bounds_declared` | executable | owned_state | 1 |
216
218
  | `non_refusal_exit` | `non_refusal_exit` | uncovered | none | 0 |
219
+ | `npm_pack_json_shape_unsupported` | `npm_pack_json_shape_unsupported` | uncovered | none | 0 |
217
220
  | `npm_package_archive_missing` | `npm_package_archive_missing` | uncovered | none | 0 |
218
221
  | `npm_package_archive_unsafe` | `npm_package_archive_unsafe` | uncovered | none | 0 |
219
222
  | `npm_package_not_found` | `npm_package_not_found` | uncovered | none | 0 |
@@ -249,6 +252,8 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
249
252
  | `reopen_reason_required` | `reopen_reason_required` | uncovered | none | 0 |
250
253
  | `reopen_receipt_missing` | `reopen_receipt_missing` | uncovered | none | 0 |
251
254
  | `reopen_target_status_invalid` | `reopen_target_status_invalid` | uncovered | none | 0 |
255
+ | `reported_zero_passes` | `reported_zero_passes` | uncovered | none | 0 |
256
+ | `reported_zero_tests` | `reported_zero_tests` | uncovered | none | 0 |
252
257
  | `reserved_item_field` | `reserved_item_field` | uncovered | none | 0 |
253
258
  | `retry_failed` | `retry_failed` | uncovered | none | 0 |
254
259
  | `schema_migration_input_required` | `schema_migration_input_required` | uncovered | none | 0 |
@@ -317,6 +322,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
317
322
  | `validate_history_drift_hash_mismatches` | `history_drift_hash_mismatch` | uncovered | none | 0 |
318
323
  | `validate_history_drift_missing_streams` | `history_drift_missing_stream` | uncovered | none | 0 |
319
324
  | `validate_history_drift_unreadable_streams` | `history_drift_unreadable_stream` | uncovered | none | 0 |
325
+ | `validate_history_drift_version_skews` | `history_drift_version_skew` | uncovered | none | 0 |
320
326
  | `validate_history_unknown_author_events` | `history_unknown_author_events` | uncovered | none | 0 |
321
327
  | `validate_lifecycle_active_closure_like_metadata` | `validate_lifecycle_active_closure_like_metadata` | uncovered | none | 0 |
322
328
  | `validate_lifecycle_active_terminal_parent` | `validate_lifecycle_active_terminal_parent` | uncovered | none | 0 |
package/marketplace.json CHANGED
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
9
- "version": "2026.8.28"
9
+ "version": "2026.8.30"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "pm-claude",
14
14
  "source": "./plugins/pm-claude",
15
15
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
16
- "version": "2026.8.28",
16
+ "version": "2026.8.30",
17
17
  "author": {
18
18
  "name": "unbrained",
19
19
  "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.8.28",
3
+ "version": "2026.8.30",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -120,7 +120,7 @@
120
120
  "lint:eslint": "eslint . --max-warnings=0",
121
121
  "lint:eslint:prune": "eslint . --prune-suppressions",
122
122
  "lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
123
- "lint:duplicates": "jscpd --config .jscpd.json",
123
+ "lint:duplicates": "jscpd --config .jscpd.json && jscpd --config .jscpd.source.json",
124
124
  "lint:codefactor": "pnpm quality:static",
125
125
  "quality:static": "pnpm build && node scripts/contracts-snapshot.mjs --check && node scripts/generate-agent-capability-surfaces.mjs --check && node scripts/generate-error-code-catalog.mjs --check && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/command-grammar-gate.mjs && node scripts/release/flag-invocation-parity.mjs && node scripts/release/flag-lexicon-gate.mjs && node scripts/release/refusal-closure-gate.mjs && node scripts/release/agent-task-token-gate.mjs && pnpm quality:mcp-deprecations && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json --output-budget unbounded && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json --output-budget unbounded",
126
126
  "quality:command-grammar": "pnpm build && node scripts/release/command-grammar-gate.mjs && node scripts/release/flag-invocation-parity.mjs && node scripts/release/flag-lexicon-gate.mjs",
@@ -206,7 +206,7 @@
206
206
  "node": ">=22.18.0"
207
207
  },
208
208
  "dependencies": {
209
- "@sentry/node": "10.71.0",
209
+ "@sentry/node": "10.72.0",
210
210
  "@toon-format/toon": "^4.1.1",
211
211
  "@types/node": ">=22",
212
212
  "commander": "^15.0.0",
@@ -217,19 +217,19 @@
217
217
  "yaml": "^2.9.0"
218
218
  },
219
219
  "devDependencies": {
220
- "@modelcontextprotocol/ext-apps": "1.7.5",
221
220
  "@codspeed/vitest-plugin": "^5.7.1",
222
221
  "@eslint/js": "^10.0.1",
223
- "@sentry/cli": "^3.6.2",
224
- "@types/node": "^26.3.0",
222
+ "@modelcontextprotocol/ext-apps": "1.7.5",
223
+ "@sentry/cli": "^3.7.0",
224
+ "@types/node": "^26.4.0",
225
225
  "@types/npm-package-arg": "^6.1.4",
226
226
  "@vitest/coverage-v8": "^4.1.11",
227
227
  "esbuild": "0.28.2",
228
228
  "eslint": "^10.9.1",
229
229
  "eslint-plugin-sonarjs": "^4.2.0",
230
- "eslint-plugin-unicorn": "^73.0.0",
230
+ "eslint-plugin-unicorn": "74.0.0",
231
231
  "fast-check": "^4.9.0",
232
- "greptile": "^3.4.1",
232
+ "greptile": "^3.4.2",
233
233
  "jscpd": "^5.0.16",
234
234
  "tsx": "^4.23.12",
235
235
  "typescript": "^6.0.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.8.28",
3
+ "version": "2026.8.30",
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.",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pm-claude",
3
3
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 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.",
4
- "version": "2026.8.28",
4
+ "version": "2026.8.30",
5
5
  "author": {
6
6
  "name": "unbrained",
7
7
  "url": "https://github.com/unbraind/pm-cli"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-codex",
3
- "version": "2026.8.28",
3
+ "version": "2026.8.30",
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",