Development record
Four test sites now assert elapsed wall-clock time where they mean to assert behaviour: iss-2608292246210181 and iss-2608290810037763 in the scanner's adjacency tests, iss-2608301301041887 in the grounds lock test, and the bootstrap fresh-install self-check in internal/surface/cli. Each was found by a CI flake and each is being fixed site by site. Worth deciding whether the rule 'a test asserts behaviour or an operation count, never a duration' graduates to a principle under .abcd/development/principles/ or to a lint rule that refuses a time.Since comparison in a _test.go file, so the fifth site is refused at draft time rather than found by the next flake. This is a design decision and was not taken during autonomous-run-2026-09-01, where it was carried from the session handover; the fourth site was fixed on its own merits.
Four test sites now assert elapsed wall-clock time where they mean to assert behaviour: iss-2608292246210181 and iss-2608290810037763 in the scanner's adjacency tests, iss-2608301301041887 in the grounds lock test, and the bootstrap fresh-install self-check in internal/surface/cli. Each was found by a CI flake and each is being fixed site by site. Worth deciding whether the rule 'a test asserts behaviour or an operation count, never a duration' graduates to a principle under .abcd/development/principles/ or to a lint rule that refuses a time.Since comparison in a _test.go file, so the fifth site is refused at draft time rather than found by the next flake. This is a design decision and was not taken during autonomous-run-2026-09-01, where it was carried from the session handover; the fourth site was fixed on its own merits.
Remedy grounds (2026-09-29)
- SOTA check: the testing/synctest documentation (https://pkg.go.dev/testing/synctest, read 2026-09-29) runs a test in a bubble whose time package uses a fake clock that advances only when every goroutine is durably blocked, generally available since Go 1.25; go.mod declares 1.26.7, so it costs no dependency (its Sleep helper is 1.27, outside the pin).
- The branch draft cites a ruling not recorded on main, so landing it still waits on CA1.
- Rejected: raising the ceilings, which keeps measuring the machine rather than the code.
Evidence: 2026-10-25
Two records-only branches failed make preflight on wall-clock assertions alone after waiting their turn at the load gate. Load average was 12.7 on 10 cores, with four preflights and seven test processes running. The same tests failed on both branches:
TestReadOwedHonoursDeadline(autonomy): a read cut short by its 10s forge deadline was not marked incomplete;TestKeepingManyDoubtsFitsThePrompt: 3.10s against an under-3s ceiling;TestEachForgeLookupEndsAtTheBudget: the deadline it saw was not the budget's;TestHookSessionEndRetriesATransientRootFailure: no time was left to retry;TestTheForgeIsAskedAboutEveryBranchInTurnandTestPeersListsALanesStageAndItsHoldersRecentHandBacks: running when their packages (claim, implement/loop, surface/cli) hit the 20-minute timeout.
The load gate admits one preflight's test stage at a time, but tests run outside a preflight (a session's own go test -run …) are not gated, so an admitted stage still runs on a saturated machine.
Frontmatter
| id | iss-2609012020476120 |
|---|---|
| type | issue |
| lifecycle | open |
| severity | minor |
.abcd/work/issues/open/iss-2609012020476120-four-test-sites-now-assert-elapsed-wall.md
open on GitHub ↗ · commit history ↗
mentions3
- iss-2608290810037763Adversarial cost guards in the scanner's adjacency tests assert wall-clock seconds, which is a property of the machine rather than of the code, so they pass locally and fail on slower CI hardware under the race detector. One failed on both CI runners at 22.5 seconds against a 15 second bar while passing locally at 11.0 seconds on the same commit; the branch that introduced the probe and the merged tree measured identically, so it was not a regression. It was fixed for the costliest shape by shrinking that case's input, which is the lever the test file's own helper documents, but three sibling bars carry the same fragility and the same thin headroom. The machine-independent cost-CLASS guard beside them is the better model: it doubles the input and asserts the growth ratio, which no hardware difference can flip. Worth converting the remaining wall-clock ceilings to ratio assertions, or at least measuring a per-machine baseline and asserting a multiple of it.
- iss-2608292246210181TestGallopingProbeCostIsLinearInLineLength in internal/adapter/scanner is a wall-clock scaling test (quadruple the line, require under 8x) that sits in release.yml's verify job, so a loaded shared runner can refuse a tag on timing alone: the v0.6.9 auto-release measured 8.4x (2.16s to 18.1s) after the same tree passed the merge-queue check leg, while the release machine measures 4.0x across three runs; the tag was already minted, so the refusal consumed nothing but needed a manual rerun. The scaling property should be asserted on operation counts or a deterministic probe budget rather than elapsed time, or the test excluded from the verify lane.
- iss-2608301301041887the lock assertion in the grounds test is wall-clock so a loaded runner could pass it with no lock held