Repository navigation
Agent narration is hidden inside collapsible tool group after same-run grouping #1615
Description
Summary
In an existing split session, remote tool calls and results succeed, but ordinary assistant narration is rendered inside the purple tools (...) collapsible group. Collapsing tools hides conversation prose. In the new screenshot, the group's ⓘ inspector control and # usage-inspect control also appear as isolated icons above and below the tool group rather than on its visible summary/header. These are two symptoms of the same grouped-run projection/chrome regression, seen during a live run and after history reload; neither establishes a remote transport failure or SDK event reordering. #1611 has separate release acceptance. This issue owns the group chrome regression; #1617 owns the independently unproven system-notification ordering.
Root Cause
features/Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlModels.cs:956-1008 (ChatMessageHtmlTransformer.ClassifyAndInsert) considers any assistant message with AssistantRunId for grouping: isToolCall || groupablePredecessor?.Group is not null, then existingGroup.AppendItem(slot.Model) even when isToolCall is false. FindGroupablePredecessor (:1367-1405) crosses same-run assistant text to find an earlier group. ToolCallGroupHtmlModel.AppendItem (:553-575) appends model.BuildGroupedMemberHtml() to ToolGroupBodyId; that builder (:222-230) includes ordinary text bindings. Thus the tool group owns the narration as well as its calls/results. Mixed TextContent + FunctionCallContent in one assistant message also qualifies via IsRunToolCallItem (:1330-1333).
The reload path repeats this in BuildHistoryRenderPlan pass 3 (:2143-2240), assigning same-run assistant text to slots[i].Group; GenerateHistoryChunk (:2290-2330) concatenates every member's BuildGroupedMemberHtml() into the tool body. ChatOutputHtmlRenderer.RenderToolCallGroup (features/Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlRenderer.cs:88-130) wraps the body in <details class="chat-content chat-tool-group">. Opening it for a run does not prevent prose from disappearing when a user collapses tools. ReconcileRoleHeaders (ChatOutputHtmlModels.cs:1439-1482, history pass 4 :2242-2277) suppresses redundant assistant headers; matched result-only messages are intentionally injected beneath their call and need not become independent rows.
Diagnosed group chrome: ToolCallGroupHtmlModel.SuppressRoleHeader defaults to true (ChatOutputHtmlModels.cs:460-490), and ReconcileRoleHeaders sets it to true for grouped runs (:1450-1473). RenderToolCallGroup (ChatOutputHtmlRenderer.cs:95-129) renders <div class="chat-message"> containing a hidden .chat-header and a .chat-contents whose child is <details class="chat-tool-group">. In features/Phantom.Workspaces.Agent.Gui/Assets/chat-output-shell.html:674-716, InspectGutter.reconcile chooses header.hidden ? message.querySelector(':scope > .chat-contents') : meta, inserting ⓘ at host.firstChild. At :751-795, UsageInspectGutter.reconcile chooses the same fallback host and appends #. With the hidden role header, they become sibling nodes before and after the tool <details>, respectively, instead of controls on the tool group's visible header/summary. The screenshot matches these placements. The ⓘ comes from the inspect marker and # from the usage marker; neither is evidence about notification order. Do not infer the spinner's DOM origin from this diagnosis.
Existing features/Phantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlModelTests.cs:2898-2960 check one group, text presence, string encounter order and open (including mixed text/call messages), not that prose lies outside <details> or that controls belong to the group header. ChatOutputHtmlStructuralInvariantsTests.cs:90-110 likewise asserts working occurs in combined HTML, not its DOM position. Legacy no-run-id grouping at ChatOutputHtmlModelTests.cs:2873-2896 expects two sibling groups around visible text; preserve this behavior.
Affected Files
| File | Responsibility |
|---|---|
features/Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlModels.cs |
Classify live slots, project same-run calls versus prose, append/rebuild groups, bulk/chunk planning, role-header suppression, result injection and marker ownership. |
features/Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlRenderer.cs |
Tool summary/body shell, assistant prose rendering, visible group chrome and collapse boundaries. |
features/Phantom.Workspaces.Agent.Gui/Assets/chat-output-shell.html |
InspectGutter and UsageInspectGutter host selection, controls, target reconciliation and group interaction; if needed, run-level collapse controller. |
features/Phantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlModelTests.cs, ChatOutputHtmlStructuralInvariantsTests.cs, ChatOutputHtmlRendererTests.cs |
Live/reload DOM, renderer and interaction regressions, including inspect/usage gutter host behavior. |
Design / Fix
Keep one stable, logical collapsible tool-call group per assistant run, collecting calls/results by call ID and preserving ordered occurrence and stable identity across running → history, reload and chunk boundaries. Do not equate run membership with DOM membership inside tool <details>. Project an ordered timeline of tool-only entries and normal assistant prose. Before/between/after narration must be readable outside collapsed tool segments; split mixed text + call messages at binding boundaries while preserving chronological content order and inspect/diff/usage IDs. A matched result-only message can stay under its call.
Give the logical group visible, accessible chrome for its ⓘ and # actions even when the outer assistant role header is suppressed. Update the renderer/group projection and both shell gutter reconcilers together: anchor controls in a stable visible group action area associated with its summary/header (or equivalent non-nested sibling action region), not as free-standing children before/after <details> and not as interactive buttons nested inside a native <summary> button-like interaction. Controls must remain keyboard-accessible, have appropriate names, retain click/pointer semantics (clicking an inspect/usage control must not expand/collapse tools), and resolve the correct target within the correct group when there are multiple calls/results or groups. Reconciliation after live mutation, header changes, collapse, promotion and reload must not duplicate controls, lose target bindings or create duplicate DOM IDs. Preserve genuine role labels, tool names and results while removing blank role placeholders.
Considered / background — native <details> constraint: A single contiguous native <details> containing every call cannot also leave interleaved narration outside it in strict DOM order. Use one stable run-level collapse identity/summary controlling tool-only segments interleaved as siblings with normal prose (or equivalent accessible timeline). Do not merely open the whole run by default or move between-call prose after all tools. Honor user/different-run boundaries and persist expanded state. The legacy no-run-id grouping around text remains separate.
Conceptual projection:
foreach (var binding in run.BindingsInEncounterOrder)
timeline.Add(binding is FunctionCallContent or FunctionResultContent
? ToolSegmentForRun(run.Id, binding)
: AssistantProseSegment(binding)); // sibling, never in collapsed tool body
// One group identity/summary controls only ToolSegmentForRun nodes;
// its visible action area hosts inspect and usage actions for that group.Expected Tests
| Test Name | Class | What It Verifies |
|---|---|---|
ChatOutput_CompletedTurnWithInterleavedAssistantContent_KeepsProseOutsideCollapsedTools |
ChatOutputHtmlModelTests |
DOM-scoped assertions: one logical summary, before/between/after prose outside collapsed tool segments, calls in order. |
ChatOutput_SameRunMixedContent_SplitsTextAndCallsWithoutLosingOrder |
ChatOutputHtmlModelTests |
Mixed text/call bindings remain separately inspectable with prose outside collapse. |
ChatOutput_GroupWithSuppressedRoleHeader_PlacesInspectAndUsageOnVisibleGroupChrome |
ChatOutputHtmlRendererTests (with shell gutter interaction coverage) |
Hidden outer role header still yields a visible group action area; ⓘ and # are attached there, not before/after <details> as standalone siblings; both actions invoke their intended targets and do not toggle collapse. |
ChatOutput_MultipleCallsAndGroups_InspectAndUsageResolveCorrectTargets |
ChatOutputHtmlStructuralInvariantsTests (with shell gutter interaction coverage) |
Controls bind to their own group/marker even with multiple calls/results, unique IDs and no duplicated or stale controls after mutation. |
ChatOutput_SameRunPromotedAcrossHistoryAndRunning_PreservesOneToolGroupAndProse |
ChatOutputHtmlStructuralInvariantsTests |
Live promotion preserves ordered narration, one group identity, collapse state, all calls/results and bound inspect/usage actions. |
ChatOutput_HistoryReloadAfterCompletedRun_MatchesVisibleProseAndToolOrder |
ChatOutputHtmlStructuralInvariantsTests |
Bulk reload matches live DOM structure, action placement and targets, not only string presence. |
ChatOutput_RunAcrossHistoryChunkBoundary_PreservesOneGroupAndProseOrder |
ChatOutputHtmlModelTests |
Explicit run crossing a chunk cut has no split/duplicate group, misplaced prose or orphan controls. |
ChatOutput_ResultOnlyAndDistinctRunOrUserBoundary_DoesNotCreateEmptyHeadersOrMergeRuns |
ChatOutputHtmlModelTests |
Matched result stays with call; visible role and group chrome remain correct across run/user boundaries. |
Activity
JoshuaRowePhantom commentedon Oct 7, 2026
Design
Root cause: same-run grouping swallows prose into tool details and hidden headers strand inspect and usage controls. Segment at visible narration/system boundaries, split mixed-content bindings into ordered tool-only segments and prose, and anchor accessible controls beside tool summary; validate live/reload and browser-hosted interactions. Reject merely opening details because collapsed prose must remain visible. Files: ChatOutputHtmlModels.cs, ChatOutputHtmlRenderer.cs, chat-output-shell.html and tests.
JoshuaRowePhantom commentedon Oct 7, 2026
Implementation notes
Commits: 1b7bf23cd629dfaa43433af891940885eb77bae9
Deviations from proposed design
The logical run is represented by linked, chronological tool-only segments with one browser-visible summary and shared collapse state, rather than one noncontiguous native details node. Mixed-content call bindings receive their own segment; prose remains outside all collapsible tool bodies.
Scope changes
None. Inspector/usage actions are keyboard-accessible sibling controls, not buttons inside the summary.
Files changed
Phantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlModelTests.csPhantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlRendererTests.csPhantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlStructuralInvariantsTests.csPhantom.Workspaces.Agent.Gui.WebViewTests/ChatOutputBrowserIntegrationTests.csPhantom.Workspaces.Agent.Gui/Assets/chat-output-shell.htmlPhantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlModels.csPhantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlRenderer.csPhantom.Workspaces.Llm.Core.Tests/CopilotSdkStreamAdapterTests.csJoshuaRowePhantom commentedon Oct 7, 2026
Verification result
Status: ❌ 2 issue(s) found
Commits checked:
1b7bf23cagainstfeatures(a5caab80), worktree 9. No source changes made.Outstanding gaps
ChatMessageHtmlModel.Renderpre-scans every result in a mixed message, claims any result matching a preceding call, renders that result inside the earlier tool segment, and skips its original binding (ChatOutputHtmlModels.cs, ~255–365). For contents[FunctionCall(c1), TextContent("between"), FunctionResult(c1)], the result appears before the prose in both live and reload; the new mixed-content regression includes calls/text but no later result. Preserve the encounter order at binding boundaries while retaining call/result identity.RenderInlineToolSegmentadds an actions host to each tool segment, butInspectGutter.reconcileandUsageInspectGutter.reconcilecreate just one button per.chat-messageand select the first inline host (chat-output-shell.html, ~765–873). For two separated calls in one mixed assistant message, the second segment's action host stays empty and its own call/result/usage cannot be selected through the visible group chrome. The real WebView interaction test only inserts separate one-call message-level groups, not two segments in one message; add actual multi-binding target and mutation/reload coverage.Tests
Approved
scripts/run-tests.ps1 -Mode fast -TestNames ChatOutputHtmlModelTests,ChatOutputHtmlStructuralInvariantsTests,ChatOutputHtmlRendererTests,CopilotSdkStreamAdapterTests,ChatOutputBrowserIntegrationTests: 405 executed, 405 passed, 0 failed, 0 skipped (GUI 302, real native WebView 52, SDK 51). Passing current tests do not cover the two cases above. No filesystem/Git layer changed; no slow-suite label required.verified-locallynot applied.JoshuaRowePhantom commentedon Oct 7, 2026
Implementation notes (verification follow-up) Commits: 1b7bf23cd629dfaa43433af891940885eb77bae9, e55e7bbdd65e100c87c746a0cf0fe68bf09cdcce The follow-up keeps call -> narration -> result in encounter order for both mixed-content messages and separately emitted result messages. Result-only messages now remain standalone when narration or a notification intervenes, while grouped tool-only calls retain their call-ID result correlation. Every inline tool segment has its own inspect and usage actions, bound to its own call/result/usage payload even after DOM mutation or reload; their accessible labels identify the target. Files changed in follow-up:
Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlModels.cs,Phantom.Workspaces.Agent.Gui/Assets/chat-output-shell.html,Phantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlModelTests.cs,Phantom.Workspaces.Agent.Gui.WebViewTests/ChatOutputBrowserIntegrationTests.cs,Phantom.Workspaces.Llm.Core.Tests/RemoteAgentChatNotificationPipelineTests.cs. Deviation/scope: Existing cross-chunk tests expecting results to jump ahead of intervening user narration were updated to assert chronological standalone results instead. Added synthetic remote-stream and native browser regressions shared with #1617. The 456-test targeted union, including native WebView tests, passes; scripted ten-pass stability passed (456/456 in each of 10 runs). No push or issue closure.JoshuaRowePhantom commentedon Oct 7, 2026
Verification result
Status: ❌ 2 issue(s) found
Commits checked:
1b7bf23c,e55e7bbdagainstfeatures(a5caab80), worktree 9.Resolved from prior verification
HasAdjacentCallForResultavoids claiming a nonadjacent result;HasInterveningVisibleContentalso prevents moving a separate result ahead of visible narration. The new model tests exercise both cases.Outstanding gaps
IsGroupingTransparentinChatOutputHtmlModels.csreturns true for every result-only slot, even whenHasDomElementis true becauseTryInjectResultsfound no matching call. For same-run[call(c1), result(unknown), call(c2)],FindGroupablePredecessor(and bulk pass 3) skips the visible result and appends c2 into c1's earlier group; the DOM becomes c1 → c2 → result instead of source order. Only suppressed/injected result slots may be crossed. Add live/reload DOM regression for unmatched result boundaries.reconcileRunhides every summary except the first and marks later details.chat-tool-group-secondary; CSS hides theirsummary[hidden]but leaves the new.chat-tool-group-actionsabsolutely positioned attop: 0of each open secondary.chat-tool-segment. Thus the second segment's ⓘ/#controls float above its tool body with no visible adjacent summary/header; on collapse that secondary host is hidden entirely. The mixed-message WebView test checks host/button counts and clicks only with the run open, not visible anchoring or keyboard reachability after collapsing. Associate actions with the visible logical summary (and preserve access to distinct targets), then assert browser layout/accessibility in both states.Tests
Approved targeted runs: GUI/model/renderer/SDK/native WebView selector 409 passed, 0 failed (includes 54 real WebView tests); actual
RemoteAgentChatTestsclass run 47 passed, 0 failed, including the added SDK/remote pipeline case. Total 456 passed, 0 failed, in two invocations. No source changes, filesystem/Git layers, or slow-suite label required.verified-locallywithheld.JoshuaRowePhantom commentedon Oct 7, 2026
Design (verification follow-up 2)
A visible unmatched tool-result message must end tool-call grouping in both incremental and bulk render paths; only DOM-suppressed slots are transparent. Add model and native WebView live/reload order regressions for call → unmatched result → call. For mixed-message tool segments, put all segment-targeted inspect/usage buttons alongside the one visible run summary, including when collapsed; preserve each target payload, keyboard reachability and mutation/reload behavior. Change the shared model/grouping logic, browser shell gutter reconciler, and matching GUI/native WebView tests.
JoshuaRowePhantom commentedon Oct 7, 2026
Implementation notes (verification follow-up 3)
Commits:
1b7bf23cd629dfaa43433af891940885eb77bae9,e55e7bbdd65e100c87c746a0cf0fe68bf09cdcce,bf82eb9d58a8bd6a2777efd51006a19dbbb50511A standalone unmatched tool result now ends tool-call grouping in both the live transformer and bulk history plan; suppressed/injected results alone remain transparent. Native WebView tests assert call → unmatched result → next call DOM order before and after reload. Every mixed-content segment's inspect/result/usage actions are hosted by the one visible run summary, with per-target payloads, keyboard focus, in-flow wrapping layout and access while collapsed. Mutation/reload tests check no duplicate actions.
Follow-up files:
Phantom.Workspaces.Agent.Gui/ViewModels/DocumentModels/ChatOutputHtmlModels.cs,Phantom.Workspaces.Agent.Gui/Assets/chat-output-shell.html,Phantom.Workspaces.Agent.Gui.Tests/ChatOutputHtmlTransformerLookupTests.cs,Phantom.Workspaces.Agent.Gui.WebViewTests/ChatOutputBrowserIntegrationTests.cs, plus the remote subagent display projection (AgentViewModel.cs,RunningSubAgentDisplay.cs) shared with #1617.Deviation/scope: Remote snapshots revealed a UI panel forwarding defect; remote display projection and collection-reset cleanup were added to cover the actual browser input. Full solution build and 479 targeted tests pass, including 57 native browser tests; the scripted ten-run targeted stability check passed (479 tests in runs 1-9; run 10 completed successfully while an overlapping targeted invocation shared its summary log). No push, closure or release.
JoshuaRowePhantom commentedon Oct 8, 2026
Verification result
Status: ❌ 1 issue(s) found
Commits checked:
1b7bf23c,e55e7bbd,bf82eb9dagainstfeatures(a5caab80), worktree 9.Prior gaps now addressed
A visible unmatched result now terminates grouping (
IsGroupingTransparentcrosses only invisible slots); the lookup test and native WebView live/reload test establish call → unmatched result → next call DOM order. Mixed-message second-segment inspect/result/usage buttons now move to an in-flow action area beside the run's sole visible summary, remain focusable and clickable when collapsed, and retain bindings after mutation/reload.Outstanding gaps
InlineToolSegmentGutter.reconcilereturns immediately for a.chat-messagewithout direct.chat-tool-segmentchildren. For same-runcall-only(c1) → visible narration/system → call-only(c2)the twoToolCallGroupHtmlModelwrappers are separate details, butreconcileRunhides the second summary. ItsInspectGutteraction remains in its own absolutely positioned.chat-contents > .chat-tool-group-actionsinstead of moving beside the first visible summary; the CSS hides that action entirely when the second details collapses.groups.slice(1)even removes those buttons on reconciliation without relocating message-level targets. Thus c2 cannot be inspected from the one visible group chrome while collapsed. The new keyboard/layout test covers only two inline segments inside one mixed message, not two message-level segments. Add a native browser live/reload/collapse/keyboard test for distinct message-level segments, and move their correctly bound actions to stable visible chrome without duplicating IDs.Tests
Approved
scripts/run-tests.ps1 -Mode fast -TestNames ChatOutputHtmlModelTests,ChatOutputHtmlStructuralInvariantsTests,ChatOutputHtmlRendererTests,ChatOutputHtmlTransformerLookupTests,CopilotSdkStreamAdapterTests,ChatOutputBrowserIntegrationTests,RemoteAgentChatTests,AgentViewModelSubAgentBrowserTests,AgentViewModelTests: 616 executed, 616 passed, 0 failed including 57 native WebView tests and 98 Llm.Core tests. No filesystem/Git layer changed; no slow-suite label. Worktree clean; no source edits or push.verified-locallywithheld.JoshuaRowePhantom commentedon Oct 8, 2026
Design (verification follow-up 4)
The latest verification identifies message-level groups as the missing case: the inline-only gutter returns before routing their controls and the run reconciler removes later controls. Add a failing real WebView regression with two distinct same-run call-only messages separated by prose, each with its own inspect and usage payload; assert visible summary chrome and keyboard reachability open/closed, correct targets, live mutation, history reload, and unique IDs. Extend shared run-level gutter reconciliation to handle both direct inline segments and message-level group wrappers, route each target action to the first visible run action host, and retire obsolete buttons without duplicating IDs. Remove the later-group button deletion; keep actions outside native summary. Leaving controls in secondary hosts is rejected because collapsed groups hide them. Files: chat-output-shell.html and ChatOutputBrowserIntegrationTests.cs. #1617 event-order evidence remains out of scope.
JoshuaRowePhantom commentedon Oct 8, 2026
Implementation notes (verification follow-up 4)
Commit:
e4dc73b19bf7b5cced461e9338438be63c5b6288(extends earlier #1615 commits; no push or issue closure).The run action reconciler now handles both inline mixed-message segments and distinct message-level tool groups. Each group's inspect and usage actions are routed to the first visible run summary chrome, remain keyboard-focusable when all segments are collapsed, and retain their own content IDs and payloads. Obsolete routed buttons are removed during mutation rather than deleting later group actions; duplicate DOM IDs are checked.
Red-first native regression: two distinct same-run tool-call messages separated by narration, with separate inspect/usage targets; checks expanded/collapsed geometry, keyboard focus/click routing, per-target payload, second-message mutation, reload with preserved collapse state and unique IDs.
Files:
Phantom.Workspaces.Agent.Gui/Assets/chat-output-shell.html;Phantom.Workspaces.Agent.Gui.WebViewTests/ChatOutputBrowserIntegrationTests.cs.Validation:
dotnet build --no-incrementalsucceeded (0 warnings);scripts/run-tests.ps1 -Mode fast -TestNames ChatOutputBrowserIntegrationTests -NoBuildpassed 58/58 native WebView tests; exclusivescripts/run-tests-stability.ps1 -WorktreePath C:\dev\Phantom.Workspaces-Skills\worktrees\9 -TestNames ChatOutputBrowserIntegrationTests -Runs 10 -NoBuildpassed 58/58 in each of 10 runs.Acceptance boundary: #1617 still requires external real-incident SDK event-order capture; this change does not establish that evidence and does not change #1617. No other acceptance gaps identified within the tested #1615 chrome follow-up.
JoshuaRowePhantom commentedon Oct 8, 2026
Verification result
Status: ✅ Verified locally
Commits checked:
1b7bf23c,e55e7bbd,bf82eb9d,e4dc73b1againstfeatures(a5caab80), worktree 9.Outstanding gaps
None — all #1615 criteria satisfied.
The final change routes separate message-level groups in the same run, as well as inline segments, to the first visible run action host. The native browser regression creates two tool-call messages separated by ordinary narration, verifies both inspect and usage targets/IDs on visible, named, keyboard-focusable chrome while expanded and collapsed, activates all four distinct targets without toggling collapse, replaces the second message and rechecks routing, then reloads history with the collapse state and unique IDs intact. Existing mixed-message and unmatched-result regressions retain chronological visible prose/results and per-segment actions through mutation and reload. The controls are outside native summary and the collapsed tool body; no source-code gap remains for this issue.
Tests
Approved
scripts/run-tests.ps1 -Mode fast -NoBuild -TestNames ChatOutputHtmlModelTests,ChatOutputHtmlStructuralInvariantsTests,ChatOutputHtmlRendererTests,ChatOutputHtmlTransformerLookupTests,CopilotSdkStreamAdapterTests,ChatOutputBrowserIntegrationTests,RemoteAgentChatTests: 480 executed, 480 passed, 0 failed, including 58 real native WebView tests and 98 Llm.Core tests. No filesystem/Git repository-layer changes; no slow-suite label. Worktree 9 clean; no source edits, push, closure or release.JoshuaRowePhantom commentedon Oct 8, 2026
Full FAST-gate follow-up in worktree 9: commit
82ff70d4501e7480d448ee90047dc4464d801e10(local only; no push/closure). The 7893/7895 failures were two stale source-string assertions, not a JS/DOM defect: one expected the old single-line hidden-header host ternary, while the current implementation first uses visible tool-group action hosts; the other prohibitedpreviousElementSibling, now required to route same-run actions to visible leader chrome. Updated the source contracts to check the actual host/routing/deduplication invariants and extended the native suppressed-header test to click both actions, check distinct inspect payloads and ensure the header remains hidden. No production JS changes. Full solution build: 0 warnings/errors. Targeted runner: 131/131 (including 58 native WebView tests). Scripted stability: 10 consecutive passes, 131/131 each. An initial attempt passed all 131 tests on run 10 but exited nonzero because an unrelated install-test prerequisite Release publish exhausted disk; stale generated caches were removed only from worktree 9 before the successful rerun. #1615 acceptance still has no identified source gap; external #1617 SDK event-order capture remains separate.JoshuaRowePhantom commentedon Oct 8, 2026
Verification result
Status: ❌ Verification incomplete — required exclusive focused test run is outstanding.
Commits reviewed:
1b7bf23c,e55e7bbd,bf82eb9d,e4dc73b1,82ff70d4againstfeatures, worktree 9 (clean); no source changes.Findings
The prior full-fast GUI TRX recorded two failures in
AgentChatOutputControlTests(1014 passed, 2 failed): the suppressed-header assertion expected the removed single-line fallback ternary, and the usage assertion disallowedpreviousElementSibling. In the actual shell, the suppressed-header path prioritizes.chat-tool-group-actions, andInlineToolSegmentGutter.reconcilelocates the run's first details and its preceding visible action host, removes misplaced/stale buttons, and reconciles target IDs. The new source assertions reflect those paths rather than merely deleting checks. The expanded nativeChatOutput_SuppressedAssistantHeaderWithInspectTargets_RemainsHiddenAndActionsUsablealso clicks both actions and checks their separate content IDs/payload while the role header stays hidden. Existing native distinct-message regression checks four visible, accessible per-target buttons, collapse, mutation, and reload. No new production change or source gap identified. This test-only commit does not establish #1617's original provider-event order; its external evidence gap remains separate.Outstanding gap
scripts/run-tests.ps1would overlap another runner, contrary to the requested constraint. The previous targetedtest-results.logsays 131 passed, 0 failed (73 GUI + 58 native WebView), but predates this independent verification and is not counted as a fresh result. Re-run approvedscripts/run-tests.ps1 -Mode fast -TestNames AgentChatOutputControlTests,ChatOutputBrowserIntegrationTestswhen the shared runner is free, then post a new result. No newverified-locallylabel action was taken; existing labels were not removed. No filesystem/Git-layer changes require slow tests.JoshuaRowePhantom commentedon Oct 8, 2026
Verification result
Status: ✅ Verified locally — test-only follow-up
82ff70d4against earlier #1615 implementation (e4dc73b1), worktree 9.Outstanding gaps
None for #1615.
The two full-fast
AgentChatOutputControlTestsfailures asserted obsolete shell source strings, not observable behavior. The revised hidden-header assertion checks the visible tool action host and retains the plain.chat-contentsfallback; the revised usage assertion checks first-run leader routing plus stale/duplicate target removal instead of globally prohibitingpreviousElementSibling, which the actual leader lookup now requires. This is not a blanket weakening: the new native WebView test asserts hidden-header inspect and usage clicks reach their distinct content IDs and the usage payload; existing native browser scenarios assert separate-group action placement, keyboard reachability, collapse state, target binding, mutation, reload and unique IDs. Production shell is unchanged by this commit. #1617's original-incident provider event-order capture remains external evidence, not supplied by these test changes.Tests
Waited for the other active runners to finish before starting this invocation. Approved
scripts/run-tests.ps1 -Mode fast -NoBuild -TestNames AgentChatOutputControlTests,ChatOutputBrowserIntegrationTestsfinished 131 executed, 131 passed, 0 failed: 73 Agent GUI control tests and 58 native WebView integration tests, confirmed in fresh TRX results. Test binaries are newer than changed source. No filesystem/Git-layer change; no slow-suite label. Worktree 9 clean; no source edits, push, closure or release.Fix #1615 and #1617: preserve tool-run narration and notification chr…
Fix #1615 and #1617: preserve narration order and test remote WebView…
Fix #1615 and #1617: keep unmatched results ordered and bridge remote…
Fix #1615: route all same-run group actions to visible chrome
Merge verified #1615 renderer integration
Merge synchronized #1615 WebView host assertions
JoshuaRowePhantom commentedon Oct 9, 2026
Checked into features via #1626 (merge 1b86a98). Hosted fast CI 37966216282 passed 8,019/8,019; full CI 37966209695 passed on Windows and Linux. #1617 and #1618 retain their separate acceptance gates.