@unbrained/pm-cli 2026.8.13 → 2026.8.15

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 (194) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +165 -113
  3. package/dist/cli/commander-usage.js +17 -4
  4. package/dist/cli/error-guidance.d.ts +2 -0
  5. package/dist/cli/error-guidance.js +52 -25
  6. package/dist/cli/main.js +40 -3
  7. package/dist/cli/register-mutation.js +4 -2
  8. package/dist/cli/register-operations.js +5 -5
  9. package/dist/cli-bundle/bundle-manifest.json +146 -178
  10. package/dist/cli-bundle/chunks/{chunk-F7FJYGK3.js → chunk-24GAV7XL.js} +2 -2
  11. package/dist/cli-bundle/chunks/chunk-AIM6VT2N.js +13 -0
  12. package/dist/cli-bundle/chunks/chunk-DSWDLTDR.js +197 -0
  13. package/dist/cli-bundle/chunks/{chunk-Q47C67TQ.js → chunk-J42EGKDK.js} +2 -2
  14. package/dist/cli-bundle/chunks/chunk-KIEGUBYQ.js +2 -0
  15. package/dist/cli-bundle/chunks/{chunk-3ZMOWAFM.js → chunk-KLKYLSDX.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-QGTUPEU5.js → chunk-LJHOAVGI.js} +59 -59
  17. package/dist/cli-bundle/chunks/chunk-MEM2ZS3O.js +5 -0
  18. package/dist/cli-bundle/chunks/chunk-QHPCJWEJ.js +35 -0
  19. package/dist/cli-bundle/chunks/{chunk-YLBAPY22.js → chunk-WLPDLNEZ.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-list-query-4HIZ7EA3.js → register-list-query-CT3LFDDN.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-mutation-W64FZ5HN.js → register-mutation-NWEVA5YS.js} +3 -3
  22. package/dist/cli-bundle/chunks/register-operations-AHIAG5KM.js +2 -0
  23. package/dist/cli-bundle/chunks/{register-setup-634MFRXU.js → register-setup-ZJZFVAKE.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/chunk-4X57RE4U.js +2 -0
  25. package/dist/cli-bundle/focused-chunks/chunk-6XKF3PGV.js +18 -0
  26. package/dist/cli-bundle/focused-chunks/chunk-7NJ4QYQ2.js +2 -0
  27. package/dist/cli-bundle/focused-chunks/{chunk-I75MANL7.js → chunk-EXZA4257.js} +2 -2
  28. package/dist/cli-bundle/focused-chunks/chunk-ITAUHSO6.js +50 -0
  29. package/dist/cli-bundle/focused-chunks/{chunk-OOYYKQWX.js → chunk-KLVUMNXJ.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-2RI2FESN.js → chunk-KT5XMYSX.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-E3AVJ655.js → chunk-KTKH4IMG.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/chunk-M67F5AIN.js +8 -0
  33. package/dist/cli-bundle/focused-chunks/{chunk-3DJSGWVB.js → chunk-NSPYTG6G.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/chunk-OKA6ELTL.js +2 -0
  35. package/dist/cli-bundle/focused-chunks/chunk-PUISBOPP.js +2 -0
  36. package/dist/cli-bundle/focused-chunks/chunk-QLNMCESQ.js +155 -0
  37. package/dist/cli-bundle/focused-chunks/{chunk-IIS2FRKL.js → chunk-SLKC6QLJ.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/chunk-U65UC4G3.js +2 -0
  39. package/dist/cli-bundle/focused-chunks/chunk-WTSER4WJ.js +16 -0
  40. package/dist/cli-bundle/focused-chunks/{chunk-2JP7W7GO.js → chunk-ZMFXQ7VF.js} +2 -2
  41. package/dist/cli-bundle/main.js +13 -13
  42. package/dist/cli-bundle/sdk-authoring.js +1 -1
  43. package/dist/cli-bundle/sdk-contracts.js +1 -1
  44. package/dist/cli-bundle/sdk-core.js +41 -41
  45. package/dist/cli-bundle/sdk-governance.js +1 -1
  46. package/dist/cli-bundle/sdk-graph.js +1 -1
  47. package/dist/cli-bundle/sdk-merge.js +110 -1
  48. package/dist/cli-bundle/sdk-query.js +1 -1
  49. package/dist/cli-bundle/sdk-runtime.js +1 -1
  50. package/dist/cli-bundle/sdk-testing.js +1 -1
  51. package/dist/cli-bundle/sdk.js +2 -2
  52. package/dist/core/diagnostics/remediation.js +7 -2
  53. package/dist/core/extensions/reserved-host-flags.js +3 -2
  54. package/dist/core/history/drift-scan.d.ts +6 -0
  55. package/dist/core/history/drift-scan.js +74 -50
  56. package/dist/core/history/replay.d.ts +14 -1
  57. package/dist/core/history/replay.js +45 -8
  58. package/dist/core/history/workspace-history.d.ts +59 -0
  59. package/dist/core/history/workspace-history.js +197 -10
  60. package/dist/core/output/output.d.ts +2 -0
  61. package/dist/core/output/output.js +13 -4
  62. package/dist/core/shared/command-types.d.ts +2 -0
  63. package/dist/core/shared/command-types.js +2 -2
  64. package/dist/core/shared/errors.d.ts +12 -0
  65. package/dist/core/shared/errors.js +2 -2
  66. package/dist/mcp/tool-definitions.js +9 -5
  67. package/dist/sdk/agent/refusal-reachability.d.ts +61 -0
  68. package/dist/sdk/agent/refusal-reachability.js +91 -3
  69. package/dist/sdk/cli-bootstrap.d.ts +2 -0
  70. package/dist/sdk/cli-bootstrap.js +7 -2
  71. package/dist/sdk/cli-contracts/completeness.js +3 -2
  72. package/dist/sdk/cli-contracts/flag-contracts.js +3 -2
  73. package/dist/sdk/cli-contracts/registration-helpers.js +3 -2
  74. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +11 -1
  75. package/dist/sdk/cli-contracts/runtime-contracts.js +176 -65
  76. package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -5
  77. package/dist/sdk/cli-contracts/tool-schema.js +10 -3
  78. package/dist/sdk/cli-program.js +4 -3
  79. package/dist/sdk/context-relevance.js +12 -4
  80. package/dist/sdk/core.d.ts +2 -2
  81. package/dist/sdk/core.js +3 -3
  82. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -2
  83. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +50 -26
  84. package/dist/sdk/governance/assurance-action.d.ts +7 -1
  85. package/dist/sdk/governance/assurance-action.js +7 -6
  86. package/dist/sdk/governance/assurance-mutation-error.d.ts +42 -1
  87. package/dist/sdk/governance/assurance-mutation-error.js +27 -3
  88. package/dist/sdk/governance/assurance-runtime.js +12 -11
  89. package/dist/sdk/governance/assurance.d.ts +9 -0
  90. package/dist/sdk/governance/assurance.js +82 -16
  91. package/dist/sdk/governance/extension-host-version.d.ts +25 -0
  92. package/dist/sdk/governance/extension-host-version.js +105 -0
  93. package/dist/sdk/governance/health.d.ts +32 -1
  94. package/dist/sdk/governance/health.js +132 -28
  95. package/dist/sdk/governance/provenance-health.d.ts +27 -0
  96. package/dist/sdk/governance/provenance-health.js +95 -3
  97. package/dist/sdk/governance/validate-history-drift.d.ts +7 -0
  98. package/dist/sdk/governance/validate-history-drift.js +68 -0
  99. package/dist/sdk/governance/validate.js +9 -52
  100. package/dist/sdk/governance.d.ts +6 -0
  101. package/dist/sdk/governance.js +8 -2
  102. package/dist/sdk/graph/assembly.d.ts +23 -0
  103. package/dist/sdk/graph/assembly.js +54 -2
  104. package/dist/sdk/graph/durable-cache.js +50 -20
  105. package/dist/sdk/graph/governance-contracts.d.ts +1 -1
  106. package/dist/sdk/graph/governance-contracts.js +4 -2
  107. package/dist/sdk/graph/governance.d.ts +21 -1
  108. package/dist/sdk/graph/governance.js +94 -32
  109. package/dist/sdk/graph/index.d.ts +2 -2
  110. package/dist/sdk/graph/index.js +4 -4
  111. package/dist/sdk/graph/mutation-advisory.js +15 -7
  112. package/dist/sdk/graph/remediation.js +12 -2
  113. package/dist/sdk/history-read.d.ts +8 -0
  114. package/dist/sdk/history-read.js +2 -2
  115. package/dist/sdk/history-repair.d.ts +13 -1
  116. package/dist/sdk/history-repair.js +62 -18
  117. package/dist/sdk/index.d.ts +1 -1
  118. package/dist/sdk/index.js +3 -3
  119. package/dist/sdk/linked-artifacts.js +16 -5
  120. package/dist/sdk/pagination.d.ts +15 -0
  121. package/dist/sdk/pagination.js +9 -5
  122. package/dist/sdk/query/context.d.ts +5 -1
  123. package/dist/sdk/query/context.js +14 -5
  124. package/dist/sdk/query/history.js +20 -3
  125. package/dist/sdk/read-output/continuation.d.ts +11 -0
  126. package/dist/sdk/read-output/continuation.js +132 -0
  127. package/dist/sdk/read-output-budget.d.ts +3 -1
  128. package/dist/sdk/read-output-budget.js +24 -13
  129. package/dist/sdk/read-output-contracts.d.ts +127 -7
  130. package/dist/sdk/read-output-contracts.js +381 -35
  131. package/dist/sdk/read-output-rows.d.ts +13 -0
  132. package/dist/sdk/read-output-rows.js +60 -2
  133. package/dist/sdk/runtime-input.js +4 -2
  134. package/dist/sdk/runtime-primitives.d.ts +1 -1
  135. package/dist/sdk/runtime-primitives.js +3 -3
  136. package/dist/sdk/runtime.js +5 -3
  137. package/docs/ASSURANCE.md +68 -2
  138. package/docs/COMMANDS.md +39 -4
  139. package/docs/READ_OUTPUT_CONTRACTS.md +85 -8
  140. package/docs/RELATIONSHIP_GRAPH.md +20 -5
  141. package/docs/RELEASING.md +42 -5
  142. package/docs/SDK.md +12 -5
  143. package/docs/SDK_CONTEXT_INTEGRITY.md +94 -1
  144. package/docs/TESTING.md +23 -1
  145. package/docs/performance/sdk-entrypoint-import-costs.md +20 -13
  146. package/marketplace.json +2 -2
  147. package/package.json +7 -7
  148. package/packages/pm-beads/extensions/beads/index.ts +1 -0
  149. package/packages/pm-beads/package.json +1 -1
  150. package/packages/pm-calendar/extensions/calendar/index.ts +1 -0
  151. package/packages/pm-calendar/package.json +1 -1
  152. package/packages/pm-command-kit/package.json +1 -1
  153. package/packages/pm-digital-twin/extensions/digital-twin/index.ts +7 -0
  154. package/packages/pm-digital-twin/package.json +1 -1
  155. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +4 -0
  156. package/packages/pm-governance-audit/package.json +1 -1
  157. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +5 -0
  158. package/packages/pm-guide-shell/package.json +1 -1
  159. package/packages/pm-kanban/package.json +1 -1
  160. package/packages/pm-lifecycle-hooks/package.json +1 -1
  161. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +6 -0
  162. package/packages/pm-linked-test-adapters/package.json +1 -1
  163. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +2 -0
  164. package/packages/pm-search-advanced/package.json +1 -1
  165. package/packages/pm-templates/extensions/templates/index.ts +4 -0
  166. package/packages/pm-templates/package.json +1 -1
  167. package/packages/pm-todos/extensions/todos/index.ts +2 -0
  168. package/packages/pm-todos/package.json +1 -1
  169. package/packages/pm-vcs/extensions/vcs/index.ts +7 -0
  170. package/packages/pm-vcs/package.json +1 -1
  171. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  172. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  173. package/scripts/bundle-cli.mjs +17 -4
  174. package/sdk/public-surface.json +1283 -157
  175. package/dist/cli-bundle/chunks/chunk-DEDU3DG7.js +0 -196
  176. package/dist/cli-bundle/chunks/chunk-DL5M5J3V.js +0 -13
  177. package/dist/cli-bundle/chunks/chunk-HIUZVCMN.js +0 -5
  178. package/dist/cli-bundle/chunks/chunk-IMGIN7R6.js +0 -2
  179. package/dist/cli-bundle/chunks/chunk-TF3TPKPR.js +0 -34
  180. package/dist/cli-bundle/chunks/register-operations-C44ET7R5.js +0 -2
  181. package/dist/cli-bundle/focused-chunks/chunk-27N23W6M.js +0 -31
  182. package/dist/cli-bundle/focused-chunks/chunk-3BNVU6LC.js +0 -8
  183. package/dist/cli-bundle/focused-chunks/chunk-6MLIRBLV.js +0 -5
  184. package/dist/cli-bundle/focused-chunks/chunk-6XYLENDV.js +0 -155
  185. package/dist/cli-bundle/focused-chunks/chunk-CP4K4WFS.js +0 -2
  186. package/dist/cli-bundle/focused-chunks/chunk-EBTNSFYE.js +0 -2
  187. package/dist/cli-bundle/focused-chunks/chunk-HC2OL2H2.js +0 -2
  188. package/dist/cli-bundle/focused-chunks/chunk-NFHFZH2Z.js +0 -2
  189. package/dist/cli-bundle/focused-chunks/chunk-OGC4XSBC.js +0 -17
  190. package/dist/cli-bundle/focused-chunks/chunk-PKPOZXLL.js +0 -2
  191. package/dist/cli-bundle/focused-chunks/chunk-QDZUABWL.js +0 -2
  192. package/dist/cli-bundle/focused-chunks/chunk-QQX5TDFT.js +0 -16
  193. package/dist/cli-bundle/focused-chunks/chunk-TEZIXMTH.js +0 -2
  194. package/dist/cli-bundle/focused-chunks/chunk-WEH6NSL6.js +0 -18
package/docs/RELEASING.md CHANGED
@@ -24,7 +24,8 @@ Tracked documentation work: [pm-u9d0](../.agents/pm/epics/pm-u9d0.toon),
24
24
  [pm-lwnifd](../.agents/pm/issues/pm-lwnifd.toon), and SDK-bound reliability
25
25
  classification [pm-dqtzva](../.agents/pm/issues/pm-dqtzva.toon).
26
26
  The local/hosted gate selection contract is tracked by
27
- [pm-ei6x66](../.agents/pm/tasks/pm-ei6x66.toon).
27
+ [pm-ei6x66](../.agents/pm/tasks/pm-ei6x66.toon). Release-candidate analyzer
28
+ provenance is tracked by [pm-u1baah](../.agents/pm/issues/pm-u1baah.toon).
28
29
 
29
30
  ## Version Policy
30
31
 
@@ -80,6 +81,9 @@ Policy:
80
81
  creating an ordinal replacement; an already-successful run is recorded as
81
82
  recovered without republishing
82
83
  - release preparation must pass all quality and compatibility gates before commit+tag push
84
+ - before dependency installation or build, auto-release verifies that the
85
+ candidate has exact-commit analyzer results or an immutable tree-identical
86
+ reviewed PR head with successful DeepScan and CodeFactor results
83
87
  - `CHANGELOG.md` is generated by the latest npm `pm-changelog` package (`pm install npm:pm-changelog --project`, then `pm changelog generate --mode replace --all-release-tags`) from closed tracker items across git release tag windows and checked in CI; do not edit it by hand
84
88
  - protected-branch pushes require `RELEASE_PAT`; Auto Release fails fast before the expensive release gates when `push=true`, `dry_run=false`, and that secret is not configured
85
89
  - release reliability gating requires `SENTRY_PERSONAL_ADMIN_TOKEN` for issue-threshold checks; Auto Release fails before creating the version commit/tag when the token is missing and `push=true`, while sourcemap upload remains optional through `SENTRY_AUTH_TOKEN`
@@ -196,8 +200,9 @@ The build writes `dist/cli-bundle/bundle-manifest.json` atomically with SHA-256
196
200
 
197
201
  4. Run the same release pipeline locally.
198
202
 
199
- Push the final implementation commit first, wait for DeepScan and CodeFactor to
200
- finish on that reviewed SHA, then run the canonical registry-owned preflight:
203
+ Push the final implementation commit through a reviewed pull request first,
204
+ wait for DeepScan and CodeFactor to finish on that reviewed SHA, then run the
205
+ canonical registry-owned preflight:
201
206
 
202
207
  ```bash
203
208
  pnpm verify:preflight
@@ -207,7 +212,8 @@ The registry supplies the ordered executable plan, command arguments,
207
212
  environment, capture policy, and explicit skip policy. Its receipt distinguishes
208
213
  passed checks from declared skips. The same registry maps named PR, nightly,
209
214
  and release workflow gates; hosted-only entries must explain why no faithful
210
- local equivalent exists.
215
+ local equivalent exists. Analyzer provenance is the first executable step, so
216
+ an unreleasable candidate fails before build, coverage, or package work.
211
217
 
212
218
  The preflight includes the mandatory local hosted-analysis proof:
213
219
 
@@ -218,13 +224,44 @@ pnpm quality:hosted-analysis
218
224
  The gate accepts only DeepScan's explicit zero-new-issue status and
219
225
  CodeFactor's explicit no-issues result. Both contexts are required by `main`
220
226
  branch protection, and the release pipeline reruns the same immutable-tree
221
- proof. It reads the release commit first. When GitHub does not copy app results
227
+ proof. The gate reads branch protection through REST first; if that transport
228
+ is unavailable or its core API quota is exhausted, it queries the equivalent
229
+ GraphQL rules across every cursor-paginated page and still requires one exact
230
+ `main` rule with strict updates plus both analyzer contexts. Malformed,
231
+ truncated, missing, or ambiguous admin policy data fails closed. GitHub Actions'
232
+ ephemeral token cannot request the repository `Administration: read` permission
233
+ required by both of those policy surfaces. When both admin transports reject
234
+ that token, the gate uses the contents-readable `GET /branches/main` summary
235
+ and requires that the exact candidate is the current protected branch head,
236
+ protection is enabled and enforced, and CodeFactor plus DeepScan are effective
237
+ required contexts. That summary intentionally cannot attest the admin-only
238
+ strict-update setting: its receipt reports `strict: null`,
239
+ `strict_verified: false`, and `verification_scope: effective_required_checks`
240
+ instead of inventing a positive result. Exact or immutable identical-tree
241
+ analyzer provenance remains mandatory and is emitted beside the policy receipt,
242
+ so the restricted-token recovery cannot admit an unanalyzed or different-tree
243
+ candidate. A maintainer token with administration-read access still verifies
244
+ and reports `strict: true` through REST or paginated GraphQL. It reads the
245
+ release commit first. When GitHub does not copy app results
222
246
  onto a merge commit, the gate may reuse a reviewed merge-parent or squash-PR
223
247
  head only when its immutable Git tree SHA exactly matches the release commit.
224
248
  Squash provenance additionally requires one unambiguous GitHub association to a
225
249
  closed PR merged into `main` with the release commit as its merge commit.
226
250
  Missing, ambiguous, or different-tree provenance fails closed.
227
251
 
252
+ The supported default-branch arrival path is a reviewed pull request. A direct
253
+ push to `main` is releasable only if both analyzers attached successful evidence
254
+ to that exact commit; when they did not, the gate explicitly refuses the
255
+ candidate instead of letting the next scheduled release discover the missing
256
+ precondition after expensive work. CI runs `Release analyzer readiness (main)`
257
+ on every product-relevant push to `main`, providing continuous visibility
258
+ between release attempts. If GitHub's commit-association endpoint has not yet
259
+ published a new merge, the gate reads the pull-request number from GitHub's
260
+ standard merge message and accepts it only after the immutable PR resource
261
+ confirms that exact merge SHA, `main` base, and reviewed head. Remediate a
262
+ refused direct-main candidate by landing the next tree-changing fix through a
263
+ reviewed PR; never copy, synthesize, or bypass analyzer evidence.
264
+
228
265
  ```bash
229
266
  # Read-only parity check
230
267
  pnpm release:pipeline:dry-run
package/docs/SDK.md CHANGED
@@ -284,7 +284,7 @@ Command/action contract exports:
284
284
  - Large-workspace memory primitives: `buildWorkspaceMemorySnapshot`, `readWorkspaceMemory`, `selectWorkspaceMemoryRollups`, and `searchWorkspaceMemory` build cursor-bound, rebuildable calendar-epoch and epic-lineage summaries. The stock `context` and `search` results attach matching bounded rollups automatically at 10,000 items; smaller projects skip the artifact entirely.
285
285
  - Persistent metadata-query primitives: `queryItemMetadataIndex` with `ItemMetadataIndexQuery` / `ItemMetadataIndexQueryResult` executes bounded status/type/id/parent/assignee/sprint/release/priority windows without materializing the JSON metadata corpus. It returns `null` on absent, stale, or corrupt derived state so custom hosts can fall back to authoritative reads.
286
286
  - Schema-evolution primitives: `planSchemaEvolutionMigration` and `runSchemaEvolutionMigration`, plus `PmClient.schemaRenameType`, `schemaRenameField`, and `schemaRemapStatus`, provide deterministic dry-run plans, collision refusal, index-backed candidate selection, per-item immutable history, and crash-resumable workspace transactions.
287
- - Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream instead of inventing an unaudited side log.
287
+ - Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `inspectWorkspaceHistoryState`, `reconcileWorkspaceJsonHistory`, `restoreWorkspaceJsonFromHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream, prove replay-to-disk agreement, and recover forward without inventing an unaudited side log or rewriting history.
288
288
  - Typed annotation and relationship primitives on `PmClient`: `comments`, `notes`, `learnings`, `files`, `filesDiscover`, `docs`, `deps`, `graph`, and `append`
289
289
  - Workspace graph-query runner: `runGraph` (with `GraphCommandOptions`, `GraphResult`, and per-subcommand envelopes) resolves the workspace relationship graph through the shared fingerprint-keyed cache and dispatches bounded `ancestors`/`descendants`/`predecessors`/`successors`/`paths`/`impact`/`analyze`/`audit`/`communities`/`redundancy`/`dominators`/`slack`/`centrality`/`articulation`/`plan` queries with counts-first cost, truncation, and cache metadata; the `pm graph` CLI command and `pm_graph` MCP tool are thin adapters over it.
290
290
  - Structural graph analytics: `detectRelationshipCommunities` (deterministic label-propagation clustering with `maxIterations`/`minSize` bounds and convergence reporting), `findRedundantRelationshipEdges` (transitive-reduction scan that joins each directed ordering or hierarchy kind with its inverse spelling and returns witness paths), and `computeRelationshipDominators` (Cooper–Harvey–Kennedy immediate dominators with per-node gating weights for bottleneck ranking) — all deterministic, cancellable, and cost-metered like every other graph query.
@@ -292,8 +292,8 @@ Command/action contract exports:
292
292
  - Incremental graph cache: `WorkspaceGraphCache`, `workspaceGraphCache`, `resetWorkspaceGraphCache`, and `computeWorkspaceGraphFingerprint` reuse the assembled workspace graph and memoize deterministic query results under a fingerprint that digests every relationship-relevant item field (id, title, status and terminal classification, item type, parent, legacy blocker, structured dependencies), so long-lived hosts stop paying full-workspace assembly per bounded query; `GraphCacheMetadata` reports assembly/result hit-or-miss on every `runGraph` envelope.
293
293
  - Durable graph index: `openDurableGraphCache`, `persistDurableGraphResult`, `clearDurableGraphCache`, `durableGraphCacheStatus`, `shouldPersistDurableGraphCache`, and the `durableGraphCachePath`/`graphAuditBaselinePath` locators persist fingerprint-keyed deterministic query results across processes under `runtime/graph-cache.json` — atomic writes, corrupt-tolerant decode, bounded retention, never authoritative (rebuildable from item storage), optional below the `GRAPH_DURABLE_CACHE_MIN_ITEMS` threshold; `pm graph index` is the maintenance surface and `cache.durable` the per-envelope observability.
294
294
  - Temporal audit census: `RelationshipAuditSnapshot`, `diffRelationshipAuditSnapshots`, `saveGraphAuditBaseline`, and `loadGraphAuditBaseline` persist and compare point-in-time governance censuses (signed per-code and per-profile deltas, `same_snapshot` fingerprint equality) behind `pm graph audit --save-baseline` and the automatic `baseline` drift block on later audits.
295
- - Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder (the `duplicate_dependency_row`/`legacy_duplicate_dependency_row` audit families; invisible to assembled-graph projections), `RelationshipCoverageProfile.coverage_by_type` breaks active connectivity down per item type, and `RelationshipAuditOptions.isolateExemptTypes` suppresses coverage findings for policy-valid disconnected types.
296
- - Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph (shared `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation), and `resolveWorkspaceRelationshipKindRegistry` exposes the built-in-plus-extension relationship-kind registry resolution every surface shares.
295
+ - Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder; `collectOrderingStorageContradictions` reports exact scalar blocker plus opposite-precedence structured rows before graph normalization; `RelationshipCoverageProfile` separates diagnostic `nodes`/`edges` from invariant-bearing `recorded_nodes`/`informative_edges` and independent redundancy/contradiction debt counts; `coverage_by_type` breaks active connectivity down per item type, and `RelationshipAuditOptions.isolateExemptTypes` suppresses coverage findings for policy-valid disconnected types.
296
+ - Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph and emits exact newly stored scalar-versus-structured contradiction evidence before the derived cycle warning (shared registry and `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation).
297
297
  - Remediation planning: `planRelationshipRemediation` (with `RelationshipRemediationPlan`, `RelationshipRemediationStep`, and operation/confidence/code contracts) derives exact dry-run `remove`/`retype`/`supersede`/`waive`/`investigate` proposals from governance-audit findings and witnessed redundancy rows — evidence-backed, confidence-rated, and never auto-applied.
298
298
  - Annotation and relationship option/result contracts: `CommentsCommandOptions` / `CommentsResult`, `NotesCommandOptions` / `NotesResult`, `LearningsCommandOptions` / `LearningsResult`, `FilesCommandOptions` / `FilesResult`, `FilesDiscoverOptions` / `FilesDiscoverResult`, `DocsCommandOptions` / `DocsResult`, `DepsCommandOptions` / `DepsResult`, `AppendCommandOptions` / `AppendResult`
299
299
  - Annotation kernel primitives: `resolveAnnotationInput`, `runAnnotationCommand`, `resolveAnnotationIndex`, `parseAnnotationTextInput`, `limitAnnotationEntries`, `readAnnotationEntries`, `wrapOwnershipConflict`, `isErrnoError`, and their typed input/config/result contracts
@@ -1167,10 +1167,17 @@ snapshot, atomic write, history append, and any compensating restore, so
1167
1167
  competing SDK writers cannot split persisted state from its audit chain. The
1168
1168
  stream participates in the history merge driver, appears in `pm activity`, and
1169
1169
  can be checked with
1170
- `pm history _workspace --verify`. Package authors that persist their own
1170
+ `pm history _workspace --verify`. Verification also replays the latest document
1171
+ map and compares every governed JSON singleton with disk; a valid chain is not
1172
+ reported healthy when the live document differs. Package authors that persist their own
1171
1173
  singleton JSON should call `writeWorkspaceJsonWithHistory`; use
1172
1174
  `appendWorkspaceHistoryChange` only when another primitive already owns the
1173
- document write.
1175
+ document write. Recovery code uses `inspectWorkspaceHistoryState` for the
1176
+ read-only classification, `reconcileWorkspaceJsonHistory` only when a terminal
1177
+ Decision explicitly authorizes adoption of the reviewed disk value, and
1178
+ `restoreWorkspaceJsonFromHistory` to reject drift and replace the singleton
1179
+ from a verified version. Reconciliation and restoration append new entries and
1180
+ compensate failed writes; neither edits historical rows.
1174
1181
 
1175
1182
  ```ts
1176
1183
  import {
@@ -1,6 +1,6 @@
1
1
  # SDK Context Integrity
2
2
 
3
- Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), and [pm-h97qxd](../.agents/pm/issues/pm-h97qxd.toon).
3
+ Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), [pm-h97qxd](../.agents/pm/issues/pm-h97qxd.toon), [pm-h06944](../.agents/pm/issues/pm-h06944.toon), [pm-5t33or](../.agents/pm/features/pm-5t33or.toon), [pm-in23qu](../.agents/pm/issues/pm-in23qu.toon), [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), [pm-okgxwa](../.agents/pm/issues/pm-okgxwa.toon), [pm-22rzjp](../.agents/pm/issues/pm-22rzjp.toon), [pm-76fkpp](../.agents/pm/issues/pm-76fkpp.toon), [pm-igdvfq](../.agents/pm/issues/pm-igdvfq.toon), [pm-643e0k](../.agents/pm/issues/pm-643e0k.toon), and [pm-larv4r](../.agents/pm/issues/pm-larv4r.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
@@ -31,6 +31,67 @@ selector grammar and omission receipts as any other SDK-owned item field.
31
31
 
32
32
  The same SDK-owned read-output registry now declares `package manage` as a first-class read surface. Package authors can resolve either `package manage` or `package-manage` to its canonical contract and discover the universal include, amount, cost, and encoding dimensions without copying CLI knowledge.
33
33
 
34
+ Compatibility aliases declare whether their migration promise is an exact
35
+ `replacement` or only `behavior_preserving`. Exact projection modes are
36
+ available through `readOutputIncludeModeOptions()` and are executed against
37
+ their legacy spelling in the temporary-tracker contract suite. Execution
38
+ controls such as `deps --collapse <value>` and `health --check-only` retain
39
+ their independent semantics and are never exposed as false include-mode
40
+ replacements.
41
+
42
+ Every registered read surface also resolves a format-aware default token ceiling
43
+ from the public command-output contract. Results already inside that ceiling are
44
+ returned byte-for-byte unchanged, so the safety default adds no receipt overhead
45
+ to ordinary reads. Oversized results follow the shared compaction ladder and
46
+ identify `budget_source: default` plus the applied `budget_tokens` in their
47
+ `read_output` receipt. Complete internal artifacts and callers that intentionally
48
+ accept unbounded output must say so explicitly with `--output-budget unbounded`
49
+ or `outputBudget: "unbounded"`; that opt-out is distinct from row-count
50
+ `--unbounded` compatibility behavior.
51
+
52
+ The budget ladder separately discovers nested arrays below declared result
53
+ rows. This lets governance envelopes reduce diagnostic findings before
54
+ omitting the whole verdict without redefining a nested tag or remediation list
55
+ as a pagination row. Receipts name every `compacted_row_paths` entry; a complete
56
+ omission also records the useful result's pre-omission estimate, while the
57
+ recovery names a bounded budget increase when no declared row path can resume.
58
+
59
+ Budget-compacted declared rows instead publish a bounded `outputCursor`
60
+ continuation on every transport. The cursor resumes the first withheld row and
61
+ rejects a command, path, row-total, or stable-identity mismatch. This gives SDK
62
+ and package loops a recursive self-improvement primitive: consume a bounded
63
+ page, update context, and continue without abandoning the ceiling.
64
+
65
+ `context --explain-ranking` projects explanations to the focus rows actually
66
+ served. `candidate_count` records the scorer population and `omitted_count`
67
+ records explanations intentionally withheld, while each returned row retains
68
+ its rank, baseline rank, score, and per-signal contributions. Explanation cost
69
+ therefore scales with the answer rather than with the active workspace.
70
+
71
+ Unknown-option recovery is likewise derived from the declared flag lexicon.
72
+ The structured `option_scope` is `declared_on_path`, `declared_elsewhere`, or
73
+ `declared_nowhere`; accepting command paths are included only for the second
74
+ case, while the third names the nearest current-path spellings and explicitly
75
+ terminates the otherwise-unbounded command search.
76
+
77
+ ## Executable recovery-reference coverage
78
+
79
+ Structured refusal guidance is a forward-reference contract, not decorative
80
+ text. `verifyPmRecoveryReferences` accepts obligations derived from real error
81
+ envelopes and observations produced by executing a retry, resolving a declared
82
+ command path, or linking prose to an already executed recovery. Its report
83
+ includes the total obligation set, pass fraction, sorted findings, and stable
84
+ coverage buckets for `suggested_retry`, `candidate_command`, `example`, and
85
+ `next_step`, including zero-population buckets.
86
+
87
+ The repository integration corpus drives real CLI refusals, executes the
88
+ emitted retry in a temporary tracker, compares candidate commands with the
89
+ unbounded runtime contract enumeration, and binds examples and next steps to
90
+ those proofs. A seeded unreachable observation must lower the pass fraction
91
+ and produce `unreachable_reference`. The same corpus is a provider-backed
92
+ blocking assertion in `repository-context-quality`, so a well-formed but broken
93
+ recovery promise cannot pass CI merely because its text or target flag exists.
94
+
34
95
  ## Row discovery and exact output receipts
35
96
 
36
97
  Row locations and encoding capabilities remain part of the SDK-owned read
@@ -85,6 +146,12 @@ The SDK exposes `resolveUnknownAuthorAcknowledgmentSelector` and `parseUnknownAu
85
146
 
86
147
  Storage integrity is evaluated independently of that provider boundary. Lossless merge receipts remain visible as provenance, while only receipts containing discarded scalar values produce `merge_decisions_unreviewed` guidance; neither classification enables vector refresh or remote provider I/O.
87
148
 
149
+ Default history-drift verification also replays the append-only `_workspace`
150
+ stream and compares every governed singleton with its latest recorded state.
151
+ That agreement check reads only local history and JSON files: mismatched,
152
+ missing, or unreadable singleton paths become bounded `history_drift` evidence
153
+ without enabling embeddings, vector-store access, or any other provider I/O.
154
+
88
155
  Brief and summary check-only health projections use the scalar-only metadata
89
156
  reader. Validation uses collection-bearing metadata for evidence and
90
157
  relationship checks and materializes bodies only when strict history-drift
@@ -103,6 +170,26 @@ never succeeded. The same bounded pass classifies bare boolean and single-digit
103
170
  values across every recorded provenance dimension, publishes only aggregate
104
171
  harness/dimension/kind counts, and never echoes the historical value.
105
172
 
173
+ `historyRepair` and `historyRepairAll` retain the detected history hash epoch
174
+ instead of unconditionally upgrading it. `normalizeProvenance: true` adds a
175
+ privacy-safe repair mode that removes invalid bounded observations and records
176
+ only aggregate counts/classes in the synthetic audit event. The bulk form
177
+ selects both drifted streams and streams requiring provenance normalization.
178
+
179
+ Health results are self-indexing: every retained warning has a `findings` row
180
+ with its owning check, stable code, severity, and either executable remediation
181
+ or an explicit safe refusal. `failed_because` contains the exact warning tokens
182
+ that decide `ok: false` and survives brief/summary projection. Extension health
183
+ adds a host-version census by resolving the pm-cli package visible from each
184
+ loaded extension; npm/pnpm duplicate-version skew is gate-failing while matching
185
+ workspace-linked and deduplicated copies remain green.
186
+
187
+ Linked file/doc add parsing uses one SDK allowlist. Whitespace-free filesystem
188
+ paths and scheme-prefixed URLs remain positional even when a path or query
189
+ contains `=`. Leading assignment syntax, including malformed URL-plus-note
190
+ input, must use the declared `path`, `scope`, and `note` keys or fail before
191
+ mutation.
192
+
106
193
  ## Replication and refusal gate
107
194
 
108
195
  `scripts/release/surface-replication-sets.json` declares replicated SDK, CLI, MCP, documentation, and test members. `pnpm quality:surface-replication` activates sets from the Git changeset, verifies every member invariant, and reports:
@@ -114,6 +201,12 @@ harness/dimension/kind counts, and never echoes the historical value.
114
201
  - an AST-derived denominator of identical named rule bodies, declared coverage,
115
202
  and a non-decreasing detected-cluster floor.
116
203
 
204
+ Trigger entries may constrain a shared file with `changed_lines_contain_any`.
205
+ The set then activates only when an added or removed diff line carries one of
206
+ those contract markers. Missing diff evidence fails closed and activates the
207
+ set, while an unrelated hunk in the same shared table does not force artificial
208
+ edits across every replicated member.
209
+
117
210
  Query waivers directly with:
118
211
 
119
212
  ```bash
package/docs/TESTING.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This page describes safe local tests, linked tests, coverage, and release-readiness checks.
4
4
 
5
- Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon).
5
+ Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon), [pm-rizqb6](../.agents/pm/issues/pm-rizqb6.toon).
6
6
 
7
7
  ## Agent Quick Context
8
8
 
@@ -100,6 +100,28 @@ node scripts/run-tests.mjs test -- tests/integration/cli.integration.spec.ts
100
100
 
101
101
  Use focused runs while iterating, then run coverage before closure when risk or scope warrants it.
102
102
 
103
+ ## CI Retry and Timeout Diagnostics
104
+
105
+ CI retains the 30-second per-test timeout and retries one failed attempt. A
106
+ test that passes only on retry is reported as flaky rather than silently folded
107
+ into the pass count; a persistent assertion still fails after the bounded
108
+ retry. Local runs do not retry, so deterministic failures stay immediate while
109
+ iterating.
110
+
111
+ Vitest's GitHub reporter emits annotations and retry evidence. The repository
112
+ reliability reporter additionally writes
113
+ `.vitest-reports/reliability-<shard>.json` and appends a job-summary table with
114
+ the test identity, file, duration, effective timeout, retry count, shard, and
115
+ failure detail. Tests completing at or above 80% of their timeout are recorded
116
+ as at-risk before load turns them into timeouts. Coverage shards upload this
117
+ JSON beside their blob report, so recurrence can be measured without decoding
118
+ the coverage artifact or re-reading raw logs.
119
+
120
+ `PM_TEST_SHARD` supplies a stable shard identity and
121
+ `PM_TEST_RELIABILITY_REPORT_DIR` can redirect the JSON report for an isolated
122
+ harness. These variables affect diagnostics only; they do not change test
123
+ selection, retry count, timeout, or verdicts.
124
+
103
125
  ## Coverage Governance
104
126
 
105
127
  Coverage gating now targets literal all-source coverage across runtime code families:
@@ -1,7 +1,9 @@
1
1
  # SDK entrypoint import costs
2
2
 
3
3
  Tracked by [pm-38bskj](../../.agents/pm/tasks/pm-38bskj.toon) and
4
- [pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon).
4
+ [pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon). Standalone merge-bundle
5
+ topology is tracked by
6
+ [pm-m9gu9r](../../.agents/pm/chores/pm-m9gu9r.toon).
5
7
 
6
8
  This table measures fresh-process ESM import and module evaluation. The bare
7
9
  Node v26.5.0 process floor on linux/x64
@@ -13,20 +15,25 @@ against the unchanged upper-bound budget and 30 ms scheduler margin. A single
13
15
  cold or descheduled process therefore cannot fail the gate, while a majority of
14
16
  over-budget samples still does; p95 remains visible as diagnostic evidence.
15
17
 
16
- | Package export | p50 | p95 | p50 above Node | Reduction vs aggregate |
17
- |---|---:|---:|---:|---:|
18
- | `./sdk` | 248 ms | 249 ms | 207 ms | 0% |
19
- | `./sdk/authoring` | 71 ms | 76 ms | 30 ms | 85.5% |
20
- | `./sdk/contracts` | 73 ms | 87 ms | 32 ms | 84.5% |
21
- | `./sdk/core` | 221 ms | 255 ms | 180 ms | 13% |
22
- | `./sdk/governance` | 154 ms | 161 ms | 113 ms | 45.4% |
23
- | `./sdk/graph` | 87 ms | 87 ms | 46 ms | 77.8% |
24
- | `./sdk/merge` | 111 ms | 122 ms | 70 ms | 66.2% |
25
- | `./sdk/query` | 100 ms | 105 ms | 59 ms | 71.5% |
26
- | `./sdk/runtime` | 251 ms | 289 ms | 210 ms | -1.4% |
27
- | `./sdk/testing` | 241 ms | 307 ms | 200 ms | 3.4% |
18
+ | Package export | p50 | p95 | p50 above Node | Reduction vs aggregate |
19
+ | ------------------ | -----: | -----: | -------------: | ---------------------: |
20
+ | `./sdk` | 248 ms | 249 ms | 207 ms | 0% |
21
+ | `./sdk/authoring` | 71 ms | 76 ms | 30 ms | 85.5% |
22
+ | `./sdk/contracts` | 73 ms | 87 ms | 32 ms | 84.5% |
23
+ | `./sdk/core` | 221 ms | 255 ms | 180 ms | 13% |
24
+ | `./sdk/governance` | 154 ms | 161 ms | 113 ms | 45.4% |
25
+ | `./sdk/graph` | 87 ms | 87 ms | 46 ms | 77.8% |
26
+ | `./sdk/merge` | 111 ms | 122 ms | 70 ms | 66.2% |
27
+ | `./sdk/query` | 100 ms | 105 ms | 59 ms | 71.5% |
28
+ | `./sdk/runtime` | 251 ms | 289 ms | 210 ms | -1.4% |
29
+ | `./sdk/testing` | 241 ms | 307 ms | 200 ms | 3.4% |
28
30
 
29
31
  The aggregate `@unbrained/pm-cli/sdk` remains supported for compatibility.
30
32
  New packages should import the narrowest subpath that owns their capability.
33
+ The build emits `./sdk/merge` as a standalone no-splitting bundle because its
34
+ dependency closure overlaps with several broader focused entrypoints. Keeping
35
+ that surface in the shared focused chunk graph made a merge-only import traverse
36
+ unrelated chunks; the isolated output preserves the same public exports while
37
+ keeping its runtime loading cost proportional to the capability requested.
31
38
  The committed budget file is an upper-bound ratchet and must not be weakened to
32
39
  hide a regression.
package/marketplace.json CHANGED
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
9
- "version": "2026.8.13"
9
+ "version": "2026.8.15"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "pm-claude",
14
14
  "source": "./plugins/pm-claude",
15
15
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
16
- "version": "2026.8.13",
16
+ "version": "2026.8.15",
17
17
  "author": {
18
18
  "name": "unbrained",
19
19
  "url": "https://github.com/unbraind/pm-cli"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -120,17 +120,17 @@
120
120
  "lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
121
121
  "lint:duplicates": "jscpd --config .jscpd.json",
122
122
  "lint:codefactor": "pnpm quality:static",
123
- "quality:static": "pnpm build && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions 114 --max-coverage-ignore-pragmas 477 --min-docstring-coverage 100 --min-exported-docstring-coverage 100 --min-member-docstring-coverage 100 && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/absence-tolerance-gate.mjs && node scripts/release/token-budget-gate.mjs && node scripts/release/context-intent-calibration-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json",
123
+ "quality:static": "pnpm build && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json --output-budget unbounded && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json --output-budget unbounded",
124
124
  "quality:token-budget": "node scripts/release/token-budget-gate.mjs",
125
125
  "quality:token-surface": "node scripts/measure-agent-token-surface.mjs --check",
126
126
  "quality:token-surface:update": "pnpm build && node scripts/measure-agent-token-surface.mjs --update",
127
- "quality:context-eval": "pnpm build && node scripts/release/context-eval-gate.mjs && node scripts/release/retrieval-eval-gate.mjs --negative-control && node scripts/release/retrieval-eval-gate.mjs && node scripts/release/agent-task-token-gate.mjs --negative-control && node scripts/release/agent-task-token-gate.mjs && pnpm quality:token-surface",
127
+ "quality:context-eval": "pnpm build && node scripts/release/repository-assurance.mjs repository-context-quality --trigger ci --json && pnpm quality:token-surface",
128
128
  "quality:agent-task-token": "pnpm build && node scripts/release/agent-task-token-gate.mjs",
129
129
  "quality:agent-task-token:update": "pnpm build && node scripts/release/agent-task-token-gate.mjs --update",
130
130
  "quality:retrieval-eval": "pnpm build && node scripts/release/retrieval-eval-gate.mjs",
131
131
  "quality:retrieval-eval:update": "pnpm build && node scripts/release/retrieval-eval-gate.mjs --update",
132
132
  "quality:gate-registry": "pnpm build && node scripts/release/gate-registry.mjs",
133
- "quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json",
133
+ "quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded",
134
134
  "quality:package-artifact": "pnpm build && node scripts/release/package-artifact-gate.mjs",
135
135
  "quality:surface-replication": "node scripts/release/surface-replication-gate.mjs",
136
136
  "quality:absence-tolerance": "node scripts/release/absence-tolerance-gate.mjs",
@@ -219,11 +219,11 @@
219
219
  "eslint-plugin-sonarjs": "^4.2.0",
220
220
  "eslint-plugin-unicorn": "^73.0.0",
221
221
  "fast-check": "^4.9.0",
222
- "greptile": "^3.3.1",
223
- "jscpd": "^5.0.14",
222
+ "greptile": "^3.4.0",
223
+ "jscpd": "^5.0.15",
224
224
  "tsx": "^4.23.12",
225
225
  "typescript": "^6.0.3",
226
- "typescript-eslint": "^8.66.0",
226
+ "typescript-eslint": "^8.67.0",
227
227
  "vitest": "^4.1.10",
228
228
  "yaml": "^2.9.0"
229
229
  }
@@ -58,6 +58,7 @@ export function activate(api: ExtensionApi): void {
58
58
  {
59
59
  action: "beads-import",
60
60
  description: "Import Beads JSONL records into pm items.",
61
+ intent: "Import Beads records through audited pm item mutations.",
61
62
  failure_hints: [
62
63
  "Use the host-global --author <id> flag when an explicit mutation identity override is required.",
63
64
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -217,6 +217,7 @@ function calendarCommand(name: "calendar" | "cal"): CommandDefinition {
217
217
  name,
218
218
  action: "calendar",
219
219
  description: "Show deadline, reminder, and scheduled event calendar views.",
220
+ intent: "Inspect time-bounded project context across schedules and work.",
220
221
  arguments: [
221
222
  {
222
223
  name: "view",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for calendar and agenda views.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-command-kit",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -697,6 +697,7 @@ export function buildTwinCommands(): CommandDefinition[] {
697
697
  action: "twin-entity-create",
698
698
  description:
699
699
  "Create a stable facility or asset identity and its first immutable state event.",
700
+ intent: "Create one digital-twin entity with an attributable initial state.",
700
701
  arguments: ENTITY_ARGUMENT,
701
702
  flags: [
702
703
  { long: "--title", value_name: "text", value_type: "string" },
@@ -728,6 +729,7 @@ export function buildTwinCommands(): CommandDefinition[] {
728
729
  action: "twin-observe",
729
730
  description:
730
731
  "Append an attributable observation or correction with optimistic concurrency.",
732
+ intent: "Append a versioned observation to one digital-twin entity.",
731
733
  arguments: ENTITY_ARGUMENT,
732
734
  flags: [
733
735
  {
@@ -756,6 +758,7 @@ export function buildTwinCommands(): CommandDefinition[] {
756
758
  action: "twin-relate",
757
759
  description:
758
760
  "Append or supersede one typed containment, flow, or utility relationship.",
761
+ intent: "Record one typed relationship in the digital-twin topology.",
759
762
  arguments: ENTITY_ARGUMENT,
760
763
  flags: [
761
764
  {
@@ -789,6 +792,7 @@ export function buildTwinCommands(): CommandDefinition[] {
789
792
  action: "twin-query",
790
793
  description:
791
794
  "Query point-in-time state, topology, provenance, conflicts, invariants, and impact.",
795
+ intent: "Inspect one entity's point-in-time state and topology impact.",
792
796
  arguments: ENTITY_ARGUMENT,
793
797
  flags: [
794
798
  { long: "--at", value_name: "iso", value_type: "string" },
@@ -802,6 +806,7 @@ export function buildTwinCommands(): CommandDefinition[] {
802
806
  action: "twin-export",
803
807
  description:
804
808
  "Export a bounded shell-friendly event bundle with a tamper-evident checkpoint.",
809
+ intent: "Export a bounded portable digital-twin event bundle.",
805
810
  flags: [
806
811
  { long: "--at", value_name: "iso", value_type: "string" },
807
812
  { long: "--limit", value_name: "n", value_type: "number" },
@@ -813,6 +818,7 @@ export function buildTwinCommands(): CommandDefinition[] {
813
818
  action: "twin-import",
814
819
  description:
815
820
  "Validate and idempotently merge a portable offline replica bundle.",
821
+ intent: "Validate and merge an offline digital-twin replica bundle.",
816
822
  flags: [
817
823
  {
818
824
  long: "--payload",
@@ -828,6 +834,7 @@ export function buildTwinCommands(): CommandDefinition[] {
828
834
  action: "twin-verify",
829
835
  description:
830
836
  "Verify checkpoint integrity, deterministic replay, topology, and invariants.",
837
+ intent: "Verify digital-twin replay, checkpoint, topology, and invariants.",
831
838
  flags: [{ long: "--at", value_name: "iso", value_type: "string" }],
832
839
  run: runVerify,
833
840
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
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.",
@@ -327,6 +327,7 @@ function dedupeAuditCommand(): CommandDefinition {
327
327
  action: "dedupe-audit",
328
328
  description:
329
329
  "Audit likely duplicate items by title and parent scope heuristics.",
330
+ intent: "Find likely duplicate work without mutating the tracker.",
330
331
  flags: [...dedupeAuditFlags],
331
332
  run: async (context) =>
332
333
  runDedupeAuditPackage(context.options, context.global),
@@ -339,6 +340,7 @@ function dedupeMergeCommand(): CommandDefinition {
339
340
  action: "dedupe-merge",
340
341
  description:
341
342
  "Consolidate duplicates into a canonical item: re-parent active children and close duplicates with duplicate_of.",
343
+ intent: "Preview or apply an evidence-preserving duplicate consolidation.",
342
344
  flags: [...dedupeMergeFlags],
343
345
  run: async (context) =>
344
346
  runDedupeMergePackage(context.options, context.global),
@@ -350,6 +352,7 @@ function commentsAuditCommand(): CommandDefinition {
350
352
  name: "comments-audit",
351
353
  action: "comments-audit",
352
354
  description: "Audit item comment coverage and export comment history rows.",
355
+ intent: "Audit comment coverage and read bounded comment-history evidence.",
353
356
  flags: [...commentsAuditFlags],
354
357
  run: async (context) =>
355
358
  runCommentsAuditPackage(context.options, context.global),
@@ -361,6 +364,7 @@ function normalizeCommand(): CommandDefinition {
361
364
  name: "normalize",
362
365
  action: "normalize",
363
366
  description: "Plan/apply lifecycle metadata normalization sweeps.",
367
+ intent: "Preview or apply deterministic lifecycle metadata normalization.",
364
368
  flags: [...normalizeFlags],
365
369
  run: async (context) =>
366
370
  runNormalizePackage(context.options, context.global),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -94,6 +94,7 @@ function guideCommand(): CommandDefinition {
94
94
  name: "guide",
95
95
  action: "guide",
96
96
  description: "Show migration and usage guidance for pm command families.",
97
+ intent: "Read focused local guidance for one pm workflow.",
97
98
  arguments: [
98
99
  { name: "topic", required: false, description: "Optional guide topic." },
99
100
  ],
@@ -108,6 +109,7 @@ function completionCommand(): CommandDefinition {
108
109
  name: "completion",
109
110
  action: "completion",
110
111
  description: "Generate shell completion scripts for bash, zsh, and fish.",
112
+ intent: "Generate a completion script for the selected shell.",
111
113
  arguments: [
112
114
  {
113
115
  name: "shell",
@@ -126,6 +128,7 @@ function completionTagsCommand(): CommandDefinition {
126
128
  name: "completion-tags",
127
129
  action: "completion-tags",
128
130
  description: "Print known tags for completion filters.",
131
+ intent: "List tag values for lazy shell completion.",
129
132
  run: async (context) => runCompletionTagsPackage(context.global),
130
133
  };
131
134
  }
@@ -135,6 +138,7 @@ function completionStatusesCommand(): CommandDefinition {
135
138
  name: "completion-statuses",
136
139
  action: "completion-statuses",
137
140
  description: "Print runtime status IDs for completion filters.",
141
+ intent: "List runtime status values for shell completion.",
138
142
  run: async (context) => runCompletionStatusesPackage(context.global),
139
143
  };
140
144
  }
@@ -144,6 +148,7 @@ function completionTypesCommand(): CommandDefinition {
144
148
  name: "completion-types",
145
149
  action: "completion-types",
146
150
  description: "Print runtime item type IDs for completion filters.",
151
+ intent: "List runtime item types for shell completion.",
147
152
  run: async (context) => runCompletionTypesPackage(context.global),
148
153
  };
149
154
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for guide and shell completion workflows.",