docs: address Copilot review round 1

The 5000 arms of #2335's re-run each had exactly one red test — the
asyncUtilTimeout guard refusing the raised value — so "0 failures in
every arm" was a misstatement; both comments now say so. And the
AGENTS.md rule still gave the expiring-wait mechanism as the reason the
pin was measured worse, which the corrected record contradicts; it now
cites both measurements and keeps the mechanism as the hazard the rule
guards against.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-09-13 12:19:26 -04:00
commit f8536cad5d
3 changed files with 17 additions and 10 deletions

View file

@ -435,12 +435,16 @@ free to run a full `local:gate`). Raising a budget nobody chose hides no race.
tool can be asked to resolve; assert at runtime when it is about behavior. tool can be asked to resolve; assert at runtime when it is about behavior.
- **A budget is stated, which is not the same as raised.** Testing Library's - **A budget is stated, which is not the same as raised.** Testing Library's
`asyncUtilTimeout` is pinned at its own default in both web setup files `asyncUtilTimeout` is pinned at its own default in both web setup files
because raising it was *measured worse*: a wait that is meant to expire — because raising it was *measured* and found to buy nothing: #2323's
a test asserting something never appears, a poll allowed to run out — spends three-arm run went red at 5000, and #2335's interleaved re-run on a leased
its whole budget on the happy path, so a raise is a proportional cost on machine found no web test that lets a Testing Library wait expire on its
exactly those tests and starves the worker pool. Measure before raising a passing path and no difference between 1000 and 5000 beyond the guard
budget that a passing test can spend in full; the call-site comment records refusing the raised value. The hazard the rule guards against is still
the three-arm run. real: a wait that is meant to expire — a test asserting something never
appears, a poll allowed to run out — spends its whole budget on the happy
path, so a raise is a proportional cost on exactly those tests. Measure
before raising a budget that a passing test can spend in full; the
call-site comment records both runs.
- **An inner budget must be strictly smaller than the budget enclosing it.** - **An inner budget must be strictly smaller than the budget enclosing it.**
`waitFor({ timeout: N })` inside a test whose own budget is `N` can never win: `waitFor({ timeout: N })` inside a test whose own budget is `N` can never win:
the test expires first and reports a timeout naming neither the wait nor its the test expires first and reports a timeout naming neither the wait nor its

View file

@ -26,8 +26,9 @@ import { getConfig } from "@testing-library/react";
* to expire spends the whole budget on the happy path, so a 5x raise is a 5x * to expire spends the whole budget on the happy path, so a 5x raise is a 5x
* cost on those tests — was checked on #2335 and does not hold here: no web * cost on those tests — was checked on #2335 and does not hold here: no web
* test lets a Testing Library wait expire on its passing path, and the same * test lets a Testing Library wait expire on its passing path, and the same
* three-arm protocol re-run interleaved on a leased machine showed 0 failures * three-arm protocol re-run interleaved on a leased machine showed no failure
* in every arm and 0 tests at or above 5000ms with the raise in place. Raising * in any arm beyond this very assertion refusing the raised value, and 0 tests
* at or above 5000ms with the raise in place. Raising
* the budget buys nothing, so the pin stays at the default until a measurement * the budget buys nothing, so the pin stays at the default until a measurement
* says otherwise. `setup.ts` carries the full record. * says otherwise. `setup.ts` carries the full record.
* *

View file

@ -31,8 +31,10 @@ import { cleanup, configure } from "@testing-library/react";
// expiring-wait shape against Testing Library across the unit, `core/`, // expiring-wait shape against Testing Library across the unit, `core/`,
// integration and story files; no test at or above 2000ms in a full unit run; // integration and story files; no test at or above 2000ms in a full unit run;
// and the same three-arm protocol re-run interleaved on a leased machine // and the same three-arm protocol re-run interleaved on a leased machine
// (1000 / 5000 / reverted, three rounds) gave 0 failures in every arm and // (1000 / 5000 / reverted, three rounds) gave 0 failures in every arm — the
// 0 tests at or above 5000ms with the raise in place. Nothing on the passing // one red test in each 5000 arm being `asyncUtilTimeout.test.ts` refusing the
// raised value, which is the guard doing its job — and 0 tests at or above
// 5000ms with the raise in place. Nothing on the passing
// path spends this budget, so raising it buys nothing — and the #2323 reds // path spends this budget, so raising it buys nothing — and the #2323 reds
// read as ambient load the arms did not share (an inference from that data, // read as ambient load the arms did not share (an inference from that data,
// not a re-measurement of the original run). // not a re-measurement of the original run).