You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| 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) |
22
22
| 11 | Stop mid-stream | 🔴 F3 | stream halts, but a red error banner "BodyStreamBuffer was aborted" presents the user's own stop as a failure |
23
23
| 12 | Regenerate | ✅ | replaced the aborted message; fresh complete response, no artifacts |
24
24
| 13 | Error recovery | ✅ | e2e (pre-verified) |
@@ -41,8 +41,14 @@ User-initiated stop renders a red "BodyStreamBuffer was aborted" error banner: `
41
41
### F4 — json-render binds objects as text — shared render/graph issue (medium, NOT AG-UI-specific)
42
42
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.
43
43
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.
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
58
64
-**F6 ✅ (main source)** — markdown children/table rows now track by `$index`; zero NG0956 during text/reasoning streaming.
59
65
-**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.
60
66
-**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 chatsubagent 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`.
62
68
63
69
Additional follow-ups logged during Phase 3:
64
70
- 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