@unbrained/pm-cli 2026.8.26 → 2026.8.28

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 (196) hide show
  1. package/.agents/skills/HARNESS_COMPATIBILITY.md +32 -0
  2. package/.agents/skills/README.md +47 -0
  3. package/.agents/skills/pm-developer/SKILL.md +117 -0
  4. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +49 -0
  5. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +91 -0
  6. package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +72 -0
  7. package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
  8. package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +82 -0
  9. package/.agents/skills/pm-developer/references/TOKEN_BUDGETS.md +85 -0
  10. package/.agents/skills/pm-extensions/SKILL.md +106 -0
  11. package/.agents/skills/pm-extensions/references/AUTHORING.md +95 -0
  12. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
  13. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
  14. package/.agents/skills/pm-sdk/SKILL.md +107 -0
  15. package/.agents/skills/pm-sdk/references/DOMAIN_MODELING.md +78 -0
  16. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
  17. package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
  18. package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +82 -0
  19. package/.agents/skills/pm-user/SKILL.md +111 -0
  20. package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +105 -0
  21. package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
  22. package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
  23. package/.claude-plugin/marketplace.json +2 -2
  24. package/CHANGELOG.md +50 -4
  25. package/README.md +8 -5
  26. package/dist/cli/commander-usage.js +11 -7
  27. package/dist/cli/error-guidance.js +62 -8
  28. package/dist/cli/help-content.d.ts +2 -0
  29. package/dist/cli/help-content.js +53 -17
  30. package/dist/cli/help-json-payload.d.ts +8 -2
  31. package/dist/cli/help-json-payload.js +46 -12
  32. package/dist/cli/main.js +52 -74
  33. package/dist/cli/register-annotations.js +83 -60
  34. package/dist/cli/register-setup.js +98 -57
  35. package/dist/cli-bundle/bundle-manifest.json +151 -151
  36. package/dist/cli-bundle/chunks/{chunk-UKBCRPA2.js → chunk-BY2FQ2NI.js} +2 -2
  37. package/dist/cli-bundle/chunks/chunk-E73FDIWT.js +3 -0
  38. package/dist/cli-bundle/chunks/{chunk-WRHJ3MB6.js → chunk-FEVBFFCQ.js} +2 -2
  39. package/dist/cli-bundle/chunks/{chunk-KBFP3E4E.js → chunk-M7OXRQE3.js} +66 -44
  40. package/dist/cli-bundle/chunks/{chunk-S4U76VZF.js → chunk-NBCBFVZI.js} +2 -2
  41. package/dist/cli-bundle/chunks/{chunk-ZNRLJ54C.js → chunk-NTXZHRKA.js} +45 -45
  42. package/dist/cli-bundle/chunks/chunk-QE6WQXFO.js +3 -0
  43. package/dist/cli-bundle/chunks/chunk-TIQ6AMH2.js +13 -0
  44. package/dist/cli-bundle/chunks/chunk-X2RROGZE.js +2 -0
  45. package/dist/cli-bundle/chunks/{chunk-E2GCFJSU.js → chunk-XRVVYRRO.js} +33 -33
  46. package/dist/cli-bundle/chunks/chunk-XWEQGHHG.js +202 -0
  47. package/dist/cli-bundle/chunks/{register-list-query-EMCPMICY.js → register-list-query-J35ZPQQ5.js} +2 -2
  48. package/dist/cli-bundle/chunks/{register-mutation-OJ67ABCB.js → register-mutation-J6XJJOGU.js} +4 -4
  49. package/dist/cli-bundle/chunks/{register-operations-H2GLP7LT.js → register-operations-AE3JEMFT.js} +2 -2
  50. package/dist/cli-bundle/chunks/register-setup-OQERLLWE.js +2 -0
  51. package/dist/cli-bundle/focused-chunks/{chunk-72T6JGAE.js → chunk-4ZDRZYYJ.js} +43 -43
  52. package/dist/cli-bundle/focused-chunks/{chunk-OHIHZ7HS.js → chunk-6GCRSLPG.js} +2 -2
  53. package/dist/cli-bundle/focused-chunks/{chunk-UYBA57GY.js → chunk-AD6ULRAF.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/{chunk-FXDLT6FL.js → chunk-AHAM2HAU.js} +2 -2
  55. package/dist/cli-bundle/focused-chunks/{chunk-LV5N3LK5.js → chunk-FC2AXLB5.js} +2 -2
  56. package/dist/cli-bundle/focused-chunks/{chunk-IBHXMFE7.js → chunk-HC7ODMH3.js} +2 -2
  57. package/dist/cli-bundle/focused-chunks/{chunk-4K2II4TV.js → chunk-HVQ22RC4.js} +2 -2
  58. package/dist/cli-bundle/focused-chunks/{chunk-MMXUPDDJ.js → chunk-JZYPPMXF.js} +2 -2
  59. package/dist/cli-bundle/focused-chunks/chunk-LLNTHF5X.js +2 -0
  60. package/dist/cli-bundle/focused-chunks/chunk-LYFWQMVC.js +2 -0
  61. package/dist/cli-bundle/focused-chunks/{chunk-A644DUFQ.js → chunk-MEASX544.js} +2 -2
  62. package/dist/cli-bundle/focused-chunks/{chunk-YO3ZF3FI.js → chunk-THEPQMLX.js} +2 -2
  63. package/dist/cli-bundle/focused-chunks/{chunk-57XY346D.js → chunk-XDPYBQCF.js} +9 -9
  64. package/dist/cli-bundle/focused-chunks/{chunk-TMJDFHVD.js → chunk-Y3JJXRVK.js} +2 -2
  65. package/dist/cli-bundle/focused-chunks/{chunk-66VGB23P.js → chunk-Y5A7SJJ7.js} +2 -2
  66. package/dist/cli-bundle/focused-chunks/chunk-YJLDHJOD.js +2 -0
  67. package/dist/cli-bundle/focused-chunks/{chunk-P2E6LDAE.js → chunk-YVVZ3LQ6.js} +3 -3
  68. package/dist/cli-bundle/focused-chunks/chunk-Z2USIBR2.js +5 -0
  69. package/dist/cli-bundle/main.js +15 -14
  70. package/dist/cli-bundle/sdk-authoring.js +1 -1
  71. package/dist/cli-bundle/sdk-contracts.js +2 -2
  72. package/dist/cli-bundle/sdk-core.js +31 -31
  73. package/dist/cli-bundle/sdk-governance.js +1 -1
  74. package/dist/cli-bundle/sdk-graph.js +1 -1
  75. package/dist/cli-bundle/sdk-merge.js +31 -31
  76. package/dist/cli-bundle/sdk-query.js +1 -1
  77. package/dist/cli-bundle/sdk-runtime.js +1 -1
  78. package/dist/cli-bundle/sdk-testing.js +1 -1
  79. package/dist/cli-bundle/sdk.js +32 -7
  80. package/dist/core/governance/issue-codes.d.ts +11 -2
  81. package/dist/core/governance/issue-codes.js +29 -10
  82. package/dist/core/item/item-format.js +3 -3
  83. package/dist/core/store/item-store.js +12 -5
  84. package/dist/mcp/server.js +123 -9
  85. package/dist/mcp/tool-definitions.d.ts +2 -0
  86. package/dist/mcp/tool-definitions.js +5 -5
  87. package/dist/sdk/agent/closed-domain-contracts.d.ts +1 -1
  88. package/dist/sdk/agent/closed-domain-contracts.js +24 -2
  89. package/dist/sdk/agent/command-recovery.js +3 -3
  90. package/dist/sdk/agent/task-transcript-contracts.d.ts +52 -0
  91. package/dist/sdk/agent/task-transcript-contracts.js +198 -0
  92. package/dist/sdk/agent-capability-contracts.js +6 -2
  93. package/dist/sdk/annotations.d.ts +5 -2
  94. package/dist/sdk/annotations.js +66 -36
  95. package/dist/sdk/cli-bootstrap.d.ts +2 -8
  96. package/dist/sdk/cli-bootstrap.js +7 -66
  97. package/dist/sdk/cli-contracts/bootstrap-command-scanner.d.ts +23 -0
  98. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +80 -0
  99. package/dist/sdk/cli-contracts/command-aliases.js +15 -2
  100. package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -1
  101. package/dist/sdk/cli-contracts/enum-contracts.js +7 -2
  102. package/dist/sdk/cli-contracts/flag-contracts.js +12 -5
  103. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +5 -5
  104. package/dist/sdk/cli-contracts/grammar-contracts.d.ts +3 -3
  105. package/dist/sdk/cli-contracts/grammar-contracts.js +24 -17
  106. package/dist/sdk/cli-contracts/runtime-contracts.js +13 -11
  107. package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -2
  108. package/dist/sdk/cli-contracts/tool-schema.d.ts +1 -1
  109. package/dist/sdk/cli-contracts/tool-schema.js +32 -16
  110. package/dist/sdk/cli-contracts.d.ts +1 -1
  111. package/dist/sdk/cli-contracts.js +3 -3
  112. package/dist/sdk/cli-program.js +3 -2
  113. package/dist/sdk/comments.d.ts +4 -0
  114. package/dist/sdk/comments.js +2 -2
  115. package/dist/sdk/completion.js +47 -16
  116. package/dist/sdk/contracts.d.ts +1 -0
  117. package/dist/sdk/contracts.js +3 -2
  118. package/dist/sdk/extension/install-sources.d.ts +13 -0
  119. package/dist/sdk/extension/install-sources.js +62 -30
  120. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -2
  121. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +38 -14
  122. package/dist/sdk/governance/upgrade.d.ts +2 -0
  123. package/dist/sdk/governance/upgrade.js +30 -8
  124. package/dist/sdk/governance/validate.js +8 -6
  125. package/dist/sdk/guide-topics.js +6 -6
  126. package/dist/sdk/index.d.ts +5 -2
  127. package/dist/sdk/index.js +6 -3
  128. package/dist/sdk/learnings.d.ts +4 -0
  129. package/dist/sdk/learnings.js +7 -4
  130. package/dist/sdk/lifecycle/close.js +4 -3
  131. package/dist/sdk/mcp/apps.d.ts +70 -0
  132. package/dist/sdk/mcp/apps.js +154 -0
  133. package/dist/sdk/mcp/skills.d.ts +127 -0
  134. package/dist/sdk/mcp/skills.js +390 -0
  135. package/dist/sdk/notes.d.ts +4 -0
  136. package/dist/sdk/notes.js +2 -2
  137. package/dist/sdk/read-output-contracts.js +16 -3
  138. package/dist/sdk/runtime-action-aliases.js +7 -3
  139. package/dist/sdk/runtime-input.js +15 -4
  140. package/dist/sdk/runtime-primitives.d.ts +1 -1
  141. package/dist/sdk/runtime-primitives.js +3 -3
  142. package/dist/sdk/runtime.d.ts +6 -6
  143. package/dist/sdk/runtime.js +8 -8
  144. package/docs/CLI_GRAMMAR.md +7 -1
  145. package/docs/COMMANDS.md +5 -4
  146. package/docs/EXTENSIONS.md +33 -32
  147. package/docs/MCP_2026_07_28.md +24 -2
  148. package/docs/MCP_2026_07_28_CONFORMANCE.md +4 -4
  149. package/docs/MCP_SKILLS_AND_APPS.md +107 -0
  150. package/docs/OUTPUT_TOKEN_ACCOUNTING.md +20 -7
  151. package/docs/QUICKSTART.md +15 -15
  152. package/docs/README.md +1 -0
  153. package/docs/RELEASING.md +20 -4
  154. package/docs/SDK.md +12 -0
  155. package/docs/SDK_CONTEXT_INTEGRITY.md +18 -1
  156. package/docs/SDK_EVIDENCE_TRACEABILITY.md +9 -1
  157. package/docs/SDK_RUNTIME_BOUNDARIES.md +10 -0
  158. package/docs/TESTING.md +6 -2
  159. package/docs/agent-task-token-baseline.json +97 -11
  160. package/docs/agent-task-transcripts.json +211 -0
  161. package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
  162. package/docs/generated/FLAG_LEXICON_BUDGETS.md +3 -3
  163. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -7
  164. package/docs/performance/cli-transport-overhead.md +10 -2
  165. package/marketplace.json +2 -2
  166. package/package.json +10 -8
  167. package/packages/pm-beads/README.md +12 -6
  168. package/packages/pm-beads/docs/MIGRATION.md +53 -0
  169. package/packages/pm-beads/extensions/beads/index.ts +8 -0
  170. package/packages/pm-beads/extensions/beads/runtime.ts +671 -112
  171. package/packages/pm-beads/package.json +1 -1
  172. package/packages/pm-calendar/package.json +1 -1
  173. package/packages/pm-command-kit/package.json +1 -1
  174. package/packages/pm-digital-twin/package.json +1 -1
  175. package/packages/pm-governance-audit/package.json +1 -1
  176. package/packages/pm-guide-shell/package.json +1 -1
  177. package/packages/pm-kanban/package.json +1 -1
  178. package/packages/pm-lifecycle-hooks/package.json +1 -1
  179. package/packages/pm-linked-test-adapters/package.json +1 -1
  180. package/packages/pm-search-advanced/package.json +1 -1
  181. package/packages/pm-templates/package.json +1 -1
  182. package/packages/pm-todos/package.json +1 -1
  183. package/packages/pm-vcs/package.json +1 -1
  184. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  185. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  186. package/sdk/public-surface.json +430 -36
  187. package/dist/cli-bundle/chunks/chunk-ES25LX3D.js +0 -202
  188. package/dist/cli-bundle/chunks/chunk-FRDWWB6R.js +0 -3
  189. package/dist/cli-bundle/chunks/chunk-ICQ3RVIY.js +0 -2
  190. package/dist/cli-bundle/chunks/chunk-IV64RJVE.js +0 -13
  191. package/dist/cli-bundle/chunks/chunk-MVYLQ67M.js +0 -3
  192. package/dist/cli-bundle/chunks/register-setup-GLZAHLVI.js +0 -2
  193. package/dist/cli-bundle/focused-chunks/chunk-4XNH2HM7.js +0 -2
  194. package/dist/cli-bundle/focused-chunks/chunk-7I23XGWO.js +0 -2
  195. package/dist/cli-bundle/focused-chunks/chunk-7YCDTCBC.js +0 -2
  196. package/dist/cli-bundle/focused-chunks/chunk-LMKG3DFE.js +0 -5
@@ -0,0 +1,107 @@
1
+ # MCP Skills and Apps
2
+
3
+ Tracker references: [pm-8nzivt](../.agents/pm/features/pm-8nzivt.toon),
4
+ [pm-pznhee](../.agents/pm/features/pm-pznhee.toon), and
5
+ [pm-55yf1t](../.agents/pm/tasks/pm-55yf1t.toon).
6
+
7
+ pm exposes optional workflow guidance and interactive context views without
8
+ moving authority out of the public SDK or the tracker. Both extensions require
9
+ explicit request-local negotiation. Clients that do not negotiate them retain
10
+ the complete CLI, SDK, tool, prompt, and ordinary resource behavior.
11
+
12
+ ## Skills over MCP
13
+
14
+ Skills support follows the current SEP-2640 draft at the exact revision
15
+ `a3e147ca2710f68214247aecc729731ee1ae8d03`. Because the proposal is not a
16
+ stable MCP extension, discovery advertises both `status: draft` and that exact
17
+ revision. Every `skills/list`, `skills/get`, skill `resources/read`, and
18
+ `resources/directory/read` request must independently declare:
19
+
20
+ ```json
21
+ {
22
+ "extensions": {
23
+ "io.modelcontextprotocol/skills": {
24
+ "revision": "SEP-2640@a3e147ca2710f68214247aecc729731ee1ae8d03",
25
+ "directoryRead": true
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ `skills/list` is lexically ordered and cursor-paginated. Descriptors contain
32
+ the parsed SKILL.md frontmatter, every file URI, byte size, SHA-256 digest,
33
+ estimated token cost, package/MCP compatibility, origin, and an explicit
34
+ `untrusted` trust marker. `skills/get` returns one descriptor without loading
35
+ file bodies. Digests use the draft's `sha256:<hex>` representation.
36
+ `resources/read` fetches one digest-bound file; the optional, cursor-paginated
37
+ directory read returns one directory's direct child resource metadata only.
38
+ Clients read selected file bodies through ordinary `resources/read` calls.
39
+
40
+ The published package carries the four canonical pm skills. A repository may
41
+ override a package skill by placing the same validated name below
42
+ `.agents/skills`, and the returned origin changes to `workspace`. Overrides do
43
+ not inherit trust: skill text is guidance, never implicit permission to execute
44
+ commands or mutate the tracker.
45
+
46
+ Security limits reject symbolic links, malformed or aliased YAML, mismatched
47
+ directory/frontmatter names, stale cursors, oversized files, excessive file
48
+ counts, and aggregate skill bodies above the declared bound. In accordance with
49
+ the draft, pm accepts at most 512 resources and 16 MiB of total content per
50
+ skill; the same 16 MiB ceiling applies to an individual resource. An origin is
51
+ limited to 100 candidate skill directories and 32 MiB across all retained
52
+ bodies. File counts and both byte budgets are reserved from filesystem metadata
53
+ before a body is read, so an untrusted workspace cannot exceed the declared
54
+ memory envelope before rejection. Each read is resolved from the immutable
55
+ in-memory registry used to compute its digest.
56
+
57
+ ## MCP Apps
58
+
59
+ pm implements the stable MCP Apps `2026-01-26` extension through the official
60
+ `@modelcontextprotocol/ext-apps` metadata contracts. A client opts in with:
61
+
62
+ ```json
63
+ {
64
+ "extensions": {
65
+ "io.modelcontextprotocol/ui": {
66
+ "specVersion": "2026-01-26",
67
+ "mimeTypes": ["text/html;profile=mcp-app"]
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ Negotiated `tools/list` attaches `_meta.ui.resourceUri` to five existing,
74
+ SDK-backed tools. `resources/list` and `resources/read` expose the corresponding
75
+ `ui://` documents:
76
+
77
+ | View | Authoritative tool | Purpose |
78
+ | --- | --- | --- |
79
+ | Context explorer | `pm_context` | Context, provenance, omissions, and token cost |
80
+ | Relationship graph | `pm_graph` | Typed edges, explaining paths, and governance |
81
+ | Plan and milestone | `pm_plan` | Steps, dependencies, decisions, and validation |
82
+ | Assurance dashboard | `pm_validate` | Verdicts, evidence, and recovery paths |
83
+ | Long-operation view | `pm_test` | Durable test and operation results |
84
+
85
+ Every view is self-contained and requests no network, storage, camera,
86
+ microphone, or location permission. It performs the MCP Apps initialization
87
+ handshake, listens for tool input/result/cancellation and host-context events,
88
+ bounds large renderings with an explicit truncation message, and retains the
89
+ tool result's text fallback. Layout is responsive, keyboard focus is visible,
90
+ and reduced-motion preferences are honored.
91
+
92
+ Apps keep no durable project state and expose no hidden mutation path. The
93
+ tracker, task store, mutation guards, consent, idempotency, and immutable
94
+ receipts remain owned by existing SDK-backed MCP tools. A host that cannot or
95
+ does not render Apps still receives meaningful tool text and structured data.
96
+ Missing or incompatible optional Apps declarations therefore leave core tool
97
+ and resource discovery undecorated; an explicit read of a `ui://` resource
98
+ continues to fail closed unless the stable capability was negotiated.
99
+
100
+ ## Public SDK
101
+
102
+ Use `PmMcpSkillRegistry`, `assertPmMcpSkillsCapability()`,
103
+ `PM_MCP_SKILLS_SERVER_CAPABILITY`, `PM_MCP_APP_CONTRACTS`,
104
+ `hasPmMcpAppsCapability()`, `decoratePmMcpToolsWithApps()`, and
105
+ `renderPmMcpAppHtml()` from `@unbrained/pm-cli/sdk`. The server is a thin
106
+ adapter over these contracts; custom hosts can project the same resources and
107
+ security policy without importing pm server internals.
@@ -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
@@ -9,7 +9,7 @@ Use this page to get from a clean repository to a tracked, verified item.
9
9
  - Claim before implementation.
10
10
  - Link changed files, docs, and tests to the item.
11
11
  - Close only after evidence is recorded.
12
- - Use `pm install guide-shell --project` before `pm guide quickstart` or `pm guide workflows` when you need local docs routing.
12
+ - Use `pm package install guide-shell --project` before `pm guide quickstart` or `pm guide workflows` when you need local docs routing.
13
13
 
14
14
  Tracked documentation work: [pm-u9d0](../.agents/pm/epics/pm-u9d0.toon).
15
15
 
@@ -23,10 +23,10 @@ pm --version
23
23
  For updates, use the registry package again:
24
24
 
25
25
  ```bash
26
- pm upgrade --cli-only
26
+ pm package upgrade --cli-only
27
27
  ```
28
28
 
29
- `pm upgrade` uses `npm install -g @unbrained/pm-cli@latest` for the CLI/SDK and can also refresh installed pm packages. Do not use the GitHub git URL as the normal global update path. If a previous git-sourced install left a stale `pm` shim, run `pm upgrade --cli-only --repair`, run `bash scripts/install.sh --repair` from a checkout, or uninstall the package before reinstalling from npm.
29
+ `pm package upgrade` uses `npm install -g @unbrained/pm-cli@latest` for the CLI/SDK and can also refresh installed pm packages. Do not use the GitHub git URL as the normal global update path. If a previous git-sourced install left a stale `pm` shim, run `pm package upgrade --cli-only --repair`, run `bash scripts/install.sh --repair` from a checkout, or uninstall the package before reinstalling from npm. The hidden `pm upgrade` alias remains compatible with existing automation and emits a migration hint on stderr.
30
30
 
31
31
  For one-off use:
32
32
 
@@ -39,8 +39,8 @@ Optional first-party packages are installable during init or on demand:
39
39
  ```bash
40
40
  pm init --defaults --with-packages
41
41
  pm package catalog --project
42
- pm install '*' --project
43
- pm install all --project
42
+ pm package install '*' --project
43
+ pm package install all --project
44
44
  pm package doctor --project --detail summary
45
45
  ```
46
46
 
@@ -78,16 +78,16 @@ pm create \
78
78
 
79
79
  Useful item types:
80
80
 
81
- | Type | Use |
82
- |------|-----|
83
- | `Epic` | broad outcome or initiative |
84
- | `Feature` | user-facing capability or major slice |
85
- | `Task` | implementation work |
86
- | `Chore` | maintenance, refactoring, or housekeeping work |
87
- | `Issue` | bug or defect |
88
- | `Decision` | recorded choice and rationale |
89
- | `Plan` | agent-optimized living plan with ordered steps and evidence |
90
- | `Event`, `Reminder`, `Milestone`, `Meeting` | calendar-aware planning |
81
+ | Type | Use |
82
+ | ------------------------------------------- | ----------------------------------------------------------- |
83
+ | `Epic` | broad outcome or initiative |
84
+ | `Feature` | user-facing capability or major slice |
85
+ | `Task` | implementation work |
86
+ | `Chore` | maintenance, refactoring, or housekeeping work |
87
+ | `Issue` | bug or defect |
88
+ | `Decision` | recorded choice and rationale |
89
+ | `Plan` | agent-optimized living plan with ordered steps and evidence |
90
+ | `Event`, `Reminder`, `Milestone`, `Meeting` | calendar-aware planning |
91
91
 
92
92
  ## Find and Claim Work
93
93
 
package/docs/README.md CHANGED
@@ -47,6 +47,7 @@ pm guide release --json
47
47
  - [MCP 2026-07-28 Protocol Decision](MCP_2026_07_28.md) - stateless request metadata, discovery, result envelopes, explicit legacy boundary, and migration policy.
48
48
  - [MCP 2026-07-28 Conformance Matrix](MCP_2026_07_28_CONFORMANCE.md) - official revision changes mapped to canonical owners and executable evidence.
49
49
  - [MCP Interaction and Task SDK](SDK_MCP_INTERACTIONS.md) - public MRTR continuation, cache/schema validation, and durable task-store contracts.
50
+ - [MCP Skills and Apps](MCP_SKILLS_AND_APPS.md) - negotiated draft workflow discovery, stable interactive views, digests, provenance, accessibility, and trust boundaries.
50
51
  - [MCP Remote Transport, Authorization, and Migration](MCP_REMOTE_TRANSPORT_SECURITY.md) - Streamable HTTP operation, subscriptions, OAuth and trace boundaries, threat model, and deprecated-feature ratchet.
51
52
  - [SDK Artifact Output Contracts](SDK_ARTIFACT_OUTPUT.md) - clean stdout/file exporter channels, bounded receipts, binary-safe delivery, and shared NDJSON terminal framing.
52
53
  - [Context Relevance and Packing](CONTEXT_RELEVANCE.md) - shared CLI/SDK signals, derived-store provenance, ranking explanations, and token budgets.
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
@@ -387,9 +395,17 @@ git push origin v<version>
387
395
  metadata cannot mask a public-registry outage. The verifier dispatches a real
388
396
  `pm contracts` command through both explicit-bin and package-default
389
397
  invocations, performs stateless JSON-RPC `server/discover` against the
390
- symlink-resolved `pm-mcp` bin under both npx and bunx, requires canonical
391
- `2026-07-28` metadata/result envelopes, derives bin coverage
392
- from `package.json`, and proves missing-bin and missing-command controls fail.
398
+ symlink-resolved `pm-mcp` bin under both npx and bunx, and launches the exact
399
+ public `pm-mcp-http` bin under both executors on an isolated loopback port for
400
+ a real Streamable HTTP `server/discover` exchange. Both transports require
401
+ canonical `2026-07-28` metadata/result envelopes. HTTP startup is bounded to
402
+ two 20-second attempts per executor so the complete retry budget remains below
403
+ the hosted step timeout. Signal-aware process-group cleanup escalates from
404
+ `SIGTERM` to `SIGKILL` after a bounded grace period, including when the outer
405
+ evaluator times out or an intermediate executor exits before its server
406
+ descendant. Direct executor exit is not treated as process-group cleanup. The
407
+ verifier derives bin coverage from `package.json`, and proves missing-bin and
408
+ missing-command controls fail.
393
409
  - exact-package installed acceptance through
394
410
  `scripts/release/verify-installed-agent-session.mjs`. Separate npm and Bun
395
411
  install roots must contain the resolved executable, then each drives the
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
 
@@ -16,10 +16,16 @@ These contracts keep project management equal to context management: reads say w
16
16
  pm get pm-a1b2 --output-include id,title
17
17
  pm get pm-a1b2 --output-include item.id,item.title,linked
18
18
  pm get pm-a1b2 --output-include item,claim_state
19
+ pm get pm-a1b2 --output-include comments,learnings,tests
19
20
  ```
20
21
 
21
22
  An unknown selector is a usage refusal that lists the valid vocabulary. Selecting the complete `item` object together with an item field is also refused because the two selectors express conflicting projection depths. Every successful projection carries an `omission_receipt` with the exact selectors needed to restore withheld item fields or sections.
22
23
 
24
+ Collection selectors participate in the same pre-execution projection on CLI,
25
+ SDK, and MCP transports. Requesting `comments`, `notes`, `learnings`, `files`,
26
+ `tests`, `docs`, `reminders`, or `events` therefore loads only the named item
27
+ collections before the universal output layer removes unrequested fields.
28
+
23
29
  Automatic receipts cover every heavy item collection (`comments`, `notes`,
24
30
  `learnings`, `files`, `tests`, `docs`, `reminders`, and `events`) plus `body`,
25
31
  `children`, `claim_state`, `linked`, and `schedule`. Empty included collections
@@ -76,6 +82,17 @@ The structured `option_scope` is `declared_on_path`, `declared_elsewhere`, or
76
82
  case, while the third names the nearest current-path spellings and explicitly
77
83
  terminates the otherwise-unbounded command search.
78
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
+
79
96
  ## Semantic flag and spelling contracts
80
97
 
81
98
  `listPmFlagLexicon()` classifies flags by meaning rather than spelling alone.
@@ -1,6 +1,6 @@
1
1
  # SDK Evidence Traceability and Integrity
2
2
 
3
- Tracker references: [pm-f86lth](../.agents/pm/features/pm-f86lth.toon), [pm-cstuys](../.agents/pm/issues/pm-cstuys.toon), [pm-jb1ron](../.agents/pm/issues/pm-jb1ron.toon), [pm-2irc1p](../.agents/pm/issues/pm-2irc1p.toon), and [pm-u5c27w](../.agents/pm/issues/pm-u5c27w.toon).
3
+ Tracker references: [pm-f86lth](../.agents/pm/features/pm-f86lth.toon), [pm-cstuys](../.agents/pm/issues/pm-cstuys.toon), [pm-jb1ron](../.agents/pm/issues/pm-jb1ron.toon), [pm-2irc1p](../.agents/pm/issues/pm-2irc1p.toon), [pm-u5c27w](../.agents/pm/issues/pm-u5c27w.toon), and [pm-blvfye](../.agents/pm/issues/pm-blvfye.toon).
4
4
 
5
5
  This contract turns linked evidence into a bidirectional context primitive. Items can continue to declare the files that explain their implementation, while agents and packages can resolve a source path back to its owning work without scanning tracker files at indexed scale.
6
6
 
@@ -127,3 +127,11 @@ such as `BD-30-A` and `BD-30-B` are distinct sibling work and receive only their
127
127
  ordinary title-token similarity; exact repetitions of the full code retain the
128
128
  strong `issue_code` signal. This keeps duplicate-close guidance from collapsing
129
129
  decomposed work that shares a numeric family prefix.
130
+
131
+ Metadata validation applies a separate, evidence-backed title classifier.
132
+ Upper-case prefixes remain conventional issue codes. Mixed-case prefixes must
133
+ have a code delimiter, an explicit body marker/backtick reference, or match the
134
+ configured item-id prefix. Natural-language compounds such as `Match-3`,
135
+ `Covid-19`, and `Wi-Fi-6` therefore do not produce dishonest rename-or-merge
136
+ warnings, while `GH-1118`, `Bug-12: ...`, and configured formats remain
137
+ detectable without an ever-growing word dictionary.
@@ -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
  }