probe(756): DO NOT MERGE — measure a dropped step on the BUILD lane #765

Closed
timothy wants to merge 2 commits from probe756/dropped-step-build-lane into main
Owner

Scratch probe for ersatztv#756. DO NOT MERGE — it will be closed unmerged.

Reintroduces the exact #751 defect (an invalid expression payload inside a shell comment) in the test job's revalidate step, on top of the #756 guard.

What this measures

#751 established on the small lane that the runner still executes a LATER step after dropping an earlier one. The #756 guard stands entirely on that premise holding on the build lane, where these two required jobs run in a container: on ubuntu-latest — a different lane, so it is measured rather than assumed.

Expected: revalidate is dropped, every later step still runs, the trailing guard runs and reports revalidate missing, and Build & test (.NET) concludes failure instead of the green it would have reported before this change.

script-tests is expected RED here too — the new test_the_required_jobs_have_NO_expression_delimiter_in_any_run_body rejects the probe payload at review time, which is the other half of the fix working.

**Scratch probe for ersatztv#756. DO NOT MERGE — it will be closed unmerged.** Reintroduces the exact #751 defect (an invalid expression payload inside a shell comment) in the `test` job's `revalidate` step, on top of the #756 guard. ## What this measures #751 established on the `small` lane that the runner still executes a LATER step after dropping an earlier one. The #756 guard stands entirely on that premise holding on the **build lane**, where these two required jobs run in a `container:` on `ubuntu-latest` — a different lane, so it is measured rather than assumed. Expected: `revalidate` is dropped, every later step still runs, the trailing guard runs and reports `revalidate` missing, and `Build & test (.NET)` concludes **failure** instead of the green it would have reported before this change. `script-tests` is expected RED here too — the new `test_the_required_jobs_have_NO_expression_delimiter_in_any_run_body` rejects the probe payload at review time, which is the other half of the fix working.
timothy added 2 commits 2026-08-10 22:03:48 +02:00
A run: body the runner declines to interpolate is DROPPED and the job still
concludes success (#751). In review-verdict.yml that is fail-CLOSED; in
docker-build.yml's `test` and `migrations` — the other two required contexts on
main — it is fail-OPEN: the required check goes green having done no work.

Every consequential run: step now records that it began, and a trailing guard
fails the job when the expected set is incomplete. Per STEP, not per job as
proposed: a job-start marker only proves step 1 ran, and the dangerous drop is
`Test` or the migration replay.

Refs #756
probe(756): DO NOT MERGE - drop the test job's revalidate step on the build lane
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 14s
PR Gates / Docs update reminder (pull_request) Successful in 18s
PR Gates / decisions lifecycle (pull_request) Successful in 23s
review-verdict/h10 Awaiting review verdict for 59bff09
Review verdict / Set review-verdict status (pull_request_target) Successful in 8s
PR Gates / Script tests (pytest) (pull_request) Failing after 2m16s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Failing after 9m42s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 6m42s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Skipped
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 6m27s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 10s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 7s
59bff0925b
Author
Owner

Probe result — the premise HOLDS on the build lane

Job test, run 1910, 20:03:49→20:13:31Z (a full 9m42s heavy run, so Build/Test really executed).

  1. The step was dropped, exactly as #751 describes:
    Unable to interpolate expression 'format('# PROBE ONLY … {0}\n…', pr number)': Failed to parse: unexpected token "IDENT" at 20:04:06.
  2. Every one of the eleven later marked steps still ran — the marker file recorded detect, restore, npm-ci, check-api, lint, typecheck, web-test, web-build, strip-scanner, build, dotnet-test, with only revalidate absent. This is the property #751 could only measure on the small lane.
  3. The guard ran and was the ONLY ❌ in the entire job log (1 failure marker, and it is Assert every expected step executed). Every other step succeeded — so without the guard this run concludes success having never executed revalidate. That is the fail-open #756 exists to close, reproduced and then caught.

Two incidental confirmations kept in the docs:

  • RUNNER_TEMP is /tmp on the build lane too (marker at /tmp/etv-ci-steps-ran-test-1910-1), so the run-keying is load-bearing here as well, not just on small.
  • The dropped step's output arrived as ETV_REVALIDATE_SKIP: empty, not false. The guard reads anything that is not exactly true as "widen what is required" — had it read empty as a skip, the one drop that disables the detect step would also have disabled the guard for everything downstream.

Script tests (pytest) is red here as designed: the new test_the_required_jobs_have_NO_expression_delimiter_in_any_run_body rejects this payload at review time, which is the static half of the fix working.

Closing unmerged — scratch probe, its purpose is served.

## Probe result — the premise HOLDS on the build lane Job `test`, run 1910, 20:03:49→20:13:31Z (a full 9m42s heavy run, so `Build`/`Test` really executed). 1. **The step was dropped**, exactly as #751 describes: `Unable to interpolate expression 'format('# PROBE ONLY … {0}\n…', pr number)': Failed to parse: unexpected token "IDENT"` at 20:04:06. 2. **Every one of the eleven later marked steps still ran** — the marker file recorded `detect, restore, npm-ci, check-api, lint, typecheck, web-test, web-build, strip-scanner, build, dotnet-test`, with only `revalidate` absent. This is the property #751 could only measure on the `small` lane. 3. **The guard ran and was the ONLY ❌ in the entire job log** (1 failure marker, and it is `Assert every expected step executed`). Every other step succeeded — so *without* the guard this run concludes `success` having never executed `revalidate`. That is the fail-open #756 exists to close, reproduced and then caught. Two incidental confirmations kept in the docs: - `RUNNER_TEMP` is `/tmp` on the **build** lane too (marker at `/tmp/etv-ci-steps-ran-test-1910-1`), so the run-keying is load-bearing here as well, not just on `small`. - The dropped step's output arrived as `ETV_REVALIDATE_SKIP:` **empty**, not `false`. The guard reads anything that is not exactly `true` as "widen what is required" — had it read empty as a skip, the one drop that disables the detect step would also have disabled the guard for everything downstream. `Script tests (pytest)` is red here as designed: the new `test_the_required_jobs_have_NO_expression_delimiter_in_any_run_body` rejects this payload at review time, which is the static half of the fix working. Closing unmerged — scratch probe, its purpose is served.
timothy closed this pull request 2026-08-10 22:15:26 +02:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.