@unbrained/pm-cli 2026.8.25 → 2026.8.27
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.
- package/.agents/skills/HARNESS_COMPATIBILITY.md +32 -0
- package/.agents/skills/README.md +47 -0
- package/.agents/skills/pm-developer/SKILL.md +117 -0
- package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +49 -0
- package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +91 -0
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +72 -0
- package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +82 -0
- package/.agents/skills/pm-developer/references/TOKEN_BUDGETS.md +85 -0
- package/.agents/skills/pm-extensions/SKILL.md +106 -0
- package/.agents/skills/pm-extensions/references/AUTHORING.md +95 -0
- package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
- package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
- package/.agents/skills/pm-sdk/SKILL.md +107 -0
- package/.agents/skills/pm-sdk/references/DOMAIN_MODELING.md +78 -0
- package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
- package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
- package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +82 -0
- package/.agents/skills/pm-user/SKILL.md +111 -0
- package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +105 -0
- package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +58 -3
- package/README.md +8 -5
- package/dist/cli/commander-usage.js +11 -7
- package/dist/cli/error-guidance.js +3 -3
- package/dist/cli/help-content.d.ts +2 -0
- package/dist/cli/help-content.js +53 -17
- package/dist/cli/help-json-payload.d.ts +8 -2
- package/dist/cli/help-json-payload.js +46 -12
- package/dist/cli/main.js +52 -74
- package/dist/cli/register-annotations.js +27 -21
- package/dist/cli/register-setup.js +98 -57
- package/dist/cli-bundle/bundle-manifest.json +156 -156
- package/dist/cli-bundle/chunks/chunk-3OO3W6FW.js +202 -0
- package/dist/cli-bundle/chunks/chunk-52EKTW6V.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-QLUORNIB.js → chunk-CVBBGWW5.js} +62 -44
- package/dist/cli-bundle/chunks/chunk-MFNTKMTI.js +13 -0
- package/dist/cli-bundle/chunks/chunk-OS27HHBN.js +35 -0
- package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-5I5RWIJC.js → chunk-R4ETAOJC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-OWHNAR2B.js → chunk-SH6P7FXI.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-SHMDY36D.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-244MI4GS.js → chunk-SKXLJIEK.js} +60 -60
- package/dist/cli-bundle/chunks/chunk-TNX6HC54.js +3 -0
- package/dist/cli-bundle/chunks/{register-list-query-XVN2ZLI7.js → register-list-query-EUWM6VII.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-QCKAEGIJ.js → register-mutation-FD4HSAVU.js} +4 -4
- package/dist/cli-bundle/chunks/{register-operations-SDEAXE7E.js → register-operations-HRMNFEC3.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-33GNICLX.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-IBZZZGK3.js → chunk-2AGZ5BRT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-4BR5UU52.js +50 -0
- package/dist/cli-bundle/focused-chunks/{chunk-OHIHZ7HS.js → chunk-6GCRSLPG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-OVJL6NZE.js → chunk-AD6ULRAF.js} +4 -4
- package/dist/cli-bundle/focused-chunks/{chunk-7YCDTCBC.js → chunk-AQ5IYEZZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-YO3ZF3FI.js → chunk-EKX37ZHA.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-N7W67YIG.js → chunk-FC2AXLB5.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-H5JZEIQV.js → chunk-HC7ODMH3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-NOOZGIXP.js → chunk-HVQ22RC4.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-A644DUFQ.js → chunk-MEASX544.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-RAFKLNZX.js → chunk-MXTYGECH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-2UIWOP3O.js → chunk-SUBSWYW3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-VXWATRFL.js → chunk-XDPYBQCF.js} +9 -9
- package/dist/cli-bundle/focused-chunks/{chunk-XUQPEKRN.js → chunk-Y3JJXRVK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-GQR3WH3F.js → chunk-Y5A7SJJ7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-YHWHX6YY.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-ONYQCALA.js → chunk-YVVZ3LQ6.js} +6 -6
- package/dist/cli-bundle/focused-chunks/chunk-Z2USIBR2.js +5 -0
- package/dist/cli-bundle/main.js +15 -14
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +31 -31
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +31 -31
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +32 -6
- package/dist/core/extensions/manifest-schema.d.ts +20 -0
- package/dist/core/extensions/manifest-schema.js +28 -10
- package/dist/core/governance/issue-codes.d.ts +11 -2
- package/dist/core/governance/issue-codes.js +29 -10
- package/dist/core/item/item-format.js +3 -3
- package/dist/core/store/item-store.js +12 -5
- package/dist/mcp/http-server.d.ts +60 -0
- package/dist/mcp/http-server.js +451 -0
- package/dist/mcp/legacy-adapter.d.ts +50 -0
- package/dist/mcp/legacy-adapter.js +64 -0
- package/dist/mcp/server.d.ts +42 -9
- package/dist/mcp/server.js +572 -59
- package/dist/mcp/tool-definitions.d.ts +2 -0
- package/dist/mcp/tool-definitions.js +2 -2
- package/dist/sdk/agent/closed-domain-contracts.d.ts +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +24 -2
- package/dist/sdk/agent/refusal-closure-census.d.ts +6 -2
- package/dist/sdk/agent/refusal-closure-census.js +16 -8
- package/dist/sdk/agent-capability-contracts.js +6 -2
- package/dist/sdk/cli-bootstrap.js +3 -2
- package/dist/sdk/cli-contracts/command-aliases.js +15 -2
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +7 -2
- package/dist/sdk/cli-contracts/flag-contracts.js +9 -5
- package/dist/sdk/cli-contracts/grammar-contracts.d.ts +3 -3
- package/dist/sdk/cli-contracts/grammar-contracts.js +24 -17
- package/dist/sdk/cli-contracts/runtime-contracts.js +13 -11
- package/dist/sdk/cli-contracts/tool-schema.js +18 -15
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +3 -3
- package/dist/sdk/cli-program.js +3 -2
- package/dist/sdk/completion.js +40 -13
- package/dist/sdk/compose.d.ts +4 -1
- package/dist/sdk/compose.js +23 -36
- package/dist/sdk/extension/author-manifest.d.ts +22 -0
- package/dist/sdk/extension/author-manifest.js +93 -0
- package/dist/sdk/extension.js +6 -3
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +20 -5
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +18 -3
- package/dist/sdk/governance/health.js +7 -2
- package/dist/sdk/governance/upgrade.d.ts +2 -0
- package/dist/sdk/governance/upgrade.js +30 -8
- package/dist/sdk/governance/validate.js +8 -6
- package/dist/sdk/guide-topics.js +6 -6
- package/dist/sdk/index.d.ts +10 -2
- package/dist/sdk/index.js +11 -3
- package/dist/sdk/mcp/apps.d.ts +70 -0
- package/dist/sdk/mcp/apps.js +154 -0
- package/dist/sdk/mcp/authorization.d.ts +134 -0
- package/dist/sdk/mcp/authorization.js +405 -0
- package/dist/sdk/mcp/interactions.d.ts +118 -0
- package/dist/sdk/mcp/interactions.js +337 -0
- package/dist/sdk/mcp/protocol.d.ts +142 -0
- package/dist/sdk/mcp/protocol.js +174 -0
- package/dist/sdk/mcp/skills.d.ts +127 -0
- package/dist/sdk/mcp/skills.js +390 -0
- package/dist/sdk/mcp/subscriptions.d.ts +65 -0
- package/dist/sdk/mcp/subscriptions.js +212 -0
- package/dist/sdk/mcp/tasks.d.ts +107 -0
- package/dist/sdk/mcp/tasks.js +431 -0
- package/dist/sdk/mcp/transport.d.ts +30 -0
- package/dist/sdk/mcp/transport.js +261 -0
- package/dist/sdk/merge/receipts.d.ts +16 -0
- package/dist/sdk/merge/receipts.js +9 -8
- package/dist/sdk/read-output-contracts.js +16 -3
- package/dist/sdk/runtime-action-aliases.js +7 -3
- package/dist/sdk/runtime-input.js +12 -4
- package/dist/sdk/runtime-primitives.d.ts +2 -2
- package/dist/sdk/runtime-primitives.js +4 -4
- package/dist/sdk/test/execution.d.ts +6 -0
- package/dist/sdk/test/execution.js +32 -3
- package/docs/AGENT_PROVENANCE_ADR.md +6 -4
- package/docs/AGENT_RUNTIME_PRIMITIVES.md +6 -5
- package/docs/CLAUDE_CODE_PLUGIN.md +12 -5
- package/docs/CLI_GRAMMAR.md +7 -1
- package/docs/COMMANDS.md +2 -2
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +8 -0
- package/docs/EXTENSIONS.md +36 -36
- package/docs/MCP_2026_07_28.md +160 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +30 -0
- package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +180 -0
- package/docs/MCP_SKILLS_AND_APPS.md +107 -0
- package/docs/QUICKSTART.md +15 -15
- package/docs/README.md +5 -0
- package/docs/RELEASING.md +12 -3
- package/docs/SDK.md +22 -1
- package/docs/SDK_AGENT_SESSION_CONTEXT.md +18 -13
- package/docs/SDK_CONTEXT_INTEGRITY.md +6 -0
- package/docs/SDK_EVIDENCE_TRACEABILITY.md +9 -1
- package/docs/SDK_MCP_INTERACTIONS.md +227 -0
- package/docs/TESTING.md +4 -0
- package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +13 -11
- package/marketplace.json +2 -2
- package/package.json +15 -11
- package/packages/pm-beads/README.md +12 -6
- package/packages/pm-beads/docs/MIGRATION.md +53 -0
- package/packages/pm-beads/extensions/beads/index.ts +8 -0
- package/packages/pm-beads/extensions/beads/runtime.ts +671 -112
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +1 -0
- package/sdk/public-surface.json +902 -54
- package/dist/cli-bundle/chunks/chunk-2F3LUFMW.js +0 -8
- package/dist/cli-bundle/chunks/chunk-65MHLHAA.js +0 -2
- package/dist/cli-bundle/chunks/chunk-6C7GIMIL.js +0 -13
- package/dist/cli-bundle/chunks/chunk-QKGMHGEI.js +0 -202
- package/dist/cli-bundle/chunks/chunk-T2ENPRXF.js +0 -3
- package/dist/cli-bundle/chunks/chunk-TPQIBSL2.js +0 -3
- package/dist/cli-bundle/chunks/chunk-YQMYF3YD.js +0 -35
- package/dist/cli-bundle/chunks/register-setup-LXVBRCJ3.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-42S3GGZ7.js +0 -50
- package/dist/cli-bundle/focused-chunks/chunk-7I23XGWO.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-LMKG3DFE.js +0 -5
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# MCP Remote Transport, Authorization, and Migration
|
|
2
|
+
|
|
3
|
+
Tracker references: [pm-v7e337](../.agents/pm/features/pm-v7e337.toon),
|
|
4
|
+
[pm-3zh9s4](../.agents/pm/features/pm-3zh9s4.toon), and
|
|
5
|
+
[pm-vzcisw](../.agents/pm/chores/pm-vzcisw.toon).
|
|
6
|
+
|
|
7
|
+
pm exposes the same MCP 2026-07-28 dispatcher through two adapters:
|
|
8
|
+
|
|
9
|
+
- `pm-mcp` is the local JSON-RPC/stdio process. It retains a bounded
|
|
10
|
+
`2025-06-18` compatibility adapter for existing local consumers.
|
|
11
|
+
- `pm-mcp-http` is the canonical sessionless Streamable HTTP POST process. It
|
|
12
|
+
accepts only modern request-local protocol metadata and never creates an
|
|
13
|
+
MCP session.
|
|
14
|
+
|
|
15
|
+
The public `@unbrained/pm-cli/sdk` entrypoint owns subscription filtering,
|
|
16
|
+
HTTP header projection, authorization discovery and validation, issuer-keyed
|
|
17
|
+
credentials, bearer enforcement, and trace-context isolation. Adapters remain
|
|
18
|
+
thin bindings over those contracts.
|
|
19
|
+
|
|
20
|
+
## Run the HTTP adapter
|
|
21
|
+
|
|
22
|
+
The safe default binds only `127.0.0.1:3000`:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pm-mcp-http
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Configuration is explicit and environment-only:
|
|
29
|
+
|
|
30
|
+
| Variable | Meaning | Default |
|
|
31
|
+
| ----------------------------- | --------------------------------------------------- | ------------------ |
|
|
32
|
+
| `PM_MCP_HTTP_HOST` | Bind host | `127.0.0.1` |
|
|
33
|
+
| `PM_MCP_HTTP_PORT` | Bind port, including `0` for an ephemeral test port | `3000` |
|
|
34
|
+
| `PM_MCP_HTTP_ALLOWED_ORIGINS` | Comma-separated exact browser origins | none |
|
|
35
|
+
| `PM_MCP_HTTP_BEARER_TOKEN` | Opaque deployment token for the bundled verifier | none |
|
|
36
|
+
| `PM_MCP_HTTP_AUTH_ISSUER` | Exact HTTPS authorization-server issuer | none |
|
|
37
|
+
| `PM_MCP_HTTP_RESOURCE` | Canonical MCP resource/audience URI | none |
|
|
38
|
+
| `PM_MCP_HTTP_SCOPES` | Space-separated consent scopes | `pm:read pm:write` |
|
|
39
|
+
|
|
40
|
+
A non-loopback bind fails closed unless token, issuer, and resource are all
|
|
41
|
+
present. Production deployments should normally call
|
|
42
|
+
`createPmMcpHttpServer()` with an OAuth access-token verifier backed by their
|
|
43
|
+
authorization server instead of using the executable's single opaque-token
|
|
44
|
+
bootstrap verifier.
|
|
45
|
+
|
|
46
|
+
For example, this starts a deliberately local protected endpoint without
|
|
47
|
+
placing a real credential in documentation:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
PM_MCP_HTTP_BEARER_TOKEN='<deployment-secret>' \
|
|
51
|
+
PM_MCP_HTTP_AUTH_ISSUER='https://auth.example.test' \
|
|
52
|
+
PM_MCP_HTTP_RESOURCE='http://127.0.0.1:3000/mcp' \
|
|
53
|
+
pm-mcp-http
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The adapter serves RFC 9728 protected-resource metadata at both
|
|
57
|
+
`/.well-known/oauth-protected-resource` and the path-qualified
|
|
58
|
+
`/.well-known/oauth-protected-resource/mcp` location.
|
|
59
|
+
|
|
60
|
+
## Stream and header contract
|
|
61
|
+
|
|
62
|
+
Every HTTP request is a POST to `/mcp` and negotiates both
|
|
63
|
+
`application/json` and `text/event-stream`. Normal finite requests return
|
|
64
|
+
JSON. `subscriptions/listen` returns an SSE response whose first message is
|
|
65
|
+
`notifications/subscriptions/acknowledged`; every later subscription
|
|
66
|
+
notification carries the listen request's JSON-RPC id in
|
|
67
|
+
`io.modelcontextprotocol/subscriptionId`.
|
|
68
|
+
|
|
69
|
+
The supported opt-ins are tool-list, prompt-list, resource-list, and exact
|
|
70
|
+
resource-update notifications. Each stream serializes writes and drops a sink
|
|
71
|
+
that fails or remains backpressured beyond the bounded write deadline; tool
|
|
72
|
+
calls do not await subscriber delivery. Disconnecting deletes the
|
|
73
|
+
request-scoped subscription. A broken stream has no replay cursor: there are no
|
|
74
|
+
SSE event ids and `Last-Event-ID` is rejected. The caller retries the lost
|
|
75
|
+
operation with a new JSON-RPC request id.
|
|
76
|
+
|
|
77
|
+
`MCP-Protocol-Version` and `Mcp-Method` are built and validated against every
|
|
78
|
+
JSON-RPC request body. `Mcp-Name` is required only for `prompts/get`,
|
|
79
|
+
`resources/read`, and `tools/call`; methods such as `tools/list` omit it. Tool
|
|
80
|
+
properties may declare `x-mcp-header` in their JSON Schema; the SDK validates
|
|
81
|
+
the header name, rejects reserved or duplicate mappings, encodes non-ASCII and
|
|
82
|
+
ambiguous values with the MCP Base64 sentinel, and compares the decoded header
|
|
83
|
+
with the argument value before dispatch. CR/LF and control-character values
|
|
84
|
+
are always rejected.
|
|
85
|
+
|
|
86
|
+
Current pm handlers do not emit request progress or deprecated MCP log-message
|
|
87
|
+
notifications. A `progressToken` or request-local
|
|
88
|
+
`io.modelcontextprotocol/logLevel` is therefore never promoted to a shared
|
|
89
|
+
subscription. Work that returns a durable task remains observable through the
|
|
90
|
+
task lifecycle; remote operational logging belongs in the deployment's
|
|
91
|
+
OpenTelemetry pipeline.
|
|
92
|
+
|
|
93
|
+
## Authorization lifecycle
|
|
94
|
+
|
|
95
|
+
Remote hosts can compose the public SDK primitives into a complete OAuth
|
|
96
|
+
client/resource lifecycle:
|
|
97
|
+
|
|
98
|
+
1. Build or read protected-resource metadata and choose an advertised
|
|
99
|
+
authorization-server issuer.
|
|
100
|
+
2. Probe OAuth and OpenID discovery URLs in the specified order. Require the
|
|
101
|
+
metadata `issuer` to match exactly and require S256 PKCE.
|
|
102
|
+
3. Prefer a pre-registered client, then a validated Client ID Metadata
|
|
103
|
+
Document, then bounded Dynamic Client Registration, and finally explicit
|
|
104
|
+
user-supplied registration.
|
|
105
|
+
4. Validate a returned `iss` when present or advertised, bind stored
|
|
106
|
+
credentials to the exact issuer, and never reuse them across issuers.
|
|
107
|
+
5. Request only the scopes needed for the operation. The resource verifies
|
|
108
|
+
bearer location, issuer, audience, and every required consent scope before
|
|
109
|
+
MCP dispatch.
|
|
110
|
+
6. Replace an issuer's stored credential after refresh. Delete only that
|
|
111
|
+
issuer's entry on revocation, invalid grant, or re-registration; discovery
|
|
112
|
+
and consent then run again without affecting other issuers.
|
|
113
|
+
|
|
114
|
+
`PmMcpIssuerCredentialStore` deliberately provides cloned `set`, `get`, and
|
|
115
|
+
`delete` operations rather than owning token refresh network traffic. This
|
|
116
|
+
keeps refresh, revocation, persistence encryption, and user interaction in the
|
|
117
|
+
host that owns the authorization relationship.
|
|
118
|
+
|
|
119
|
+
## Trace and privacy boundary
|
|
120
|
+
|
|
121
|
+
Modern request `_meta` may carry W3C `traceparent`, `tracestate`, and baggage.
|
|
122
|
+
The SDK validates syntax and byte bounds, drops every baggage member that is
|
|
123
|
+
not on the host-provided allowlist, and stores the resulting context in an
|
|
124
|
+
`AsyncLocalStorage` scope for only that request. Concurrent requests cannot
|
|
125
|
+
inherit one another's trace context. Raw bearer tokens are hashed for
|
|
126
|
+
constant-time comparison by the bundled verifier and are never included in
|
|
127
|
+
claims, errors, traces, or JSON-RPC result data.
|
|
128
|
+
|
|
129
|
+
| Threat | Enforced boundary |
|
|
130
|
+
| ------------------------------ | ------------------------------------------------------------------------------- |
|
|
131
|
+
| DNS rebinding/browser drive-by | Loopback default plus exact `Origin` allowlist |
|
|
132
|
+
| Token passthrough | Bearer is verified at pm and never forwarded to another service |
|
|
133
|
+
| Issuer mix-up | Exact discovery/response issuer checks and issuer-keyed credentials |
|
|
134
|
+
| Confused audience | Exact protected-resource audience check |
|
|
135
|
+
| Excess authority | Required-scope intersection before dispatch |
|
|
136
|
+
| Query/log credential leak | Query tokens rejected; challenges and errors omit token material |
|
|
137
|
+
| Header injection | Schema-derived allowlist, reserved-name checks, control-byte rejection |
|
|
138
|
+
| Trace privacy leak | Syntax/size validation, baggage-key allowlist, request-local storage |
|
|
139
|
+
| Proxy cache disclosure | MCP and metadata errors use explicit content types; MCP results use `no-store` |
|
|
140
|
+
| Replay after disconnect | No session, event id, resume cursor, or redelivery; retry uses a new request id |
|
|
141
|
+
|
|
142
|
+
## Deprecated-feature inventory and sunset
|
|
143
|
+
|
|
144
|
+
Run the generated ratchet locally or in CI:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
pnpm quality:mcp-deprecations
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The inventory classifies every match as canonical source, the isolated legacy
|
|
151
|
+
adapter, migration documentation, a negative control, or
|
|
152
|
+
`bounded_source_control`. The last disposition applies only to exact,
|
|
153
|
+
single-use source lines in the reviewed fixed allowlist; an adjacent marker or
|
|
154
|
+
an unlisted source path cannot create that exemption. Any canonical match for a
|
|
155
|
+
removed method, session header, SSE resume mechanism, legacy
|
|
156
|
+
resource-subscription method, or deprecated server policy fails the gate.
|
|
157
|
+
|
|
158
|
+
The compatibility adapter supports only protocol `2025-06-18` on local stdio.
|
|
159
|
+
It may be removed after telemetry and installed-consumer probes show no
|
|
160
|
+
required legacy clients for two consecutive release windows. Deprecated
|
|
161
|
+
2026-07-28 fields remain available only where the normative registry requires
|
|
162
|
+
its minimum compatibility period; no pm sunset occurs earlier than
|
|
163
|
+
2027-07-28. A removal is always a reviewed release change with packed and
|
|
164
|
+
published consumer proof.
|
|
165
|
+
|
|
166
|
+
## Verification
|
|
167
|
+
|
|
168
|
+
Focused release evidence is reproducible with:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
node scripts/run-tests.mjs test -- tests/unit/sdk/mcp/subscriptions.spec.ts
|
|
172
|
+
node scripts/run-tests.mjs test -- tests/unit/sdk/mcp/transport.spec.ts
|
|
173
|
+
node scripts/run-tests.mjs test -- tests/unit/sdk/mcp/authorization.spec.ts
|
|
174
|
+
node scripts/run-tests.mjs test -- tests/integration/mcp-streamable-http.spec.ts
|
|
175
|
+
node scripts/run-tests.mjs test -- tests/unit/scripts/release/mcp-deprecation-gate.spec.ts
|
|
176
|
+
pnpm quality:mcp-deprecations
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
The full release gates, packed artifact probes, installed `npx`/`bunx`
|
|
180
|
+
consumers, and published artifact checks remain distinct closeout evidence.
|
|
@@ -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.
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -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
|
|
82
|
-
|
|
83
|
-
| `Epic`
|
|
84
|
-
| `Feature`
|
|
85
|
-
| `Task`
|
|
86
|
-
| `Chore`
|
|
87
|
-
| `Issue`
|
|
88
|
-
| `Decision`
|
|
89
|
-
| `Plan`
|
|
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
|
@@ -44,6 +44,11 @@ pm guide release --json
|
|
|
44
44
|
- [SDK Primitive Inventory](SDK_PRIMITIVE_INVENTORY.md) - SDK-first migration map and private-import ratchet for CLI/MCP layering.
|
|
45
45
|
- [Package SDK Contract Conformance](PACKAGE_SDK_CONTRACT_CONFORMANCE.md) - authoritative public types, `typeof` module derivation, and the first-party parity gate.
|
|
46
46
|
- [SDK Action and Boundary Conformance](SDK_ACTION_CONFORMANCE.md) - derived CLI/SDK/MCP action vocabulary, public-import ratchets, intent budget diagnostics, and package-runner proof.
|
|
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
|
+
- [MCP 2026-07-28 Conformance Matrix](MCP_2026_07_28_CONFORMANCE.md) - official revision changes mapped to canonical owners and executable evidence.
|
|
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.
|
|
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.
|
|
47
52
|
- [SDK Artifact Output Contracts](SDK_ARTIFACT_OUTPUT.md) - clean stdout/file exporter channels, bounded receipts, binary-safe delivery, and shared NDJSON terminal framing.
|
|
48
53
|
- [Context Relevance and Packing](CONTEXT_RELEVANCE.md) - shared CLI/SDK signals, derived-store provenance, ranking explanations, and token budgets.
|
|
49
54
|
- [Output Projection and Omission Contracts](OUTPUT_PROJECTION_CONTRACTS.md) - explicit withheld-field receipts, mode-paired row keys, and completion resolver outcomes.
|
package/docs/RELEASING.md
CHANGED
|
@@ -386,9 +386,18 @@ git push origin v<version>
|
|
|
386
386
|
Bun caches plus an empty npm user config so maintainer credentials and cached
|
|
387
387
|
metadata cannot mask a public-registry outage. The verifier dispatches a real
|
|
388
388
|
`pm contracts` command through both explicit-bin and package-default
|
|
389
|
-
invocations, performs
|
|
390
|
-
symlink-resolved `pm-mcp` bin under both npx and bunx,
|
|
391
|
-
|
|
389
|
+
invocations, performs stateless JSON-RPC `server/discover` against the
|
|
390
|
+
symlink-resolved `pm-mcp` bin under both npx and bunx, and launches the exact
|
|
391
|
+
public `pm-mcp-http` bin under both executors on an isolated loopback port for
|
|
392
|
+
a real Streamable HTTP `server/discover` exchange. Both transports require
|
|
393
|
+
canonical `2026-07-28` metadata/result envelopes. HTTP startup is bounded to
|
|
394
|
+
two 20-second attempts per executor so the complete retry budget remains below
|
|
395
|
+
the hosted step timeout. Signal-aware process-group cleanup escalates from
|
|
396
|
+
`SIGTERM` to `SIGKILL` after a bounded grace period, including when the outer
|
|
397
|
+
evaluator times out or an intermediate executor exits before its server
|
|
398
|
+
descendant. Direct executor exit is not treated as process-group cleanup. The
|
|
399
|
+
verifier derives bin coverage from `package.json`, and proves missing-bin and
|
|
400
|
+
missing-command controls fail.
|
|
392
401
|
- exact-package installed acceptance through
|
|
393
402
|
`scripts/release/verify-installed-agent-session.mjs`. Separate npm and Bun
|
|
394
403
|
install roots must contain the resolved executable, then each drives the
|
package/docs/SDK.md
CHANGED
|
@@ -62,6 +62,13 @@ Terminal recurrence and executable recovery are tracked by
|
|
|
62
62
|
|
|
63
63
|
Use it for extension authoring, package authoring, command/action contract discovery, and deterministic app or CI automation. Do not import private `src/core/...` modules from external integrations or packages.
|
|
64
64
|
|
|
65
|
+
MCP hosts can build on the public stateless protocol, MRTR, cache/schema, and
|
|
66
|
+
durable task primitives described in
|
|
67
|
+
[MCP Interaction and Task SDK](SDK_MCP_INTERACTIONS.md). Those contracts are
|
|
68
|
+
owned by [pm-rz9gep](../.agents/pm/features/pm-rz9gep.toon),
|
|
69
|
+
[pm-rzs24j](../.agents/pm/features/pm-rzs24j.toon), and
|
|
70
|
+
[pm-hv1x1x](../.agents/pm/features/pm-hv1x1x.toon).
|
|
71
|
+
|
|
65
72
|
## Install
|
|
66
73
|
|
|
67
74
|
```bash
|
|
@@ -244,6 +251,7 @@ Common authoring exports:
|
|
|
244
251
|
the same remediation used by runtime activation.
|
|
245
252
|
- `renderExtensionSurfaceMarkdown` (render a describe summary to a drift-free Markdown reference doc for a package README)
|
|
246
253
|
- `checkExtensionManifestCompatibility` (author-time `pm_min_version`/`pm_max_version` check against a target pm version)
|
|
254
|
+
- `inspectExtensionManifestSchema` / `lintExtensionManifestSchema` (pure raw-manifest schema inspection and actionable finding boundary)
|
|
247
255
|
- `preflightExtension` (one-call capstone: lint + manifest synthesis + version-compat in a single consolidated report)
|
|
248
256
|
- `RESERVED_ITEM_FIELD_NAMES` (the shared runtime/authoring denylist); `lintExtensionBlueprint`, preflight, and the test harness reject blueprint item fields that shadow these metadata keys before publication
|
|
249
257
|
- `EXTENSION_CAPABILITIES`
|
|
@@ -2783,8 +2791,18 @@ bound, a `pm_min_version` the target is below, or a `block`-mode `pm_max_version
|
|
|
2783
2791
|
the target exceeds) and stays quiet on advisory `*_unchecked` / `*_exceeded_warn`
|
|
2784
2792
|
warnings, which still load:
|
|
2785
2793
|
|
|
2794
|
+
Use `lintExtensionManifestSchema(manifest)` when only the manifest vocabulary is
|
|
2795
|
+
in scope. It returns stable `manifest_unknown_key` and
|
|
2796
|
+
`no_version_bounds_declared` findings without requiring a target pm version.
|
|
2797
|
+
Compatibility results retain the existing combined `findings` array, while the
|
|
2798
|
+
dedicated lint result gives SDK, CLI, and MCP adapters a stable schema-only
|
|
2799
|
+
boundary.
|
|
2800
|
+
|
|
2786
2801
|
```ts
|
|
2787
|
-
import {
|
|
2802
|
+
import {
|
|
2803
|
+
checkExtensionManifestCompatibility,
|
|
2804
|
+
lintExtensionManifestSchema,
|
|
2805
|
+
} from "@unbrained/pm-cli/sdk";
|
|
2788
2806
|
import { assertExtensionManifestCompatible } from "@unbrained/pm-cli/sdk/testing";
|
|
2789
2807
|
|
|
2790
2808
|
// Inspect every bound outcome against a target version…
|
|
@@ -2793,6 +2811,9 @@ const report = checkExtensionManifestCompatibility(manifest, {
|
|
|
2793
2811
|
});
|
|
2794
2812
|
// report.compatible === false, report.findings[0].code === "pm_min_version_unmet", …
|
|
2795
2813
|
|
|
2814
|
+
const schema = lintExtensionManifestSchema(manifest);
|
|
2815
|
+
// schema.ok === false, schema.findings[0].path === "compatibility", …
|
|
2816
|
+
|
|
2796
2817
|
// …or fail the package's own suite when a bound would block the load.
|
|
2797
2818
|
assertExtensionManifestCompatible(manifest, { pmVersion: "2026.6.23" });
|
|
2798
2819
|
```
|
|
@@ -152,22 +152,27 @@ invalid values.
|
|
|
152
152
|
|
|
153
153
|
## Cross an MCP boundary
|
|
154
154
|
|
|
155
|
-
An embedding MCP client can add bounded `provenance` and `episode`
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
An embedding MCP 2026-07-28 client can add bounded `provenance` and `episode`
|
|
156
|
+
fields to request-local `io.modelcontextprotocol/clientInfo`. The server
|
|
157
|
+
retains only those fields while processing that request; no later request
|
|
158
|
+
inherits them.
|
|
158
159
|
|
|
159
160
|
```json
|
|
160
161
|
{
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
"
|
|
164
|
-
"
|
|
165
|
-
"
|
|
166
|
-
"
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
162
|
+
"_meta": {
|
|
163
|
+
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
164
|
+
"io.modelcontextprotocol/clientCapabilities": {},
|
|
165
|
+
"io.modelcontextprotocol/clientInfo": {
|
|
166
|
+
"name": "agent-host",
|
|
167
|
+
"version": "1.0.0",
|
|
168
|
+
"provenance": {
|
|
169
|
+
"role": "implementer",
|
|
170
|
+
"topic": "release readiness"
|
|
171
|
+
},
|
|
172
|
+
"episode": {
|
|
173
|
+
"id": "release-2026-08-01",
|
|
174
|
+
"label": "Release readiness"
|
|
175
|
+
}
|
|
171
176
|
}
|
|
172
177
|
}
|
|
173
178
|
}
|
|
@@ -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
|
|
@@ -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),
|
|
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.
|