DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-198-loomworks-b84-polling-determinism-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-198 — B-84: an intermittently-red gate is not a gate (v0.1)

Version. 0.1 · Date. 2026-08-10 · Author. Claude.ai (drafting) / Marvin Percival (approving). Target. /Users/dunin7/loomworks-engine, branch main. Baseline. Engine f338f3f — the first green push run in seven. CC confirms at Step 0. Companion to. standing-notes/dunin7-build-list-v0_58 (B-84); B-83's entry, which this closes the residue of. Charter. Autonomous regime. Status. Ready for CC execution, with a read-first Step 1.


1. Summary

test_external_polling::test_concurrent_polls_for_different_specialists failed in 2 of the 6 suite-reaching runs during B-83's investigation — "Expected ≥2 polled events committed before slow poll returns, got 1" — and passed on rerun with no code change. Green locally throughout.

Why this ranks where it does. B-83 made the gate green. It did not make it trustworthy. A test that fails at random means the next red result is ambiguous, and ambiguity is exactly what produced six unsignalled pushes: nobody could distinguish a new failure from the standing one. An intermittently-red gate gets read as noise, and once people learn to rerun rather than read it, it has stopped being a gate.


2. Step 1 — establish what the test is actually asserting

Read before touching anything. The remedy depends entirely on which of two things is true, and they need opposite fixes:

  1. The property is real and the test's grip on it is loose. Concurrent polls for different specialists genuinely should interleave, and the assertion is timing-coupled to something that varies under load. Remedy: make the property deterministic — control the interleaving rather than waiting for it.
  2. The property is not what the test names. "≥2 polled events committed before the slow poll returns" may be an artefact of how the test stages concurrency rather than a behaviour anyone depends on. Remedy: assert what actually matters, which may be a different claim entirely.

CC reports which, with the reasoning. If it is (2), halt and report — rewriting a test to assert a different property is a decision about what the system guarantees, not an implementation choice.

Also establish: does anything in production depend on the interleaving this test asserts? If nothing does, the test is pinning an incidental behaviour, and that changes what "fixing" it means.


3. The remedy this CR forbids

Widening the timeout is not a fix and must not be taken. It makes the failure rarer without making it impossible, which converts a visible flake into an invisible one — the same trade B-83 just spent six pushes paying for. If the only available remedy is a wider timeout, halt and say so; that is a finding, not a build.

"Retry on failure" is likewise out. A gate that reruns until green is a gate that reports green regardless.


4. Scope

Make the test deterministic — it passes every run or fails every run, and its failure means something.

Observed failing first, per the standing note, with a message naming the invariant. And because this test is already known to fail sometimes, the observation has to distinguish a deliberate break from the flake itself: CC states how it established that the failure it observed was the one it caused.


5. Out of scope


6. Seed-mutability impact

B-69 applies. External polling is unlikely to touch seed state — record it as Kind C if so. A null finding is an entry.


7. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — confirm baseline, tree clean. | Auto | | 1 | Read per §2. Report which case, and whether production depends on the interleaving. Halt if case (2). | Auto, conditional halt | | 2 | Make it deterministic. Halt if the only remedy is a wider timeout. | Auto, conditional halt | | 3 | Observed failing first, distinguishing the deliberate break from the flake. | Auto | | 4 | Run the test in a loop — at least 20 iterations — and report the pass count. A single green run is not evidence about a flake. | Auto | | 5 | Full engine suite; ruff 0; mypy at/below baseline. | Auto | | A | Checkpoint. | Checkpoint | | 6 | Tag cr-2026-198-b84-polling-determinism. Push. Watch the CI run and report its result — this CR is about the gate, so its own gate result is part of the evidence. | Auto |


8. Acceptance gate

  1. The test passes 20 consecutive runs, count reported. One green run proves nothing about a flake.
  2. The remedy is determinism, not a widened timeout or a retry.
  3. Step 1's finding recorded — which case, and whether production depends on the asserted interleaving.
  4. Full suite green; both gates clean; the push CI run watched and its result reported, not assumed.
  5. Seed-mutability check recorded, including as a null finding.

9. Kickoff prompt


Execute CR-2026-198 v0.1 at ~/Downloads/cr-2026-198-loomworks-b84-
polling-determinism-v0_1.md. Confirm the CR number first.

B-84: test_concurrent_polls_for_different_specialists failed 2 of 6
suite-reaching runs during B-83's investigation and passed on rerun.
B-83 made the gate green; this makes it trustworthy.

Step 1 decides the remedy and the two cases need opposite fixes: either
the property is real and the test's grip is loose, or the property isn't
what the test names. HALT if it's the second — rewriting a test to
assert a different property is a decision about what the system
guarantees.

Also establish whether anything in production depends on the
interleaving this test asserts. If nothing does, it's pinning incidental
behaviour and that changes what fixing it means.

§3 is a hard prohibition: widening the timeout is NOT a fix. It makes
the failure rarer without making it impossible, converting a visible
flake into an invisible one — the trade B-83 just spent six pushes
paying for. If that's the only available remedy, HALT and say so. Same
for retry-on-failure.

Step 3 has a wrinkle worth planning for: this test already fails
sometimes, so observing your deliberate break has to distinguish the
break from the flake. State how you established that.

Step 4: 20 consecutive runs, report the count. One green run is not
evidence about a flake.

Step 6: watch the push CI run and report its result. This CR is about
the gate — assuming its own gate result would be the wrong ending.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-198 — B-84 polling determinism — v0.1 — 2026-08-10