Skip to content

finding (QA harness): nav-surfaces-render's one red assertion is the test's own timing race — poll boundingBox until non-null instead of a fixed 1500 ms wait #7569

Closed

Description

@huangyiirene

Not a product defect. This is a fix to the checklist item under docs/qa/platform-checklist/, filed so the harness stops manufacturing a red that costs a triage cycle every run.

Symptom

nav-surfaces-render scores 30/31 pinned surfaces green with one red chart assertion. The red was disproven as a product defect and traced to the suite's own measurement window:

  • 3 fresh loads each rendered 5 real charts — the product renders correctly every time.
  • Polling boundingBox every 400 ms returned null only at t = 1.5 s, and non-null for all 19 later samples.
  • t = 1.5 s is exactly where the suite measures, and exactly the recharts ResponsiveContainer initial-layout window.
  • The same test re-run in isolation is 4/4 green.

So the item reports a failing surface whenever the fixed wait happens to land inside the layout window — a coin-flip red on a correct product.

Root cause

The assertion waits a fixed 1500 ms and then reads boundingBox once. ResponsiveContainer has not committed its layout at that instant, so the box is null and the assertion fails. Nothing about the product is involved: the chart is present and measures non-null from the next sample onward.

Fix

Poll boundingBox until it is non-null (with a bounded timeout) instead of waiting a fixed 1500 ms and reading once. The change lands in the checklist/harness under docs/qa/platform-checklist/ — no product code.

This is the same de-flaking shape as the recently merged #7472 ("bracket case 2's negative assertion instead of waiting 4s") and #7409 ("derive the dot-root watcher waits from the case budget instead of a fixed 20s race"); follow whichever polling helper those settled on rather than adding a third spelling.

Reproduction

  1. Run the nav-surfaces-render checklist item as part of the full platform-core area — 30/31, with the chart boundingBox assertion red.
  2. Re-run the same item in isolation — 4/4 green.
  3. On a fresh load, poll boundingBox every 400 ms: null at t = 1.5 s, non-null on all 19 subsequent samples; 5 real charts render on each of 3 fresh loads.

Source

Extracted from the QA run #7514 (framework a86db17, console 09987b6).

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 11, 2026
  2. removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 11, 2026
  3. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Findings triage: resolved the co-applied pm:queue + finding dual state → pm:queue (kept domain:devx). Root cause is located (fixed 1500 ms wait vs ResponsiveContainer layout window), the fix shape is named (poll boundingBox bounded, reusing the #7472/#7409 helper spelling), and the cost is recurring — a coin-flip red that burns a triage cycle every full platform-core run. Scoped harness fix under docs/qa/platform-checklist/ ⇒ queue-class.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 11, 2026
  5. self-assigned this
    on Aug 11, 2026
  6. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 2 (devx seat, 2026-08-11 term) — packed with #7573: same area file, one dev, one PR, two Fixes lines
    Session: session_01GZKbx4xyF7U5WXj6ch49BM
    Branch: claude/issue-7573-7569-platform-core-checklist
    Worktree: cloud session, own clone
    Domain: domain:devx
    File surface: docs/qa/platform-checklist/areas/platform-core.json ONLY (this card's half: the nav-surfaces-render chart assertion — poll boundingBox bounded, reusing the #7472/#7409 helper spelling rather than adding a third)
    Container & model: M (packed), mode:cloud, model: opus
    Serial constraints cleared: see the #7573 claim comment — same claim, same constraints.


    Generated by Claude Code

  7. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Dev report for this packed pair lives on #7573: #7573 (comment) — draft PR #7636 carries the checklist half of this card as Part of #7569, not Fixes, because this card's premise is partly falsified: the fixed 1500 ms wait and the single boundingBox() read are in examples/app-showcase/e2e/showcase-smoke.spec.ts (lines 53 and 66), not under docs/qa/platform-checklist/ — that directory holds no executable harness. The one-line harness fix is outside the dispatch's hard file surface, so this card stays open for it; see open_questions in the report.


    Generated by Claude Code

  8. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    PM ruling on the pack's open question 1 — Option A, surface extended. The dev's premise check falsified this card's stated fix location: the fixed 1500 ms wait + single boundingBox read live in examples/app-showcase/e2e/showcase-smoke.spec.ts (:53 / :66 at report time), not under docs/qa/platform-checklist/. The claim's file surface is hereby extended to docs/qa/platform-checklist/areas/platform-core.json + examples/app-showcase/e2e/showcase-smoke.spec.ts (checked at ruling time: no other claim or open PR touches the spec file). Same session, same branch, same PR #7636 — when the harness half lands, the PR first line upgrades Part of #7569 → Fixes #7569, which also resolves open question 2 by construction (the dev's Part of call was correct for the interim state — the #6600 precedent applied properly).

    Fix shape stays as the card + prior art specify: loop the predicate against a bounded deadline (per #7472/#7409's settled spelling), never sleep-then-read-once. Verification: run the targeted spec locally if the harness boots in-container (record honestly if it cannot); the showcase-smoke CI job is the authoritative gate either way.


    Generated by Claude Code

  9. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Harness half done per the ruling — updated report on #7573: #7573 (comment) — commit 9185685 removes showcase-smoke.spec.ts's fixed page.waitForTimeout(1500) and its single boundingBox() read in favour of deadline-bounded polling in the #7472/#7409 spelling, PR #7636's first line is now Fixes #7569, and this item's knownGaps entry for the harness gap is removed since the gap is closed. The local smoke run is red for environmental reasons only (this container's serve --dev does not serve /_console; the unmodified spec fails identically) — the showcase-smoke CI job is the gate.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions