⛔ THE TABLE BELOW IS SUPERSEDED — DO NOT DISPATCH FROM IT
The census was re-derived on 2026-08-31 and this body's original numbers did not survive. The per-site lists, the 55 subtracted sites, and the instrument itself are published in a comment on this card — cut every slice from those, not from the table further down.
| rung | body originally said | actual at 7a5da1414 |
|---|
| tier 1 | 1,105 | 1,606 |
| tier 3 | 176 | 475 (tier-2 witness rung retired) |
| tier 3 + settle | — | 149 |
| published population | 173 | 94 |
⚠️ The per-package split of the published 94 — use ONLY this for slicing
| package | in the 94 | | package | in the 94 |
|---|
app-shell | 41 | | plugin-dashboard | 3 |
components | 14 | | plugin-form | 3 |
plugin-detail | 9 | | plugin-grid | 3 |
plugin-list | 7 | | plugin-charts | 2 |
apps/console | 7 | | plugin-chatbot | 2 |
fields | 3 | | plugin-kanban | 0 |
Sums to 94, and 94 + 55 absence-only = 149 = tier 3 + settle.
⛔ Do not confuse these with the tier-3+settle counts, which are larger because the 55 absence-only sites have not yet come out of them: plugin-detail is 14 there but 9 here, plugin-list 12 there but 7 here, and plugin-kanban is 3 there but 0 here because all three of its candidates are absence-only. An earlier version of this banner quoted the tier-3+settle figures next to the published total — my error. A slice cut at 14 or 12 over-scopes by 5; a plugin-kanban slice finds nothing to triage.
Why the original numbers are void, and it is not a rounding matter: this body lists GanttView.autoscheduledlg.test.tsx:63 as a tier-3 hit, and tier 3 is cumulative on tier 2's "surface async-witnessed elsewhere in its own package". That site reads gantt-autoschedule-confirm, which occurs exactly twice in the whole repository — the production element at GanttView.tsx:5030 and the candidate read itself — and is never named by a findBy, a waitFor, or any async query anywhere. It cannot reach tier 2, therefore cannot be tier 3, yet this body published it as tier 3. The original numbers are not reproducible from their own definitions even in principle. The tier-2 witness rung is retired as a result.
The .each blind spot that prompted the re-run is real but small — about 1.6%. It was not what killed the numbers.
Measured at 7a5da1414 (main as of #6954). ⚠️ That is not current main, which is fd8dacecc, two merges ahead; the drift is exactly one added test file and four edited ones, which moves no conclusion. Effective corpus 2,260 after excluding 28 Playwright specs where the ladder does not apply (page.getByRole returns an auto-waiting Locator, not a synchronous DOM read).
The 55 absence-only sites are subtracted from the published count and retained in this card as a named sub-population — they cannot fail this card's way (an early read makes an absence assertion pass) but can pass vacuously. Their first step is a probe, not a fix: make the element appear late and see whether the test still passes. Their site list is published alongside the 94.
Everything below is kept for the record. The calibration and the trap sections remain valid and are still the most useful part of this card.
Filed by the domain:ui execution seat (PM session session_013hfmP9hoMd3dJwTh85J4yB), carrying forward the census #6959's implementer produced and deliberately did not file itself — several of the named packages had live PRs at measurement time, so it reported rather than widened. ⛔ Grading beyond the p2 carried from #6959 is triage's.
The class
#6959 was one instance: ObjectGantt.referenceArms-6837.test.tsx:257 read a surface that appears after an async settle using a synchronousgetByTestId. In the merge queue — a heavier runner than PR CI — it lost that race twice in fifteen minutes and ejected two PRs that do not touch plugin-gantt at all, one of which passed and failed on byte-identical content.
⚠️Read #6959's correction before working this card. That card's original text — mine — blamed a React.lazy boundary. There is none.ObjectGantt imports statically and the package contains zero React.lazy; the fallback is a plain if (loading) early return. The real race is a gate that settles a mock call being ISSUED one promise-resolution before setLoading(false) runs in a finally. ⇒ The class is wider than "lazy": it is any test whose awaited settle does not touch the DOM, followed by a synchronous DOM read.
The measurement ⛔ SUPERSEDED — see the banner
Pathspec bound, stated:git ls-files -- '*.test.tsx' '*.test.ts' '*.spec.tsx' '*.spec.ts' = 2,282 files.
| tier | definition | hits |
|---|
| 1 | async block, first sync DOM read, no gate naming that surface | 1,105 |
| 2 | + surface async-witnessed elsewhere in its own package | 413 |
| 3 | + no DOM-touching gate at all before the read, resolving awaited file-local helpers one level | 176 |
Tier 3 is the real shape — the awaited settle never touches the DOM.
⭐ The hot control fired, and the instrument was fixed rather than the corpus declared clean. Tier 1 initially did not report :257 itself, because it required a literal render( in the block while :257 mounts through a helper. A zero that would have read as "clean" was caught as "broken search."
What is already done, and what remains
packages/plugin-gantt's 3 tier-3 hits were hand-triaged: exactly one real defect (:257, fixed in PR #6966). The other two are false positives — ObjectGantt.quickfilter.test.tsx:141 is gated at :135 through the file-local gv() helper, and GanttView.autoscheduledlg.test.tsx:63 has a synchronous mount with nothing to race.
Remaining: 173 tier-3 candidates outside plugin-gantt. ⛔ SUPERSEDED — the current population is 94, and the per-package table below is void.
| package | hits | | package | hits |
|---|
app-shell | 58 | | plugin-detail | 4 |
fields | 28 | | plugin-calendar | 3 |
apps/console | 25 | | plugin-dashboard | 3 |
components | 16 | | react | 3 |
plugin-form | 11 | | e2e/live | 3 |
plugin-grid | 9 | | examples/schema-catalog | 2 |
plugin-charts | 5 | | plugin-list | 2 |
| | | plugin-chatbot | 1 |
⭐ Calibration — apply this before dispatching, it is the most useful thing here
From the implementer, who hand-triaged its own package's hits:
my plugin-gantt triage found 2 of 3 tier-3 hits were false positives, so assume roughly a 2-in-3 false-positive rate; the dominant false-positive causes are a real DOM gate hidden behind a one-token file-local helper, and a mount that is synchronous to begin with.
⇒ A candidate count is not a defect count. Expect the triage cost to dominate the fix cost. ⛔ Do not dispatch this as a mechanical sweep — a blind getBy → findBy rewrite would churn files that were never wrong, and would erase gates that are load-bearing (see below).
⛔ The trap that makes this not-mechanical
#6959's fix keptmount()'s find-call gate rather than trading it for the DOM gate — because the two gates measure different facts, and the refusal probe above it needed the schema-dependent commit that the chart's presence alone does not carry.
⇒ A rewrite that replaces an existing gate with a DOM gate can silently weaken a test while leaving it green. Whoever takes a slice must, per site, establish what the existing gate proves before adding or replacing one.
Suggested shape
Slice by package, largest first, one PR per package or per small group — ⛔ not one sweeping PR. Cut slices from the published-94 split in the banner, never from the void table above.
Per site, the deliverable is a judgement, not a rewrite: is the awaited settle DOM-touching? If not, is there another gate, possibly behind a helper? Only then change the read.
Related
Filed by the
domain:uiexecution seat (PM sessionsession_013hfmP9hoMd3dJwTh85J4yB), carrying forward the census #6959's implementer produced and deliberately did not file itself — several of the named packages had live PRs at measurement time, so it reported rather than widened. ⛔ Grading beyond the p2 carried from #6959 is triage's.The class
#6959 was one instance:
ObjectGantt.referenceArms-6837.test.tsx:257read a surface that appears after an async settle using a synchronousgetByTestId. In the merge queue — a heavier runner than PR CI — it lost that race twice in fifteen minutes and ejected two PRs that do not touchplugin-ganttat all, one of which passed and failed on byte-identical content.React.lazyboundary. There is none.ObjectGanttimports statically and the package contains zeroReact.lazy; the fallback is a plainif (loading)early return. The real race is a gate that settles a mock call being ISSUED one promise-resolution beforesetLoading(false)runs in afinally. ⇒ The class is wider than "lazy": it is any test whose awaited settle does not touch the DOM, followed by a synchronous DOM read.The measurement ⛔ SUPERSEDED — see the banner
Pathspec bound, stated:
git ls-files -- '*.test.tsx' '*.test.ts' '*.spec.tsx' '*.spec.ts'= 2,282 files.Tier 3 is the real shape — the awaited settle never touches the DOM.
⭐ The hot control fired, and the instrument was fixed rather than the corpus declared clean. Tier 1 initially did not report
:257itself, because it required a literalrender(in the block while:257mounts through a helper. A zero that would have read as "clean" was caught as "broken search."What is already done, and what remains
packages/plugin-gantt's 3 tier-3 hits were hand-triaged: exactly one real defect (:257, fixed in PR #6966). The other two are false positives —ObjectGantt.quickfilter.test.tsx:141is gated at:135through the file-localgv()helper, andGanttView.autoscheduledlg.test.tsx:63has a synchronous mount with nothing to race.Remaining: 173 tier-3 candidates outside
plugin-gantt. ⛔ SUPERSEDED — the current population is 94, and the per-package table below is void.app-shellplugin-detailfieldsplugin-calendarapps/consoleplugin-dashboardcomponentsreactplugin-forme2e/liveplugin-gridexamples/schema-catalogplugin-chartsplugin-listplugin-chatbot⭐ Calibration — apply this before dispatching, it is the most useful thing here
From the implementer, who hand-triaged its own package's hits:
⇒ A candidate count is not a defect count. Expect the triage cost to dominate the fix cost. ⛔ Do not dispatch this as a mechanical sweep — a blind
getBy→findByrewrite would churn files that were never wrong, and would erase gates that are load-bearing (see below).⛔ The trap that makes this not-mechanical
#6959's fix kept
mount()'s find-call gate rather than trading it for the DOM gate — because the two gates measure different facts, and the refusal probe above it needed the schema-dependent commit that the chart's presence alone does not carry.⇒ A rewrite that replaces an existing gate with a DOM gate can silently weaken a test while leaving it green. Whoever takes a slice must, per site, establish what the existing gate proves before adding or replacing one.
Suggested shape
Slice by package, largest first, one PR per package or per small group — ⛔ not one sweeping PR. Cut slices from the published-94 split in the banner, never from the void table above.
Per site, the deliverable is a judgement, not a rewrite: is the awaited settle DOM-touching? If not, is there another gate, possibly behind a helper? Only then change the read.
Related
ObjectGantt.referenceArms-6837.test.tsx:257reads the lazy Gantt through a SYNCHRONOUS query and ejects unrelated PRs from the merge queue — two ejections in 15 minutes, neither PR touching plugin-gantt #6959 — the instance, its correction, and the census method