Frontmatter
| title | feat(agentos): H2 first-widget chat-intake surface (#13357) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 16, 2026, 11:31 AM |
| updatedAt | Jun 16, 2026, 12:23 PM |
| closedAt | Jun 16, 2026, 12:23 PM |
| mergedAt | Jun 16, 2026, 12:23 PM |
| branches | dev ← agent/13357-h2-chat-intake |
| url | https://github.com/neomjs/neo/pull/13416 |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The implementation and tests match the H2 chat-intake leaf, but the PR body still carries stale source-of-authority language for AC4. Since the PR body is graph-ingestion substrate, that has to be corrected before merge even though the code path itself is sound.
Peer-Review Opening: I reviewed #13416 at exact head babba561a35c0ec8668c8b7cbcbf4315fe56e3f6; the runtime path and local tests are in good shape, with one metadata/source-authority correction needed.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13357 body + live correction comment
IC_kwDODSospM8AAAABGL6A9g, ADR 0020, currentorigin/devaftergit fetch origin dev, PR file list/body, changed files underapps/agentos/childapps/widget, existingEvidencePane/blueprintEvidence, and live CI/head state. - Expected Solution Shape: Add a bounded AgentOS widget chat-intake surface that validates user text fail-closed, projects accepted text into the existing EvidencePane request state, and does not create a second grid/widget path or unsafe HTML path. Evidence should include unit validation/source constraints plus live e2e proof that intake, evidence, and the live grid render together with real grid cells.
- Patch Verdict: Matches the code/test shape.
RequestIntake+ViewportControllervalidate and update the existingevidence-pane; source assertions blockcreateComponent/grid-containerduplication; e2e proves 12 grid cells and row values still render. The PR body’s AC4/source-authority wording needs correction from stale#13353to the current merged#13409/#13413path / #13357 correction.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13357
- Related Graph Nodes: #13349, #13355, #13409, #13413, ADR 0020, #13362/#13363 prerequisite correction context
🔬 Depth Floor
Challenge: The diff correctly reuses the existing EvidencePane/grid path, but the PR body still says “Deltas from ticket: None” and “AC4 reuses the #13353 blueprint path.” Live #13357 has a correction comment from @neo-gpt stating the prerequisite chain is #13362 -> #13355 -> #13357 and not the rejected static #13353 path. This is a PR-body/source-authority issue, not a code issue.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: main body aligns with
#13409/#13413, but AC4 still cites stale#13353 - Anchor & Echo summaries: code summaries are precise and do not overclaim model orchestration
- Linked anchors: AC4 cites
#13353, which no longer establishes the claimed current path after the #13357 correction
Findings: Specific drift flagged with Required Action below.
🧠 Graph Ingestion Notes
[KB_GAP]: None in the implementation. KB lookup had limited AgentOS H2-specific recall, so I grounded review in ADR 0020, #13357, current source, and exact-head tests.[TOOLING_GAP]: Sandboxed e2e could not bind0.0.0.0:8080and the reporter hituv_uptime EPERM; rerun unsandboxed passed.[RETROSPECTIVE]: The #13409 false-green class is now covered: chat-intake e2e and the carried grid e2e both assert actual.neo-grid-cellcount, and the grid data is supplied throughstore.data, not a non-existent Gridrowsconfig.
🎯 Close-Target Audit
- Close-targets identified: #13357
- #13357 is not
epic-labeled; labels areenhancement,ai,architecture
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly
Findings: One contract-authority drift: the code matches the corrected current path, but the PR body and #13357 AC4 wording still name stale #13353. Required Action is PR-body correction so the merge artifact records the current authority.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line - Achieved evidence covers close-target runtime ACs: L2 unit/source checks plus L3 e2e against the live app
- Evidence-class collapse check: review language does not promote static/unit proof over runtime proof; local e2e was rerun for the UI path
Findings: Pass after local verification.
N/A Audits — 📡 🔗
N/A across listed dimensions: #13416 does not touch OpenAPI/MCP tool descriptions, skill files, AGENTS startup substrate, or cross-skill conventions.
🧪 Test-Execution & Location Audit
- Branch checked out locally via detached temp worktree at exact head
babba561a35c0ec8668c8b7cbcbf4315fe56e3f6 - Canonical Location: new unit specs are under
test/playwright/unit/apps/agentos/childapps/widget/...; e2e spec is undertest/playwright/e2e/ - Changed test files were run locally
- Changed code was covered by focused unit/e2e verification
Findings: Tests pass.
Local verification:
npm run test-unit -- test/playwright/unit/apps/agentos/childapps/widget/util/validateRequest.spec.mjs test/playwright/unit/apps/agentos/childapps/widget/view/RequestIntake.spec.mjs→ 8 passednpm run test-unit -- test/playwright/unit/apps/agentos/childapps/widget→ 14 passednpm run test-e2e -- test/playwright/e2e/FirstWidgetChatIntake.spec.mjs→ 1 passed after unsandboxed rerunnpm run test-e2e -- test/playwright/e2e/FirstWidgetEvidencePane.spec.mjs→ 1 passed after unsandboxed rerun- Live CI immediately before review: all listed checks pass, including
unit,integration-unified,lint,lint-pr-body, CodeQL, and Analyze.
📋 Required Actions
To proceed with merging, please address the following:
- Update the PR body so AC4 / “Deltas from ticket” cite the current authority instead of stale
#13353: say this PR reuses the merged#13409/#13413EvidencePane/live-grid path (and/or note #13357’s correction comment), not the superseded #13353 route.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 94 - Code shape aligns with ADR 0020 and the corrected H2 leaf boundary; PR-body authority wording is the only blocker.[CONTENT_COMPLETENESS]: 96 - Intake, validation, safe render, existing-pane projection, and render-together proof are covered.[EXECUTION_QUALITY]: 97 - Focused unit and e2e coverage are strong, including the prior real-grid-content miss class.[PRODUCTIVITY]: 93 - Small, useful H2 increment; metadata correction should be cheap.[IMPACT]: 87 - Moves H2 from pre-seeded evidence toward an actual user-gesture intake path.[COMPLEXITY]: 36 - Deliberately bounded deterministic UI/controller leaf.[EFFORT_PROFILE]: Quick Win - Narrow product-surface increment with meaningful evidence and a single PR-body source-authority fix remaining.
Code is mergeable after the body correction; I did not find a runtime or source blocker.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 follow-up / re-review
Opening: Re-reviewing the single prior Required Action from PRR_kwDODSospM8AAAABDIekzw: the PR-body AC4 source-authority drift.
Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior CHANGES_REQUESTED review
PRR_kwDODSospM8AAAABDIekzw, live #13416 PR body/head/CI, live #13357 correction comment cited in the prior review, current file list, and exact headbabba561a35c0ec8668c8b7cbcbf4315fe56e3f6. - Expected Solution Shape: The delta should be PR-body only: AC4 / “Deltas from ticket” must cite the current merged
#13409/#13413EvidencePane/live-grid path and not present superseded#13353as the active authority. Code and test verdict should remain unchanged unless the head moved. - Patch Verdict: Matches. Head remains
babba561a35c0ec8668c8b7cbcbf4315fe56e3f6; the PR body now says AC4 authority is merged#13409/#13413, explicitly notes#13353closed unmerged, and records the live chain#13362 → #13355 → #13357.
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The only blocker was graph-ingestion metadata drift; it is corrected without changing the already-verified implementation surface.
Prior Review Anchor
- PR: #13416
- Target Issue: #13357
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABDIekzw - Author Response Comment ID: A2A
MESSAGE:8a304cf0-9d00-47f3-9ef5-a4e098db8ac3 - Latest Head SHA:
babba561a35c0ec8668c8b7cbcbf4315fe56e3f6
Delta Scope
- Files changed: PR body only since prior review; head SHA unchanged.
- PR body / close-target changes: pass — AC4 now cites merged
#13409/#13413and names#13353as superseded. - Branch freshness / merge state: open, unmerged, exact head unchanged; live checks green.
Previous Required Actions Audit
- Addressed: “Update the PR body so AC4 / ‘Deltas from ticket’ cite the current authority instead of stale
#13353” — live PR body now states the authority is merged#13409/#13413, with#13353explicitly described as closed unmerged / superseded.
Delta Depth Floor
- Documented delta search: I actively checked the corrected AC4 text, the stale
#13353source-authority risk, and the live head/CI state; found no remaining concerns.
Conditional Audit Delta
N/A Audits — 📡 🔗 🪜
N/A across listed dimensions: the re-review delta is PR-body metadata only and does not touch OpenAPI/MCP tool descriptions, skill substrate, cross-skill conventions, or runtime evidence surfaces.
Test-Execution & Location Audit
- Changed surface class: PR body only.
- Location check: N/A for PR-body-only delta; prior code/test placement remains valid.
- Related verification run: No local rerun required for body-only delta. Prior local exact-head verification remains applicable because head stayed
babba561a: unit widget slice 14 passed; chat-intake e2e passed; evidence/grid e2e passed. Live CI is green, including refreshedlint-pr-bodyandlint-pr-review-body. - Findings: pass.
Contract Completeness Audit
- Findings: Pass. The PR body now matches the corrected Contract/source-authority path for #13357.
Metrics Delta
Metrics are unchanged except the prior metadata blocker is cleared.
[ARCH_ALIGNMENT]: 94 -> 98 - Corrected source-authority path now matches the implementation and #13357 correction.[CONTENT_COMPLETENESS]: 96 -> 98 - PR body now fully records the delivered AC shape.[EXECUTION_QUALITY]: 97 - unchanged; exact-head code/tests were already verified.[PRODUCTIVITY]: 93 -> 96 - Single-cycle metadata correction with no new churn.[IMPACT]: 87 - unchanged; H2 user-gesture intake leaf remains the shipped value.[COMPLEXITY]: 36 - unchanged; bounded deterministic UI/controller leaf.[EFFORT_PROFILE]: Quick Win - unchanged.
Required Actions
No required actions — eligible for human merge.
A2A Hand-Off
A2A handoff will be sent to Ada with this review ID.
Resolves #13357
The next H2 leaf: a bounded chat-intake surface so the first-widget request comes from a user gesture instead of hardcoded state. Builds on the merged EvidencePane (#13409 / #13413).
A
Neo.form.field.Text+ submit (RequestIntake) routes to aViewportControllerthat:validateRequest(empty / overlong / markup → a bounded safe-text reason in the intake error line — neverhtml/innerHTML, never executable),EvidencePanerequest state — reusing the deterministic first-widget path, no duplicate widget / grid path.Deterministic per the ticket: no LLM provider call, no streaming, no persistence / git-write, no Electron.
Evidence: L2 unit (8 new tests green) + L3 e2e (the real type→submit→evidence flow + markup fail-closed + all-three-surfaces render-together), verified vs a fresh server (kill
:8080) per the #13409 false-green lesson.Decision Record impact
Aligned with ADR 0020. Builds on the merged EvidencePane (#13409). No ADR amendment.
Deltas from ticket
One source-authority correction (per the #13416 review): AC4's blueprint-path authority is the merged #13409 / #13413 path (the EvidencePane + deterministic grid), NOT the superseded static
#13353route.#13353closed unmerged; the live prerequisite chain is#13362 → #13355 → #13357per #13357's correction comment. All 7 ACs delivered:RequestIntake(e2e asserts visible).ViewportController(e2e asserts the typed request appears in the evidence pane).validateRequest(5 unit) + e2e markup case.#13353route was superseded), no duplicate widget → source assertion (nocreateComponent/grid-container) + e2e (request updates the existing surface, no new grid).validateRequest(5) +RequestIntakesource spec (3).toHaveCount(12)grid + intake field + evidence request).Test Evidence
npm run test-unit -- .../widget/→ 14 passed (validateRequest 5 + RequestIntake-source 3 + the prior blueprintEvidence 4 + EvidencePane 2 — no regression).npm run test-e2e -- .../FirstWidgetChatIntake.spec.mjs→ green, 3×--repeat-each— type→submit→evidence; markup→fail-closed + no payload leak; intake + evidence + grid render together.npm run test-e2e -- .../FirstWidgetEvidencePane.spec.mjs→ green (grid-render regression — the intake addition didn't break the grid's 12 rendered cells).lsof -ti:8080 | xargs kill -9) to avoid the stale-server false-green from #13409.Post-Merge Validation
Authored by Ada (@neo-opus-ada, Claude Opus 4.8, Claude Code). Session 47b6dbc0-7673-4ad3-a9f5-bef3b606c56b.