Skip to content

Commit c1e99da

Browse files
committed
docs(ag-ui): close F5 — inline persistent subagent card (premise refuted; duplicate-mount defect fixed)
1 parent 9f9f84a commit c1e99da

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

docs/superpowers/specs/2026-06-11-ag-ui-capability-findings.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
| 7 | Gen-UI: a2ui || pre-verified |
1919
| 8 | Gen-UI: json-render | ✅ (renders) + 🔶 F4 | interactive dashboard rendered (tabs/sliders/checkboxes); metric values show `[object Object]`**reproduces identically on canonical prod** → shared render/graph issue, not AG-UI |
2020
| 9 | Theme presets + dark/light | ✅ + 🔶 F2 | toggle + URL knobs sync; itinerary panel & mode hosts stay dark in light scheme (example CSS) |
21-
| 10 | Research subagent |(runs) + 🔶 F5 | run completed with structured summary; renders as plain tool row — no subagent card (known adapter gap: no subagent metadata over AG-UI) |
21+
| 10 | Research subagent |+ F5 closed | run completes with structured summary AND renders an inline, persistent `chat-subagent-card` (F5 premise refuted by live smoke; the real defect was a duplicate per-message mount — fixed 2026-06-19) |
2222
| 11 | Stop mid-stream | 🔴 F3 | stream halts, but a red error banner "BodyStreamBuffer was aborted" presents the user's own stop as a failure |
2323
| 12 | Regenerate || replaced the aborted message; fresh complete response, no artifacts |
2424
| 13 | Error recovery || e2e (pre-verified) |
@@ -41,8 +41,14 @@ User-initiated stop renders a red "BodyStreamBuffer was aborted" error banner: `
4141
### F4 — json-render binds objects as text — shared render/graph issue (medium, NOT AG-UI-specific)
4242
Generated dashboard specs render `[object Object]` for metric values and a literal `trending_up` icon name. Reproduces byte-for-byte on `demo.threadplane.ai` (langgraph transport), so the bug is in the json-render engine's value/binding resolution (`@threadplane/render`) and/or the graph's `json_render` spec schema — not the AG-UI adapter. Track as its own fix; both demos benefit.
4343

44-
### F5 — No subagent card over AG-UI — adapter gap (medium, known)
45-
The research delegation runs fine but renders as a generic tool row; the canonical demo shows a `chat-subagent` card. The AG-UI adapter doesn't surface subagent metadata (custom events → subagent sub-contract). Needs design: map the graph's subagent custom events into the chat subagent contract in `toAgent()`.
44+
### F5 — ✅ CLOSED (2026-06-19) — premise refuted; real defect was a duplicate mount
45+
**Original claim:** research delegation renders as a generic tool row, no subagent card (unlike the canonical LangGraph demo).
46+
47+
**Live-LLM smoke refuted this.** The AG-UI adapter DOES surface subagent metadata: `subagentFor` in `libs/ag-ui/.../to-agent.ts` projects `ACTIVITY` events onto `agent.subagents()` keyed by tool-call id (the `text``messages` fallback handles the backend's shape), and `chat-subagent-card` rendered + streamed live (verified by screenshot: a `research` card with a `running` badge and 6.7k streamed chars). The audit's observation was a timing artifact — the card is transient (active-only) and the auditor caught it on one transport's run but not the other.
48+
49+
**The real, transport-agnostic defect:** `<chat-subagents [agent]>` was mounted inside the per-assistant-message `ai` template in the `<chat>` composition but bound the whole agent's `subagents()`, so it re-rendered the same active cards once per assistant message → duplicate cards (and the durable trace after completion was a generic "called task" chip).
50+
51+
**Fix (PR for `2026-06-19-subagent-card-inline-persistent`):** the spawning `task` tool call now renders **as** an inline, persistent `chat-subagent-card` in `chat-tool-calls` (running = expanded/live, done = collapsed summary), replacing the generic chip; the duplicate per-message mount is removed. Keyed on `toolCallId`, so it fixes both transports. Live re-smoke confirmed: 3 subagents → 3 cards, **0 duplicate ticks**, persist + collapse on done, **0 NG0956**, no leftover task chips.
4652

4753
### F6 — NG0956 console warnings during streaming — chat lib perf (low)
4854
Angular warns repeatedly that a tracked `@for` collection (size 1) is re-created per stream chunk (track-by-identity). Cheap fix: stable `track` keys in the streaming message list templates.
@@ -58,7 +64,7 @@ Phase 3 (branch `ag-ui-gap-closure-p3`, plan `2026-06-11-ag-ui-gap-closure-p3.md
5864
- **F6 ✅ (main source)** — markdown children/table rows now track by `$index`; zero NG0956 during text/reasoning streaming.
5965
- **F6 residual ✅ (resolved 2026-06-18)** — the json-render *spec assembly* NG0956 residual is gone. Re-grounded against current main (post #680 render-lifecycle rework + F4 + the markdown `$index` fixes): **every** `@for` in the json-render path — `cockpit/ag-ui/json-render` views, the a2ui catalog, `libs/render` core (`render-element` `track $index`, `render-spec` has no `@for`), and `libs/chat` markdown — now keys on a **primitive** (`$index` / string key / numeric value); the NG0956-prone `track <object>` pattern is absent. Confirmed by a live `cockpit-ag-ui-json-render` e2e run streaming the airline dashboard: **zero NG0956** in the console.
6066
- **No regression guard committed.** An e2e console-guard was prototyped but proven ineffective here: NG0956 only fires when an `@for` collection re-materializes across multiple change-detection cycles, but the aimock fixture replays the spec ~atomically (single `content`), so no `@for` re-evaluates. A negative control — forcing `track [key]` (identity) on the fixture-rendered `container` view — produced **no** NG0956, confirming the e2e harness cannot catch this class of regression. A real guard would need a **component-level** vitest test feeding a render component successive specs (simulating streaming deltas) and asserting no NG0956 across re-materialization. Deferred as optional.
61-
- **F5 **subagent card over AG-UI deferred to Phase 4 (needs design: mapping graph subagent custom events into the chat subagent contract in `toAgent()`).
67+
- **F5 ✅ (closed 2026-06-19)**premise refuted by live smoke (the card already rendered + streamed over AG-UI). The real defect was a transport-agnostic duplicate per-message `<chat-subagents>` mount in the `<chat>` composition. Fixed by rendering the subagent inline + persistent in `chat-tool-calls` (replacing the generic chip) and removing the duplicate mount. See `docs/superpowers/specs/2026-06-19-subagent-card-inline-persistent-design.md`.
6268

6369
Additional follow-ups logged during Phase 3:
6470
- Icon rendering: the a2ui catalog icon component renders icon *names* as text (`trending_up`) — proper icon support is a new catalog feature, not built.

0 commit comments

Comments
 (0)