Skip to content

docs: retire Relay V1 and registryctl from the published docs - #709

Merged
jeremi merged 8 commits into
mainfrom
agent/docs-relay-v2-cutover
Aug 11, 2026
Merged

docs: retire Relay V1 and registryctl from the published docs#709
jeremi merged 8 commits into
mainfrom
agent/docs-relay-v2-cutover

Conversation

@jeremi

@jeremi jeremi commented Aug 11, 2026

Copy link
Copy Markdown
Member

Why

v0.19.0 replaced the configuration-driven Relay 1.0 runtime with the contract-compiled Relay V2 runtime (relay) and retired the registryctl CLI in favour of relayctl. The published documentation was never cut over. It still described the retired runtime as the product a reader adopts, so the site taught spreadsheet ingestion, HTTP sources, OAuth client credentials, Rhai script adapters, PostgreSQL materialization, and baseline approval: capabilities no shipped binary has. The beta-29 manifest states the legacy runtime and the registryctl binary are absent from the release.

What this does

Deletes retired pages, with redirects. 25 content pages removed. src/lib/relay-v2-retirement-redirects.mjs carries 114 entries (38 route sources, their .md twins, and 39 retired API operation slugs) resolving to 10 live targets. No redirect source collides with a live page, and every target resolves.

Rewrites the spec layer rather than withdrawing it. rs-pr-registryctl becomes rs-pr-relayctl; rs-pr-relay, rs-arc-g, rs-op-posture, rs-sec-g, rs-dm-manifest, and rs-terms are rewritten against the V2 surface. rs-terms retires the cross-product term "Registry Stack project" in favour of the per-deployment authoring project, which is the name the tooling itself uses (crates/registry-relayctl/src/lib.rs).

Corrects the standards register. This is the part worth reading closely. src/data/projects.yaml defines six product ids and there is no registry-relay-v2 id: after the cutover the id registry-relay denotes V2. So every used_by: registry-relay entry for a standard V2 does not implement had become a false public interoperability claim.

Re-scoped (product id dropped, V1 evidence relabelled as a retired record):

Standard Change
DCAT, BRegDCAT-AP used_by narrowed to registry-manifest; the catalog routes belonged to V1
OGC API Records used_by narrowed to registry-manifest; Manifest still publishes static Records item collections, only Relay's live adapter went with V1
OGC API Features, OGC API EDR demoted to compares_against, not adopted, no user
ODRL narrowed to registry-manifest; registry-platform-pdp's only consumer was V1
FHIR R4, SP-DCI demoted to compares_against, no user: both were reachable only through the V1 remote-HTTP source model

Repointed at crates/registry-relay-v2 evidence anchored at v0.19.0: OpenAPI (3.1.0, generated per deployment at GET /openapi.json, so there is no product-level document to pin), SHACL, JSON Schema, JSON-LD, SDMX, GovStack. A bogus registry-relay-v2 line in sdmx.used_by is deleted.

Drops retired tooling from the build and CI. Deleted generators and checks leave the generate and check chains; the five Registryctl tutorial * jobs leave ci.yml; guardrails that pointed at deleted material are either retargeted at their V2 equivalent or removed with the thing they guarded. crates/registryctl Rust jobs are kept, since the crate stays in-tree for historical release validation.

Fact-checks the surviving prose against crates/registry-relay-v2. Four review passes read every claim the cutover left standing back to source. The corrections worth calling out:

  • operate/relay.mdx published a runtime.yaml example with secret:file/secrets/audit-integrity-key. valid_secret_reference permits no /; the nested form is an explicit rejection test case. A reader copying that example got a startup failure. Every secret:file/ reference in the docs now names a single flat lowercase filename, and the grammar is stated where it is introduced.
  • trusted-context-constraints.mdx and dpi-safeguards-alignment.mdx named a processing context key. The struct field is processingDescriptions under deny_unknown_fields, with no serde alias, so the documented document was unparseable.
  • The unauthenticated surface was undercounted in rs-sec-g and rs-op-posture: resource metadata and generated artifacts also answer anonymously when the contract marks that metadata public.
  • "An audit event for every answered request" was too broad. The probes, the OpenAPI document, service metadata, resource metadata, and artifacts all answer with no audit event; audit is emitted on the data surface. glossary.mdx now matches what rs-terms already said.
  • The register described the generated JSON Schemas and SHACL shapes as build-time artifacts that are never served. They are served at GET /v2/artifacts/{artifactIdentifier} under the contract's metadata visibility, and the route is in the public OpenAPI projection unconditionally.
  • The interoperability and reviewability definitions still promised a DCAT catalog and ODRL policy documents from a Relay deployment. Both now attribute each shape to the product that actually emits it.
  • relayctl inspect takes a database path, not a project; --fixture takes an identifier, not a path; packaging does open each bound source read-only, so "never opens the institution's database" was wrong.
  • A cursor key is required by any contract that declares a list or a search, or that shows more than one resource in its listing. The checklist named only lists.

Verification

All green on the settled tree:

  • docs/site: npm test 304/304, npm run check exit 0 (15348 links, 155 llms, SEO, markdownlint, build), npm run check:cutover clean, check-evidence-links.mjs 65 links verified against local Git objects
  • .github/scripts/test_ci_changes.py 45/45
  • release/scripts: test_registry_release 80, test_check_gates_inventory 70, test_first_country_release_form 54, test_check_stable_surface_compatibility 16

Review round

Rebased onto main at #708. Automated review left five findings; four are fixed in the second commit.

  • Audit scope and source count, second sites. The first pass fixed both claims in some places and missed others: dpi-safeguards-alignment.mdx still said one audit record per served request, and six pages still said Relay serves one SQLite source. A contract may declare more than one, and each resource binds to exactly one of them. Swept properly this time.
  • relayctl release assets. quickstart.mdx and operate/index.mdx implied a single platform. The release workflow publishes linux-amd64, linux-arm64, and macos-arm64.
  • Docs CI routing. This PR rewrote ops-posture-spec.test.mjs to read crates/registry-relay-v2/src/{server,main,contract,startup}.rs, where on main it read crates/registry-platform-ops/src/lib.rs. The classifier routed the old dependency to the docs job but not the new one, so a probe route or runtime bound could change and leave RS-OP-POSTURE stale with nothing to catch it. Those four paths are now docs inputs, and test_ci_changes.py pins both directions: the four route to docs, and a Relay V2 source no docs test reads does not.

The fifth finding is real but predates this PR, and I did not act on it. release/scripts/first-country-release-form.py was reported as broken by the two deleted check-registryctl-*.sh scripts it invokes at lines 3374 and 3428. It is broken, but earlier and for a different reason: verify_asset_set runs at line 3266 and requires registryctl-{tag}-install.sh and registryctl-{tag}-image-lock.json. release/notes/v0.19.0.md states those assets are not included. The form therefore already fails on any v0.19.0 or later tag, roughly a hundred lines before it reaches anything this PR deleted. Its 54 tests pass because the fixtures synthesize the registryctl assets, which is why nothing flagged it at the v0.19.0 cut.

Restoring two shell scripts that drive a retired binary would not fix that. The form needs either a relayctl rebuild or a deliberate retirement, which is release governance rather than a docs cutover. Flagging it for you instead of guessing.

Scope note

Root AGENTS.md says to keep a change scoped to one owning area, and this one crosses into .github/, release/, products/, and root README.md. Those edits are forced rather than opportunistic: the deleted docs generators were CI-wired, and release/scripts/check-stable-surface-compatibility.py read files this cutover deletes. Splitting them out would leave the tree red between PRs. Flagging it rather than hiding it.

The two products/ files are there because they are published. products/relay-v2/CONCEPT.md becomes the public Registry Relay overview in this PR, and it said in the present tense that registryctl "is not renamed, migrated, deprecated, or otherwise changed" (plus two "Relay V1" labels where the subject is V2). Publishing that verbatim would have shipped a denial of the retirement this PR documents, so those four sentences are corrected in place. products/evidence/README.md described evidencectl as being "like registryctl for the rest of the stack"; it now says relayctl.

One structural question for you. CONCEPT.md is an approved scoping document, written before the work, in "this work / non-goals / deferred" register, 873 lines long. Manifest and Evidence each publish a purpose-written overview (products/manifest/docs/overview.md, products/evidence/README.md). Relay is now the only product whose public overview is an internal concept doc, and it sits at nav_order: 0. I corrected what was false rather than authoring a replacement, because that is your call, not mine.

release/contracts/selected-metrics.json is emptied because Relay V2 exposes no metrics endpoint and the V1 binary does not ship. Each retired family is recorded in RETIRED_SELECTED_METRICS with a stated reason, so the compatibility gate still tells a deliberate retirement apart from a regression.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 397764ca2c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/scripts/ci_changes.py Outdated
Comment thread docs/site/scripts/check-registryctl-tutorials.sh
Comment thread docs/site/src/content/docs/start/quickstart.mdx Outdated
Comment thread docs/site/src/content/docs/explanation/integration-patterns.mdx Outdated
Comment thread docs/site/src/content/docs/explanation/dpi-safeguards-alignment.mdx Outdated
@jeremi
jeremi force-pushed the agent/docs-relay-v2-cutover branch from 397764c to 189bac5 Compare August 11, 2026 05:34

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 189bac5a1c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/site/src/content/docs/operate/index.mdx Outdated
Comment thread docs/site/src/content/docs/reference/relayctl.mdx Outdated
Comment thread docs/site/src/content/docs/explanation/threat-model.mdx Outdated
Comment thread docs/site/src/content/docs/spec/rs-op-posture.mdx Outdated
Comment thread docs/site/src/content/docs/operate/retention-and-persistent-state.mdx Outdated
jeremi added 5 commits August 11, 2026 15:41
v0.19.0 replaced the configuration-driven Relay 1.0 runtime with the
contract-compiled Relay V2 runtime (`relay`) and retired `registryctl` in
favour of `relayctl`. The published documentation still described the
retired runtime as the product a reader adopts, so it taught capabilities
no shipped binary has.

Retired pages are deleted rather than archived, and every removed route
carries a redirect to its nearest live successor. The spec layer is
rewritten against the V2 surface instead of being withdrawn, and
`rs-pr-registryctl` becomes `rs-pr-relayctl`.

Correct the standards register against the post-cutover product ids. The
id `registry-relay` now denotes V2, so every claim V2 does not implement
was a false public claim: DCAT, BRegDCAT-AP, OGC API Records, ODRL,
OGC API Features, OGC API EDR, FHIR R4, and SP-DCI are re-scoped, and
OpenAPI, SHACL, JSON Schema, JSON-LD, SDMX, and GovStack are repointed at
`crates/registry-relay-v2` evidence anchored at v0.19.0.

Drop the retired tooling from the docs build and CI: the deleted
generators and checks leave the `generate` and `check` chains, the five
registryctl tutorial jobs leave `ci.yml`, and the guardrails that pointed
at deleted material are either retargeted at their V2 equivalent or
removed with the thing they guarded.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Sweep the two defect classes review found remaining after the first pass:
Relay audits data requests rather than every request, and a contract binds
one or more read-only SQLite sources rather than exactly one. Correct the
relayctl release-asset list to the three platforms the release workflow
publishes.

Add the four Relay V2 sources ops-posture-spec.test.mjs reads to the docs
classifier in ci_changes.py, so a runtime change that invalidates a published
operational claim runs the test that catches it.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
…bar by product

The governed-SQLite tutorial built its project by copying an acceptance
fixture and writing the database through a Python heredoc, and it never
started the service, so a reader finished without seeing an answer or a
refusal. Rewrite it as a run transcribed end to end: the reader installs
the released binaries, writes the SQL and the contract, watches
`check --production` refuse five governance gaps, records the review,
seals the package, serves it, and reads both the answer and the audit
line behind it.

Reorganize the sidebar on one rule, now pinned by the IA test: a page
that names one product lives under that product, and the cross-product
sections keep only what applies to every deployment. Relay gains its
operate pages, Evidence keeps its security model, and both promote their
first tutorial beside the overview.

Also correct the installer story, which described a runtime-only
Linux-amd64 installer and a source checkout neither path now needs, and
replace two instructions to start from a repository fixture with links
to the tracked worked example.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
The docs build no longer compiles a registryctl authoring-reference
generator, so the rust-cache step that warmed it in the docs jobs of
`ci.yml` and `docs-pages.yml` restores and saves nothing. Remove it with
the tooling it served.

The `project-authoring-determinism` job keeps its own registryctl build:
that one exercises the crate, which this branch does not retire.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Three `referenceExclusions` globs named generated configuration-reference
data and the registryctl authoring-reference generator. This branch
deletes those files, and the closure check requires every exclusion to
match at least one tracked file, so `generate.py --check-references`
fails until they go.

The catalog fingerprints `products/relay-v2/CONCEPT.md`, which this
branch edits, so its recorded source digest moves with it. Regenerated
with `products/identifiers/scripts/generate.py`, not by hand.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
@jeremi
jeremi force-pushed the agent/docs-relay-v2-cutover branch from 189bac5 to b080f90 Compare August 11, 2026 09:06
`test_docs_deploy_rechecks_latest_published_release` pinned the
rust-cache step that warmed the registryctl authoring-reference
generator in both the `docs-pages.yml` build job and the `ci.yml` docs
job. This branch deletes that generator and the steps that cached it, so
the assertions fail on a guard for tooling that no longer exists.

There is no V2 equivalent to retarget them at: the docs build compiles no
Rust reference generator now. Remove them with the thing they guarded and
leave the test to the deploy-recheck ordering its name describes.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dc043f95e7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/site/src/content/docs/start/quickstart.mdx Outdated
Comment thread docs/site/src/lib/relay-v2-retirement-redirects.mjs
Comment thread docs/site/src/content/docs/operate/backup-and-restore.mdx
Comment thread docs/site/src/content/docs/tutorials/publish-governed-sqlite-registry.mdx Outdated
jeremi added 2 commits August 11, 2026 16:44
The relayctl reference claimed seven flat commands. The command line also
carries `tooling`, whose `editor` and `language-server` subcommands are the
only way to install project schema mappings or host the LSP, so document
both and state the nesting.

Correct two claims about runtime defaults. `CursorRuntime` and
`ShutdownRuntime` make every field required, so the 300 second and 30 second
defaults apply only when the whole section is absent, and a partial section
is refused rather than filled in. Record that a contract binding any list or
search operation must configure `cursor`.

Cursors bind search operations exactly as they bind list operations: the
compiler gives both a pagination block and the runtime treats the two kinds
identically at the source boundary.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
The install instructions claimed one installer publishes both relay and
relayctl for three platforms. install.sh accepts Linux amd64 only, downloads
only the relay asset, and installs only relay, so the tutorial's relayctl
--version call right after the installer could not succeed. Document the two
binaries separately and give relayctl its own release-asset download.

The audit walkthrough read a phase "attempt" record as proof the caller "was
answered". RelayAudit::attempt writes that record before source access and
carries no outcome; the terminal record carries it. Describe what the attempt
line actually proves.

The threat model forbade describing Relay as an Evidence Gateway source hop.
AGENTS.md, products/relay-v2/CONCEPT.md, explanation/architecture, and
explanation/integration-patterns all document that composition as supported.
Narrow the boundary to the inherited-authorization rule it was written for, and
correct the same over-reach in the quickstart.

Repoint the two release/READINESS.md evidence links this branch broke by
deleting their target pages, pinning them to v0.19.0, the last release that
carried them.

Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
@jeremi
jeremi merged commit 7255aab into main Aug 11, 2026
43 checks passed
@jeremi
jeremi deleted the agent/docs-relay-v2-cutover branch August 11, 2026 10:15

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff87d0c883

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +86 to +89
status: referenced
claim_level: compares_against
adoption_mode: not adopted
used_by: []

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reconcile the release claim inventories

After this cutover marks OGC API Features and EDR as unimplemented by maintained products, release/notes/standards-claims-inventory.md:23-25 still describes them as current Relay emissions and links the now-deleted reference/apis/registry-relay.mdx; similarly, release/notes/behavioral-guarantee-claims.md:23-29,69 links other deleted V1 pages without identifying them as historical. A release-readiness review therefore sees claims that contradict the new standards register and cannot follow their evidence. Fresh evidence beyond the corrected READINESS.md links is that these two durable inventories retain unpinned deleted targets; update them for V2 or preserve the V1 rows with stable tag-pinned links.

AGENTS.md reference: AGENTS.md:L280-L282

Useful? React with 👍 / 👎.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant