From 42b81d7b04a4f045a9a2a813a63bbe3a34795e16 Mon Sep 17 00:00:00 2001 From: Matt <47545907+SoundMatt@users.noreply.github.com> Date: Fri, 21 Aug 2026 07:29:58 -0700 Subject: [PATCH] ci: gate on relay interop's real exit code instead of grep-scraping stdout Replaces `interop_out=$(relay interop ... 2>&1) || true` + a grep of stdout for ERROR/FAIL with a plain `relay interop --strict --protocol LIN ./target/release/rust-lin` invocation whose real exit code gates the step directly. 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. --protocol LIN restricts the check to rust-lin's own protocol and --strict fails on a missing convert rather than treating it as an innocuous skip -- matching the pattern already fixed in rust-RCP (SoundMatt/rust-RCP#171) and go-RCP/go-LIN's existing clean form. The surrounding job is already correctly named 'conformance' (not 'interop'), so no rename needed here, unlike rust-RCP's fix. Verified locally against the exact relay v2.0.4 build this job installs: a real rust-lin binary produces RESULT: PASS / exit 0; mutation-tested against a deliberately broken binary, confirmed RESULT: FAIL / exit 1 (the previous || true form would have swallowed this). Also confirmed no job-id collisions exist in this workflow (5 unique job ids, none duplicated) before pushing, after the job-collision bug found while fixing rust-RCP's identical pattern. SoundMatt/RELAY THEME-K (#125) / INTEROP-04 (#149). Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com> --- .github/workflows/ci.yml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a7d374..b2cfad4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -278,14 +278,18 @@ jobs: - name: RELAY conformance (strict) run: relay conform --strict ./target/release/rust-lin - - name: RELAY interop (LIN golden vectors — must be EQUIVALENT) - run: | - interop_out=$(relay interop ./target/release/rust-lin 2>&1) || true - echo "$interop_out" - if echo "$interop_out" | grep -A2 "(LIN)" | grep -qE "ERROR|FAIL"; then - echo "FAIL: one or more LIN golden vectors not EQUIVALENT" - exit 1 - fi + - name: RELAY interop --strict --protocol LIN (LIN golden vectors — must be EQUIVALENT) + # Was previously `interop_out=$(relay interop ... 2>&1) || true` piped + # through a grep of stdout instead of the command's real exit code — + # that silently tolerated both a genuinely broken run and any future + # change to relay interop's output format (SoundMatt/RELAY THEME-K, + # INTEROP-04). --protocol LIN restricts the check to rust-lin's own + # protocol 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 LIN ./target/release/rust-lin # ── DCO sign-off check ───────────────────────────────────────────────────── dco: