Skip to content

[NEW-SPEC-5] Define a formal protocol/model retirement process (spec/version.json retired[]/deprecated[] arrays) #143

Closed

Description

@SoundMatt

Problem. §19.2's existing deprecation policy (confirmed at current HEAD) governs only the removal
or inversion of a spec MUST requirement — it has nothing to say about retiring a protocol model
(e.g. the pre-TC18 RCP placeholder model retired by §15.5) or its downstream port code/docs. THEME-F
and THEME-M (filed separately in this batch) show what happens without such a process: retired-model
residue reportedly persists in code, tests, and docs across three of four RCP ports roughly a full
major version after the model was declared retired with no compatibility shim.

Proposal. Add a new §3.2 "Retiring a protocol or model" plus a retired[]/deprecated[] array in
spec/version.json. When a model is superseded, RELAY MUST record it with since/removal versions.
Implementations MUST NOT advertise a retired feature in capabilities past its removal version;
retired-model code MUST be removed, or fenced behind a documented capability-declared compat flag,
within the existing §19.2 deprecation window; docs MUST NOT reference retired models outside a
CHANGELOG. relay conform MUST FAIL a binary whose features/commands name a retired capability
past its removal version.


Filed from the 2026-07-29 ecosystem audit register; independently re-verified against current HEAD before filing.

Activity

  1. added a commit that references this issue on Aug 21, 2026
    91cb6be
  2. SoundMatt commented on Aug 21, 2026

    @SoundMatt
    OwnerAuthor

    Implemented and merged in #184 (v2.6 → v2.7, MINOR).

    What shipped

    • New §3.2 "Retiring a protocol or model" in the spec: spec/version.json gains optional retired[]/deprecated[] arrays, each entry {name, since, removal, reason}. since/removal are spec MINOR-version strings; per §19.2, removal must be at least one MINOR release after since.
    • New §17 Requirement 17: relay conform MUST FAIL a capabilities document (§12.2) whose declared spec_version is at or past a retired[] entry's removal version but still lists that entry's name in features/commands. This is classified as fully black-box observable (unlike Requirements 13–16) — the check only needs data relay conform already fetches over the CLI, compared against its own embedded spec/version.json.
    • Reference implementation: checkRetiredCapabilities/specVersionAtLeast/loadRetiredCapabilities in cmd/relay/conform.go, wired into validateCapabilitiesDoc. New REQ-RELAY-099, 8 new tests including a real mutation test on the comparison logic.
    • Bug found and fixed along the way: buildManifest's Requirement 1 and 6 statuses didn't account for the capabilities command failing to run/parse entirely (§17.7) as a superset failure once findings started being filtered by precise section citation. Fixed with a shared capsUnreachable check, mutation-tested (reverted, confirmed the regression test failed, restored).

    Scope note

    retired[]/deprecated[] ship empty by design. RELAY's own historical RCP placeholder-model retirement (§15.5, v2.0) predates §3.2 and was an instant, compat-shim-free MAJOR break — not the kind of graceful since/removal-spaced retirement this mechanism tracks. Backfilling it would misrepresent that history as having had a deprecation window it never had. The mechanism governs retirements declared from here onward.

    Verification

    Local, pre-merge: go build/vet/test clean, gofmt -l . clean, golangci-lint run 0 issues, gofusa check 0 errors/PASS, gofusa trace -req-coverage 100 100%/100%.

    Post-merge, independently re-verified from a fresh clone at 91cb6be: build/vet/gofmt/test clean, gofusa check 0 errors/PASS, gofusa trace 100%/100%, and end-to-end — relay conform --manifest against the built binary reports 17 total requirements with Requirement 17 PASS, and the manifest's capabilities_sha256 matches an independently recomputed SHA-256 of relay capabilities' output.

    CI green on the main merge commit (DCO, Lint, Docker build, CodeQL, Security, Test, Self-conformance, go-FuSa full safety lifecycle — all pass).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions