Skip to content

TEST-GUARD-GATE-EVIDENCE declares a step that cannot run from a checkout, with a stale threshold #414

Description

@avrabe

Found while implementing #403, by executing every declared verification step
rather than reading them. 17 of 18 pass; this is the one that does not.

artifacts/verification.yaml, TEST-GUARD-GATE-EVIDENCE (status: implemented):

    fields:
      method: automated-test
      steps:
        - run: tools/check_mutants_report.py --self-test
        - run: tools/check_mutants_report.py --output-dir mutants-out --max-missed 210

Executed from a clean checkout:

ok   [0] tools/check_mutants_report.py --self-test
FAIL [1] tools/check_mutants_report.py --output-dir mutants-out --max-missed 210
       ::error::no cargo-mutants report directory at mutants-out/mutants.out —
       the run did not complete. ...
       mutants-out/ does not exist at all.

Two distinct problems

1. The step cannot run outside its CI job. mutants-out/ only exists after a
~3-hour cargo mutants run in the mutants job. tools/run_verification.py
executes declared steps and scores returncode == 0, so this artifact is
permanently FAILED for anyone who runs the verification gate over it. That is the
mirror image of #403: there, a claiming artifact had no step and was silently
skipped; here it has a step that cannot succeed.

2. The threshold is stale. It says --max-missed 210; .github/workflows/ci.yml
uses 292, and the live run on main reports 291 survivors. So the artifact
records a bound that has not been the enforced one since #389/#401 landed. Nothing
cross-checks the number in the artifact against the number in the workflow — the
same duplicated-fact shape as #381, where the report path was written twice and the
copies disagreed for four months.

Why it is not simply deleted

Removing the step would make the artifact pass, which is exactly the move
REQ-GUARD-GATE-EVIDENCE-002/003 exist to prevent. The honest options are:

  1. Point it at something runnable — the self-test already is; a second step could
    assert the workflow declares a threshold, rather than re-running the gate.
  2. Or keep the live invocation and mark the artifact so the verification runner
    knows it is CI-context-only — but no such concept exists today, and inventing
    one is an exemption mechanism, which Lean 'Fail on sorry' gate enforces zero obligations: all 12 sorrys are self-exempted by '-- TODO' #385 is a cautionary tale about.
  3. And regardless: single-source the threshold so the artifact and ci.yml cannot
    disagree.

Note the general shape for whoever picks this up: --max-missed 210 in an
artifact and --max-missed 292 in a workflow is a number stated twice.
Every
other instance of that in this repo has eventually drifted.

Found by running the steps, not reading them. A declared step nobody has executed
is a claim with no gate on it.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions