@unbrained/pm-cli 2026.11.4 → 2026.11.5

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 (219) hide show
  1. package/.agents/skills/HARNESS_COMPATIBILITY.md +1 -1
  2. package/.agents/skills/README.md +14 -14
  3. package/.agents/skills/pm-developer/SKILL.md +16 -16
  4. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +14 -14
  5. package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +10 -10
  6. package/.agents/skills/pm-extensions/SKILL.md +13 -13
  7. package/.agents/skills/pm-extensions/references/AUTHORING.md +12 -12
  8. package/.agents/skills/pm-sdk/SKILL.md +27 -27
  9. package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +32 -32
  10. package/.agents/skills/pm-test-audit/references/AUDIT.md +1 -1
  11. package/.agents/skills/pm-user/SKILL.md +35 -35
  12. package/.claude-plugin/marketplace.json +1 -1
  13. package/AGENTS.md +9 -9
  14. package/CHANGELOG.md +9 -0
  15. package/README.md +13 -13
  16. package/dist/cli/register-setup.js +1 -1
  17. package/dist/cli-bundle/bundle-manifest.json +1 -1
  18. package/dist/cli-bundle/chunks/chunk-2RPORE7M.js +31 -0
  19. package/dist/cli-bundle/chunks/{chunk-NPEDFOVQ.js → chunk-335BZ75D.js} +2 -2
  20. package/dist/cli-bundle/chunks/chunk-5GWEY4P6.js +122 -0
  21. package/dist/cli-bundle/chunks/chunk-6VRX2CM7.js +2 -0
  22. package/dist/cli-bundle/chunks/{chunk-7PGNAHNW.js → chunk-7DEKAXVA.js} +2 -2
  23. package/dist/cli-bundle/chunks/{chunk-3OXQGGRD.js → chunk-7ZRCYESH.js} +42 -41
  24. package/dist/cli-bundle/chunks/{chunk-BWAXA6S4.js → chunk-AUEKTX7V.js} +2 -2
  25. package/dist/cli-bundle/chunks/{chunk-SRDO2NJU.js → chunk-D7KYPRK4.js} +2 -2
  26. package/dist/cli-bundle/chunks/{chunk-ODMJ3HIB.js → chunk-DAX3AOFI.js} +2 -2
  27. package/dist/cli-bundle/chunks/{chunk-L4BKTPJ6.js → chunk-F6NDMKZ4.js} +2 -2
  28. package/dist/cli-bundle/chunks/{chunk-T56MB6SF.js → chunk-FRNMQM45.js} +2 -2
  29. package/dist/cli-bundle/chunks/{chunk-5S6RT5LX.js → chunk-HNGLDMSZ.js} +3 -3
  30. package/dist/cli-bundle/chunks/{chunk-QN7VCOUU.js → chunk-HRCMORE7.js} +2 -2
  31. package/dist/cli-bundle/chunks/{chunk-BK2XAQVC.js → chunk-HRFGFIYU.js} +2 -2
  32. package/dist/cli-bundle/chunks/{chunk-CERNIZLB.js → chunk-JI2GDE4I.js} +42 -42
  33. package/dist/cli-bundle/chunks/{chunk-6T2V3UIK.js → chunk-LS3GI3H4.js} +53 -53
  34. package/dist/cli-bundle/chunks/chunk-OH6WQ7VT.js +3 -0
  35. package/dist/cli-bundle/chunks/{chunk-BRIPGUAO.js → chunk-OJDMJT7Y.js} +2 -2
  36. package/dist/cli-bundle/chunks/{chunk-7RCI7AAA.js → chunk-S4LPZ4TN.js} +2 -2
  37. package/dist/cli-bundle/chunks/{chunk-AQ5UHHQS.js → chunk-UEGXWXUZ.js} +2 -2
  38. package/dist/cli-bundle/chunks/{chunk-5BVZ32G7.js → chunk-XLSHFYXZ.js} +2 -2
  39. package/dist/cli-bundle/chunks/{chunk-2GW662DP.js → chunk-YKXATU2G.js} +2 -2
  40. package/dist/cli-bundle/chunks/{item-revision-UAZOBP2Q.js → item-revision-OJJVPQY7.js} +2 -2
  41. package/dist/cli-bundle/chunks/item-transaction-QEPBUCMY.js +2 -0
  42. package/dist/cli-bundle/chunks/{mutation-admission-QZQI2NN5.js → mutation-admission-INMM3HHG.js} +2 -2
  43. package/dist/cli-bundle/chunks/{register-list-query-P3NOKQUA.js → register-list-query-5Y5JKWU5.js} +2 -2
  44. package/dist/cli-bundle/chunks/{register-mutation-A6I5K5N6.js → register-mutation-WC7OSQID.js} +2 -2
  45. package/dist/cli-bundle/chunks/{register-operations-SPKB3TNM.js → register-operations-PO63DBZH.js} +2 -2
  46. package/dist/cli-bundle/chunks/register-setup-RRFOS7IT.js +2 -0
  47. package/dist/cli-bundle/chunks/{stage-L3T725DS.js → stage-E3MMV4TV.js} +2 -2
  48. package/dist/cli-bundle/focused-chunks/chunk-5PMJOJCZ.js +44 -0
  49. package/dist/cli-bundle/focused-chunks/{chunk-TFYTTDAK.js → chunk-7KK66ISG.js} +2 -2
  50. package/dist/cli-bundle/focused-chunks/{chunk-Y5GOUUYJ.js → chunk-AHWJPZSJ.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/{chunk-C7UX2ZI3.js → chunk-C6P6HPCX.js} +2 -2
  52. package/dist/cli-bundle/focused-chunks/{chunk-Q4OIRSKL.js → chunk-CPMSL4HS.js} +2 -2
  53. package/dist/cli-bundle/focused-chunks/chunk-CZM75DE3.js +2 -0
  54. package/dist/cli-bundle/focused-chunks/{chunk-CO2DNPH7.js → chunk-D2TBEBNW.js} +2 -2
  55. package/dist/cli-bundle/focused-chunks/chunk-E56OXRYH.js +2 -0
  56. package/dist/cli-bundle/focused-chunks/{chunk-FXFDVM5O.js → chunk-F62XGAAY.js} +2 -2
  57. package/dist/cli-bundle/focused-chunks/chunk-G4QP365K.js +2 -0
  58. package/dist/cli-bundle/focused-chunks/{chunk-J7M52SCZ.js → chunk-G5PJCR7R.js} +2 -2
  59. package/dist/cli-bundle/focused-chunks/chunk-GS3JC5UU.js +23 -0
  60. package/dist/cli-bundle/focused-chunks/{chunk-W3CSX6GI.js → chunk-LW64TINU.js} +2 -2
  61. package/dist/cli-bundle/focused-chunks/{chunk-MEJKELWC.js → chunk-M6V7UMWL.js} +3 -3
  62. package/dist/cli-bundle/focused-chunks/{chunk-CXTDEQ3N.js → chunk-MC7IE7D7.js} +2 -2
  63. package/dist/cli-bundle/focused-chunks/chunk-MG7C3JUY.js +2 -0
  64. package/dist/cli-bundle/focused-chunks/{chunk-QEVJ3Y67.js → chunk-MK4HV4JO.js} +2 -2
  65. package/dist/cli-bundle/focused-chunks/{chunk-A2246ZM7.js → chunk-NQ7GYFOX.js} +54 -54
  66. package/dist/cli-bundle/focused-chunks/chunk-O7EI33NP.js +91 -0
  67. package/dist/cli-bundle/focused-chunks/{chunk-FFO7RBLN.js → chunk-RFTJZ5VB.js} +2 -2
  68. package/dist/cli-bundle/focused-chunks/{chunk-PNPYQDHU.js → chunk-SNOXXRSJ.js} +2 -2
  69. package/dist/cli-bundle/focused-chunks/{chunk-JQS7TYQ6.js → chunk-UPJUTP2V.js} +2 -2
  70. package/dist/cli-bundle/focused-chunks/{chunk-SDLIUZEL.js → chunk-VWWTIX5L.js} +2 -2
  71. package/dist/cli-bundle/focused-chunks/{chunk-J6FDCAMH.js → chunk-XHOBYCVE.js} +2 -2
  72. package/dist/cli-bundle/focused-chunks/{chunk-J3YOATXR.js → chunk-YMGB2O4E.js} +25 -24
  73. package/dist/cli-bundle/focused-chunks/{item-revision-L6GVT42D.js → item-revision-CTDO4H3I.js} +2 -2
  74. package/dist/cli-bundle/focused-chunks/{item-transaction-GYGP264N.js → item-transaction-AEAYVVHA.js} +2 -2
  75. package/dist/cli-bundle/focused-chunks/{mutation-admission-UWTH56OD.js → mutation-admission-4WM7TNHZ.js} +2 -2
  76. package/dist/cli-bundle/focused-chunks/{stage-WRSNJ7VI.js → stage-WV7QXR4C.js} +2 -2
  77. package/dist/cli-bundle/main.js +2 -2
  78. package/dist/cli-bundle/sdk-authoring.js +1 -1
  79. package/dist/cli-bundle/sdk-contracts.js +1 -1
  80. package/dist/cli-bundle/sdk-core.js +1 -1
  81. package/dist/cli-bundle/sdk-governance.js +1 -1
  82. package/dist/cli-bundle/sdk-graph.js +1 -1
  83. package/dist/cli-bundle/sdk-merge.js +57 -57
  84. package/dist/cli-bundle/sdk-query.js +1 -1
  85. package/dist/cli-bundle/sdk-runtime.js +1 -1
  86. package/dist/cli-bundle/sdk-testing.js +1 -1
  87. package/dist/cli-bundle/sdk.js +9 -9
  88. package/dist/core/config/positional-value.d.ts +6 -0
  89. package/dist/core/config/positional-value.js +1 -1
  90. package/dist/core/item/literal-mutation-input.d.ts +17 -0
  91. package/dist/core/item/literal-mutation-input.js +1 -1
  92. package/dist/core/item/parent-reference-policy.d.ts +8 -4
  93. package/dist/core/item/parent-reference-policy.js +1 -1
  94. package/dist/core/item/sprint-release-format.d.ts +2 -1
  95. package/dist/core/item/sprint-release-format.js +1 -1
  96. package/dist/core/output/mutation-projection.js +1 -1
  97. package/dist/core/store/item-mutation-precondition.d.ts +3 -1
  98. package/dist/core/store/item-mutation-precondition.js +1 -1
  99. package/dist/core/store/item-store.js +1 -1
  100. package/dist/core/store/settings.d.ts +14 -0
  101. package/dist/core/store/settings.js +5 -4
  102. package/dist/core/telemetry/policy.d.ts +27 -1
  103. package/dist/core/telemetry/policy.js +1 -1
  104. package/dist/core/telemetry/runtime.d.ts +18 -7
  105. package/dist/core/telemetry/runtime.js +4 -4
  106. package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +8 -5
  107. package/dist/sdk/cli-contracts.d.ts +1 -1
  108. package/dist/sdk/cli-contracts.js +1 -1
  109. package/dist/sdk/config.d.ts +2 -2
  110. package/dist/sdk/config.js +1 -1
  111. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  112. package/dist/sdk/governance/health.d.ts +2 -2
  113. package/dist/sdk/governance/health.js +2 -2
  114. package/dist/sdk/index.d.ts +4 -2
  115. package/dist/sdk/index.js +1 -1
  116. package/dist/sdk/init.d.ts +4 -4
  117. package/dist/sdk/init.js +8 -8
  118. package/dist/sdk/lifecycle/claim.d.ts +4 -0
  119. package/dist/sdk/lifecycle/claim.js +1 -1
  120. package/dist/sdk/lifecycle/close.d.ts +10 -0
  121. package/dist/sdk/lifecycle/close.js +1 -1
  122. package/dist/sdk/lifecycle/create.d.ts +7 -5
  123. package/dist/sdk/lifecycle/create.js +1 -1
  124. package/dist/sdk/lifecycle/shared-unset-fields.d.ts +628 -4
  125. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
  126. package/dist/sdk/lifecycle/update.d.ts +5 -4
  127. package/dist/sdk/lifecycle/update.js +2 -2
  128. package/dist/sdk/public-surface.json +1 -1
  129. package/dist/sdk/runtime/actions.js +1 -1
  130. package/dist/sdk/runtime/mutation-value-validation.js +1 -1
  131. package/dist/sdk/runtime-input.js +1 -1
  132. package/dist/sdk/runtime-primitives.d.ts +1 -0
  133. package/dist/sdk/runtime-primitives.js +1 -1
  134. package/dist/sdk/telemetry.d.ts +1 -1
  135. package/dist/sdk/telemetry.js +2 -2
  136. package/docs/AGENT_GUIDE.md +48 -48
  137. package/docs/AGENT_OUTPUT_ENCODINGS.md +20 -20
  138. package/docs/ASSURANCE.md +10 -10
  139. package/docs/BOUNDED_CONTEXT_READS.md +3 -3
  140. package/docs/CLAUDE_CODE_PLUGIN.md +1 -1
  141. package/docs/CLI_GRAMMAR.md +2 -2
  142. package/docs/COMMANDS.md +56 -35
  143. package/docs/COMMAND_NAMESPACES.md +1 -1
  144. package/docs/CONFIGURATION.md +82 -71
  145. package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +2 -2
  146. package/docs/CONTEXT_INTEGRITY_CONTRACTS.md +5 -5
  147. package/docs/CORPUS_SHAPES.md +1 -1
  148. package/docs/DEPENDENCY_KIND_CONTRACT.md +6 -6
  149. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +5 -5
  150. package/docs/ECOSYSTEM_PLANNING_REVIEW.md +3 -3
  151. package/docs/EXTENSION_AUTHOR_CONTRACTS.md +4 -4
  152. package/docs/HISTORY_ATTESTATION.md +1 -1
  153. package/docs/HISTORY_MAINTENANCE.md +1 -1
  154. package/docs/LIFECYCLE_COMMANDS.md +1 -1
  155. package/docs/MCP_2026_07_28.md +16 -16
  156. package/docs/MCP_2026_07_28_CONFORMANCE.md +19 -19
  157. package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +22 -22
  158. package/docs/MCP_SKILLS_AND_APPS.md +1 -1
  159. package/docs/MERGE_SAFETY.md +6 -6
  160. package/docs/MUTATION_INTEGRITY.md +5 -5
  161. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +14 -14
  162. package/docs/PACKED_FIRST_RUN.md +1 -1
  163. package/docs/QUICKSTART.md +10 -10
  164. package/docs/README.md +21 -21
  165. package/docs/READ_OUTPUT_CONTRACTS.md +9 -9
  166. package/docs/RECURRENCE_RECOVERY_CONTRACTS.md +1 -1
  167. package/docs/RELEASING.md +19 -10
  168. package/docs/SCRIPTING.md +10 -10
  169. package/docs/SDK.md +74 -38
  170. package/docs/SDK_ARTIFACT_OUTPUT.md +1 -1
  171. package/docs/SDK_PRIMITIVE_INVENTORY.md +2 -2
  172. package/docs/SELF_DESCRIBING_CONTEXT_CONTRACTS.md +7 -7
  173. package/docs/TESTING.md +1 -1
  174. package/docs/WORKFLOW_POLICIES.md +2 -2
  175. package/docs/WORKSPACE_POSITION_AND_LIFECYCLE.md +8 -8
  176. package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
  177. package/docs/generated/AGENT_COMMAND_SURFACE.md +1 -1
  178. package/docs/generated/FLAG_LEXICON_BUDGETS.md +1 -1
  179. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +1 -1
  180. package/docs/performance/cli-transport-overhead.md +7 -7
  181. package/marketplace.json +1 -1
  182. package/package.json +1 -1
  183. package/packages/pm-beads/package.json +1 -1
  184. package/packages/pm-calendar/package.json +1 -1
  185. package/packages/pm-command-kit/README.md +5 -5
  186. package/packages/pm-command-kit/package.json +1 -1
  187. package/packages/pm-digital-twin/GAP_REPORT.md +16 -16
  188. package/packages/pm-digital-twin/package.json +1 -1
  189. package/packages/pm-governance-audit/package.json +1 -1
  190. package/packages/pm-guide-shell/package.json +1 -1
  191. package/packages/pm-kanban/README.md +1 -1
  192. package/packages/pm-kanban/package.json +1 -1
  193. package/packages/pm-lifecycle-hooks/package.json +1 -1
  194. package/packages/pm-linked-test-adapters/package.json +1 -1
  195. package/packages/pm-search-advanced/package.json +1 -1
  196. package/packages/pm-templates/package.json +1 -1
  197. package/packages/pm-todos/package.json +1 -1
  198. package/packages/pm-vcs/GAP_REPORT.md +1 -1
  199. package/packages/pm-vcs/package.json +1 -1
  200. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  201. package/plugins/pm-claude/README.md +6 -6
  202. package/plugins/pm-claude/package.json +1 -1
  203. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  204. package/plugins/pm-codex/package.json +1 -1
  205. package/plugins/pm-codex/plugin.json +1 -1
  206. package/runtime-dependencies.json +1 -1
  207. package/dist/cli-bundle/chunks/chunk-5Z6LWFDL.js +0 -31
  208. package/dist/cli-bundle/chunks/chunk-DSCFJTHB.js +0 -122
  209. package/dist/cli-bundle/chunks/chunk-QQHMNUZT.js +0 -2
  210. package/dist/cli-bundle/chunks/chunk-TX2W6G37.js +0 -3
  211. package/dist/cli-bundle/chunks/item-transaction-N5F4LXYV.js +0 -2
  212. package/dist/cli-bundle/chunks/register-setup-ZZRHJ4IS.js +0 -2
  213. package/dist/cli-bundle/focused-chunks/chunk-5NGNO54M.js +0 -44
  214. package/dist/cli-bundle/focused-chunks/chunk-B6U44WPW.js +0 -2
  215. package/dist/cli-bundle/focused-chunks/chunk-BAW3DGQO.js +0 -91
  216. package/dist/cli-bundle/focused-chunks/chunk-BHNY3KPJ.js +0 -2
  217. package/dist/cli-bundle/focused-chunks/chunk-CBG67HUP.js +0 -23
  218. package/dist/cli-bundle/focused-chunks/chunk-FEPE2CE4.js +0 -2
  219. package/dist/cli-bundle/focused-chunks/chunk-PMKR4MJI.js +0 -2
@@ -55,19 +55,19 @@ Each includes nested facts. The historical renderer is measured at commit
55
55
  Measurements are committed in `tests/fixtures/agent-encoding-baseline.json`.
56
56
 
57
57
  | Surface / rows | Previous TOON | JSON | Nested TOON | Hoisted cells | Ordinal | Selected |
58
- | -------------- | ------------: | ---: | ----------: | ------------: | ------: | -------: |
59
- | search / 1 | 83 | 110 | 70 | 86 | 88 | 73 |
60
- | search / 8 | 503 | 607 | 406 | 303 | 417 | 303 |
61
- | search / 32 | 1943 | 2311 | 1558 | 1047 | 1545 | 1047 |
62
- | next / 1 | 86 | 122 | 76 | 94 | 93 | 79 |
63
- | next / 8 | 527 | 703 | 454 | 367 | 457 | 367 |
64
- | next / 32 | 2039 | 2695 | 1750 | 1303 | 1705 | 1303 |
65
- | context / 1 | 89 | 118 | 76 | 89 | 95 | 79 |
66
- | context / 8 | 544 | 664 | 447 | 320 | 459 | 321 |
67
- | context / 32 | 2104 | 2536 | 1719 | 1112 | 1707 | 1113 |
68
- | get / 1 | 86 | 124 | 76 | 115 | 106 | 80 |
69
- | get / 8 | 408 | 551 | 279 | 311 | 400 | 264 |
70
- | get / 32 | 1512 | 2015 | 975 | 983 | 1408 | 840 |
58
+ |---|---:|---:|---:|---:|---:|---:|
59
+ | search / 1 | 83 | 110 | 70 | 86 | 88 | 73 |
60
+ | search / 8 | 503 | 607 | 406 | 303 | 417 | 303 |
61
+ | search / 32 | 1943 | 2311 | 1558 | 1047 | 1545 | 1047 |
62
+ | next / 1 | 86 | 122 | 76 | 94 | 93 | 79 |
63
+ | next / 8 | 527 | 703 | 454 | 367 | 457 | 367 |
64
+ | next / 32 | 2039 | 2695 | 1750 | 1303 | 1705 | 1303 |
65
+ | context / 1 | 89 | 118 | 76 | 89 | 95 | 79 |
66
+ | context / 8 | 544 | 664 | 447 | 320 | 459 | 321 |
67
+ | context / 32 | 2104 | 2536 | 1719 | 1112 | 1707 | 1113 |
68
+ | get / 1 | 86 | 124 | 76 | 115 | 106 | 80 |
69
+ | get / 8 | 408 | 551 | 279 | 311 | 400 | 264 |
70
+ | get / 32 | 1512 | 2015 | 975 | 983 | 1408 | 840 |
71
71
 
72
72
  These are fixture measurements, not universal compression guarantees. Selected
73
73
  output combines the existing scalar presentation with a per-collection choice,
@@ -83,13 +83,13 @@ one for an extra JSON-cell decoding step or two for positional row interpretatio
83
83
  The minimum adopted score is four; it is a design criterion alongside the
84
84
  independent executable equivalence gate.
85
85
 
86
- | Candidate | Readability score / 5 | Interpretation |
87
- | --------------- | --------------------: | ----------------------------------------- |
88
- | JSON | 5 | Named fields and native nested values |
89
- | Nested TOON | 5 | Named fields and standard nested decoding |
90
- | Hoisted cells | 4 | Named columns and declared JSON cells |
91
- | Ordinal | 3 | Column lookup plus positional nested rows |
92
- | Selected hybrid | 4–5 | Expanded small rows or declared tables |
86
+ | Candidate | Readability score / 5 | Interpretation |
87
+ |---|---:|---|
88
+ | JSON | 5 | Named fields and native nested values |
89
+ | Nested TOON | 5 | Named fields and standard nested decoding |
90
+ | Hoisted cells | 4 | Named columns and declared JSON cells |
91
+ | Ordinal | 3 | Column lookup plus positional nested rows |
92
+ | Selected hybrid | 4–5 | Expanded small rows or declared tables |
93
93
 
94
94
  Ordinal arrays require an additional positional interpretation and save nothing
95
95
  on these nested fixtures, so they are not adopted. The complete brief-list
package/docs/ASSURANCE.md CHANGED
@@ -33,17 +33,17 @@ The assurance SDK keeps those semantics independent from presentation. Commander
33
33
 
34
34
  Measurements support these built-in sources:
35
35
 
36
- | Source | Purpose |
37
- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
38
- | `items` | Count authoritative full item records matching status, type, tags, an exact metadata field, or a field `state` of `present`/`missing`. |
36
+ | Source | Purpose |
37
+ |---|---|
38
+ | `items` | Count authoritative full item records matching status, type, tags, an exact metadata field, or a field `state` of `present`/`missing`. |
39
39
  | `dependency_kind` | Count typed relationship edges such as `blocked_by` or `verifies`; accepted aliases and canonical spellings measure the same population. |
40
- | `graph` | Select a numeric or labelled-set field from a public graph SDK result. |
41
- | `validate` | Select a validator check status or numeric detail. |
42
- | `health` | Select a health check status, numeric detail, or labelled set. |
43
- | `history` | Count immutable events by operation, author, harness, or model. |
44
- | `links` | Count items with present or missing file, test, or documentation evidence. |
45
- | `derived` | Combine numeric measurements with deterministic arithmetic and cycle detection. |
46
- | `provider` | Delegate a measurement to an explicitly supplied host/package resolver. |
40
+ | `graph` | Select a numeric or labelled-set field from a public graph SDK result. |
41
+ | `validate` | Select a validator check status or numeric detail. |
42
+ | `health` | Select a health check status, numeric detail, or labelled set. |
43
+ | `history` | Count immutable events by operation, author, harness, or model. |
44
+ | `links` | Count items with present or missing file, test, or documentation evidence. |
45
+ | `derived` | Combine numeric measurements with deterministic arithmetic and cycle detection. |
46
+ | `provider` | Delegate a measurement to an explicitly supplied host/package resolver. |
47
47
 
48
48
  `ASSURANCE_MEASUREMENT_SOURCE_KINDS` and `ASSURANCE_GATE_TRIGGERS` are the
49
49
  public SDK constants for these closed vocabularies. Runtime validation rejects
@@ -153,7 +153,7 @@ projection, including feedback writes). The explicit scan includes the cold
153
153
  derived-index rebuild; these are host observations rather than latency gates.
154
154
 
155
155
  | Corpus items | Standard p95 | Brief p95 | Fields p95 | Explicit full scan | Verified scan rows |
156
- | ---: | ---: | ---: | ---: | ---: | ---: |
156
+ |---:|---:|---:|---:|---:|---:|
157
157
  | 100 | 4.53 ms | 4.24 ms | 3.54 ms | 48 ms | 100 |
158
158
  | 10,000 | 3.61 ms | 3.03 ms | 4.08 ms | 4.91 s | 10,000 |
159
159
  | 100,000 | 3.69 ms | 11.00 ms | 3.11 ms | 48.59 s | 100,000 |
@@ -162,7 +162,7 @@ Measured on 2026-09-05 with Node 26.7.0; these are observations, not portable
162
162
  latency guarantees. Duplicate timings exclude filesystem ingestion.
163
163
 
164
164
  | Items | Possible pairs | Scored pairs | Analysis time | Mean bytes written per serve | Compactions / serves | Final ledger bytes |
165
- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
165
+ |---:|---:|---:|---:|---:|---:|---:|
166
166
  | 10,000 | 49,995,000 | 5,000 | 92 ms | 18,138 | 2 / 40 | 237,785 |
167
167
  | 100,000 | 4,999,950,000 | 50,000 | 864 ms | 18,149 | 2 / 40 | 237,821 |
168
168
  | 1,000,000 | 499,999,500,000 | 500,000 | 10,367 ms | 18,135 | 2 / 40 | 237,857 |
@@ -175,7 +175,7 @@ receipts; these are four concurrent tasks sharing a cross-process lock, not a
175
175
  measurement of four separate OS processes.
176
176
 
177
177
  | Candidate rows per serve | Serves/s/workspace | Minimum wait | p50 wait | p95 wait | Maximum wait |
178
- | ---: | ---: | ---: | ---: | ---: | ---: |
178
+ |---:|---:|---:|---:|---:|---:|
179
179
  | 10,000 | 46.73 | 3.11 ms | 25.15 ms | 84.97 ms | 105.66 ms |
180
180
  | 100,000 | 20.82 | 18.29 ms | 50.10 ms | 193.86 ms | 229.60 ms |
181
181
  | 1,000,000 | 1.92 | 198.10 ms | 809.52 ms | 1,367.67 ms | 1,622.77 ms |
@@ -197,7 +197,7 @@ After installing the plugin:
197
197
  ## Compatibility
198
198
 
199
199
  | pm-cli version | Plugin version | Claude Code version |
200
- |---------------|----------------|---------------------|
200
+ |---|---|---|
201
201
  | Exact same date-based version as the plugin | Exact same date-based version as pm-cli | Current supported Claude Code |
202
202
 
203
203
  The authoritative plugin version is `plugins/pm-claude/.claude-plugin/plugin.json`; `pnpm version:check` also verifies the pinned runtime dependency.
@@ -133,7 +133,7 @@ and cross-workspace evidence exist, published aliases remain executable.
133
133
  Tracked by [pm-m6g87m](../.agents/pm/tasks/pm-m6g87m.toon), [pm-fmy9ih](../.agents/pm/tasks/pm-fmy9ih.toon), and [pm-wfskfn](../.agents/pm/tasks/pm-wfskfn.toon).
134
134
 
135
135
  | Canonical command | Compatibility alias | Responsibility |
136
- | --- | --- | --- |
136
+ |---|---|---|
137
137
  | `item copy` | `copy` | Copy one item to a new ID |
138
138
  | `workspace merge` | `merge` | Install, inspect, or run Git tracker merge drivers |
139
139
  | `item duplicates` | `duplicates` | Discover bounded duplicate clusters in core |
@@ -216,7 +216,7 @@ Tracked by [pm-npr3](../.agents/pm/tasks/pm-npr3.toon) and
216
216
  [pm-uk9dwh](../.agents/pm/tasks/pm-uk9dwh.toon).
217
217
 
218
218
  | Canonical command | Compatibility spelling | Responsibility |
219
- | --- | --- | --- |
219
+ |---|---|---|
220
220
  | `workspace init` | `init` | Bootstrap storage, settings, and optional guidance |
221
221
  | `workspace config` | `config` | Read or change individual project/global settings |
222
222
  | `workspace schema` | `schema` | Define types, statuses, fields, and validation contracts |
package/docs/COMMANDS.md CHANGED
@@ -51,21 +51,21 @@ JSON ceiling; TOON uses the smaller default agent ceiling.
51
51
 
52
52
  ## Command Families
53
53
 
54
- | Family | Commands | Purpose |
55
- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
56
- | Bootstrap | `init`, `config`, `health`, `telemetry` | create and inspect tracker setup |
57
- | Lifecycle | `create`, `copy`, `focus`, `claim`, `update`, `item reopen`, `append`, `close`, `release`, `close delete` | mutate item state, including terminal-work recurrence without duplicate creation |
58
- | Bulk | `item mutate`, `item complete`, `update many`, `close many` | atomically commit heterogeneous SDK mutation batches or evidence-backed completion, or apply one change across a matched, dry-run-previewed set with a rollback checkpoint |
59
- | Scheduling | `meet`, `event`, `remind` | low-friction Meeting/Event/Reminder creation |
60
- | Planning | `plan create`, `plan add-step`, `plan update-step`, `plan complete-step`, `plan link`, `plan approve`, `plan materialize` | agent-optimized living plans with ordered steps, evidence, decisions, validation, and materialization |
61
- | Links | `files`, `docs`, `test`, `deps` | connect items to artifacts, tests, and relationships |
62
- | Verification | `test`, `test-all`, `test-runs`†, `validate`, `gc` | run linked tests and repository checks |
63
- | History | `history`, `history-compact`, `history-redact`, `history-repair`, `activity`, `restore`, `stats` | inspect, compact, redact, re-anchor, and recover item state |
64
- | Schema | `schema add/remove-*` / `rename-type` / `rename-field` / `remap-status` / `apply-preset` | manage config-driven types, statuses, and fields; losslessly migrate existing items when definitions evolve; adopt presets or infer types |
65
- | Profiles | `profile list` / `show` / `apply` / `lint` | compose item types, statuses, fields, workflows, config, templates, and recommended packages into archetype bundles (agile/ops/research); `apply` stages every dimension idempotently; `lint` reports author-time consistency findings without writing |
66
- | Calendar | `calendar`, `cal` | project deadlines, reminders, and events |
67
- | Packages | `install`, `upgrade`, `package`, `packages`, `extension`, package/extension command groups | install, upgrade, manage, and run package-backed extension commands |
68
- | Machines | `contracts`, `help`, optional `guide`/`completion` | command contracts plus optional guide-shell docs routing and shell helpers |
54
+ | Family | Commands | Purpose |
55
+ |---|---|---|
56
+ | Bootstrap | `init`, `config`, `health`, `telemetry` | create and inspect tracker setup |
57
+ | Lifecycle | `create`, `copy`, `focus`, `claim`, `update`, `item reopen`, `append`, `close`, `release`, `close delete` | mutate item state, including terminal-work recurrence without duplicate creation |
58
+ | Bulk | `item mutate`, `item complete`, `update many`, `close many` | atomically commit heterogeneous SDK mutation batches or evidence-backed completion, or apply one change across a matched, dry-run-previewed set with a rollback checkpoint |
59
+ | Scheduling | `meet`, `event`, `remind` | low-friction Meeting/Event/Reminder creation |
60
+ | Planning | `plan create`, `plan add-step`, `plan update-step`, `plan complete-step`, `plan link`, `plan approve`, `plan materialize` | agent-optimized living plans with ordered steps, evidence, decisions, validation, and materialization |
61
+ | Links | `files`, `docs`, `test`, `deps` | connect items to artifacts, tests, and relationships |
62
+ | Verification | `test`, `test-all`, `test-runs`†, `validate`, `gc` | run linked tests and repository checks |
63
+ | History | `history`, `history-compact`, `history-redact`, `history-repair`, `activity`, `restore`, `stats` | inspect, compact, redact, re-anchor, and recover item state |
64
+ | Schema | `schema add/remove-*` / `rename-type` / `rename-field` / `remap-status` / `apply-preset` | manage config-driven types, statuses, and fields; losslessly migrate existing items when definitions evolve; adopt presets or infer types |
65
+ | Profiles | `profile list` / `show` / `apply` / `lint` | compose item types, statuses, fields, workflows, config, templates, and recommended packages into archetype bundles (agile/ops/research); `apply` stages every dimension idempotently; `lint` reports author-time consistency findings without writing |
66
+ | Calendar | `calendar`, `cal` | project deadlines, reminders, and events |
67
+ | Packages | `install`, `upgrade`, `package`, `packages`, `extension`, package/extension command groups | install, upgrade, manage, and run package-backed extension commands |
68
+ | Machines | `contracts`, `help`, optional `guide`/`completion` | command contracts plus optional guide-shell docs routing and shell helpers |
69
69
 
70
70
  `†` `test-runs` subcommands are provided by the optional `linked-test-adapters` package (`pm package install linked-test-adapters --project`).
71
71
 
@@ -968,8 +968,12 @@ Starting work respects declared blockers
968
968
  in_progress`, `pm claim <id> --start`, `pm claim --next --start` and the
969
969
  `start-task` action refuse with `start_blocked_by_open_dependency` (exit 4)
970
970
  when the item moves into the start status while a `blocked_by` target is still
971
- open. An item already in that status is not rechecked, so `claim --start` on it
972
- succeeds. The check runs before any write: the
971
+ open. `pm claim --next --start` skips a ranked candidate refused this way (its
972
+ blocker opened after ranking, and nothing is written to it), claims the next
973
+ eligible candidate, and lists the skipped ids in `start_refused`. When the walk
974
+ is exhausted, the `no_available_next_item` refusal (or the `--if-available`
975
+ empty result) carries them too. An item already in that status is not
976
+ rechecked, so `claim --start` on it succeeds. The check runs before any write: the
973
977
  explicit `claim <id> --start` judges it under the claim's item lock, and its
974
978
  status update judges again under its own lock. When the first check refuses,
975
979
  nothing is written. When a blocker opens between the two writes, the start
@@ -1031,7 +1035,24 @@ carrying `error_code`, `expected_revision`, `current_revision` and
1031
1035
  `details.changes_since`. When `close` auto-unblocks a guarded dependent whose revision
1032
1036
  moved, the close stays committed and the command refuses with that dependent's
1033
1037
  `item_revision_conflict` once the fan-out finishes. `side_effects` names every
1034
- write that committed first: the close and each dependent already unblocked. `close-many` reports such a row as `closed` (`update-many` closing
1038
+ write that committed first: the close and each dependent already unblocked. Do
1039
+ not retry the close; it is already terminal. `required` and `nextSteps` name
1040
+ only the remaining step for each refused guarded dependent
1041
+ (`details.pending_unblock`): re-read it, confirm every blocker it declares is
1042
+ resolved, then run the scoped unblock `nextSteps` lists (`pm update <dependent>
1043
+ --status <open-status> --unset blocked_by --unset blocked_reason --expect-hash
1044
+ <dependent>=<item_hash>`, carrying the configured open status and tracker
1045
+ scope). `--unset blocked_by` removes every `blocked_by` edge, including one a
1046
+ concurrent change added, so skipping the check can reopen a still-blocked item.
1047
+ Dependents whose unblock failed for another reason are in
1048
+ `details.auto_unblock_failed` with that reason; fix the cause first. Each list
1049
+ names at most 10 ids and counts the rest in `*_omitted`, keeping the details
1050
+ within the error-details size limit. When ids were omitted, or the steps exceed
1051
+ the 20-step cap (ten conflicts plus one other failure make 21), the last step
1052
+ lists every item in a blocked-role status (`pm list --status <blocked-statuses>
1053
+ --fields id,title,blocked_by,dependencies`, over the statuses the fan-out drew
1054
+ from), so a dependent whose step was cut is still found; it returns 200 rows per
1055
+ page, so follow `--after <next_cursor>` while `has_more: true`. `close-many` reports such a row as `closed` (`update-many` closing
1035
1056
  through `--status`, as `updated`), with the dependent's conflict under
1036
1057
  `dependent_revision_conflict`. A guarded `restore` refuses to recover
1037
1058
  over a live file that cannot be read as a document; an unguarded restore still
@@ -1578,23 +1599,23 @@ pm plan show <plan-id> --fields id,title,steps_summary
1578
1599
 
1579
1600
  Subcommand cheatsheet:
1580
1601
 
1581
- | Subcommand | Purpose |
1582
- | ----------------- | -------------------------------------------------------------------------------------------- |
1583
- | `create` | Create a Plan item with scope, harness, parent, related, blocked-by, and optional auto-claim |
1584
- | `show` | Progressive-disclosure read (brief / standard / deep) with current step + next-action hints |
1585
- | `add-step` | Append a step with title/body/owner/status/dependencies/files/tests/docs |
1586
- | `update-step` | Patch one step (title, body, status, evidence, owner, blocked reason) |
1587
- | `complete-step` | Shortcut for setting a step to `completed` with evidence |
1588
- | `block-step` | Shortcut for setting a step to `blocked` with required `--step-blocked-reason` |
1589
- | `reorder-step` | Move a step to a new 1-based order |
1590
- | `remove-step` | Drop a step and renumber remaining steps |
1591
- | `link` / `unlink` | Add or remove `linked_items` on a step (with optional `--promote-to-item-dep`) |
1592
- | `decision` | Append a decision log entry (decision/rationale/evidence) |
1593
- | `discovery` | Append a discovery log entry |
1594
- | `validation` | Append a validation check (text/command/expected) |
1595
- | `resume` | Replace the resume-context summary for stateless agents |
1596
- | `approve` | Move `plan_mode` to `approved` (default) or any other mode via `--mode` |
1597
- | `materialize` | Create real pm items (default `Task`) from selected steps with bidirectional links |
1602
+ | Subcommand | Purpose |
1603
+ |---|---|
1604
+ | `create` | Create a Plan item with scope, harness, parent, related, blocked-by, and optional auto-claim |
1605
+ | `show` | Progressive-disclosure read (brief / standard / deep) with current step + next-action hints |
1606
+ | `add-step` | Append a step with title/body/owner/status/dependencies/files/tests/docs |
1607
+ | `update-step` | Patch one step (title, body, status, evidence, owner, blocked reason) |
1608
+ | `complete-step` | Shortcut for setting a step to `completed` with evidence |
1609
+ | `block-step` | Shortcut for setting a step to `blocked` with required `--step-blocked-reason` |
1610
+ | `reorder-step` | Move a step to a new 1-based order |
1611
+ | `remove-step` | Drop a step and renumber remaining steps |
1612
+ | `link` / `unlink` | Add or remove `linked_items` on a step (with optional `--promote-to-item-dep`) |
1613
+ | `decision` | Append a decision log entry (decision/rationale/evidence) |
1614
+ | `discovery` | Append a discovery log entry |
1615
+ | `validation` | Append a validation check (text/command/expected) |
1616
+ | `resume` | Replace the resume-context summary for stateless agents |
1617
+ | `approve` | Move `plan_mode` to `approved` (default) or any other mode via `--mode` |
1618
+ | `materialize` | Create real pm items (default `Task`) from selected steps with bidirectional links |
1598
1619
 
1599
1620
  Invariants:
1600
1621
 
@@ -9,7 +9,7 @@ spellings remain executable compatibility aliases with the same arguments,
9
9
  results, exit codes, and SDK behavior.
10
10
 
11
11
  | Native invocation | Compatibility spelling | Purpose |
12
- | --- | --- | --- |
12
+ |---|---|---|
13
13
  | `pm context next` | `pm next` | Select ready work and explain blockers |
14
14
  | `pm context focus` | `pm focus` | Read, set, or clear the focused item |
15
15
  | `pm ops stats` | `pm stats` | Inspect tracker statistics |
@@ -37,7 +37,7 @@ it to the right typed flag based on the key (so `--policy`/`--format`/`--criteri
37
37
  remain optional for single values):
38
38
 
39
39
  ```bash
40
- pm config set telemetry-tracking off # off|on|true|false map to disabled|enabled
40
+ pm config set telemetry-tracking off # off|on|true|false; global profile
41
41
  pm config set item-format toon # same as --format toon
42
42
  pm config set governance-preset strict # same as --policy strict
43
43
  pm config set definition-of-done "Tests pass" # same as --criterion "Tests pass"
@@ -80,35 +80,35 @@ If the existing `settings.json` is valid JSON but fails schema validation (for e
80
80
 
81
81
  ## Common Settings
82
82
 
83
- | Setting | Purpose |
84
- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
85
- | `id_prefix` | generated item ID prefix, default `pm-` |
86
- | `ids.token_length` | random base36 token length for newly minted item ids (4-12, default `4`); raise it to shrink cross-branch id collision odds in concurrent multi-agent workflows (see [Merge Safety](MERGE_SAFETY.md)) |
87
- | `author_default` | configured mutation author before automatic harness detection |
88
- | `mutation_guard.require_attributed_author` | reject mutations whose effective author remains `unknown` (default `false`) |
89
- | `mutation_guard.secret_guard` | credential-shaped content policy: `off`, `advise`, or `block` (default `advise`) |
90
- | `mutation_guard.stale_in_progress_hours` | age threshold for unclaimed in-progress work surfaced by `pm health` (integer >= 1, default `72`) |
91
- | `item_format` | item storage format (`toon` writes; legacy markdown is read/migrate only) |
92
- | `output.default_format` | default renderer, usually `toon` |
93
- | `locks.ttl_seconds` | stale lock threshold |
94
- | `locks.wait_ms` | wait budget before a contended lock returns `lock_conflict`; item-store mutations, restore and the hierarchy lock restart it on each owner handoff (120 s cap), other locks use it as a fixed total (default `3000`; `0` fails fast) |
95
- | `history.missing_stream` | `auto_create` or `strict_error` |
96
- | `history.compact_policy.enabled` | enable the compaction advisory: `pm health` warns on over-threshold streams (default `false`); when disabled, `max_entries`/`trigger` are inert |
97
- | `history.compact_policy.max_entries` | when the policy is enabled, the entry count above which a stream is flagged by `pm health` and the default `pm history-compact --all-over` threshold (default `500`) |
98
- | `history.compact_policy.trigger` | policy intent when enabled: `health_warn` (advisory only) or `auto` (scheduled sweeps expected) |
99
- | `testing.record_results_to_items` | persist bounded linked-test summaries |
100
- | `testing.allow_untrusted_linked_tests` | permit the explicit `pm test --allow-untrusted-linked-tests` one-run override (default `false`; does not trust or execute commands by itself) |
101
- | `validation.sprint_release_format` | `warn` or `strict_error` |
102
- | `validation.parent_reference` | `warn` or `strict_error` (`strict_error` is the built-in default; `pm create --allow-missing-parent` is the explicit escape hatch) |
103
- | `item_types.definitions[]` | custom item types and type options |
104
- | `governance.create_default_type` | default `--type` used by `pm create "title"` when `--type` is omitted (defaults to `Task`); must resolve to a known item type |
105
- | `governance.workflow_enforcement` | per-type transition enforcement mode for `pm update --status` (`off` default, `warn`, or `strict`) |
106
- | `governance.start_blocker_enforcement` | starting an item (`update --status in_progress`, `claim --start`) while a declared `blocked_by` target is open: `strict` (default; refuse unless `--force`), `warn`, or `off` |
107
- | `governance.duplicate_detection_mode` | create/copy similarity policy: `off`, `advisory`, or `strict`; the minimal preset uses `off`, while the default and strict presets use `strict` |
108
- | `governance.duplicate_detection_threshold` | inclusive likely-duplicate score from `0` through `1` (default `0.8`) |
109
- | `governance.duplicate_detection_limit` | maximum matches attached to a create/copy advisory from `0` through `20` (default `3`) |
110
- | `schema.type_workflows[]` | per-type allowed status transitions (see Per-Type Workflows below) |
111
- | `search.*` | search mode, scoring, providers, embedding timeout, and vector settings |
83
+ | Setting | Purpose |
84
+ |---|---|
85
+ | `id_prefix` | generated item ID prefix, default `pm-` |
86
+ | `ids.token_length` | random base36 token length for newly minted item ids (4-12, default `4`); raise it to shrink cross-branch id collision odds in concurrent multi-agent workflows (see [Merge Safety](MERGE_SAFETY.md)) |
87
+ | `author_default` | configured mutation author before automatic harness detection |
88
+ | `mutation_guard.require_attributed_author` | reject mutations whose effective author remains `unknown` (default `false`) |
89
+ | `mutation_guard.secret_guard` | credential-shaped content policy: `off`, `advise`, or `block` (default `advise`) |
90
+ | `mutation_guard.stale_in_progress_hours` | age threshold for unclaimed in-progress work surfaced by `pm health` (integer >= 1, default `72`) |
91
+ | `item_format` | item storage format (`toon` writes; legacy markdown is read/migrate only) |
92
+ | `output.default_format` | default renderer, usually `toon` |
93
+ | `locks.ttl_seconds` | stale lock threshold |
94
+ | `locks.wait_ms` | wait budget before a contended lock returns `lock_conflict`; item-store mutations, restore and the hierarchy lock restart it on each owner handoff (120 s cap), other locks use it as a fixed total (default `3000`; `0` fails fast) |
95
+ | `history.missing_stream` | `auto_create` or `strict_error` |
96
+ | `history.compact_policy.enabled` | enable the compaction advisory: `pm health` warns on over-threshold streams (default `false`); when disabled, `max_entries`/`trigger` are inert |
97
+ | `history.compact_policy.max_entries` | when the policy is enabled, the entry count above which a stream is flagged by `pm health` and the default `pm history-compact --all-over` threshold (default `500`) |
98
+ | `history.compact_policy.trigger` | policy intent when enabled: `health_warn` (advisory only) or `auto` (scheduled sweeps expected) |
99
+ | `testing.record_results_to_items` | persist bounded linked-test summaries |
100
+ | `testing.allow_untrusted_linked_tests` | permit the explicit `pm test --allow-untrusted-linked-tests` one-run override (default `false`; does not trust or execute commands by itself) |
101
+ | `validation.sprint_release_format` | `warn` or `strict_error` |
102
+ | `validation.parent_reference` | `warn` or `strict_error` (`strict_error` is the built-in default; `pm create --allow-missing-parent` is the explicit escape hatch) |
103
+ | `item_types.definitions[]` | custom item types and type options |
104
+ | `governance.create_default_type` | default `--type` used by `pm create "title"` when `--type` is omitted (defaults to `Task`); must resolve to a known item type |
105
+ | `governance.workflow_enforcement` | per-type transition enforcement mode for `pm update --status` (`off` default, `warn`, or `strict`) |
106
+ | `governance.start_blocker_enforcement` | starting an item (`update --status in_progress`, `claim --start`, `claim --next --start`, `start-task`) while a declared `blocked_by` target is open: `strict` (default; refuse unless `--force`), `warn`, or `off`; `claim --next --start` skips a refused candidate and claims the next eligible one |
107
+ | `governance.duplicate_detection_mode` | create/copy similarity policy: `off`, `advisory`, or `strict`; the minimal preset uses `off`, while the default and strict presets use `strict` |
108
+ | `governance.duplicate_detection_threshold` | inclusive likely-duplicate score from `0` through `1` (default `0.8`) |
109
+ | `governance.duplicate_detection_limit` | maximum matches attached to a create/copy advisory from `0` through `20` (default `3`) |
110
+ | `schema.type_workflows[]` | per-type allowed status transitions (see Per-Type Workflows below) |
111
+ | `search.*` | search mode, scoring, providers, embedding timeout, and vector settings |
112
112
 
113
113
  Lock recovery is tracked by
114
114
  [pm-02z97f](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-02z97f.toon)
@@ -219,15 +219,15 @@ underscore aliases remain accepted for compatibility.
219
219
 
220
220
  ## Environment Variables
221
221
 
222
- | Variable | Use |
223
- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
224
- | `PM_AUTHOR` | optional explicit session-wide mutation author override |
225
- | `PM_PATH` | override project tracker root for tests or sandboxes |
226
- | `PM_GLOBAL_PATH` | override global profile root for tests or sandboxes |
227
- | `PM_LOCK_WAIT_MS` | per-process override for the `locks.wait_ms` budget (a no-progress window only where that lock uses the progress policy); non-negative integer milliseconds, with `0` restoring fail-fast lock conflicts |
228
- | `PM_OLLAMA_MODEL` | choose default Ollama embedding model |
229
- | `PM_DISABLE_OLLAMA_AUTO_DEFAULTS` | disable implicit Ollama search defaults |
230
- | `PM_CONTEXT_USAGE_DISABLED` | set to `1` to disable the derived context/next usage-feedback ledger with zero filesystem reads or writes |
222
+ | Variable | Use |
223
+ |---|---|
224
+ | `PM_AUTHOR` | optional explicit session-wide mutation author override |
225
+ | `PM_PATH` | override project tracker root for tests or sandboxes |
226
+ | `PM_GLOBAL_PATH` | override global profile root for tests or sandboxes |
227
+ | `PM_LOCK_WAIT_MS` | per-process override for the `locks.wait_ms` budget (a no-progress window only where that lock uses the progress policy); non-negative integer milliseconds, with `0` restoring fail-fast lock conflicts |
228
+ | `PM_OLLAMA_MODEL` | choose default Ollama embedding model |
229
+ | `PM_DISABLE_OLLAMA_AUTO_DEFAULTS` | disable implicit Ollama search defaults |
230
+ | `PM_CONTEXT_USAGE_DISABLED` | set to `1` to disable the derived context/next usage-feedback ledger with zero filesystem reads or writes |
231
231
 
232
232
  For command-level tracker targeting, prefer `--pm-path <tracker-root>`. The old
233
233
  `--path` flag is still accepted, but it means the pm tracker storage directory
@@ -264,23 +264,31 @@ Tests should set both `PM_PATH` and `PM_GLOBAL_PATH` to temporary directories. T
264
264
 
265
265
  ### Telemetry environment variables
266
266
 
267
- Telemetry is enabled by default. Use `pm config set telemetry-tracking off` to opt out persistently (see [Common Settings](#common-settings)). When enabled, these environment variables tune runtime behaviour. All boolean knobs accept `1`, `true`, `yes`, or `on` (case-insensitive); any other value leaves the knob off.
267
+ Telemetry is enabled by default. Use `pm config set telemetry-tracking off` to opt out persistently (see [Common Settings](#common-settings)). Consent and the event endpoint live only in the global profile:
268
268
 
269
- | Variable | Values | Use |
270
- | ------------------------------------ | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
271
- | `PM_TELEMETRY_DISABLED` | boolean | Hard-disable all telemetry for this process, ignoring settings. |
269
+ - A scope-less `telemetry-tracking` call targets the global profile.
270
+ - Project-scope `get` and `set` refuse. Project `list` and `export` omit the key.
271
+ - `pm init` asks only while no choice is recorded in the global profile. It keeps a choice another process records while its prompt is open. It reports the global value and writes no project `telemetry` block.
272
+ - An older project `telemetry` block is ignored.
273
+
274
+ When enabled, these environment variables tune runtime behaviour. All boolean knobs accept `1`, `true`, `yes`, or `on` (case-insensitive); any other value leaves the knob off.
275
+
276
+ | Variable | Values | Use |
277
+ |---|---|---|
278
+ | `PM_TELEMETRY_DISABLED` | boolean | Hard-disable all telemetry for this process, ignoring settings. |
272
279
  | `DO_NOT_TRACK` | boolean | Hard-disable event capture, identity creation, flush workers, endpoint probes, and Sentry, regardless of persisted preferences. |
273
280
  | `PM_TELEMETRY_SEND_TEST_EVENTS` | boolean | Explicitly allow inferred test events. Hard opt-outs still take precedence. |
274
281
  | `PM_TELEMETRY_READ_SAMPLE_RATE` | number greater than `0` and at most `1` | Override automatic successful-read sampling; `1`, empty, or invalid values retain every invocation. Omit for automatic frequency bounding. |
275
- | `PM_NO_TELEMETRY` | boolean | Alias for `PM_TELEMETRY_DISABLED` (honoured by the same checks). |
276
- | `PM_TELEMETRY_OTEL_DISABLED` | boolean | Disable only OTLP trace-span export; the event queue still flushes. |
277
- | `PM_TELEMETRY_INLINE_FLUSH` | boolean | Flush the queue and OTLP spans inline instead of dispatching the detached worker. Mainly for tests; normal use relies on the background worker. |
278
- | `PM_TELEMETRY_SOURCE_CONTEXT` | `user` \| `automation` \| `test` \| `dogfood` | Override the inferred source context recorded on each event. Unrecognized nonempty values use inferred context with `source_context_source=env_override_rejected`; the raw value is never emitted. |
279
- | `PM_TELEMETRY_HTTP_TIMEOUT_MS` | integer milliseconds | Bound each background event or OTLP request (default `20000`, clamped to `1000`–`25000` to stay below the worker lock TTL). |
280
- | `PM_TELEMETRY_INGEST_KEY` | string | Sent as the `x-pm-telemetry-key` header on queue flushes; never logged. |
281
- | `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | URL | OTLP/HTTP traces endpoint for command spans. Takes precedence over the base endpoint. |
282
- | `OTEL_EXPORTER_OTLP_ENDPOINT` | URL | Base OTLP endpoint; the traces endpoint is derived by appending `/v1/traces`. |
283
- | `OTEL_SERVICE_NAME` | string | `service.name` attribute on exported spans (defaults to `pm-cli`). |
282
+ | `PM_NO_TELEMETRY` | boolean | Alias for `PM_TELEMETRY_DISABLED` (honoured by the same checks). |
283
+ | `PM_TELEMETRY_OTEL_DISABLED` | boolean | Disable only OTLP trace-span export; the event queue still flushes. |
284
+ | `PM_TELEMETRY_INLINE_FLUSH` | boolean | Flush the queue and OTLP spans inline instead of dispatching the detached worker. Mainly for tests; normal use relies on the background worker. |
285
+ | `PM_TELEMETRY_SOURCE_CONTEXT` | `user` \| `automation` \| `test` \| `dogfood` | Override the inferred source context recorded on each event. Unrecognized nonempty values use inferred context with `source_context_source=env_override_rejected`; the raw value is never emitted. |
286
+ | `PM_TELEMETRY_HTTP_TIMEOUT_MS` | integer milliseconds | Bound each background event or OTLP request (default `20000`, clamped to `1000`–`25000` to stay below the worker lock TTL). |
287
+ | `PM_TELEMETRY_INGEST_KEY` | string | Sent as the `x-pm-telemetry-key` header on queue flushes; never logged. |
288
+ | `PM_TELEMETRY_ENDPOINT` | http(s) URL | Deliver events to this collector instead of the configured endpoint. Events captured under it go to a queue and state file of their own that only a process with the same value reads or reports; a later flush removes them after a day idle. `pm telemetry clear` removes them too, but it also revokes consent and deletes every telemetry queue and state file of the profile. An empty value uses the configured endpoint; any other value that is not an http(s) URL disables delivery. URL credentials are sent as Basic auth, by `pm health --check-telemetry` too. |
289
+ | `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | URL | OTLP/HTTP traces endpoint for command spans. Takes precedence over the base endpoint. |
290
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | URL | Base OTLP endpoint; the traces endpoint is derived by appending `/v1/traces`. |
291
+ | `OTEL_SERVICE_NAME` | string | `service.name` attribute on exported spans (defaults to `pm-cli`). |
284
292
 
285
293
  Unrecognized source-context overrides produce one bounded warning per process on
286
294
  stderr, naming the accepted values without echoing the rejected input. JSON
@@ -326,9 +334,12 @@ Interaction rules:
326
334
 
327
335
  Test environments inferred from `VITEST`, `VITEST_WORKER_ID`, `NODE_TEST_CONTEXT`
328
336
  (native `node --test` children), or `NODE_ENV=test` suppress telemetry and Sentry
329
- before identity creation. A valid explicit `PM_TELEMETRY_SOURCE_CONTEXT` or
330
- `PM_TELEMETRY_SEND_TEST_EVENTS=1` permits intentional test delivery. Point such
331
- tests at a local collector. Inferred tests use inline telemetry flushing even
337
+ before identity creation. A valid explicit `PM_TELEMETRY_SOURCE_CONTEXT`,
338
+ including `test`, or `PM_TELEMETRY_SEND_TEST_EVENTS=1` permits intentional test
339
+ delivery, so a test that only wants the label must also set
340
+ `PM_TELEMETRY_DISABLED=1`. Point such tests at a local collector: set
341
+ `PM_TELEMETRY_ENDPOINT` for events, `SENTRY_DSN` for errors, and
342
+ `OTEL_EXPORTER_OTLP_*` for spans. Inferred tests use inline telemetry flushing even
332
343
  after an opt in, so CLI delivery settles before process exit and disposable-root
333
344
  cleanup. SDK telemetry completion also awaits inline delivery before returning.
334
345
  Neither setting overrides a hard opt-out. `pm telemetry status` exposes effective `enabled`, persisted
@@ -361,12 +372,12 @@ Tracing and privacy delivery: [pm-58yzil](../.agents/pm/features/pm-58yzil.toon)
361
372
 
362
373
  Crash and error diagnostics are reported to Sentry only when telemetry is enabled and the process is not opted out. These environment variables tune the Sentry client.
363
374
 
364
- | Variable | Values | Use |
365
- | --------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
366
- | `PM_SENTRY_DISABLED` | boolean | Disable Sentry error reporting for this process (the Sentry SDK is not even imported). `PM_TELEMETRY_DISABLED` / `PM_NO_TELEMETRY` also disable it. |
367
- | `SENTRY_DSN` | URL | Override the destination DSN. Defaults to the bundled pm-cli project DSN. |
368
- | `SENTRY_ENVIRONMENT` | string | Override the reported environment tag. Defaults to `test` under Vitest, `ci` when `CI` is set, otherwise `production`. |
369
- | `PM_SENTRY_TRACE_COMMANDS` | boolean | Explicitly initialize Sentry for successful commands. Defaults to off, preserving lazy startup. All consent opt-outs and test isolation still apply; a zero trace sample rate avoids initialization. |
375
+ | Variable | Values | Use |
376
+ |---|---|---|
377
+ | `PM_SENTRY_DISABLED` | boolean | Disable Sentry error reporting for this process (the Sentry SDK is not even imported). `PM_TELEMETRY_DISABLED` / `PM_NO_TELEMETRY` also disable it. |
378
+ | `SENTRY_DSN` | URL | Override the destination DSN. Defaults to the bundled pm-cli project DSN. |
379
+ | `SENTRY_ENVIRONMENT` | string | Override the reported environment tag. Defaults to `test` under Vitest, `ci` when `CI` is set, otherwise `production`. |
380
+ | `PM_SENTRY_TRACE_COMMANDS` | boolean | Explicitly initialize Sentry for successful commands. Defaults to off, preserving lazy startup. All consent opt-outs and test isolation still apply; a zero trace sample rate avoids initialization. |
370
381
  | `SENTRY_TRACES_SAMPLE_RATE` | number `0`–`1` | Fraction of command spans sampled for performance tracing. Defaults to `0.2` (20%). Set to `1` for full-trace performance debugging or `0` to disable tracing. Non-numeric or out-of-range values fall back to the default. |
371
382
 
372
383
  > Sentry is hard-disabled under Vitest (`VITEST` / `VITEST_WORKER_ID`), so these knobs are no-ops inside the test suite.
@@ -629,21 +640,21 @@ When query expansion or rerank providers fail, `pm search` degrades gracefully a
629
640
 
630
641
  `search.default_mode` decides the mode a bare `pm search` runs in (`--mode` always wins):
631
642
 
632
- | Value | Behavior |
633
- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
634
- | `auto` | default; `hybrid` when `search.provider` names the active embedding provider and a vector store or extension adapter resolves (or an extension search provider is active), `keyword` otherwise |
635
- | `keyword` | pin exact-token ranking for every bare search |
636
- | `semantic`, `hybrid` | pin the semantic path; an unreachable provider still degrades to keyword hits with a `search_semantic_fallback` warning |
643
+ | Value | Behavior |
644
+ |---|---|
645
+ | `auto` | default; `hybrid` when `search.provider` names the active embedding provider and a vector store or extension adapter resolves (or an extension search provider is active), `keyword` otherwise |
646
+ | `keyword` | pin exact-token ranking for every bare search |
647
+ | `semantic`, `hybrid` | pin the semantic path; an unreachable provider still degrades to keyword hits with a `search_semantic_fallback` warning |
637
648
 
638
649
  Every search result reports `mode_source` (`explicit`, `settings`, or `auto`) beside the effective `mode`.
639
650
 
640
651
  Mutation commands invalidate keyword search caches immediately. Semantic vector refresh is controlled by `search.mutation_refresh_policy`:
641
652
 
642
- | Policy | Behavior |
643
- | --------------------- | ------------------------------------------------------------------------------------------------------------------- |
644
- | `semantic_configured` | default; refresh vectors during mutations only when semantic provider/store settings are explicitly configured |
645
- | `cache_only` | fastest writes; invalidate keyword caches and leave vector refresh to `pm reindex` or `pm health --refresh-vectors` |
646
- | `semantic_auto` | also apply implicit local Ollama/LanceDB defaults during mutations |
653
+ | Policy | Behavior |
654
+ |---|---|
655
+ | `semantic_configured` | default; refresh vectors during mutations only when semantic provider/store settings are explicitly configured |
656
+ | `cache_only` | fastest writes; invalidate keyword caches and leave vector refresh to `pm reindex` or `pm health --refresh-vectors` |
657
+ | `semantic_auto` | also apply implicit local Ollama/LanceDB defaults during mutations |
647
658
 
648
659
  Useful commands:
649
660
 
@@ -28,7 +28,7 @@ Where two descriptions express one experiment, both slugs resolve to its owner.
28
28
  Existing acceptance owners retain their original delivery boundary.
29
29
 
30
30
  | Stable slug | Historical ordinal | Source note (UTC) | Canonical owner | Disposition |
31
- | --- | --- | --- | --- | --- |
31
+ |---|---|---|---|---|
32
32
  | `act-r-activation` | 1 | 2026-07-07T15:12:12.161Z | [pm-fr9ok0](../.agents/pm/tasks/pm-fr9ok0.toon) | Proposed experiment |
33
33
  | `typed-spreading-activation` | 2 | 2026-07-07T15:12:12.161Z | [pm-fdb8e8](../.agents/pm/tasks/pm-fdb8e8.toon) | Proposed experiment |
34
34
  | `learned-linear-signal-weights` | 3 | 2026-07-07T15:12:12.161Z | [pm-ex5p2u](../.agents/pm/tasks/pm-ex5p2u.toon) | Proposed experiment |
@@ -112,7 +112,7 @@ The 18 candidate compositions from pm-vvib retain the architecture decision gate
112
112
  Individual experiment drafts record the ideas without accepting that decision.
113
113
 
114
114
  | Candidate | Composition | Canonical owner |
115
- | --- | --- | --- |
115
+ |---|---|---|
116
116
  | 1 | Prospective memory | [pm-0uvib0](../.agents/pm/tasks/pm-0uvib0.toon) |
117
117
  | 2 | Metacognitive revalidation | [pm-ur2t9o](../.agents/pm/tasks/pm-ur2t9o.toon) |
118
118
  | 3 | Interference and belief revision | [pm-xfta80](../.agents/pm/tasks/pm-xfta80.toon) |
@@ -53,11 +53,11 @@ History writers using item-hash epoch 2 always emit `item_hash_version: 2`. An e
53
53
 
54
54
  Repair keeps implicit legacy streams implicit and byte-stable when no drift exists. Unsupported explicit epochs still fail with a typed `unsupported_item_hash_version` diagnostic instead of being rewritten.
55
55
 
56
- | Writer/runtime range | Item-hash output | Read contract |
57
- | ---------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------ |
58
- | Legacy writers before an explicit marker | implicit epoch 1 | Modern readers retain legacy canonicalization candidates. |
59
- | Observed 2026.8.24 through 2026.8.28 | explicit epoch 2 | Modern readers accept both field-frozen and expanded epoch-2 forms without mixing forms inside one entry. |
60
- | 2026.8.31 and newer | explicit epoch 3 | Exact pins and bounded ranges that cannot select an epoch-3 reader cause current runtimes to reject the write before mutation. |
56
+ | Writer/runtime range | Item-hash output | Read contract |
57
+ |---|---|---|
58
+ | Legacy writers before an explicit marker | implicit epoch 1 | Modern readers retain legacy canonicalization candidates. |
59
+ | Observed 2026.8.24 through 2026.8.28 | explicit epoch 2 | Modern readers accept both field-frozen and expanded epoch-2 forms without mixing forms inside one entry. |
60
+ | 2026.8.31 and newer | explicit epoch 3 | Exact pins and bounded ranges that cannot select an epoch-3 reader cause current runtimes to reject the write before mutation. |
61
61
 
62
62
  The table records confirmed release boundaries rather than inventing an exact
63
63
  first release for legacy epoch 1 or epoch 2. The SDK exports
@@ -46,7 +46,7 @@ identifier is `https://schema.unbrained.dev/pm/corpus-shape/v1`.
46
46
  ## Built-in populations
47
47
 
48
48
  | Shape | Purpose |
49
- |-------|---------|
49
+ |---|---|
50
50
  | `scratch` | Seconds-old, shallow project with minimal history |
51
51
  | `representative` | Medium-lived project with rich evidence and typed lineage |
52
52
  | `deep-graph` | Deep relationship graph with deterministic cycles |
@@ -4,12 +4,12 @@ Tracker: [pm-4020c5](../.agents/pm/issues/pm-4020c5.toon), [pm-jkbqt8](../.agent
4
4
 
5
5
  Dependency rows have one canonical stored spelling per relationship meaning. Command inputs remain compatibility-friendly: hyphens normalize to underscores and the aliases below are accepted, but `pm create` and `pm update` persist the canonical kind. Existing historical rows are never rewritten implicitly.
6
6
 
7
- | Canonical kind | Accepted legacy aliases |
8
- | -------------- | -------------------------------------- |
9
- | `blocked_by` | `depends_on`, `depends-on` |
10
- | `related` | `related_to`, `related-to` |
11
- | `parent` | `child_of`, `child-of`, `epic` |
12
- | `child` | `parent_child`, `parent-child`, `task` |
7
+ | Canonical kind | Accepted legacy aliases |
8
+ |---|---|
9
+ | `blocked_by` | `depends_on`, `depends-on` |
10
+ | `related` | `related_to`, `related-to` |
11
+ | `parent` | `child_of`, `child-of`, `epic` |
12
+ | `child` | `parent_child`, `parent-child`, `task` |
13
13
 
14
14
  `epic` and `task` are compatibility aliases, not item types embedded in the relationship ontology. New integrations should use `parent` or `child` and express the work classification through the item `type` field.
15
15