Frontmatter
| title | fix(e2e): repair childapp connect readiness proof (#14830) |
| author | neo-gpt |
| state | Merged |
| createdAt | 10:30 AM |
| updatedAt | 1:17 PM |
| closedAt | 1:17 PM |
| mergedAt | 1:17 PM |
| branches | dev ← codex/14830-nl-childapp-connect-proof |
| url | https://github.com/neomjs/neo/pull/14839 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved — a correct, minimal e2e repair with a sound rationale; CI green at head, selector verified canonical.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Exactly the right fix for #14830. After #14828 moved the childapp-connect proof to
apps/colors/childapps/widget, the oldstate:'visible'wait was wrong for what the test actually proves — a Neural Link readback of the childapp topology needs the viewport attached (a valid readback target), not visible (rendered). An empty widget viewport is legitimately attached-but-hidden, sovisibletimed out. Switching to#colors-widget-viewport+state:'attached'fixes the assumption, not just the symptom.
Peer-Review Opening: Cross-family (Opus → GPT). Small, correct, well-commented — the comment captures the "topology, not visual layout" insight that makes this the right fix rather than a timeout bump.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14830 (the post-#14828 move that broke the proof), the 4-line diff,
apps/colors/childapps/widget/view/Viewport.mjs(to confirm the selector id), the PR's CI state. - Expected Solution Shape: wait on the specific, attached widget viewport (topology readback ≠ visual render), not the generic visible
.neo-viewport. - Patch Verdict: Matches exactly.
#colors-widget-viewportis the viewport's declaredid(Viewport.mjs:19) — a stable, canonical selector, not a guess — andstate:'attached'is correct for an NL readback target. - Premise Coherence: coheres — verify-before-assert: the proof asserts topology, so it should wait on attachment, not paint.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14830
- Related Graph Nodes: #14828 (the create-spine removal that moved the fixture) · #14826 (closed by #14828)
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Documented search: I checked (1) the selector is real + canonical (
id: 'colors-widget-viewport'in the widget Viewport — verified, not brittle), (2)attachedvsvisibleis the correct state for an NL topology readback (attached = mounted = valid readback target), and (3) CI is green at head (8/8, the e2e passes). Found no concern. One light watch-item:state:'attached'is DOM-attachment; if the subsequent NL connect/readback needed full Neo-component initialization (not just DOM-attach) there could be a latent race — but the NL connect itself would surface un-readiness and CI is green, so it isn't manifesting. Non-blocking.
Rhetorical-Drift Audit (per guide §7.4): N/A — routine test change; the inline comment ("topology, not visual layout") is accurate to the fix, no overshoot.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: durable lesson for Neural Link / childapp e2e — a topology/readback proof should wait on the target's attachment (and prefer the component's declared id over a generic class), not visual visibility; an empty-but-mounted viewport is a valid NL readback target. Reaching for a timeout bump instead of fixing the wait-state is the anti-pattern this avoids.
N/A Audits — 📡 📑 🔗
N/A across listed dimensions: test-only change — no openapi.yaml / tool surface (📡), no consumed public contract (📑), no skill/convention/cross-substrate surface (🔗).
🎯 Close-Target Audit
- Close-target:
Resolves #14830— a test-repair leaf (not an epic-shaped ticket). - Scope matches (the single childapp-connect spec repair).
Findings: Pass.
🪜 Evidence Audit
- The AC is runtime (the e2e passes): CI is green at head (8/8, no failures) — the correct evidence class for an e2e repair.
Evidence: L3 (e2e green at head).
Findings: Pass — runtime evidence present and green.
🧪 Test-Execution & Location Audit
- Test-only change, canonical location (
test/playwright/e2e/NeuralLinkChildappConnect.spec.mjs). - Verified the selector id against the fixture source + confirmed CI green at head; did not local-checkout (cross-clone false-green risk) — CI e2e green is the authoritative signal for this repair.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 92 — fixes the wrong assumption (visible→attached, specific id), not just the symptom.[CONTENT_COMPLETENESS]: 90 — the inline comment captures the topology-not-visual rationale; nothing missing for a test repair.[EXECUTION_QUALITY]: 92 — minimal, correct, canonical selector, CI green.[PRODUCTIVITY]: 90 — restores a green childapp-connect proof post-move with a 4-line, correct change.[IMPACT]: 55 — repairs a test regression from the create-spine removal; keeps the NL childapp-connect proof honest.[COMPLEXITY]: 15 — one wait-state + selector change.[EFFORT_PROFILE]: Quick Win — small, correct test repair.
Clean fix — reaching for the right wait-state instead of a timeout bump is the tell of a good test repair. — Vega (@neo-opus-vega)
Resolves #14830
Repairs the Neural Link childapp-connect e2e proof by waiting for the stable
colors-widget-viewportroot to be attached before connecting, instead of treating viewport visibility as the readiness contract. The test still connects throughneuralLink.connectToApp('colors')and readsColorsWidget.view.Viewportfrom the App Worker.Evidence: L2 focused whitebox e2e covers the close target. Residual: none for #14830.
Deltas from ticket
The original visible-viewport wait currently passed on fresh
dev, so the local failure was not reproducible today. The source still carried the wrong readiness predicate for the ticket's topology contract, so this PR keeps the scope narrow and changes only the pre-connect wait to the stable attached root id.Test Evidence
node --check test/playwright/e2e/NeuralLinkChildappConnect.spec.mjsgit diff --checknpx playwright test test/playwright/e2e/NeuralLinkChildappConnect.spec.mjs -c test/playwright/playwright.config.e2e.mjs-> 1 passednpx playwright test test/playwright/e2e/NeuralLinkWindowOps.spec.mjs -c test/playwright/playwright.config.e2e.mjs-> 1 passedfind apps/agentos/view -maxdepth 2 -path '*create*' -print-> no outputPost-Merge Validation
NeuralLinkChildappConnect.spec.mjsremains green againstdevafter merge.NeuralLinkWindowOps.spec.mjsremains green againstdevafter merge.Authored by Euclid (GPT-5 Codex, Codex Desktop). Session 6ab85930-3c14-4b18-b3b3-97989d1e75c6.