Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD across contents and paths, upstream package/repo coordinates -> @golem15/msd-core and golem15com/msd-core. Deep links into upstream history, sibling upstream packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is. Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line, package/plugin identity, regenerated lockfile, install-tree fixtures, derived registries and benchmark baseline; migration checksum baseline re-locked (MSD keeps its own install state, so no install had applied the old sums); sort-order and regex-escaped expectations in tests adjusted.
8.0 KiB
PRD-1244 — Capability Ecosystem
- Status: Proposed
- Date: 2026-06-14
- Owner: Tom Boucher (maintainer)
- Tracking issue: #1244
- Architecture: ADR-1244
- Target release: 1.6.0
This PRD captures the what and why. The how lives in ADR-1244. Where the two overlap, the ADR is authoritative on architecture and this PRD is authoritative on product intent, scope, and success.
1. Summary
MSD 1.6.0 opens the capability platform (ADR-857) to third-party authors. Developers can write a capability, publish it at a URL, and any MSD user can import it, keep it up to date, and remove it cleanly — with versioned manifests, host-compatibility checks, and an explicit trust gate for capabilities that run code. A generated capability matrix documents every capability (native and third-party) and gives authors a place to plug in.
2. Problem & opportunity
ADR-857 made MSD extensible in principle — 12 loop extension points, 32 capabilities — but the platform is closed: the registry is build-time-only, capabilities are unversioned, and there is no per-capability install/upgrade/remove. A solo developer cannot share the capability they built, and cannot adopt one someone else built, without forking MSD or routing a PR through the maintainer.
The opportunity: turn an internal architecture into an ecosystem, where the long tail of stack-specific and house-style capabilities lives outside the core repo — reducing maintainer burden while expanding what MSD can do for any given user.
3. Personas
| Persona | Goal | Today's pain |
|---|---|---|
| Capability author (solo dev who extends MSD) | Ship a reusable capability (a deploy gate, a house-style review step, a domain planner contribution) once and reuse it everywhere | No distribution path; must fork MSD or upstream a PR for every change |
| Capability consumer (solo dev using MSD) | Add a community/team capability to a project in one step, and keep it current | No install path; no version surface; no clean removal |
| Maintainer | Grow MSD's reach without absorbing every extension as permanent core maintenance | Every useful idea becomes an upstream PR and forever-maintenance |
| Team lead / enterprise admin | Constrain which capability sources are allowed | No allowlist; no trust controls |
4. Goals
- G1. A capability author can publish a capability at a Git URL (or npm/tarball/registry) and a consumer can install it with one command.
- G2. Capabilities are versioned; consumers can see when an update exists and apply it deliberately.
- G3. Host↔capability compatibility is explicit (
engines.msd) and enforced, with graceful downgrade where possible. - G4. Installing a capability that runs code (hooks/MCP/command modules) requires informed, explicit consent and integrity verification — and never runs code at install time.
- G5. Capabilities can be upgraded atomically and removed cleanly (files + shared-config fragments), with no orphaned state.
- G6. A capability matrix documents every capability and gives third parties a documented way to be listed.
5. Success metrics
- Adoption: ≥1 documented end-to-end author→publish→consumer-install flow works on all tier-1 runtimes (Claude/Codex/Antigravity) at release; the four how-to guides are each independently completable by following only the docs.
- Safety: zero code execution during
install(verified by test); every executable surface is disclosed before consent (verified by test);strictKnownRegistries: []blocks all external installs (verified by test). - Integrity: an install with a mismatched
integrity/SHA aborts (verified by test); auto-update with a changed executable set re-prompts (verified by test). - Cleanliness:
removefollowed by a filesystem audit shows no residual capability files and no leftover entries in sharedsettings.json/hooks.json(verified by test). - Honesty of the matrix: the generated matrix never drifts from the registry (drift guard in CI).
6. Scope (1.6.0)
In scope: versioned capability.json; runtime registry overlay; msd capability install|update|outdated|remove|disable|list; source resolver (registry/git/npm/tarball/local); capability ledger; trust/integrity/consent gate; native version stamping; registry-driven dispatch for third-party command families; the generated capability matrix; the full diataxis documentation set.
Out of scope (explicit non-goals for 1.6.0):
- Operating a hosted central community registry. The manifest and matrix mechanic ship; whether MSD runs/advertises a curated registry is TBD/TBA (see §8). URL/git import does not depend on it.
- Sandboxing third-party code. Out of reach technically; the trust model is consent + integrity + reversibility (ADR-1244 D5).
- Automated malware scanning / safety scorecards. A possible follow-up if a curated registry is adopted; not in 1.6.0.
- A capability marketplace UI. Docs + CLI only.
- Paid/licensed capabilities, telemetry, or usage analytics.
7. Functional requirements (product-level)
- FR1.
install <spec>accepts registry/git(#tag,#sha)/npm/tarball/local specs; shows a pre-install summary (name, version, author, artifact counts, executable surfaces, context-cost note) and requires consent for non-trusted sources. - FR2.
engines.msdincompatibility blocks with a clear message and offers the newestcompatVersions-compatible version when the source enumerates versions. - FR3.
outdatedlists installed capabilities with an available update (per the documented per-source support matrix);update [--all]applies updates atomically. - FR4.
remove <id>deletes exactly what the ledger recorded (files + shared-config fragments) and prompts before deleting persistent capability data;disable <id>toggles off without removing files. - FR5.
listshows installed capabilities with version, source, tier, and enabled/disabled state. - FR6. Reserved namespaces and
strictKnownRegistriesare enforced. - FR7. Third-party capabilities, once installed, are indistinguishable from first-party in surface/config toggling and loop participation (subject to the load-time re-gate).
8. Open questions / decisions deferred
- OQ1 — Advertise a community registry? (TBD/TBA). The mechanic (versioned manifests + matrix + registry source adapter) ships. The product decision to operate/advertise a curated
msd-capabilities-communityregistry — with its review, scanning, and trust implications — is deferred to a follow-up. Recommendation when revisited: separate "official" (curated) from "community" (consented) sources, mirroring Claude Code's marketplace split. - OQ2 — Provenance enforcement. SHOULD for first-party/curated now; whether to require provenance for any listed third-party capability is tied to OQ1.
- OQ3 — Inter-capability dependency resolution depth. 1.6.0 validates
requiresclosure remains satisfiable on install/upgrade; full npm-style transitive version resolution is a candidate follow-up.
9. Risks
- Supply-chain risk is the headline risk (third-party code at full parity). Mitigated by ADR-1244 D5; accepted by the maintainer as the cost of full parity.
- Doc-vs-reality drift — docs describe behavior that ships in phased PRs; docs land with the implementing phase, not ahead of it.
- Maintainer-burden inversion — if a community registry is later advertised (OQ1), review/scanning load returns; keeping it consented-but-decentralized avoids this.
10. Release & rollout
Phased per ADR-1244 (manifest versioning → overlay → resolver+ledger → trust gate → dispatch → docs/matrix). Documentation ships with the implementing phase. The advertising decision (OQ1) is explicitly a separate, later call — 1.6.0 ships the capability to import from any URL and the documentation mechanic, not a MSD-run storefront.