Auto placement floated the new docks to the top of the main pane; every
dock now owns an explicit grid row (and the layout regression guards
them). Live tool rows use the streamed kind verb like persisted rows,
and the approval card's fallback reject is omitted when the request
already carries a reject option.
Prompts submitted while a turn runs queue above the composer (edit,
remove, auto-send on completion; interruption or a failure pauses the
queue with an explicit resume). Permission requests and elicitations
route from the ACP client in main to renderer cards with the request
options — pending cards replay when the renderer reloads, replacing
the blocking OS dialogs. The task plan docks above the composer instead
of scrolling inside the thread, multi-line user bubbles trim their
padding lines, and a turn that ends abnormally shows an inline error
line in the transcript.
todo/write events fold into plan targets: the chat transcript and
trajectory show a checklist card (done counts, active item), and live
ACP plan updates render the same card while the turn streams — the
task list was previously invisible on both paths. Tool rows label
themselves with the streamed ACP kind verb (read/edit/search/run…)
instead of a generic noun, and touched-file locations open in the OS
editor from the expanded row.
Turn completion no longer force-scrolls the conversation: only a
session switch snaps to the bottom, so finishing a turn does not yank
the view while the user reads. ACP streams richer tool titles (for
example a workflow run's description) than the persisted tool/call
name; remember them per call id and keep rendering them in chat and
trajectory after the persisted trace replaces the live turn.
Develop stays read-first: each artifact whose source is a repository
path gains an Open in editor action routed through a path-validated
main-process handler (shell.openPath), instead of an in-app write path.
Persona and prompt-assembly sources open the governing cordis.yml or
source file directly.
Every sidebar section now shares the same horizontal inset, so the
primary action, module nav, search field, and session rows start and
end on identical lines with one control height and one radius. Topbar
controls share one row height, and the round send-button style no
longer leaks onto the cancel button.
Adopt initiator-derived private loop and session plumbing while preserving post-step recovery and balanced synthetic tool-call results after cancellation.
Keep the architecture map within its existing budget while documenting ambient Agent ownership and explicit cross-boundary identities.
Combine agent initiator scoping and exact Cordis JSDoc inspection with post-step compaction and bounded request recovery.
Regenerate the Cordis and website API catalogs, and classify the recovery and compaction types required by the current catalog link-coverage gate.
Replace the process-wide adapter-failure WeakSet with a per-call scope bound to the exact AsyncIterable returned by LlmService.stream(). Give every call a unique wrapper so waterfall middleware can reuse an iterable without sharing provenance.
Move agent-loop recovery classification to the model-stream boundary. Only the final adapter behind that exact call can become an agent/request-error; nested llm/stream calls remain ordinary outer middleware failures while preserving the original Error.
Cover nested calls, reused middleware iterables, and end-to-end agent-loop recovery. Update the package and RFC contracts, bilingual pairing record, and generated API and catalog references.