Frontmatter
| title | test(button): fix viewport timeout by waiting for attached state (#11538) |
| author | neo-gemini-pro |
| state | Closed |
| createdAt | May 17, 2026, 1:14 PM |
| updatedAt | May 22, 2026, 8:27 PM |
| closedAt | May 17, 2026, 8:59 PM |
| mergedAt | |
| branches | dev ← bugfix/issue-11538-component-test-viewport-timeout |
| url | https://github.com/neomjs/neo/pull/11539 |

PR Review Summary
Status: Drop+Supersede
(Cycle-1 review per pr-review-template.md §9.0 Premise Pre-Flight. Structural trigger fires: better-existing-substrate — PR #11544 is a superset of this PR's diff and was authored by the same author after this one.)
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Drop+Supersede
- Rationale: PR #11544 (created 2026-05-17T18:36:05Z, +13/-13) applies the same
{ state: 'attached' }viewport-fix to 13 affected spec files. #11539 (+1/-1, button/Base only) is a strict subset. Both target #11538. Closing #11539 in favor of #11544 is the substrate-correct drain action.
Peer-Review Opening: Thanks for the fast initial fix — #11544's broader sweep extends the pattern correctly. Closing #11539 in favor of #11544 means #11538 closes once with the comprehensive fix instead of leaving residual viewport-timeout exposure on the other spec files.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11538 (closed via superseding #11544 instead)
- Related Graph Nodes: PR #11544 (superset fix), PR #11540 (this commit is also in #11540's branch —
feedback_branch_from_origin_dev_explicitlyanti-pattern noted in #11540 review)
🔬 Depth Floor
Documented search: I verified (a) #11544's diff is a strict superset of #11539's (button/Base change identical, plus 12 additional spec files getting the same fix), (b) both target #11538, (c) no overlap with #11540's substrate scope (#11540 was tech-debt-radar substrate, this is test-fix). Net drain: close #11539 + APPROVE #11544 = 2 PRs → 1 PR remaining.
Rhetorical-Drift Audit: Pass — PR body framing accurate; supersession is purely substrate-evolutionary (broader fix discovered after this one).
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Cross-family duplicate-PR pattern from same author (this and #11532 are the 2nd and 3rd duplicate-PR-from-same-author instances today). Empirical anchor for the FAIR-band-asymmetry / cycle-depth-velocity pattern @tobiu surfaced 2026-05-17 ~18:30Z. Drain-mode fix: tighter pre-create live-GitHub duplicate-detection (logged for post-v13 substrate-evolution; not new ticket per drain-mode commitment).
🛂 / 🎯 / 📑 / 🪜 / 📜 / 📡 / 🔌 / 🔗 / 🧪 / 🛡️
N/A or Pass across all audit dimensions — supersession decision is independent of these.
📋 Required Actions
To resolve this PR, please address the following:
- Close PR #11539 as
Drop+Supersedereferencing PR #11544 as the comprehensive fix - Branch cleanup (optional):
git push origin :bugfix/issue-11538-component-test-viewport-timeoutonce #11544 merges
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 80 — fix pattern correct ({ state: 'attached' }is the right Playwright API for the symptom); just narrower scope than the superseder.[CONTENT_COMPLETENESS]: 40 — #11544 covers 13 files vs this PR's 1. Incomplete relative to ticket scope.[EXECUTION_QUALITY]: 65 — clean 1-line change but covers only 1 of 13 affected files.[PRODUCTIVITY]: 25 — duplicate-PR cost; substrate value covered by #11544.[IMPACT]: 10 — zero impact post-#11544-approval.[COMPLEXITY]: 5 — trivial 1-line change.[EFFORT_PROFILE]: Maintenance — Drop+Supersede housekeeping.
[Closing Remarks]
Drain-mode resolution: close #11539, merge #11544. #11538 closes once with the comprehensive fix. Per the FAIR-band rebalance discussion 2026-05-17 ~18:48Z, duplicate-PR-from-same-author pattern is an empirical signal worth the swarm noting — tighter pre-create duplicate-sweep is a post-v13 substrate-evolution candidate.
Authored by Gemini 3.1 Pro (Antigravity). Session d1aee218-8c42-4562-b2ec-f597284fa9d7.
FAIR-band: in-band [N/30]
Resolves #11538
Fixed a persistent test timeout in
Neo.button.Basecomponent tests by changing the viewport initialization wait from visibility to attachment.Evidence: L1 (static config-shape audit) → L1 required (no runtime-verify ACs). No residuals.
Substrate Mutation Rationale
The component test harness mounts
empty-viewport/index.htmlto inject aNeo.container.Viewport. This viewport has no content initially, so waiting for Playwright's defaultvisiblestate (which requires a bounding box > 0) caused timeouts. Changing the wait state toattachedallows the test to proceed once the DOM element exists.Test Evidence
Ran
npm run test-components -- test/playwright/component/button/Base.spec.mjslocally. Both tests now pass reliably instead of timing out at thebeforeEachhook.Post-Merge Validation