@unbrained/pm-cli 2026.9.4 → 2026.9.6

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 (277) hide show
  1. package/.agents/skills/HARNESS_COMPATIBILITY.md +1 -1
  2. package/.agents/skills/README.md +2 -2
  3. package/.agents/skills/pm-developer/SKILL.md +4 -1
  4. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +10 -0
  5. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +3 -1
  6. package/.agents/skills/pm-extensions/SKILL.md +2 -2
  7. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +3 -3
  8. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +3 -3
  9. package/.agents/skills/pm-user/SKILL.md +2 -0
  10. package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +5 -0
  11. package/.agents/skills/pm-user/references/WORKFLOWS.md +20 -5
  12. package/.claude-plugin/marketplace.json +2 -2
  13. package/CHANGELOG.md +58 -3
  14. package/dist/cli/commander-usage.d.ts +2 -0
  15. package/dist/cli/commander-usage.js +15 -12
  16. package/dist/cli/help-json-payload.js +12 -7
  17. package/dist/cli/main.js +22 -11
  18. package/dist/cli/register-list-query.js +4 -2
  19. package/dist/cli/register-mutation.js +4 -2
  20. package/dist/cli/register-operations.js +17 -8
  21. package/dist/cli-bundle/bundle-manifest.json +153 -161
  22. package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +9 -0
  23. package/dist/cli-bundle/chunks/{chunk-V72UV7QS.js → chunk-BAX2BYUW.js} +73 -73
  24. package/dist/cli-bundle/chunks/{chunk-HI6BHPCU.js → chunk-CKOL5U7J.js} +51 -51
  25. package/dist/cli-bundle/chunks/{chunk-A24WAVE6.js → chunk-JT6XF6GE.js} +2 -2
  26. package/dist/cli-bundle/chunks/{chunk-I2AS367G.js → chunk-JX4DH4WC.js} +2 -2
  27. package/dist/cli-bundle/chunks/{chunk-YW4QK2G7.js → chunk-NPN5I67J.js} +2 -2
  28. package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +5 -0
  29. package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +232 -0
  30. package/dist/cli-bundle/chunks/{chunk-RI4XNOYS.js → chunk-RWWBOWJ5.js} +2 -2
  31. package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +40 -0
  32. package/dist/cli-bundle/chunks/{chunk-X6CMGV6L.js → chunk-WI2AYPA7.js} +2 -2
  33. package/dist/cli-bundle/chunks/{register-list-query-Z5YYSJJG.js → register-list-query-5JL52D33.js} +3 -3
  34. package/dist/cli-bundle/chunks/{register-mutation-ELSP6I4I.js → register-mutation-ZPG7KMVP.js} +4 -4
  35. package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +2 -0
  36. package/dist/cli-bundle/chunks/{register-setup-E2AE72QG.js → register-setup-H4SVAVX7.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-3646BZ4W.js → chunk-3BZEOXLT.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +2 -0
  39. package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +6 -0
  40. package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +20 -0
  41. package/dist/cli-bundle/focused-chunks/{chunk-NBMJD6MK.js → chunk-EZR3GHFE.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +56 -0
  43. package/dist/cli-bundle/focused-chunks/{chunk-53IHPICX.js → chunk-LIJIA4TY.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/{chunk-25UJBH4M.js → chunk-M6PBRFSH.js} +2 -2
  45. package/dist/cli-bundle/focused-chunks/{chunk-AJR3OP2E.js → chunk-NTPY5GSO.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +2 -0
  47. package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +177 -0
  48. package/dist/cli-bundle/focused-chunks/{chunk-MHKUIPJW.js → chunk-PEFABF7E.js} +2 -2
  49. package/dist/cli-bundle/focused-chunks/{chunk-6PWPQKDN.js → chunk-QTVCLMSZ.js} +2 -2
  50. package/dist/cli-bundle/focused-chunks/{chunk-7N2TV7WZ.js → chunk-QTZRBUYA.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +12 -0
  52. package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +10 -0
  53. package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +2 -0
  54. package/dist/cli-bundle/main.js +22 -15
  55. package/dist/cli-bundle/sdk-authoring.js +1 -1
  56. package/dist/cli-bundle/sdk-contracts.js +2 -2
  57. package/dist/cli-bundle/sdk-core.js +37 -37
  58. package/dist/cli-bundle/sdk-governance.js +1 -1
  59. package/dist/cli-bundle/sdk-graph.js +1 -1
  60. package/dist/cli-bundle/sdk-merge.js +42 -39
  61. package/dist/cli-bundle/sdk-query.js +1 -1
  62. package/dist/cli-bundle/sdk-runtime.js +1 -1
  63. package/dist/cli-bundle/sdk-testing.js +1 -1
  64. package/dist/cli-bundle/sdk.js +9 -9
  65. package/dist/core/extensions/extension-types.d.ts +2 -0
  66. package/dist/core/extensions/extension-types.js +2 -2
  67. package/dist/core/extensions/module-graph-snapshot.js +5 -4
  68. package/dist/core/fs/host-environment-errors.d.ts +27 -0
  69. package/dist/core/fs/host-environment-errors.js +142 -0
  70. package/dist/core/history/drift-scan.d.ts +5 -0
  71. package/dist/core/history/drift-scan.js +16 -6
  72. package/dist/core/history/event-classification.d.ts +1 -1
  73. package/dist/core/history/event-classification.js +3 -2
  74. package/dist/core/history/history.js +37 -5
  75. package/dist/core/history/identity.d.ts +15 -0
  76. package/dist/core/history/identity.js +31 -0
  77. package/dist/core/history/projection.js +50 -17
  78. package/dist/core/history/read.js +6 -3
  79. package/dist/core/history/replay.d.ts +1 -2
  80. package/dist/core/history/replay.js +4 -4
  81. package/dist/core/history/version-address.d.ts +13 -0
  82. package/dist/core/history/version-address.js +33 -0
  83. package/dist/core/item/actionability.d.ts +21 -1
  84. package/dist/core/item/actionability.js +45 -10
  85. package/dist/core/item/id.js +8 -4
  86. package/dist/core/item/item-type-definition.d.ts +2 -0
  87. package/dist/core/item/item-type-definition.js +9 -2
  88. package/dist/core/item/type-registry.d.ts +5 -1
  89. package/dist/core/item/type-registry.js +9 -4
  90. package/dist/core/output/mutation-projection.js +12 -5
  91. package/dist/core/shared/errors.d.ts +8 -0
  92. package/dist/core/shared/errors.js +2 -2
  93. package/dist/core/store/item-metadata-query-index.js +13 -10
  94. package/dist/core/store/item-metadata-read-work.d.ts +19 -0
  95. package/dist/core/store/item-metadata-read-work.js +44 -0
  96. package/dist/core/store/item-store.d.ts +14 -0
  97. package/dist/core/store/item-store.js +52 -10
  98. package/dist/core/store/settings-validator.js +3 -2
  99. package/dist/core/validate/fix-planning.d.ts +1 -1
  100. package/dist/core/validate/fix-planning.js +2 -2
  101. package/dist/core/validate/missing-link-owners.d.ts +1 -1
  102. package/dist/core/validate/missing-link-owners.js +5 -3
  103. package/dist/core/validate/stale-file-classification.d.ts +6 -4
  104. package/dist/core/validate/stale-file-classification.js +20 -5
  105. package/dist/mcp/server.js +12 -5
  106. package/dist/sdk/actionability.d.ts +1 -1
  107. package/dist/sdk/actionability.js +3 -3
  108. package/dist/sdk/cli-contracts/command-aliases.js +11 -2
  109. package/dist/sdk/cli-contracts/completeness.js +4 -3
  110. package/dist/sdk/cli-contracts/flag-contracts.d.ts +2 -0
  111. package/dist/sdk/cli-contracts/flag-contracts.js +31 -5
  112. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +21 -13
  113. package/dist/sdk/cli-contracts/grammar-contracts.js +11 -2
  114. package/dist/sdk/cli-contracts/runtime-contracts.js +5 -2
  115. package/dist/sdk/cli-contracts/schemas/assurance-definition.d.ts +254 -5
  116. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +52 -2
  117. package/dist/sdk/cli-contracts/tool-parameter-tables.js +30 -6
  118. package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
  119. package/dist/sdk/cli-contracts/tool-schema.js +32 -7
  120. package/dist/sdk/context/usage-ledger.d.ts +41 -0
  121. package/dist/sdk/context/usage-ledger.js +186 -0
  122. package/dist/sdk/context-intent-contracts.js +3 -3
  123. package/dist/sdk/context-usage.d.ts +18 -9
  124. package/dist/sdk/context-usage.js +44 -121
  125. package/dist/sdk/define.d.ts +1 -1
  126. package/dist/sdk/define.js +2 -2
  127. package/dist/sdk/dependency-provenance.d.ts +7 -0
  128. package/dist/sdk/dependency-provenance.js +14 -4
  129. package/dist/sdk/duplicates.d.ts +2 -0
  130. package/dist/sdk/duplicates.js +3 -2
  131. package/dist/sdk/environment/host-environment-errors.d.ts +5 -27
  132. package/dist/sdk/environment/host-environment-errors.js +4 -137
  133. package/dist/sdk/extension/install-runtime.js +9 -6
  134. package/dist/sdk/extension/install-snapshot.js +7 -6
  135. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +104 -56
  136. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +50 -2
  137. package/dist/sdk/governance/assurance-action.d.ts +3 -2
  138. package/dist/sdk/governance/assurance-action.js +23 -11
  139. package/dist/sdk/governance/assurance-runtime.d.ts +2 -0
  140. package/dist/sdk/governance/assurance-runtime.js +6 -3
  141. package/dist/sdk/governance/defect-recurrence-coverage.d.ts +93 -0
  142. package/dist/sdk/governance/defect-recurrence-coverage.js +189 -0
  143. package/dist/sdk/governance/defect-recurrence-graph.d.ts +33 -0
  144. package/dist/sdk/governance/defect-recurrence-graph.js +121 -0
  145. package/dist/sdk/governance/defect-recurrence.d.ts +8 -0
  146. package/dist/sdk/governance/defect-recurrence.js +118 -17
  147. package/dist/sdk/governance/health.d.ts +17 -2
  148. package/dist/sdk/governance/health.js +31 -10
  149. package/dist/sdk/governance/linked-file-report.d.ts +41 -0
  150. package/dist/sdk/governance/linked-file-report.js +72 -0
  151. package/dist/sdk/governance/validate-history-drift.js +16 -5
  152. package/dist/sdk/governance/validate.d.ts +5 -2
  153. package/dist/sdk/governance/validate.js +21 -37
  154. package/dist/sdk/governance.d.ts +2 -0
  155. package/dist/sdk/governance.js +4 -2
  156. package/dist/sdk/guide-topics.js +116 -2
  157. package/dist/sdk/history/salvage.d.ts +35 -0
  158. package/dist/sdk/history/salvage.js +248 -0
  159. package/dist/sdk/history-compact.js +32 -37
  160. package/dist/sdk/history-read.d.ts +3 -2
  161. package/dist/sdk/history-read.js +6 -3
  162. package/dist/sdk/history-repair.d.ts +12 -0
  163. package/dist/sdk/history-repair.js +60 -13
  164. package/dist/sdk/lifecycle/claim.d.ts +4 -0
  165. package/dist/sdk/lifecycle/claim.js +9 -3
  166. package/dist/sdk/lifecycle/close.d.ts +8 -0
  167. package/dist/sdk/lifecycle/close.js +16 -8
  168. package/dist/sdk/lifecycle/create.js +9 -12
  169. package/dist/sdk/lifecycle/restore.d.ts +1 -0
  170. package/dist/sdk/lifecycle/restore.js +19 -7
  171. package/dist/sdk/lifecycle/update.js +12 -12
  172. package/dist/sdk/lifecycle-policy.d.ts +3 -0
  173. package/dist/sdk/lifecycle-policy.js +2 -2
  174. package/dist/sdk/merge/abandoned-receipts.d.ts +15 -0
  175. package/dist/sdk/merge/abandoned-receipts.js +47 -0
  176. package/dist/sdk/merge/driver.js +4 -2
  177. package/dist/sdk/merge/index.d.ts +1 -0
  178. package/dist/sdk/merge/index.js +2 -2
  179. package/dist/sdk/merge/receipt-operation.d.ts +15 -0
  180. package/dist/sdk/merge/receipt-operation.js +97 -0
  181. package/dist/sdk/merge/receipt-schema.d.ts +20 -0
  182. package/dist/sdk/merge/receipt-schema.js +398 -0
  183. package/dist/sdk/merge/receipts.d.ts +16 -7
  184. package/dist/sdk/merge/receipts.js +54 -340
  185. package/dist/sdk/merge/reconcile.d.ts +2 -0
  186. package/dist/sdk/merge/reconcile.js +11 -4
  187. package/dist/sdk/output-projection.d.ts +3 -1
  188. package/dist/sdk/output-projection.js +11 -3
  189. package/dist/sdk/public-surface.json +1 -0
  190. package/dist/sdk/query/context.d.ts +9 -0
  191. package/dist/sdk/query/context.js +33 -21
  192. package/dist/sdk/query/duplicate-candidates.d.ts +7 -0
  193. package/dist/sdk/query/duplicate-candidates.js +71 -0
  194. package/dist/sdk/query/get.d.ts +2 -2
  195. package/dist/sdk/query/get.js +9 -8
  196. package/dist/sdk/query/history.d.ts +11 -0
  197. package/dist/sdk/query/history.js +34 -10
  198. package/dist/sdk/query/next.d.ts +15 -1
  199. package/dist/sdk/query/next.js +43 -20
  200. package/dist/sdk/query.d.ts +3 -0
  201. package/dist/sdk/query.js +5 -2
  202. package/dist/sdk/read-output-session.js +5 -3
  203. package/dist/sdk/runtime-primitives.d.ts +1 -1
  204. package/dist/sdk/runtime-primitives.js +3 -3
  205. package/dist/sdk/runtime.js +4 -2
  206. package/dist/sdk/similarity.d.ts +24 -3
  207. package/dist/sdk/similarity.js +50 -55
  208. package/dist/types.d.ts +2 -0
  209. package/dist/types.js +2 -2
  210. package/docs/AGENT_GUIDE.md +58 -1
  211. package/docs/BOUNDED_CONTEXT_READS.md +185 -0
  212. package/docs/CLOSE_EVIDENCE_RECOVERY.md +35 -0
  213. package/docs/COMMANDS.md +30 -8
  214. package/docs/CONTEXT_RELEVANCE.md +16 -4
  215. package/docs/DEFECT_RECURRENCE.md +80 -6
  216. package/docs/EXTENSIONS.md +18 -19
  217. package/docs/HISTORY_RECOVERY.md +146 -0
  218. package/docs/MERGE_SAFETY.md +50 -0
  219. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +66 -0
  220. package/docs/PR_REVIEW_LOOP.md +18 -3
  221. package/docs/README.md +19 -1
  222. package/docs/RELEASING.md +31 -13
  223. package/docs/SDK_CONTEXT_TRUTH_CONTRACTS.md +24 -1
  224. package/docs/SDK_EXECUTION_CONTRACTS.md +105 -0
  225. package/docs/SDK_LIFECYCLE.md +27 -0
  226. package/docs/SDK_RUNTIME_BOUNDARIES.md +11 -0
  227. package/docs/TESTING.md +5 -0
  228. package/docs/agent-task-token-baseline.json +17 -17
  229. package/docs/agent-task-transcripts.json +2 -1
  230. package/docs/generated/FLAG_LEXICON_BUDGETS.md +11 -11
  231. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -3
  232. package/marketplace.json +2 -2
  233. package/package.json +8 -6
  234. package/packages/pm-beads/package.json +1 -1
  235. package/packages/pm-calendar/package.json +1 -1
  236. package/packages/pm-command-kit/package.json +1 -1
  237. package/packages/pm-digital-twin/package.json +1 -1
  238. package/packages/pm-governance-audit/README.md +10 -1
  239. package/packages/pm-governance-audit/extensions/governance-audit/dedupe-audit.ts +50 -65
  240. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +2 -2
  241. package/packages/pm-governance-audit/extensions/governance-audit/sdk.ts +1 -0
  242. package/packages/pm-governance-audit/package.json +1 -1
  243. package/packages/pm-guide-shell/package.json +1 -1
  244. package/packages/pm-kanban/package.json +1 -1
  245. package/packages/pm-lifecycle-hooks/package.json +1 -1
  246. package/packages/pm-linked-test-adapters/package.json +1 -1
  247. package/packages/pm-search-advanced/package.json +1 -1
  248. package/packages/pm-templates/package.json +1 -1
  249. package/packages/pm-todos/package.json +1 -1
  250. package/packages/pm-vcs/package.json +1 -1
  251. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  252. package/plugins/pm-claude/skills/pm-audit/SKILL.md +2 -2
  253. package/plugins/pm-claude/skills/pm-developer/SKILL.md +2 -2
  254. package/plugins/pm-claude/skills/pm-planner/SKILL.md +2 -2
  255. package/plugins/pm-claude/skills/pm-release/SKILL.md +2 -2
  256. package/plugins/pm-claude/skills/pm-workflow/SKILL.md +3 -3
  257. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  258. package/plugins/pm-codex/skills/pm-auditor/SKILL.md +2 -2
  259. package/plugins/pm-codex/skills/pm-native/SKILL.md +3 -4
  260. package/plugins/pm-codex/skills/pm-release/SKILL.md +2 -2
  261. package/scripts/finalize-build.mjs +13 -1
  262. package/dist/cli-bundle/chunks/chunk-6XSKPNCF.js +0 -230
  263. package/dist/cli-bundle/chunks/chunk-OGBVU67G.js +0 -5
  264. package/dist/cli-bundle/chunks/chunk-TXW6VL33.js +0 -38
  265. package/dist/cli-bundle/chunks/chunk-VGLHECAP.js +0 -9
  266. package/dist/cli-bundle/chunks/register-operations-OH7R3ZT4.js +0 -2
  267. package/dist/cli-bundle/focused-chunks/chunk-4YRAVI43.js +0 -12
  268. package/dist/cli-bundle/focused-chunks/chunk-5P4HVOWG.js +0 -176
  269. package/dist/cli-bundle/focused-chunks/chunk-636VVQ7F.js +0 -54
  270. package/dist/cli-bundle/focused-chunks/chunk-B3A6MJYE.js +0 -2
  271. package/dist/cli-bundle/focused-chunks/chunk-BFDDJ2T2.js +0 -2
  272. package/dist/cli-bundle/focused-chunks/chunk-BHUIRZWQ.js +0 -9
  273. package/dist/cli-bundle/focused-chunks/chunk-JADHHPY6.js +0 -6
  274. package/dist/cli-bundle/focused-chunks/chunk-NSKBLHVI.js +0 -20
  275. package/dist/cli-bundle/focused-chunks/chunk-P2GOAOQN.js +0 -2
  276. package/dist/cli-bundle/focused-chunks/chunk-YARWJM2B.js +0 -2
  277. package/sdk/public-surface.json +0 -33034
@@ -0,0 +1,105 @@
1
+ # SDK Execution and Recovery Contracts
2
+
3
+ Tracker references: [pm-08mt4k](../.agents/pm/issues/pm-08mt4k.toon),
4
+ [pm-ugld](../.agents/pm/issues/pm-ugld.toon),
5
+ [pm-2bqgs7](../.agents/pm/issues/pm-2bqgs7.toon),
6
+ [pm-u4t9gp](../.agents/pm/issues/pm-u4t9gp.toon), and
7
+ [pm-bfa1ob](../.agents/pm/issues/pm-bfa1ob.toon).
8
+
9
+ ## Declare Who Can Execute a Type
10
+
11
+ Custom settings definitions and package `defineItemType` definitions accept
12
+ `execution_role: "agent" | "human" | "gate"`. An omitted role defaults to agent
13
+ execution; built-in Decision and Milestone types default to human and gate,
14
+ respectively. A definition can override a built-in role. Aliases resolve through
15
+ the type registry, and invalid roles are rejected rather than silently enabling
16
+ execution.
17
+
18
+ Package authors can declare a review checkpoint alongside the rest of their item
19
+ type definition:
20
+
21
+ ```ts
22
+ import { defineItemType } from "@unbrained/pm-cli/sdk/authoring";
23
+
24
+ export const checkpoint = defineItemType({
25
+ name: "Checkpoint",
26
+ folder: "checkpoints",
27
+ aliases: ["checkpoint"],
28
+ execution_role: "gate",
29
+ });
30
+ ```
31
+
32
+ `computeActionabilityReport` is the pure SDK primitive: it accepts candidates,
33
+ the surrounding item corpus, a status registry, and an optional item type
34
+ registry. It resolves both forward `blocked_by` and reverse `blocks` edges,
35
+ terminal prerequisites, active descendants, and execution roles. Its result
36
+ contains ready leaves, blocked leaves, human decisions, gates, and containers.
37
+ `selectActionableEntries` applies explicit dispatch opt-ins to that report;
38
+ ownership and ranking remain the responsibility of the caller. The selector
39
+ returns `ready`, `decisions`, and `gates`: eligible opted-in containers enter
40
+ `ready`, subject to their execution role. Read `report.containers` for the full
41
+ classified container worklist; the selector does not return a separate
42
+ `containers` property.
43
+
44
+ Integrations that construct an `ActionabilityReport` themselves must now provide
45
+ the `containers`, `decisions`, and `gates` arrays. Prefer computing the report
46
+ through the SDK so these classifications stay consistent with dependency and
47
+ schema rules. Existing callers may omit the new selection options and type
48
+ registry argument.
49
+
50
+ ## Read Every Scheduling Bucket
51
+
52
+ `pm next` exposes `ready`, `decision_needed`, `gate_needed`, `containers`,
53
+ `blocked`, and `held_by_others`. Summary counts describe the full matching
54
+ buckets; each bounded worklist has truncation totals when needed. The row
55
+ contract advertises the new gate and container collections to generic consumers.
56
+ Intent budgets compact these worklists along with the other scheduling rows.
57
+ Final-delivery feedback records their visible identifiers so recursive context
58
+ improvement observes what the caller actually received.
59
+ A workspace containing only outcome gates returns no recommendation and explains
60
+ how to inspect or explicitly include gates.
61
+
62
+ `--include-decisions`, `--include-gates`, and `--include-containers` opt into
63
+ held-out work for both `next` and `claim --next`. The SDK and MCP use
64
+ `includeDecisions`, `includeGates`, and `includeContainers`. These options do not
65
+ bypass unresolved blockers, blocked lifecycle states, or ownership checks.
66
+ Context places gates, human work, and containers in high-level context rather
67
+ than agent execution detail. Population summaries retain all matching work.
68
+
69
+ ## Stop Work Explicitly
70
+
71
+ `release` relinquishes ownership and preserves status. When an in-progress item
72
+ is released (using the configured workflow status), its result includes `released_unclaimed_in_progress` and a concrete
73
+ `pm pause-task <id>` suggestion. Use `pause-task` when the intended operation is
74
+ to stop work and return it to the configured open state. Consumers should not
75
+ interpret an ownership release as evidence that work has stopped.
76
+
77
+ ## Recover from Command Mistakes
78
+
79
+ Unknown commands direct the caller to `pm --help --all`, the complete core
80
+ command surface. `pm tests <id>` is an executable alias of `pm test <id>`.
81
+ Positional item operands are accepted in help requests, including hybrid
82
+ commands such as `pm files <id> --help --json`; invalid child command names still
83
+ produce usage errors.
84
+
85
+ With `--token-accounting`, JSON refusals carry the same serialized-output
86
+ accounting used by successful commands. Accounting is attached after diagnostic
87
+ projection and recalculated if extension failures enrich the refusal. The
88
+ receipt measures the emitted diagnostic, including its own receipt overhead.
89
+ Recovery metadata retains the actual invocation, including the accounting flag.
90
+ The executable transcript gate predicts that transport change independently and
91
+ rejects any other payload drift. It also verifies that the accounting-off
92
+ attempted command agrees with its normalized arguments before projection.
93
+ Detailed recovery evidence must contain argument and provided-field arrays.
94
+ Compact recovery is accepted only when the transcript explicitly declares and
95
+ verifies that mode; its advertised retry still executes as a separate step.
96
+ Serialized JSON refusals use the SDK `writeStderr` transport primitive so an
97
+ `error_format` text override cannot replace a measured machine payload.
98
+ Human-readable error formatting remains customizable through `error_format`.
99
+
100
+ The flag-invocation gate compares registered executable options against SDK
101
+ contracts without filtering out undeclared observations. An option missing from
102
+ the contract and a root command missing a resolver both fail the gate. A seeded
103
+ undeclared option is a mandatory negative control. Contract snapshots, MCP
104
+ parameter declarations, help, and completion are regenerated from the shared
105
+ contract tables.
@@ -39,6 +39,33 @@ Package authors can import these operations from `@unbrained/pm-cli/sdk`
39
39
  without importing CLI modules or spawning the executable. Existing CLI import
40
40
  paths remain source-compatible while integrations migrate.
41
41
 
42
+ ## Relationship Identity
43
+
44
+ Tracked by [pm-olcoon](../.agents/pm/issues/pm-olcoon.toon).
45
+
46
+ `normalizeItemReference(reference, prefix, sourceKind?)` is the shared public
47
+ SDK primitive for parent and dependency identities. Local shorthand, optional
48
+ leading `#`, and case variants normalize to the workspace's canonical prefix.
49
+ Explicit URL or provider locators (`github:`, `gitlab:`, `jira:`, `linear:`)
50
+ retain their spelling and case; externally sourced dependency IDs do too.
51
+ Only surrounding whitespace is trimmed from remote identities.
52
+
53
+ Create, update, and plan materialization persist the canonical local parent,
54
+ so lookup success cannot leave an unresolved shorthand in the stored graph.
55
+ Explicit remote parents remain external references without a local
56
+ missing-parent warning. Local missing parents still follow workspace policy,
57
+ and self-parent and hierarchy-cycle checks remain enforced. A foreign-looking
58
+ bare string is treated as local unless external provenance is supplied; the
59
+ SDK does not guess a remote workspace from punctuation.
60
+
61
+ ```ts
62
+ import { normalizeItemReference } from "@unbrained/pm-cli/sdk";
63
+
64
+ normalizeItemReference("#ABC", "team-"); // team-abc
65
+ normalizeItemReference("github:Org/Repo#42", "team-"); // unchanged
66
+ normalizeItemReference("OTHER-Case", "team-", "external"); // unchanged
67
+ ```
68
+
42
69
  ## Reason Contract
43
70
 
44
71
  `resolveTerminalReason` is the pure precedence primitive. It chooses the first
@@ -72,6 +72,17 @@ exceeds temporary-filesystem capacity fails with a stable recovery contract,
72
72
  while linked tests whose effective context is schema avoid materializing
73
73
  tracker data at all.
74
74
 
75
+ Package installation applies the same boundary to `extension_install_copy`,
76
+ `extension_install_backup`, `extension_install_rollback`, and
77
+ `extension_module_graph_snapshot`. These fixed operation labels identify the
78
+ failed stage without exposing source, destination, backup, or temporary paths.
79
+ Capacity and permission faults are not transient copy races and are not retried;
80
+ existing bounded retries for concurrent filesystem changes remain available.
81
+ The shared implementation lives under `core/fs`, while the public SDK exports
82
+ remain stable for package authors. This coverage does not imply that every
83
+ filesystem operation in the repository has adopted the boundary; the complete
84
+ migration and recurrence-gate obligation remains tracked in `pm-3lhth4`.
85
+
75
86
  Existing SDK surfaces can supply category-specific `codes` to preserve their
76
87
  published error vocabulary while still sharing classification, path redaction,
77
88
  and recovery guidance. Workspace snapshots use this compatibility path for
package/docs/TESTING.md CHANGED
@@ -146,6 +146,11 @@ boilerplate summaries are rejected.
146
146
 
147
147
  ## TOON Storage Round-Trip Gate
148
148
 
149
+ History-only lifecycle reconstruction and recovery contracts are described in
150
+ [History durability and recovery](HISTORY_RECOVERY.md). Their integration suite
151
+ is part of the required all-source test run and compares historical projections
152
+ against independently captured item files, including after removing those files.
153
+
149
154
  TOON item serialization is a fail-closed storage boundary. Before returning
150
155
  bytes to any create, update, merge, migration, or package caller, pm decodes the
151
156
  new `@toon-format/toon` output and compares it with the JSON-like canonical
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 4,
3
3
  "transcript_version": 2,
4
- "transcript_digest": "sha256:4f9e96bb6ce12bbbeb2514e4bd5958d201c4e62e95083bcbebd749d1e48cc82d",
4
+ "transcript_digest": "sha256:b8a6aea318c41e6a40dbcaf8094da8397ca747515a7df249d35c1f21ad94a307",
5
5
  "estimator": "ceil(utf8_bytes / 4)",
6
6
  "measurement_scope": "output_before_token_accounting",
7
7
  "published_with_release": true,
@@ -12,12 +12,12 @@
12
12
  "active_ownership",
13
13
  "workspace_state"
14
14
  ],
15
- "measured_winner_tokens": 1055,
15
+ "measured_winner_tokens": 1102,
16
16
  "protocols": [
17
17
  {
18
18
  "task_id": "orientation-context-intent",
19
19
  "command_count": 1,
20
- "estimated_tokens": 1055,
20
+ "estimated_tokens": 1102,
21
21
  "capabilities": [
22
22
  "actionable_work",
23
23
  "active_ownership",
@@ -47,7 +47,7 @@
47
47
  {
48
48
  "task_id": "orientation-operating-rules",
49
49
  "command_count": 4,
50
- "estimated_tokens": 2293,
50
+ "estimated_tokens": 2340,
51
51
  "capabilities": [
52
52
  "actionable_work",
53
53
  "active_ownership",
@@ -77,7 +77,7 @@
77
77
  {
78
78
  "task_id": "orientation-contracts-next",
79
79
  "command_count": 2,
80
- "estimated_tokens": 4798,
80
+ "estimated_tokens": 4829,
81
81
  "capabilities": [
82
82
  "actionable_work",
83
83
  "active_ownership",
@@ -109,18 +109,18 @@
109
109
  "tasks": [
110
110
  {
111
111
  "id": "orientation-context-intent",
112
- "max_estimated_tokens": 1055,
112
+ "max_estimated_tokens": 1102,
113
113
  "steps": [
114
114
  {
115
115
  "id": "context",
116
- "max_estimated_tokens": 1055,
116
+ "max_estimated_tokens": 1102,
117
117
  "accounting_mode": "self_reported"
118
118
  }
119
119
  ]
120
120
  },
121
121
  {
122
122
  "id": "orientation-contracts-next",
123
- "max_estimated_tokens": 4798,
123
+ "max_estimated_tokens": 4829,
124
124
  "steps": [
125
125
  {
126
126
  "id": "contracts",
@@ -129,18 +129,18 @@
129
129
  },
130
130
  {
131
131
  "id": "next",
132
- "max_estimated_tokens": 687,
132
+ "max_estimated_tokens": 718,
133
133
  "accounting_mode": "self_reported"
134
134
  }
135
135
  ]
136
136
  },
137
137
  {
138
138
  "id": "orientation-operating-rules",
139
- "max_estimated_tokens": 2293,
139
+ "max_estimated_tokens": 2340,
140
140
  "steps": [
141
141
  {
142
142
  "id": "context",
143
- "max_estimated_tokens": 1055,
143
+ "max_estimated_tokens": 1102,
144
144
  "accounting_mode": "self_reported"
145
145
  },
146
146
  {
@@ -162,7 +162,7 @@
162
162
  },
163
163
  {
164
164
  "id": "context-bootstrap",
165
- "max_estimated_tokens": 1978,
165
+ "max_estimated_tokens": 2025,
166
166
  "steps": [
167
167
  {
168
168
  "id": "triage",
@@ -171,7 +171,7 @@
171
171
  },
172
172
  {
173
173
  "id": "orient",
174
- "max_estimated_tokens": 1055,
174
+ "max_estimated_tokens": 1102,
175
175
  "accounting_mode": "self_reported"
176
176
  },
177
177
  {
@@ -199,12 +199,12 @@
199
199
  },
200
200
  {
201
201
  "id": "unknown-option-recovery",
202
- "max_estimated_tokens": 585,
202
+ "max_estimated_tokens": 603,
203
203
  "steps": [
204
204
  {
205
205
  "id": "refuse-option",
206
- "max_estimated_tokens": 422,
207
- "accounting_mode": "independent_transport"
206
+ "max_estimated_tokens": 440,
207
+ "accounting_mode": "self_reported"
208
208
  },
209
209
  {
210
210
  "id": "retry-option",
@@ -261,5 +261,5 @@
261
261
  ]
262
262
  }
263
263
  ],
264
- "composite_max_estimated_tokens": 12477
264
+ "composite_max_estimated_tokens": 12667
265
265
  }
@@ -186,6 +186,7 @@
186
186
  "expected_accounting_mode": "self_reported",
187
187
  "required_fields": ["code", "refusal", "recovery"],
188
188
  "expected_error_code": "unknown_context_intent",
189
+ "expected_field_values": { "recovery.recovery_mode": "compact" },
189
190
  "expected_refusal_surface": "--for"
190
191
  },
191
192
  {
@@ -216,7 +217,7 @@
216
217
  ],
217
218
  "expected_exit_code": 2,
218
219
  "expected_output_kind": "refusal",
219
- "expected_accounting_mode": "independent_transport",
220
+ "expected_accounting_mode": "self_reported",
220
221
  "required_fields": ["code", "refusal", "recovery"],
221
222
  "expected_error_code": "unknown_option",
222
223
  "expected_refusal_surface": "--include-body"
@@ -5,7 +5,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
5
5
  | Command | Capability family | Canonical flags | Maximum |
6
6
  | --- | --- | ---: | ---: |
7
7
  | `init` | workspace | 30 | 30 |
8
- | `config` | workspace | 35 | 35 |
8
+ | `config` | workspace | 36 | 36 |
9
9
  | `extension` | extensions | 53 | 53 |
10
10
  | `package` | extensions | 54 | 54 |
11
11
  | `packages` | extensions | 54 | 54 |
@@ -15,7 +15,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
15
15
  | `copy` | intake | 24 | 24 |
16
16
  | `focus` | intake | 22 | 22 |
17
17
  | `list` | context | 86 | 86 |
18
- | `list-all` | context | 85 | 85 |
18
+ | `list-all` | context | 86 | 86 |
19
19
  | `list-draft` | context | 84 | 84 |
20
20
  | `list-open` | context | 84 | 84 |
21
21
  | `list-in-progress` | context | 84 | 84 |
@@ -28,34 +28,34 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
28
28
  | `get` | context | 30 | 30 |
29
29
  | `graph` | graph | 34 | 34 |
30
30
  | `search` | context | 78 | 78 |
31
- | `duplicates` | context | 24 | 24 |
31
+ | `duplicates` | context | 25 | 25 |
32
32
  | `eval` | context | 25 | 25 |
33
- | `next` | context | 35 | 35 |
33
+ | `next` | context | 38 | 38 |
34
34
  | `history` | evidence | 35 | 35 |
35
35
  | `events` | evidence | 33 | 33 |
36
36
  | `history-redact` | evidence | 27 | 27 |
37
- | `history-repair` | evidence | 26 | 26 |
37
+ | `history-repair` | evidence | 27 | 27 |
38
38
  | `history-compact` | evidence | 30 | 30 |
39
39
  | `history-author-acknowledge` | evidence | 28 | 28 |
40
- | `merge` | workspace | 24 | 24 |
40
+ | `merge` | workspace | 27 | 27 |
41
41
  | `schema` | workspace | 40 | 40 |
42
42
  | `profile` | workspace | 22 | 22 |
43
43
  | `activity` | context | 35 | 35 |
44
44
  | `restore` | intake | 23 | 23 |
45
45
  | `update` | lifecycle | 105 | 105 |
46
- | `update-many` | lifecycle | 140 | 140 |
46
+ | `update-many` | lifecycle | 146 | 146 |
47
47
  | `close` | lifecycle | 31 | 31 |
48
48
  | `close-many` | lifecycle | 72 | 72 |
49
49
  | `delete` | lifecycle | 24 | 24 |
50
- | `append` | evidence | 24 | 24 |
50
+ | `append` | evidence | 25 | 25 |
51
51
  | `comments` | evidence | 31 | 31 |
52
52
  | `notes` | evidence | 35 | 35 |
53
- | `learnings` | evidence | 27 | 27 |
53
+ | `learnings` | evidence | 31 | 31 |
54
54
  | `files` | evidence | 39 | 39 |
55
55
  | `docs` | evidence | 30 | 30 |
56
56
  | `deps` | graph | 32 | 32 |
57
57
  | `plan` | graph | 109 | 109 |
58
- | `test` | quality | 52 | 52 |
58
+ | `test` | quality | 53 | 53 |
59
59
  | `test-all` | quality | 40 | 40 |
60
60
  | `telemetry` | workspace | 21 | 21 |
61
61
  | `stats` | context | 29 | 29 |
@@ -65,7 +65,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
65
65
  | `gc` | workspace | 22 | 22 |
66
66
  | `workspace` | workspace | 23 | 23 |
67
67
  | `contracts` | quality | 29 | 29 |
68
- | `claim` | lifecycle | 36 | 36 |
68
+ | `claim` | lifecycle | 38 | 38 |
69
69
  | `release` | lifecycle | 23 | 23 |
70
70
  | `start-task` | lifecycle | 23 | 23 |
71
71
  | `pause-task` | lifecycle | 23 | 23 |
@@ -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: 357
7
+ - Catalog error codes: 365
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: 338
12
- - Coverage fraction: 0.053221
11
+ - Uncovered error codes: 346
12
+ - Coverage fraction: 0.052055
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 94
15
15
 
@@ -111,17 +111,23 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
111
111
  | `history_author_acknowledge_selector_required` | `history_author_acknowledge_selector_required` | uncovered | none | 0 |
112
112
  | `history_author_acknowledge_target_not_actionable` | `history_author_acknowledge_target_not_actionable` | uncovered | none | 0 |
113
113
  | `history_author_acknowledge_target_unreadable` | `history_author_acknowledge_target_unreadable` | uncovered | none | 0 |
114
+ | `history_baseline_unavailable` | `history_baseline_unavailable` | uncovered | none | 0 |
114
115
  | `history_drift_chain_mismatch` | `history_drift_chain_mismatch` | uncovered | none | 0 |
115
116
  | `history_drift_hash_mismatch` | `history_drift_hash_mismatch` | uncovered | none | 0 |
116
117
  | `history_drift_merge_receipt` | `history_drift_merge_receipt` | uncovered | none | 0 |
117
118
  | `history_drift_missing_stream` | `history_drift_missing_stream` | uncovered | none | 0 |
118
119
  | `history_drift_unreadable_stream` | `history_drift_unreadable_stream` | uncovered | none | 0 |
119
120
  | `history_drift_version_skew` | `history_drift_version_skew` | uncovered | none | 0 |
121
+ | `history_json_invalid` | `history_json_invalid` | uncovered | none | 0 |
120
122
  | `history_merge_conflict_markers_detected` | `merge_conflict_markers_detected` | uncovered | none | 0 |
123
+ | `history_replay_invalid` | `history_replay_invalid` | uncovered | none | 0 |
124
+ | `history_salvage_refused` | `history_salvage_refused` | uncovered | none | 0 |
121
125
  | `history_stream_over_compact_threshold` | `history_stream_over_compact_threshold` | uncovered | none | 0 |
122
126
  | `history_target_out_of_range` | `history_target_out_of_range` | uncovered | none | 0 |
123
127
  | `history_timestamp_invalid` | `history_timestamp_invalid` | uncovered | none | 0 |
124
128
  | `history_unknown_author_events` | `history_unknown_author_events` | uncovered | none | 0 |
129
+ | `history_version_mapping_unavailable` | `history_version_mapping_unavailable` | uncovered | none | 0 |
130
+ | `history_version_pruned` | `history_version_pruned` | uncovered | none | 0 |
125
131
  | `host_environment_capacity_fault` | `host_environment_capacity_fault` | uncovered | none | 0 |
126
132
  | `host_environment_operation_invalid` | `host_environment_operation_invalid` | uncovered | none | 0 |
127
133
  | `host_environment_permission_fault` | `host_environment_permission_fault` | uncovered | none | 0 |
@@ -163,9 +169,11 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
163
169
  | `invalid_reproducible_process_environment` | `invalid_reproducible_process_environment` | uncovered | none | 0 |
164
170
  | `invalid_workspace_snapshot_target` | `invalid_workspace_snapshot_target` | uncovered | none | 0 |
165
171
  | `item_already_active` | `item_already_active` | uncovered | none | 0 |
172
+ | `item_document_encoding_invalid` | `item_document_encoding_invalid` | uncovered | none | 0 |
166
173
  | `item_document_invalid` | `item_document_invalid` | uncovered | none | 0 |
167
174
  | `item_document_roundtrip_failed` | `item_document_roundtrip_failed` | uncovered | none | 0 |
168
175
  | `item_id_collision` | `item_id_collision` | uncovered | none | 0 |
176
+ | `item_identity_reserved` | `item_identity_reserved` | uncovered | none | 0 |
169
177
  | `item_not_found` | `item_not_found` | uncovered | none | 0 |
170
178
  | `likely_duplicate` | `likely_duplicate` | uncovered | none | 0 |
171
179
  | `linked_artifact_mutation_conflict` | `linked_artifact_mutation_conflict` | 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.9.4"
9
+ "version": "2026.9.6"
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.9.4",
16
+ "version": "2026.9.6",
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.9.4",
3
+ "version": "2026.9.6",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -76,7 +76,7 @@
76
76
  "import": "./dist/cli-bundle/sdk-testing.js",
77
77
  "default": "./dist/cli-bundle/sdk-testing.js"
78
78
  },
79
- "./sdk/public-surface.json": "./sdk/public-surface.json",
79
+ "./sdk/public-surface.json": "./dist/sdk/public-surface.json",
80
80
  "./cli": {
81
81
  "types": "./dist/cli/public.d.ts",
82
82
  "import": "./dist/cli/public.js",
@@ -95,7 +95,6 @@
95
95
  "LICENSE",
96
96
  "AGENTS.md",
97
97
  "docs/**",
98
- "sdk/public-surface.json",
99
98
  ".claude-plugin/**",
100
99
  "plugins/**",
101
100
  "packages/pm-*/**",
@@ -225,12 +224,15 @@
225
224
  "@types/npm-package-arg": "^6.1.4",
226
225
  "@vitest/coverage-v8": "^4.1.11",
227
226
  "esbuild": "0.28.2",
228
- "eslint": "^10.9.1",
227
+ "eslint": "^10.10.0",
229
228
  "eslint-plugin-sonarjs": "^4.2.0",
230
229
  "eslint-plugin-unicorn": "74.0.0",
231
230
  "fast-check": "^4.9.0",
232
- "greptile": "^3.4.2",
233
- "jscpd": "^5.1.1",
231
+ "github-slugger": "2.0.0",
232
+ "greptile": "^3.5.2",
233
+ "jscpd": "^5.1.2",
234
+ "marked": "18.0.11",
235
+ "parse5": "8.0.1",
234
236
  "tsx": "^4.23.13",
235
237
  "typescript": "^6.0.3",
236
238
  "typescript-eslint": "^8.69.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.4",
3
+ "version": "2026.9.6",
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.9.4",
3
+ "version": "2026.9.6",
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.9.4",
3
+ "version": "2026.9.6",
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.9.4",
3
+ "version": "2026.9.6",
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.",
@@ -67,7 +67,16 @@ pm normalize --dry-run --json
67
67
  ```
68
68
 
69
69
  `dedupe-audit --status all` explicitly selects every status and is equivalent
70
- to omitting the filter. For `comments-audit`, `--limit-items` caps item
70
+ to omitting the filter. The receipt retains `filters.status: "all"` for an
71
+ explicit all-status request. Configured status aliases and comma-separated OR
72
+ filters use the host SDK parser; combining `all` with another status or using
73
+ an unknown status fails. `--limit` caps returned clusters after the complete
74
+ matching item population is scanned, and unreadable source items fail the read.
75
+ Workflow terminality is captured per invocation so concurrent SDK calls cannot
76
+ exchange workspace policy. These contracts are tracked by
77
+ [pm-449do9](../../.agents/pm/issues/pm-449do9.toon).
78
+
79
+ For `comments-audit`, `--limit-items` caps item
71
80
  scanning while `--limit-rows` caps emitted comment rows across the whole
72
81
  result. The older `--limit` spelling remains a deprecated alias for
73
82
  `--limit-rows`; do not combine the two row-limit spellings.