[MG_Impl, MG_IntegrationTest, ci] (P7): the first perturbation block's falsifier is the DirectVulkan entry

- measured with one block removed at a time: without the re-applied block both server halves drop to 1 (DirectGLES 1 / DirectVulkan 1, both entries red); without the first block DirectVulkan drops to 1 (red) while DirectGLES stays at 2 (green), because the GLES backend reads the pack field twice after the neutral pack is installed (3 = the saved-pack read + 2 post-install) and DirectVulkan once (2 = 1 + 1)
- so the >= 2 requirement falsifies the re-applied block on both backends and the first block on DirectVulkan; the CI step runs both backends and needs both, which it already does
- the scenario, hook and CI comments now say exactly that, instead of "removing either block drops it to 1"
This commit is contained in:
2026-09-22 23:02:08 -04:00
parent 403b566949
commit ffc4fb7d77
3 changed files with 15 additions and 5 deletions
@@ -380,7 +380,11 @@ void main() { o_color = vec4(0.25, 0.5, 0.75, 1.0); }
// after the window's overwrite can turn the post-install read red, because there the
// stored value IS the neutral pack. A control satisfied by ONE line is satisfied by
// either block alone and so falsified neither. Measured at landing the server half
// carries 3 (DirectGLES) / 2 (DirectVulkan); removing either block drops it to 1.
// carries 3 (DirectGLES: the saved-pack read and TWO post-install reads) / 2
// (DirectVulkan: one of each). Removing the re-applied block drops both backends to
// 1; removing the first block drops DirectVulkan to 1 and leaves DirectGLES at 2, so
// the first block's falsifier is the DirectVulkan entry - which is why the CI step
// runs both backends and needs both.
const std::size_t reads = CountReadReports(server, expected);
EXPECT_GE(reads, std::size_t{2})
<< "the server half carries " << reads << " `where=read` report(s) for " << expected