@unbrained/pm-cli 2026.8.27 → 2026.8.29

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 (148) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +49 -1
  3. package/dist/cli/error-guidance.js +61 -7
  4. package/dist/cli/register-annotations.js +58 -41
  5. package/dist/cli-bundle/bundle-manifest.json +142 -142
  6. package/dist/cli-bundle/chunks/{chunk-TNX6HC54.js → chunk-2MKLQL2E.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-SKXLJIEK.js → chunk-2UETTHY6.js} +49 -49
  8. package/dist/cli-bundle/chunks/{chunk-SHMDY36D.js → chunk-3TEF3HM5.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-SH6P7FXI.js → chunk-7SKMLSMX.js} +2 -2
  10. package/dist/cli-bundle/chunks/chunk-7X6OZEIV.js +34 -0
  11. package/dist/cli-bundle/chunks/{chunk-CVBBGWW5.js → chunk-CMIEDWAY.js} +54 -50
  12. package/dist/cli-bundle/chunks/{chunk-3OO3W6FW.js → chunk-GNWPTEBW.js} +64 -61
  13. package/dist/cli-bundle/chunks/chunk-MTTKAUBX.js +2 -0
  14. package/dist/cli-bundle/chunks/chunk-N6OR6FAR.js +13 -0
  15. package/dist/cli-bundle/chunks/{chunk-R4ETAOJC.js → chunk-TGNAA66W.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-52EKTW6V.js → chunk-WS2GJQVG.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-list-query-EUWM6VII.js → register-list-query-OMKJ5ONN.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-mutation-FD4HSAVU.js → register-mutation-QBSNCOY3.js} +4 -4
  19. package/dist/cli-bundle/chunks/{register-operations-HRMNFEC3.js → register-operations-UC77FQZC.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-setup-33GNICLX.js → register-setup-GLQ5SYV3.js} +2 -2
  21. package/dist/cli-bundle/focused-chunks/{chunk-HC7ODMH3.js → chunk-3AVAWVZA.js} +2 -2
  22. package/dist/cli-bundle/focused-chunks/chunk-3UMBF26I.js +158 -0
  23. package/dist/cli-bundle/focused-chunks/{chunk-YVVZ3LQ6.js → chunk-73EDXGYE.js} +16 -15
  24. package/dist/cli-bundle/focused-chunks/{chunk-4BR5UU52.js → chunk-AXZ5AJAF.js} +45 -45
  25. package/dist/cli-bundle/focused-chunks/{chunk-MXTYGECH.js → chunk-G6PATS5E.js} +3 -3
  26. package/dist/cli-bundle/focused-chunks/{chunk-SUBSWYW3.js → chunk-JZYPPMXF.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/chunk-LLNTHF5X.js +2 -0
  28. package/dist/cli-bundle/focused-chunks/chunk-LYFWQMVC.js +2 -0
  29. package/dist/cli-bundle/focused-chunks/chunk-RKOKG43G.js +2 -0
  30. package/dist/cli-bundle/focused-chunks/chunk-TDK3OCX3.js +2 -0
  31. package/dist/cli-bundle/focused-chunks/{chunk-EKX37ZHA.js → chunk-THEPQMLX.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-FC2AXLB5.js → chunk-XXOWRJZ5.js} +2 -2
  33. package/dist/cli-bundle/main.js +14 -14
  34. package/dist/cli-bundle/sdk-authoring.js +1 -1
  35. package/dist/cli-bundle/sdk-contracts.js +2 -2
  36. package/dist/cli-bundle/sdk-core.js +31 -32
  37. package/dist/cli-bundle/sdk-governance.js +1 -1
  38. package/dist/cli-bundle/sdk-graph.js +1 -1
  39. package/dist/cli-bundle/sdk-merge.js +34 -32
  40. package/dist/cli-bundle/sdk-query.js +1 -1
  41. package/dist/cli-bundle/sdk-runtime.js +1 -1
  42. package/dist/cli-bundle/sdk-testing.js +1 -1
  43. package/dist/cli-bundle/sdk.js +10 -10
  44. package/dist/core/diagnostics/remediation.js +16 -6
  45. package/dist/core/history/drift-scan.d.ts +2 -0
  46. package/dist/core/history/drift-scan.js +72 -36
  47. package/dist/core/history/history.d.ts +3 -3
  48. package/dist/core/history/history.js +5 -5
  49. package/dist/core/history/replay.d.ts +1 -1
  50. package/dist/core/history/replay.js +50 -19
  51. package/dist/core/item/actionability.d.ts +7 -1
  52. package/dist/core/item/actionability.js +44 -11
  53. package/dist/core/item/dependency-reference.d.ts +10 -0
  54. package/dist/core/item/dependency-reference.js +21 -0
  55. package/dist/core/item/parse.d.ts +4 -0
  56. package/dist/core/item/parse.js +38 -16
  57. package/dist/core/shared/author.js +69 -17
  58. package/dist/mcp/tool-definitions.js +5 -5
  59. package/dist/sdk/agent/command-recovery.js +3 -3
  60. package/dist/sdk/agent/task-transcript-contracts.d.ts +52 -0
  61. package/dist/sdk/agent/task-transcript-contracts.js +198 -0
  62. package/dist/sdk/annotations.d.ts +5 -2
  63. package/dist/sdk/annotations.js +66 -36
  64. package/dist/sdk/cli-bootstrap.d.ts +2 -8
  65. package/dist/sdk/cli-bootstrap.js +7 -67
  66. package/dist/sdk/cli-contracts/bootstrap-command-scanner.d.ts +23 -0
  67. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +80 -0
  68. package/dist/sdk/cli-contracts/flag-contracts.js +5 -2
  69. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +5 -5
  70. package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -2
  71. package/dist/sdk/cli-contracts/tool-schema.d.ts +1 -1
  72. package/dist/sdk/cli-contracts/tool-schema.js +16 -3
  73. package/dist/sdk/comments.d.ts +4 -0
  74. package/dist/sdk/comments.js +2 -2
  75. package/dist/sdk/completion.js +9 -5
  76. package/dist/sdk/contracts.d.ts +1 -0
  77. package/dist/sdk/contracts.js +3 -2
  78. package/dist/sdk/dependency-provenance.d.ts +51 -2
  79. package/dist/sdk/dependency-provenance.js +91 -7
  80. package/dist/sdk/extension/install-sources.d.ts +8 -1
  81. package/dist/sdk/extension/install-sources.js +132 -39
  82. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +74 -14
  83. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +86 -38
  84. package/dist/sdk/governance/health.js +86 -22
  85. package/dist/sdk/governance/validate-history-drift.js +5 -2
  86. package/dist/sdk/graph/assembly.js +51 -22
  87. package/dist/sdk/history-repair.d.ts +1 -1
  88. package/dist/sdk/history-repair.js +20 -10
  89. package/dist/sdk/index.d.ts +1 -0
  90. package/dist/sdk/index.js +3 -2
  91. package/dist/sdk/learnings.d.ts +4 -0
  92. package/dist/sdk/learnings.js +7 -4
  93. package/dist/sdk/lifecycle/close.js +4 -3
  94. package/dist/sdk/lifecycle/create.js +43 -19
  95. package/dist/sdk/linked-artifacts.js +21 -31
  96. package/dist/sdk/merge/reconcile.js +3 -16
  97. package/dist/sdk/notes.d.ts +4 -0
  98. package/dist/sdk/notes.js +2 -2
  99. package/dist/sdk/query/next.d.ts +6 -0
  100. package/dist/sdk/query/next.js +7 -2
  101. package/dist/sdk/runtime-input.js +5 -2
  102. package/dist/sdk/runtime.d.ts +6 -6
  103. package/dist/sdk/runtime.js +8 -8
  104. package/dist/sdk/test/entry.d.ts +1 -1
  105. package/dist/sdk/test/entry.js +5 -9
  106. package/dist/sdk/test/execution.d.ts +3 -0
  107. package/dist/sdk/test/execution.js +54 -13
  108. package/docs/COMMANDS.md +4 -3
  109. package/docs/CONTEXT_RECOVERY_PRIMITIVES.md +67 -0
  110. package/docs/MERGE_SAFETY.md +23 -10
  111. package/docs/OUTPUT_TOKEN_ACCOUNTING.md +20 -7
  112. package/docs/README.md +1 -0
  113. package/docs/RELEASING.md +9 -1
  114. package/docs/SDK.md +12 -0
  115. package/docs/SDK_CONTEXT_INTEGRITY.md +12 -1
  116. package/docs/SDK_RUNTIME_BOUNDARIES.md +10 -0
  117. package/docs/TESTING.md +6 -2
  118. package/docs/agent-task-token-baseline.json +97 -11
  119. package/docs/agent-task-transcripts.json +211 -0
  120. package/docs/generated/FLAG_LEXICON_BUDGETS.md +3 -3
  121. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +13 -4
  122. package/docs/performance/cli-transport-overhead.md +10 -2
  123. package/marketplace.json +2 -2
  124. package/package.json +8 -8
  125. package/packages/pm-beads/package.json +1 -1
  126. package/packages/pm-calendar/package.json +1 -1
  127. package/packages/pm-command-kit/package.json +1 -1
  128. package/packages/pm-digital-twin/package.json +1 -1
  129. package/packages/pm-governance-audit/package.json +1 -1
  130. package/packages/pm-guide-shell/package.json +1 -1
  131. package/packages/pm-kanban/package.json +1 -1
  132. package/packages/pm-lifecycle-hooks/package.json +1 -1
  133. package/packages/pm-linked-test-adapters/package.json +1 -1
  134. package/packages/pm-search-advanced/package.json +1 -1
  135. package/packages/pm-templates/package.json +1 -1
  136. package/packages/pm-todos/package.json +1 -1
  137. package/packages/pm-vcs/package.json +1 -1
  138. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  139. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  140. package/sdk/public-surface.json +297 -36
  141. package/dist/cli-bundle/chunks/chunk-MFNTKMTI.js +0 -13
  142. package/dist/cli-bundle/chunks/chunk-OS27HHBN.js +0 -35
  143. package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +0 -2
  144. package/dist/cli-bundle/focused-chunks/chunk-2AGZ5BRT.js +0 -2
  145. package/dist/cli-bundle/focused-chunks/chunk-AQ5IYEZZ.js +0 -2
  146. package/dist/cli-bundle/focused-chunks/chunk-XDPYBQCF.js +0 -156
  147. package/dist/cli-bundle/focused-chunks/chunk-Y5A7SJJ7.js +0 -2
  148. package/dist/cli-bundle/focused-chunks/chunk-YHWHX6YY.js +0 -2
@@ -1,6 +1,6 @@
1
1
  # Output Token Accounting
2
2
 
3
- Tracker references: [pm-t5dt4z](../.agents/pm/tasks/pm-t5dt4z.toon) and [pm-g3n00m](../.agents/pm/stories/pm-g3n00m.toon).
3
+ Tracker references: [pm-t5dt4z](../.agents/pm/tasks/pm-t5dt4z.toon), [pm-g3n00m](../.agents/pm/stories/pm-g3n00m.toon), [pm-8pnj](../.agents/pm/features/pm-8pnj.toon), [pm-f05lsg](../.agents/pm/features/pm-f05lsg.toon), and [pm-srns](../.agents/pm/issues/pm-srns.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
@@ -39,20 +39,33 @@ The command still exits with its normal non-zero status; the receipt is additive
39
39
 
40
40
  ## Release-Level Task Entitlement
41
41
 
42
- [`agent-task-token-baseline.json`](agent-task-token-baseline.json) is the externally shipped release baseline. The gate executes the built CLI in an isolated workspace and covers:
42
+ [`agent-task-transcripts.json`](agent-task-transcripts.json) is the SDK-validated, versioned golden corpus. [`agent-task-token-baseline.json`](agent-task-token-baseline.json) is its externally shipped release ratchet. The gate executes the built CLI against independent, identically seeded accounting-on and accounting-off workspaces. Its five complete workflows cover:
43
43
 
44
- - a small-workspace read;
45
- - a scaled-workspace context read;
46
- - a returning-agent item read with a required-field completeness assertion;
47
- - a failing command with bounded recovery output.
44
+ - bounded triage, scaled-workspace orientation, and returning-agent inspection;
45
+ - a closed-domain refusal followed by the exact advertised shell-free retry;
46
+ - an unknown option after valid flags followed by a corrected command;
47
+ - create, inspect, close, and final-state confirmation through mutation receipts;
48
+ - successful bulk partial-effect and no-effect exits without collapsing them into exit zero.
48
49
 
49
- Each invocation is independently byte-counted, its section sum is checked, and its consumed field is retained. A seeded million-token regression proves the ratchet fails. Run it with:
50
+ Every step verifies its public SDK output family, canonical successful or refusal exit status, required own-property paths, declared `expected_field_values`, and refusal identity where applicable. Recovery steps must declare a successful output family instead of chaining one refusal to another, every refusal in a completed task must have a later successful `recovery_for` step, and every completed task must terminate with successful output. Successful steps cannot carry refusal-only metadata. Dot-separated `required_fields` and `expected_field_values` paths are traversed structurally from the output root, so incidental prose or nested key names cannot satisfy completeness or terminal-state assertions. The report publishes bytes and estimated tokens for each step and completed task, retry counts, corpus digest, and composite cost. Accounting-on application payloads must be byte-equivalent to their independently captured accounting-off payloads after removing only the receipt. Receipt byte and token fields are independently measured rather than trusted. Runtime refusals verify that their self-reported `total_bytes` matches the independent transport and that `total_estimated_tokens` equals `ceil(total_bytes / 4)`; Commander usage refusals that happen before accounting attachment are measured directly from the captured transport and labeled `independent_transport`.
51
+
52
+ The baseline fails closed on corpus digest, task identity, step identity, missing or non-finite per-step and per-task ceilings, and missing or non-finite composite cost ceilings. A seeded million-token completed-task regression proves the ratchet fails. Run it with:
50
53
 
51
54
  ```bash
52
55
  pnpm quality:agent-task-token
53
56
  node scripts/release/agent-task-token-gate.mjs --negative-control
54
57
  ```
55
58
 
59
+ Package authors can validate their own corpus with the same public contract before replay:
60
+
61
+ ```ts
62
+ import { parsePmAgentTaskTranscriptCorpus } from "@unbrained/pm-cli/sdk/contracts";
63
+
64
+ const corpus = parsePmAgentTaskTranscriptCorpus(JSON.parse(source));
65
+ ```
66
+
67
+ The parser rejects unknown versions, empty tasks or steps, duplicate identities, output families that disagree with the command contract, refusal-only metadata on successful steps, terminal or otherwise unrecovered refusals, and recovery edges that do not point from a successful step to an earlier refusal.
68
+
56
69
  Refresh the committed ceiling only after an intentional reviewed output change:
57
70
 
58
71
  ```bash
package/docs/README.md CHANGED
@@ -68,6 +68,7 @@ pm guide release --json
68
68
  - [Recurrence and Executable Recovery Contracts](RECURRENCE_RECOVERY_CONTRACTS.md) - terminal-item recurrence, duplicate-intake routing, capability-aware reindex recovery, and target-aware generated test guidance.
69
69
  - [Trustworthy Context and Evidence Contracts](TRUSTWORTHY_CONTEXT_EVIDENCE.md) - full-record assurance, graph composition, boolean health rows, lossless linked-test removal, and role-labelled recovery.
70
70
  - [Context Integrity Contracts](CONTEXT_INTEGRITY_CONTRACTS.md) - sparse-read identity, closed extension manifests, lossless remote docs, direction-locked graph impact, and cross-version history epochs.
71
+ - [Context Integrity and Recovery Primitives](CONTEXT_RECOVERY_PRIMITIVES.md) - lossless metadata, write-time link receipts, executed-test evidence, external blockers, npm receipts, history capabilities, and truthful recovery.
71
72
  - [SDK Evidence Traceability and Integrity](SDK_EVIDENCE_TRACEABILITY.md) - reverse source-to-item lookup, atomic evidence replacement, no-op history, linked-test collision classification, and telemetry drain receipts.
72
73
  - [SDK Context and Evidence Contracts](SDK_CONTEXT_EVIDENCE_CONTRACTS.md) - material omission receipts, scoped preflight activation, truthful merge preference, claim-race classification, and versioned history hashes.
73
74
  - [Reproducible Workspaces and Snapshots](REPRODUCIBLE_WORKSPACES.md) - deterministic SDK recipes and content-addressed authoritative tracker restore points.
package/docs/RELEASING.md CHANGED
@@ -29,6 +29,8 @@ provenance is tracked by [pm-u1baah](../.agents/pm/issues/pm-u1baah.toon), and
29
29
  authoritative blocker-recovery run selection by
30
30
  [pm-db8onn](../.agents/pm/issues/pm-db8onn.toon), and queued automatic
31
31
  same-day recovery by [pm-dm2vfz](../.agents/pm/issues/pm-dm2vfz.toon).
32
+ Bounded Sentry request latency is tracked by
33
+ [pm-b9g2cs](../.agents/pm/issues/pm-b9g2cs.toon).
32
34
 
33
35
  ## Version Policy
34
36
 
@@ -210,6 +212,12 @@ events, and every `generic_failure` or `dependency_failed` remain blocking.
210
212
  This keeps rewording independent from release policy and makes stale or broad
211
213
  message allowlists impossible.
212
214
 
215
+ Sentry API requests use a 120-second deadline by default. Operators can set
216
+ `--sentry-request-timeout-ms` between `1` and `300000` when reproducing
217
+ provider latency, while the emitted gate receipt records the effective value.
218
+ The release workflow pins `120000`; query timeouts remain fail-closed and must
219
+ not be treated as an empty issue set.
220
+
213
221
  If private reliability checks identify repeated user friction, either confirm the current release already contains the remediation with regression coverage or fix it before continuing.
214
222
 
215
223
  The build writes `dist/cli-bundle/bundle-manifest.json` atomically with SHA-256 digests for every emitted bundle file. At startup, `pm` reports `bundle_integrity_torn_install` only when a module-loader failure is accompanied by manifest proof that an upgrade or rebuild changed, removed, or corrupted the active bundle. Reinstall `@unbrained/pm-cli` and retry after that diagnostic. Ordinary `ERR_MODULE_NOT_FOUND` and export failures with an intact manifest remain unexpected failures and must continue to block reliability gates.
@@ -358,7 +366,7 @@ git push origin v<version>
358
366
  tracked source path (apart from managed-extension install metadata).
359
367
  - static quality gate (shared complexity, duplication, dead/orphan module, file/folder hygiene, source/exported docstring coverage profile)
360
368
  - temporary-project compatibility gate against latest published tracker data
361
- - reliability threshold gate (Sentry severity threshold, bounded to a recent-activity window via `--sentry-window-days` (default `14`, `0` = unbounded) so a stale benign unresolved issue cannot block every scheduled release; `--telemetry-mode` gate policy: `off` | `best-effort` | `required`). Scheduled `auto-release.yml` failures open/update an `Auto Release blocked` GitHub issue so blocked daily releases are never silently skipped.
369
+ - reliability threshold gate (Sentry severity threshold, bounded to a recent-activity window via `--sentry-window-days` (default `14`, `0` = unbounded) so a stale benign unresolved issue cannot block every scheduled release; Sentry requests use the fail-closed bounded `--sentry-request-timeout-ms` contract (default `120000`, maximum `300000`); `--telemetry-mode` gate policy: `off` | `best-effort` | `required`). Scheduled `auto-release.yml` failures open/update an `Auto Release blocked` GitHub issue so blocked daily releases are never silently skipped.
362
370
  - sandboxed `pm` coverage
363
371
  - optional Sentry release metadata and sourcemap upload when `SENTRY_AUTH_TOKEN` is configured
364
372
  - npm pack dry run and npx tarball smoke test
package/docs/SDK.md CHANGED
@@ -1512,6 +1512,18 @@ edit/delete semantics, ownership guidance, history mutation metadata, and stable
1512
1512
  list pagination. MCP tool actions intentionally omit file input to prevent host
1513
1513
  filesystem access. Package authors can build custom annotation presentation
1514
1514
  layers without importing CLI modules.
1515
+ `CommentsCommandOptions.ifAbsent`, `NotesCommandOptions.ifAbsent`, and
1516
+ `LearningsCommandOptions.ifAbsent` give retrying agents one explicit idempotent
1517
+ annotation append contract. Equality is evaluated under the item writer lock
1518
+ after author resolution and text normalization, using the resolved author plus
1519
+ exact stored text. The first append returns `changed: true` and
1520
+ `mutation_receipt.changed_count: 1`; an exact retry returns the existing entry,
1521
+ `changed: false`, and `changed_count: 0` without changing the item, history, or
1522
+ derived search state. Different authors remain distinct, and the default
1523
+ without `ifAbsent` continues to append intentional duplicates. The option is
1524
+ valid only for append input and fails closed for list, edit, or delete modes.
1525
+ CLI `comments|notes|learnings --if-absent` and the corresponding MCP actions
1526
+ with `options.ifAbsent: true` are thin transports over this SDK behavior.
1515
1527
  `PmClient.notes` also accepts `addJson` for a validated structured context event. The persisted entry remains backward-readable through canonical `text` while exposing typed `format: "json"`, `data`, and `event_type` fields. `since`, `eventType`, `limit`, and `includeMeta` form the bounded query contract; the collection continues to use field-aware union merge semantics for concurrent branches.
1516
1528
 
1517
1529
  Customization convenience methods are the SDK baseline for project-specific pm
@@ -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), [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), [pm-larv4r](../.agents/pm/issues/pm-larv4r.toon), [pm-mcxk8v](../.agents/pm/issues/pm-mcxk8v.toon), and [pm-2zkvxm](../.agents/pm/issues/pm-2zkvxm.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), [pm-larv4r](../.agents/pm/issues/pm-larv4r.toon), [pm-mcxk8v](../.agents/pm/issues/pm-mcxk8v.toon), [pm-2zkvxm](../.agents/pm/issues/pm-2zkvxm.toon), and [pm-ea1yh2](../.agents/pm/issues/pm-ea1yh2.toon).
4
4
 
5
5
  Current closure tranche: [pm-fs8q9x](../.agents/pm/tasks/pm-fs8q9x.toon), [pm-gy885b](../.agents/pm/issues/pm-gy885b.toon), and [pm-f05lsg](../.agents/pm/features/pm-f05lsg.toon).
6
6
 
@@ -82,6 +82,17 @@ The structured `option_scope` is `declared_on_path`, `declared_elsewhere`, or
82
82
  case, while the third names the nearest current-path spellings and explicitly
83
83
  terminates the otherwise-unbounded command search.
84
84
 
85
+ ## Retry-safe annotation mutations
86
+
87
+ Comments, notes, and learnings expose one SDK-owned `ifAbsent` append contract.
88
+ The item writer lock compares the resolved author and exact normalized stored
89
+ text, so concurrent retries create one entry and one history event. The winning
90
+ append reports `changed: true` and `mutation_receipt.changed_count: 1`; later
91
+ exact retries return the existing entry with `changed: false` and
92
+ `changed_count: 0`. Default appends remain duplicate-preserving. CLI
93
+ `--if-absent` and MCP `ifAbsent` are thin transports, and `--full-history`
94
+ remains the explicit escape hatch from bounded mutation receipts.
95
+
85
96
  ## Semantic flag and spelling contracts
86
97
 
87
98
  `listPmFlagLexicon()` classifies flags by meaning rather than spelling alone.
@@ -61,6 +61,16 @@ published error vocabulary while still sharing classification, path redaction,
61
61
  and recovery guidance. Workspace snapshots use this compatibility path for
62
62
  their stable storage, resource, and permission fault codes.
63
63
 
64
+ Package archives use one bounded validation and extraction boundary whether
65
+ they come from a local path or `npm pack`. The SDK rejects links, escaping
66
+ paths, unsupported entry types, oversized archives, and decompression growth
67
+ before extraction. If npm reports an archive it did not create, callers receive
68
+ the path-redacted `npm_package_archive_missing` refusal instead of a raw system
69
+ `tar` exception; an archive reported outside the isolated pack destination is
70
+ rejected as `npm_package_archive_unsafe`. This keeps package install behavior
71
+ portable and prevents an untrusted registry artifact or package-manager result
72
+ from bypassing the local-archive policy.
73
+
64
74
  ## CLI refusal ownership
65
75
 
66
76
  CLI adapters preserve SDK error codes, exit semantics, and actionable recovery
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), [pm-rizqb6](../.agents/pm/issues/pm-rizqb6.toon), [pm-95h7pg](../.agents/pm/issues/pm-95h7pg.toon), [pm-giks4s](../.agents/pm/issues/pm-giks4s.toon), [pm-xa3t0o](../.agents/pm/issues/pm-xa3t0o.toon), [pm-e97jyf](../.agents/pm/issues/pm-e97jyf.toon), [pm-efkvdy](../.agents/pm/issues/pm-efkvdy.toon), and [pm-ed28wi](../.agents/pm/issues/pm-ed28wi.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), [pm-95h7pg](../.agents/pm/issues/pm-95h7pg.toon), [pm-giks4s](../.agents/pm/issues/pm-giks4s.toon), [pm-xa3t0o](../.agents/pm/issues/pm-xa3t0o.toon), [pm-e97jyf](../.agents/pm/issues/pm-e97jyf.toon), [pm-efkvdy](../.agents/pm/issues/pm-efkvdy.toon), [pm-ed28wi](../.agents/pm/issues/pm-ed28wi.toon), and [pm-5ug5xq](../.agents/pm/issues/pm-5ug5xq.toon).
6
6
 
7
7
  ## Agent Quick Context
8
8
 
@@ -43,7 +43,11 @@ claims to the same canonical gate IDs. Hosted-only environment isolation and
43
43
  tracker-integrity steps remain explicit entries with reasons rather than
44
44
  silently disappearing from local parity.
45
45
 
46
- `node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, then cleans them up.
46
+ `node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, disables
47
+ external Sentry delivery for the build, test workers, and their nested CLI
48
+ children, then cleans the roots up. Instrumentation tests can still exercise
49
+ Sentry initialization through their mocked module boundary; ordinary negative
50
+ fixtures must never create production incidents from a developer host.
47
51
 
48
52
  Public SDK changes additionally run semantic surface and import-cost contracts:
49
53
 
@@ -1,25 +1,111 @@
1
1
  {
2
- "version": 1,
2
+ "version": 3,
3
+ "transcript_version": 2,
4
+ "transcript_digest": "sha256:2bf91406426d2a9e5de1da10ba67f7b8e9d4a4baa09eb488fe89ae3925c78f3f",
3
5
  "estimator": "ceil(utf8_bytes / 4)",
4
6
  "measurement_scope": "output_before_token_accounting",
5
7
  "published_with_release": true,
6
- "scenarios": [
8
+ "tasks": [
7
9
  {
8
- "id": "small-workspace",
9
- "max_estimated_tokens": 552
10
+ "id": "context-bootstrap",
11
+ "max_estimated_tokens": 1978,
12
+ "steps": [
13
+ {
14
+ "id": "triage",
15
+ "max_estimated_tokens": 552,
16
+ "accounting_mode": "self_reported"
17
+ },
18
+ {
19
+ "id": "orient",
20
+ "max_estimated_tokens": 1055,
21
+ "accounting_mode": "self_reported"
22
+ },
23
+ {
24
+ "id": "inspect",
25
+ "max_estimated_tokens": 371,
26
+ "accounting_mode": "self_reported"
27
+ }
28
+ ]
10
29
  },
11
30
  {
12
- "id": "large-workspace",
13
- "max_estimated_tokens": 1055
31
+ "id": "closed-domain-recovery",
32
+ "max_estimated_tokens": 630,
33
+ "steps": [
34
+ {
35
+ "id": "refuse-intent",
36
+ "max_estimated_tokens": 259,
37
+ "accounting_mode": "self_reported"
38
+ },
39
+ {
40
+ "id": "retry-intent",
41
+ "max_estimated_tokens": 371,
42
+ "accounting_mode": "self_reported"
43
+ }
44
+ ]
14
45
  },
15
46
  {
16
- "id": "returning-agent",
17
- "max_estimated_tokens": 371
47
+ "id": "unknown-option-recovery",
48
+ "max_estimated_tokens": 585,
49
+ "steps": [
50
+ {
51
+ "id": "refuse-option",
52
+ "max_estimated_tokens": 422,
53
+ "accounting_mode": "independent_transport"
54
+ },
55
+ {
56
+ "id": "retry-option",
57
+ "max_estimated_tokens": 163,
58
+ "accounting_mode": "self_reported"
59
+ }
60
+ ]
18
61
  },
19
62
  {
20
- "id": "failing-command",
21
- "max_estimated_tokens": 219
63
+ "id": "lifecycle-mutation",
64
+ "max_estimated_tokens": 812,
65
+ "steps": [
66
+ {
67
+ "id": "create",
68
+ "max_estimated_tokens": 20,
69
+ "accounting_mode": "self_reported"
70
+ },
71
+ {
72
+ "id": "inspect-open",
73
+ "max_estimated_tokens": 363,
74
+ "accounting_mode": "self_reported"
75
+ },
76
+ {
77
+ "id": "close",
78
+ "max_estimated_tokens": 31,
79
+ "accounting_mode": "self_reported"
80
+ },
81
+ {
82
+ "id": "inspect-closed",
83
+ "max_estimated_tokens": 398,
84
+ "accounting_mode": "self_reported"
85
+ }
86
+ ]
87
+ },
88
+ {
89
+ "id": "bulk-effect-outcomes",
90
+ "max_estimated_tokens": 326,
91
+ "steps": [
92
+ {
93
+ "id": "create-bulk-target",
94
+ "max_estimated_tokens": 20,
95
+ "accounting_mode": "self_reported"
96
+ },
97
+ {
98
+ "id": "partial-effect",
99
+ "max_estimated_tokens": 174,
100
+ "accounting_mode": "self_reported"
101
+ },
102
+ {
103
+ "id": "no-effect",
104
+ "max_estimated_tokens": 132,
105
+ "accounting_mode": "self_reported"
106
+ }
107
+ ]
22
108
  }
23
109
  ],
24
- "composite_max_estimated_tokens": 2197
110
+ "composite_max_estimated_tokens": 4331
25
111
  }
@@ -0,0 +1,211 @@
1
+ {
2
+ "version": 2,
3
+ "tasks": [
4
+ {
5
+ "id": "context-bootstrap",
6
+ "description": "Orient in a scaled workspace and inspect the canonical focus item.",
7
+ "steps": [
8
+ {
9
+ "id": "triage",
10
+ "args": ["list", "--for", "triage", "--limit", "2"],
11
+ "expected_exit_code": 0,
12
+ "expected_output_kind": "collection",
13
+ "expected_accounting_mode": "self_reported",
14
+ "required_fields": ["items"]
15
+ },
16
+ {
17
+ "id": "orient",
18
+ "args": ["context", "--for", "orient", "--limit", "5"],
19
+ "expected_exit_code": 0,
20
+ "expected_output_kind": "diagnostic",
21
+ "expected_accounting_mode": "self_reported",
22
+ "required_fields": ["summary.active_items", "hierarchy", "activity"]
23
+ },
24
+ {
25
+ "id": "inspect",
26
+ "args": ["get", "$ANCHOR_ID", "--for", "inspect"],
27
+ "expected_exit_code": 0,
28
+ "expected_output_kind": "entity",
29
+ "expected_accounting_mode": "self_reported",
30
+ "required_fields": ["item.id"]
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "id": "closed-domain-recovery",
36
+ "description": "Reject an invalid context intent and execute the advertised shell-free retry.",
37
+ "steps": [
38
+ {
39
+ "id": "refuse-intent",
40
+ "args": ["get", "$ANCHOR_ID", "--for", "invalid-agent-intent"],
41
+ "expected_exit_code": 2,
42
+ "expected_output_kind": "refusal",
43
+ "expected_accounting_mode": "self_reported",
44
+ "required_fields": ["code", "refusal", "recovery"],
45
+ "expected_error_code": "unknown_context_intent",
46
+ "expected_refusal_surface": "--for"
47
+ },
48
+ {
49
+ "id": "retry-intent",
50
+ "args": ["get", "$ANCHOR_ID", "--for", "inspect"],
51
+ "expected_exit_code": 0,
52
+ "expected_output_kind": "entity",
53
+ "expected_accounting_mode": "self_reported",
54
+ "required_fields": ["item.id"],
55
+ "recovery_for": "refuse-intent"
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "id": "unknown-option-recovery",
61
+ "description": "Identify an unsupported option after valid flags and continue with the corrected command.",
62
+ "steps": [
63
+ {
64
+ "id": "refuse-option",
65
+ "args": [
66
+ "search",
67
+ "agent task",
68
+ "--status",
69
+ "open",
70
+ "--limit",
71
+ "5",
72
+ "--include-body"
73
+ ],
74
+ "expected_exit_code": 2,
75
+ "expected_output_kind": "refusal",
76
+ "expected_accounting_mode": "independent_transport",
77
+ "required_fields": ["code", "refusal", "recovery"],
78
+ "expected_error_code": "unknown_option",
79
+ "expected_refusal_surface": "--include-body"
80
+ },
81
+ {
82
+ "id": "retry-option",
83
+ "args": ["search", "agent task", "--status", "open", "--limit", "5"],
84
+ "expected_exit_code": 0,
85
+ "expected_output_kind": "collection",
86
+ "expected_accounting_mode": "self_reported",
87
+ "required_fields": ["items"],
88
+ "recovery_for": "refuse-option"
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "id": "lifecycle-mutation",
94
+ "description": "Create, inspect, close, and confirm a project item through public CLI receipts.",
95
+ "steps": [
96
+ {
97
+ "id": "create",
98
+ "args": [
99
+ "create",
100
+ "--id",
101
+ "$LIFECYCLE_ID",
102
+ "--title",
103
+ "Transcript lifecycle item",
104
+ "--description",
105
+ "Golden multi-step lifecycle task",
106
+ "--type",
107
+ "Task",
108
+ "--status",
109
+ "open",
110
+ "--create-mode",
111
+ "progressive"
112
+ ],
113
+ "expected_exit_code": 0,
114
+ "expected_output_kind": "mutation_receipt",
115
+ "expected_accounting_mode": "self_reported",
116
+ "required_fields": ["id", "changed_field_count"]
117
+ },
118
+ {
119
+ "id": "inspect-open",
120
+ "args": ["get", "$LIFECYCLE_ID", "--for", "inspect"],
121
+ "expected_exit_code": 0,
122
+ "expected_output_kind": "entity",
123
+ "expected_accounting_mode": "self_reported",
124
+ "required_fields": ["item.id", "item.status"],
125
+ "expected_field_values": { "item.status": "open" }
126
+ },
127
+ {
128
+ "id": "close",
129
+ "args": ["close", "$LIFECYCLE_ID", "Golden task completed"],
130
+ "expected_exit_code": 0,
131
+ "expected_output_kind": "mutation_receipt",
132
+ "expected_accounting_mode": "self_reported",
133
+ "required_fields": ["id", "status", "close_reason"]
134
+ },
135
+ {
136
+ "id": "inspect-closed",
137
+ "args": ["get", "$LIFECYCLE_ID", "--for", "inspect"],
138
+ "expected_exit_code": 0,
139
+ "expected_output_kind": "entity",
140
+ "expected_accounting_mode": "self_reported",
141
+ "required_fields": ["item.id", "item.status"],
142
+ "expected_field_values": { "item.status": "closed" }
143
+ }
144
+ ]
145
+ },
146
+ {
147
+ "id": "bulk-effect-outcomes",
148
+ "description": "Preserve successful partial-effect and no-effect outcomes across a bulk lifecycle task.",
149
+ "steps": [
150
+ {
151
+ "id": "create-bulk-target",
152
+ "args": [
153
+ "create",
154
+ "--id",
155
+ "$BULK_ID",
156
+ "--title",
157
+ "Transcript bulk effect target",
158
+ "--description",
159
+ "Golden bulk outcome transcript target",
160
+ "--type",
161
+ "Task",
162
+ "--status",
163
+ "open",
164
+ "--create-mode",
165
+ "progressive"
166
+ ],
167
+ "expected_exit_code": 0,
168
+ "expected_output_kind": "mutation_receipt",
169
+ "expected_accounting_mode": "self_reported",
170
+ "required_fields": ["id", "status", "changed_field_count"]
171
+ },
172
+ {
173
+ "id": "partial-effect",
174
+ "args": [
175
+ "close-many",
176
+ "--ids",
177
+ "$BULK_ID,pm-transcript-missing",
178
+ "--reason",
179
+ "Golden partial-effect transcript",
180
+ "--validate-close",
181
+ "off",
182
+ "--no-checkpoint"
183
+ ],
184
+ "expected_exit_code": 7,
185
+ "expected_output_kind": "collection",
186
+ "expected_accounting_mode": "self_reported",
187
+ "required_fields": ["rows", "outcome", "exit_code"],
188
+ "expected_field_values": { "outcome": "partial_effect" }
189
+ },
190
+ {
191
+ "id": "no-effect",
192
+ "args": [
193
+ "close-many",
194
+ "--ids",
195
+ "$BULK_ID",
196
+ "--reason",
197
+ "Golden no-effect transcript",
198
+ "--validate-close",
199
+ "off",
200
+ "--no-checkpoint"
201
+ ],
202
+ "expected_exit_code": 6,
203
+ "expected_output_kind": "collection",
204
+ "expected_accounting_mode": "self_reported",
205
+ "required_fields": ["rows", "outcome", "exit_code"],
206
+ "expected_field_values": { "outcome": "no_effect" }
207
+ }
208
+ ]
209
+ }
210
+ ]
211
+ }
@@ -48,9 +48,9 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
48
48
  | `close-many` | lifecycle | 72 | 72 |
49
49
  | `delete` | lifecycle | 24 | 24 |
50
50
  | `append` | evidence | 24 | 24 |
51
- | `comments` | evidence | 30 | 30 |
52
- | `notes` | evidence | 34 | 34 |
53
- | `learnings` | evidence | 26 | 26 |
51
+ | `comments` | evidence | 31 | 31 |
52
+ | `notes` | evidence | 35 | 35 |
53
+ | `learnings` | evidence | 27 | 27 |
54
54
  | `files` | evidence | 39 | 39 |
55
55
  | `docs` | evidence | 30 | 30 |
56
56
  | `deps` | graph | 32 | 32 |
@@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`.
4
4
 
5
5
  Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
6
6
 
7
- - Catalog error codes: 344
7
+ - Catalog error codes: 353
8
8
  - Executable error codes: 19
9
9
  - Executable-code ratchet floor: 18
10
10
  - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
11
- - Uncovered error codes: 325
12
- - Coverage fraction: 0.055233
11
+ - Uncovered error codes: 334
12
+ - Coverage fraction: 0.053824
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 94
15
15
 
@@ -25,10 +25,12 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
25
25
  | `ambiguous_option_combination` | `ambiguous_option_combination` | uncovered | none | 0 |
26
26
  | `annotation_alias_conflict` | `annotation_alias_conflict` | uncovered | none | 0 |
27
27
  | `annotation_flag_like_value` | `annotation_flag_like_value` | uncovered | none | 0 |
28
+ | `annotation_if_absent_without_append` | `annotation_if_absent_without_append` | uncovered | none | 0 |
28
29
  | `annotation_message_without_text` | `annotation_message_without_text` | uncovered | none | 0 |
29
30
  | `annotation_transposed_subcommand` | `annotation_transposed_subcommand` | uncovered | none | 0 |
30
31
  | `append_empty_body` | `append_empty_body` | uncovered | none | 0 |
31
32
  | `assurance_registry_invalid` | `assurance_registry_invalid` | uncovered | none | 0 |
33
+ | `bare_comma_entry_ambiguous` | `bare_comma_entry_ambiguous` | uncovered | none | 0 |
32
34
  | `body_file_conflicts_with_body` | `body_file_conflicts_with_body` | uncovered | none | 0 |
33
35
  | `body_file_missing_path` | `body_file_missing_path` | uncovered | none | 0 |
34
36
  | `body_file_unreadable` | `body_file_unreadable` | uncovered | none | 0 |
@@ -114,6 +116,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
114
116
  | `history_drift_merge_receipt` | `history_drift_merge_receipt` | uncovered | none | 0 |
115
117
  | `history_drift_missing_stream` | `history_drift_missing_stream` | uncovered | none | 0 |
116
118
  | `history_drift_unreadable_stream` | `history_drift_unreadable_stream` | uncovered | none | 0 |
119
+ | `history_drift_version_skew` | `history_drift_version_skew` | uncovered | none | 0 |
117
120
  | `history_merge_conflict_markers_detected` | `merge_conflict_markers_detected` | uncovered | none | 0 |
118
121
  | `history_stream_over_compact_threshold` | `history_stream_over_compact_threshold` | uncovered | none | 0 |
119
122
  | `history_target_out_of_range` | `history_target_out_of_range` | uncovered | none | 0 |
@@ -184,7 +187,6 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
184
187
  | `merge_git_config_unwritable` | `merge_git_config_unwritable` | uncovered | none | 0 |
185
188
  | `merge_receipt_evidence_invalid` | `merge_receipt_evidence_invalid` | uncovered | none | 0 |
186
189
  | `merge_receipts_pending` | `merge_receipts_pending` | uncovered | none | 0 |
187
- | `merge_reconcile_discards_require_acceptance` | `merge_reconcile_discards_require_acceptance` | uncovered | none | 0 |
188
190
  | `merge_reconcile_receipt_evidence_untrusted` | `merge_reconcile_receipt_evidence_untrusted` | uncovered | none | 0 |
189
191
  | `merge_root_not_found` | `merge_root_not_found` | uncovered | none | 0 |
190
192
  | `missing_allowed_values` | `missing_allowed_values` | uncovered | none | 0 |
@@ -197,6 +199,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
197
199
  | `missing_observation` | `missing_observation` | uncovered | none | 0 |
198
200
  | `missing_observed_signature` | `missing_observed_signature` | uncovered | none | 0 |
199
201
  | `missing_parameter_alias` | `missing_parameter_alias` | uncovered | none | 0 |
202
+ | `missing_positive_execution_receipt` | `missing_positive_execution_receipt` | uncovered | none | 0 |
200
203
  | `missing_probe` | `missing_probe` | uncovered | none | 0 |
201
204
  | `missing_required_argument` | `missing_required_argument` | executable | grammar | 57 |
202
205
  | `missing_required_option` | `missing_required_option` | uncovered | none | 0 |
@@ -213,6 +216,9 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
213
216
  | `no_update_fields` | `no_update_fields` | uncovered | none | 0 |
214
217
  | `no_version_bounds_declared` | `no_version_bounds_declared` | executable | owned_state | 1 |
215
218
  | `non_refusal_exit` | `non_refusal_exit` | uncovered | none | 0 |
219
+ | `npm_pack_json_shape_unsupported` | `npm_pack_json_shape_unsupported` | uncovered | none | 0 |
220
+ | `npm_package_archive_missing` | `npm_package_archive_missing` | uncovered | none | 0 |
221
+ | `npm_package_archive_unsafe` | `npm_package_archive_unsafe` | uncovered | none | 0 |
216
222
  | `npm_package_not_found` | `npm_package_not_found` | uncovered | none | 0 |
217
223
  | `ownership_conflict` | `ownership_conflict` | uncovered | none | 0 |
218
224
  | `ownership_dependency_bypass_restricted_options` | `ownership_dependency_bypass_restricted_options` | uncovered | none | 0 |
@@ -246,6 +252,8 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
246
252
  | `reopen_reason_required` | `reopen_reason_required` | uncovered | none | 0 |
247
253
  | `reopen_receipt_missing` | `reopen_receipt_missing` | uncovered | none | 0 |
248
254
  | `reopen_target_status_invalid` | `reopen_target_status_invalid` | uncovered | none | 0 |
255
+ | `reported_zero_passes` | `reported_zero_passes` | uncovered | none | 0 |
256
+ | `reported_zero_tests` | `reported_zero_tests` | uncovered | none | 0 |
249
257
  | `reserved_item_field` | `reserved_item_field` | uncovered | none | 0 |
250
258
  | `retry_failed` | `retry_failed` | uncovered | none | 0 |
251
259
  | `schema_migration_input_required` | `schema_migration_input_required` | uncovered | none | 0 |
@@ -314,6 +322,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
314
322
  | `validate_history_drift_hash_mismatches` | `history_drift_hash_mismatch` | uncovered | none | 0 |
315
323
  | `validate_history_drift_missing_streams` | `history_drift_missing_stream` | uncovered | none | 0 |
316
324
  | `validate_history_drift_unreadable_streams` | `history_drift_unreadable_stream` | uncovered | none | 0 |
325
+ | `validate_history_drift_version_skews` | `history_drift_version_skew` | uncovered | none | 0 |
317
326
  | `validate_history_unknown_author_events` | `history_unknown_author_events` | uncovered | none | 0 |
318
327
  | `validate_lifecycle_active_closure_like_metadata` | `validate_lifecycle_active_closure_like_metadata` | uncovered | none | 0 |
319
328
  | `validate_lifecycle_active_terminal_parent` | `validate_lifecycle_active_terminal_parent` | uncovered | none | 0 |
@@ -1,12 +1,20 @@
1
1
  # CLI transport overhead
2
2
 
3
- Tracked by [pm-yse5dt](../../.agents/pm/tasks/pm-yse5dt.toon).
3
+ Tracked by [pm-yse5dt](../../.agents/pm/tasks/pm-yse5dt.toon), with RSS
4
+ admission reliability owned by
5
+ [pm-pz49xc](../../.agents/pm/issues/pm-pz49xc.toon).
4
6
 
5
7
  Each result starts from a fresh isolated workspace containing exactly one item.
6
8
  The command runs in a fresh Node v26.5.0 process on
7
9
  linux/x64; setup and fixture generation are
8
10
  outside the timed interval. Short local gates use the best observed latency,
9
- while the report retains p50 and p95 evidence.
11
+ while the report retains p50 and p95 evidence. RSS admission uses the measured
12
+ median so one page-level outlier cannot false-fail the gate; the maximum remains
13
+ in the report as diagnostic evidence. Every post-warmup RSS sample must be a
14
+ finite measurement; an unavailable sample makes the admission median unavailable
15
+ and fails closed when a budget exists. Admission adds a fixed 512 KiB noise margin
16
+ without changing the committed budget; a majority persistent increase beyond
17
+ that bounded margin still fails.
10
18
 
11
19
  | Command | best | p50 | p95 |
12
20
  | --------- | -----: | -----: | -----: |