fix(ci): the nightly runtime proof asks the emulator what it verified - #787
Merged
stephrobert merged 2 commits intoSep 21, 2026
Merged
Conversation
The `runtime` job ran the four dataplane suites, the leftovers doorstep, and nothing else of guard.sh. Both local reproductions of those same suites call `guard.sh verification` before the emulator stops — leg.sh and day2.sh — so a claim the emulator itself published as broken reddened a workstation and never a night. `runtime-proof` is the gate #736 wanted a green night from before tagging, and a green there did not say the claims held. Measured before arming it, because a gate that starts red teaches people to ignore it and #731 is about exactly that: on 2026-09-15, after #741 closed the one claim breaking under OVN, the incus-ovn leg answers `held=58 broken=0 unreadable=0 repaired=0`. The step is `if: always()` and runs before the emulator stops, because the counters and the claims die with the process (#670). **What the falsification taught, and it is the better half of this change.** The test was written as three `strings.Contains` over the workflow text, and both mutations went straight through it: - commenting the step out keeps every name in the file, so a grep-shaped test stays green while the night asks nothing. The test now drops whole-line YAML comments before reading, so it reads steps rather than text; - `if: always() == false` CONTAINS `if: always()`. The test now compares the step's `if:` as a whole line, so a longer expression that merely starts the same way cannot satisfy it. Neither defect was visible from reading the test. Both mutations bite now. Closes #740 Assisted-by: Claude Code (claude-opus-5)
stephrobert
deleted the
fix/740-the-night-asks-what-the-emulator-verified
branch
September 21, 2026 07:58
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
runtimejob ran the four dataplane suites, the leftovers doorstep, and nothing else ofguard.sh. Both local reproductions of those same suites callguard.sh verificationbefore the emulator stops —leg.shandday2.sh— so a claim the emulator itself published as broken reddened a workstation and never a night.runtime-proofis the gate #736 wanted a green night from before tagging, and a green there did not say the claims held.Measured before arming it
A gate that starts red teaches people to ignore it, and #731 is about exactly that. On 2026-09-15, after #741 closed the one claim breaking under OVN, the incus-ovn leg answers:
The step is
if: always()and runs before the emulator stops, because the counters and the claims die with the process (#670).What the falsification taught, and it is the better half of this change
The test was three
strings.Containsover the workflow text. Both mutations went straight through it:if: always() == falseif: always()Neither defect was visible from reading the test. Now:
readWorkflowdrops whole-line YAML comments, so the test reads steps rather than text. Whole-line only, on purpose: a#inside a value is part of the value;if:is compared as a whole line, so a longer expression that merely starts the same way cannot satisfy it.Both mutations bite now.
Type of change
Checklist
Always
mise run checkpasses, andmise run prepushin fullinternal/corestill knows no provider — untouchedmise run testplanwas run.conformanceis not played, and this says so rather than leaving the box blank: the diff adds one workflow step, one test and one falsification spec. No route, no handler, no response shape changed, so a conformance leg would re-prove the previous commit. The step this adds is itself a conformance call, and it will run on the next scheduled night.When a model wrote a substantive part of this
Assisted-by:trailer names the tool and the model versionmise run conformance, for the reason stated just aboveleg.shandday2.shalready call, read from those scriptsWhen a route is added or changed
N/A.
When behaviour a client can observe changes
N/A — nothing a client sees changes. What changes is what the night asks before it stops.
When
.github/workflows/is touchedstep-security/harden-runneris the job's first step — unchangedpermissions:least-privilege — unchangedguard.sh verification, whose non-zero reddens the job, which is the whole pointWhen a machine runtime is involved
runtimejob, which boots machines underincus-ovn; the figure quoted above comes from that leg/_feint/Related issues
Closes #740
🤖 Generated with Claude Code