You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking epic for landing ADR-0087 (accepted in #2582). The ADR designs how externally developed, AI-agent-maintained metadata apps upgrade stably across protocol majors — arriving from any past version — instead of crashing on a deliberate, gated, documented break.
Why (the problem the ADR closes)
ADR-0059 already guarantees a breaking change cannot leave this repo silently (frozen witnesses + pre-publish hotcrm smoke). What is missing is the consumer side: a package built against protocol N loaded by an N+2 runtime is never told "incompatible — here is the migration"; it runs until some deep .parse() or renderer contract fails. And PluginEnginesSchema.protocol (packages/spec/src/kernel/manifest.zod.ts) — the field that should gate this — is declared, documented, and checked nowhere, an ADR-0078 "declarable-but-inert" violation.
The preference ladder (design, not restated here — see the ADR)
L0 — don't break: ADR-0059's gates, unchanged.
L1 — break invisibly: a versioned load-time conversion layer (most breaks need zero consumer action). → P1
L2 — break executably: a permanent, fixture-tested migration chain, migrate meta --from N replays any past major → current. → P2
L3 — break loudly & structurally: enforce the engines.protocolhandshake with a machine-actionable diagnostic. → P0
verify: the consumer's own validate && typecheck && test loop is the acceptance test.
Governing constraint: timeliness is never load-bearing (a cross-major consumer was never present for any warning window), and the consumer's maintainer is an AI agent (machine-executability + structure beat human notification).
Tracking epic for landing ADR-0087 (accepted in #2582). The ADR designs how externally developed, AI-agent-maintained metadata apps upgrade stably across protocol majors — arriving from any past version — instead of crashing on a deliberate, gated, documented break.
Why (the problem the ADR closes)
ADR-0059 already guarantees a breaking change cannot leave this repo silently (frozen witnesses + pre-publish hotcrm smoke). What is missing is the consumer side: a package built against protocol N loaded by an N+2 runtime is never told "incompatible — here is the migration"; it runs until some deep
.parse()or renderer contract fails. AndPluginEnginesSchema.protocol(packages/spec/src/kernel/manifest.zod.ts) — the field that should gate this — is declared, documented, and checked nowhere, an ADR-0078 "declarable-but-inert" violation.The preference ladder (design, not restated here — see the ADR)
migrate meta --from Nreplays any past major → current. → P2engines.protocolhandshake with a machine-actionable diagnostic. → P0validate && typecheck && testloop is the acceptance test.Governing constraint: timeliness is never load-bearing (a cross-major consumer was never present for any warning window), and the consumer's maintainer is an AI agent (machine-executability + structure beat human notification).
Phases (independently shippable, evidence-gated)
engines.protocolreal) #2644 · install seam in feat(protocol): enforce the engines.protocol handshake (ADR-0087 P0) #2650; load seams (boot rehydration + AppPlugin) / lint nudge / scaffold stamping in feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts #2972retiredFromLoadPath) in feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts #2972composeSpecChangesin feat(spec,cli): ADR-0087 P1+P2 — conversion layer, migration chain & change manifest #2897;spec-changes.jsonrelease artifact + generated guide (both CI drift-checked) in feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts #2972; chain backfilled for majors 12–15 in feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts #2972Do not parallelize: P1 depends on P0's
PROTOCOL_VERSION+ handshake seam; P2/P3 depend on P1. The ADR gates each phase on evidence from the previous.Boundaries
migrate metaonly).Existing momentum (already in the ADR-0087 direction)
llms.txt"Upgrading Across Spec Versions" section — a partial D3/D4 down payment.spec-changeshistory.Live deprecation windows to route through the new pipeline (not the old hand-migration path)
These are the first real test subjects for P1/P2 — retire them via a conversion-table entry + chain step, not a bespoke tombstone:
titleFormat→nameField(deprecated 11.3.0) — ✅ step-11 semantic entry (feat(spec,cli): ADR-0087 P1+P2 — conversion layer, migration chain & change manifest #2897)kind: 'jsx'→kind: 'html'(aliased 11.4.0) — ✅ conversion + chain step (feat(spec,cli): ADR-0087 P1+P2 — conversion layer, migration chain & change manifest #2897)sqlPredicateToCelSQL-ish RLS predicates → canonical CEL (deprecated 10.0.0) — ✅ step-11 semantic entry (feat(spec,cli): ADR-0087 P1+P2 — conversion layer, migration chain & change manifest #2897)Refs: ADR-0087, ADR-0059, ADR-0078, ADR-0025 §3.2/§3.10.