D191 - A check must fail to return on two consecutive runs before it is skipped
D181 measured the cost of trusting one sighting: eight consecutive
shadPS4 runs, one crash inside 900-surface/videoout on the
third, and every run after it reporting
complete with 20,342 records where a clean
state gives 36,575. Two corpus groups had been skipped permanently on
the strength of a single intermittent fault, and nothing in the tally,
the check count or the verdict moved - only the raw record count, which
nobody compares.
A dangling try means "did not return", and that is
produced by two different things: a check that hangs, and a check that
was still running when something killed the process. The report cannot
tell them apart. So stop asking it to.
The rule
A first dangling try puts the check on a watch
list and it is retried. A second dangling
try on the very next run skips it. A res for a
watched check drops it from the list, which is what makes the rule
consecutive rather than twice ever - an intermittent
fault has to recur immediately to count.
Where the watch list lives
On the resume record, appended after its two existing
fields:
OBS|resume|<skipped>|<ok|full>|<watched id>...
The report is the state file - there is no second one, by design - and a check being retried emits an ordinary result rather than a skip, so nothing else in the stream would carry it forward. Appending is what the format permits without a version bump, and a reader that does not know about these stops at the two fields it does. (Principle 3.)
Measured, both directions
Positive, fpPS4 from a cleared state:
| run | died in | resume record |
|---|---|---|
| 1 | 007-responsive/libc |
0|ok |
| 2 | 007-responsive/libc |
0|ok|007-responsive/libc - watched, retried |
| 3 | 007-responsive/math |
1|ok - libc skipped on the second sighting |
| 4 | 007-responsive/math |
1|ok|007-responsive/math |
Negative, on the host build, seeding a watch entry for a check that answers normally:
seeded: OBS|resume|0|ok|010-kernel/process-time
run 1: OBS|resume|0|ok|010-kernel/process-time (answered; still watched)
run 2: OBS|resume|0|ok (dropped; 0 skipped)
The guard has been watched both accepting and rejecting, which is the standard this project sets for one.
What it costs
One extra run per blocker. fpPS4 has 44, so its convergence roughly
doubles - paid in machine time, unattended. Against that: a report that
says complete while missing half its measurements, which is
the failure this program exists to make impossible.
What it does not fix
A check that hangs reliably is still skipped, and should be - that is the mechanism working. And a run killed twice in a row at the same place still poisons, which is the residual case. A runner that told the module "I killed you" would close it, but the runner and the module do not share a filesystem view, so that stays open.
Status: decided - measured in both directions.