From 9cc2c442b7ff1496b8a23f357e039c57794bc06c Mon Sep 17 00:00:00 2001 From: Matt <47545907+SoundMatt@users.noreply.github.com> Date: Fri, 21 Aug 2026 07:22:25 -0700 Subject: [PATCH 1/2] ci: gate on relay interop's real exit code, rename job to relay-conformance Replaces `output=$(relay interop ... 2>&1) || true` + a brittle grep of stdout with a plain `relay interop --strict --protocol RCP target/release/rust-rcp` invocation whose real exit code gates the step directly -- matching go-RCP's existing clean pattern for the same check. The old form silently tolerated both a genuinely broken run and any future change to relay interop's output format, since `|| true` swallowed the real exit code before the grep ever ran. Also renames the job from `relay-interop`/"RELAY interop" to `relay-conformance`/"RELAY conformance": this step only checks self-consistency against RELAY's own embedded golden vector, not a third-party reference implementation, so "interop" overstates what it actually verifies. Confirmed nothing else in this workflow (or, per GitHub's branch-protection API, this repo's required-status-checks list) references the job by its old name, so the rename is safe. Both fixes verified locally against the exact relay v2.0.4 build this job installs (matching the pinned version): a real rust-rcp binary gets RESULT: PASS / exit 0, and mutation-testing against a deliberately broken binary confirms RESULT: FAIL / exit 1 -- the previous `|| true` form would have swallowed that failure. SoundMatt/RELAY THEME-K (#125) / INTEROP-04 (#149). Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com> --- .github/workflows/ci.yml | 60 ++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52e4223..5ebfa90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -184,9 +184,14 @@ jobs: - name: relay conform --strict run: relay conform --strict target/release/rust-rcp - # ── RELAY interop ───────────────────────────────────────────────────────── - relay-interop: - name: RELAY interop + # ── RELAY conformance (relay interop) ─────────────────────────────────────── + # Named "conformance", not "interop": this only checks self-consistency + # against RELAY's own embedded golden vector, not a third-party reference + # implementation (SoundMatt/RELAY THEME-K / INTEROP-07 naming convention — + # docs/INTEROP-ARCHITECTURE.md reserves "interop" for a genuine external + # peer this repo did not build). + relay-conformance: + name: RELAY conformance needs: relay-conform runs-on: ubuntu-latest steps: @@ -200,42 +205,19 @@ jobs: run: go install github.com/SoundMatt/RELAY/v2/cmd/relay@v2.0.4 - name: build rcp binary run: cargo build --bin rust-rcp --release --locked - - name: relay interop (rcp-message EQUIVALENT or SKIP) - run: | - output=$(relay interop target/release/rust-rcp 2>&1) || true - echo "$output" - if echo "$output" | grep -q "rcp-message"; then - # `convert` is rebuilt against the real canonical rcp.Message / - # ByteBusID addressing (rust-RCP-FS-01) and is verified - # byte-for-byte EQUIVALENT against a genuine RELAY v2.0 - # reference build. This job previously showed ERROR instead, - # because `go install .../relay@latest` (no /v2 suffix) - # resolved to a stale pre-v2 release — SoundMatt/RELAY's - # go.mod lacked the /v2 suffix its own v2.0.0+ tags require - # under Go's semantic import versioning (SoundMatt/RELAY#70). - # Resolved as of RELAY v2.0.4, which the step above now - # installs by pinned version via the /v2 module path. - # - # The vector/case name this check greps for is also updated - # here, from the retired `rcp-status` to `rcp-message`: RELAY's - # own v2.0 canonical-type replacement renamed the embedded - # golden vector `rcp-status.json` -> `rcp-message.json` (see - # RELAY's spec/CHANGELOG.md v2.0 entry), so a `relay@latest` - # pinned to a real v2.0+ build never emits an `rcp-status` case - # for this check to find — it would always have silently fallen - # through to the "no RCP vectors found" branch below, never - # actually exercising the equivalence check, independent of - # the go.mod /v2 bug above. SKIP is still accepted as a - # defensive allowance for a future state where `convert` isn't - # advertised at all; any other outcome still fails this step. - rcp_line=$(echo "$output" | grep -A3 "^rcp-message" | grep "rust-rcp") - echo "$rcp_line" | grep -qE "EQUIVALENT|SKIP" || { - echo "relay interop: unexpected rcp-message result for rust-rcp: $rcp_line" >&2 - exit 1 - } - else - echo "relay interop: no RCP vectors found on runner — skipping equivalence check" - fi + - name: relay interop --strict --protocol RCP + # Was previously `relay interop ... 2>&1) || true` piped through a + # brittle grep of stdout instead of the command's real exit code — + # that pattern silently tolerated both a genuinely broken run and + # any future change to relay interop's output format (SoundMatt/ + # RELAY THEME-K, INTEROP-04). --protocol RCP restricts the check to + # rust-rcp's own protocol (matching go-RCP's equivalent step) and + # --strict fails on a missing convert rather than treating it as an + # innocuous skip; the command's real exit code now gates this step + # directly, verified locally against the pinned relay v2.0.4 build + # this job installs (EQUIVALENT/PASS/exit 0 on a real convert + # implementation, FAIL/exit 1 on a broken one). + run: relay interop --strict --protocol RCP target/release/rust-rcp # ── RELAY wire+e2e unit tests (spec traceability) ───────────────────────── relay-conformance: From 22833a3bc127239a8466f8636686e88ddd3e869b Mon Sep 17 00:00:00 2001 From: Matt <47545907+SoundMatt@users.noreply.github.com> Date: Fri, 21 Aug 2026 07:23:53 -0700 Subject: [PATCH 2/2] fix: rename job to relay-cli-conformance to avoid collision with existing relay-conformance job CI failed immediately on push: the previous commit renamed this job to relay-conformance, colliding with an already-existing job of the same id (RELAY spec v2.0 unit conformance). Duplicate YAML mapping keys are technically valid per the YAML spec (last one wins) so python's yaml.safe_load silently accepted it and my earlier check didn't catch the collision -- GitHub Actions' own schema validation correctly rejected the workflow file outright. Renamed to relay-cli-conformance / "RELAY CLI conformance" instead, distinguishing it from the existing relay-conformance job. Verified with a proper duplicate-key detector (not yaml.safe_load) that no other job id collides. Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com> --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ebfa90..fd24f02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -184,14 +184,15 @@ jobs: - name: relay conform --strict run: relay conform --strict target/release/rust-rcp - # ── RELAY conformance (relay interop) ─────────────────────────────────────── + # ── RELAY CLI conformance (relay interop) ─────────────────────────────────── # Named "conformance", not "interop": this only checks self-consistency # against RELAY's own embedded golden vector, not a third-party reference # implementation (SoundMatt/RELAY THEME-K / INTEROP-07 naming convention — # docs/INTEROP-ARCHITECTURE.md reserves "interop" for a genuine external - # peer this repo did not build). - relay-conformance: - name: RELAY conformance + # peer this repo did not build). "CLI" distinguishes this from the + # existing `relay-conformance` job below (RELAY spec v2.0 unit tests). + relay-cli-conformance: + name: RELAY CLI conformance needs: relay-conform runs-on: ubuntu-latest steps: