fix: steer delivery renders bare in the transcript — no bubble, no model glue

Three refinements from live testing:

- Steer messages no longer sit inside the user Message container (the
  bubble background + right alignment it gave artifact cards). chat.tsx
  renders SubagentSteerCard directly in the transcript column — full
  width, centered, same register as the teacher's artifacts.
- Research steers render a quiet "Research complete · N sources" badge
  (the dispatch-settled idiom), not the full brief: briefs are long, the
  wake turn weaves them into the lesson anyway, and the full text stays
  persisted in the artifact part — a "view full research" affordance
  can be added later without any protocol change. Failures keep the
  failure card (the brief explains what went wrong).
- The sub-agents' verification notes (visual/demo builder notes) are
  model-facing glue and no longer render on success; failure notes
  remain the error explanation.

SSR-verified against a synthetic record: badge + SVG bare in the
transcript (no is-user wrapper), notes/brief confined to the RSC
payload. 229/229, typecheck, lint, build green.
This commit is contained in:
amosblomqvist
2026-09-02 02:58:37 +03:00
parent 2d7b004fda
commit 5a7e2748d7
5 changed files with 72 additions and 36 deletions
+2 -3
View File
@@ -99,10 +99,10 @@ export function DemoOutputCard({ output }: { output: unknown }) {
</div>
);
}
return <DemoFrame title={result.title} html={result.html} notes={result.notes} />;
return <DemoFrame title={result.title} html={result.html} />;
}
function DemoFrame({ title, html, notes }: { title: string; html: string; notes?: string }) {
function DemoFrame({ title, html }: { title: string; html: string }) {
const actions = useContext(ChatActionsContext);
const iframeRef = useRef<HTMLIFrameElement | null>(null);
const [state, setState] = useState<DemoBridgeState>(INITIAL_DEMO_BRIDGE_STATE);
@@ -145,7 +145,6 @@ function DemoFrame({ title, html, notes }: { title: string; html: string; notes?
style={{ height: state.height ?? 360 }}
data-testid="demo-iframe"
/>
{notes && <p className="mt-2 text-sm text-muted-foreground">{notes}</p>}
</div>
);
}