EPIC: taOS as the harness wrapper - move all agent comms into taOS
Jay, 2026-07-26: all communication with the lead agents moves out of the Claude
app and into taOS. taOStalk becomes the chat surface, Projects becomes the work
surface, and the A2A realtime stream is the transport. The target is using taOS
to build taOS, on stream.
What already exists (verified in code, not assumed)
request_decision agent tool -> DecisionStore -> Decisions app, with
single_select, multi_select, approve_deny, free_text, options
normalised to [{label, value}], priorities, and a notification on raise.
- Decisions app renders and answers those choices today.
- Chat messages already carry
content_blocks (chat/message_store.py).
- A2A realtime stream is live: authenticated SSE proxy, verified end to end.
- taOStalk s1 renderer cards are already on the board (text, thinking,
tool-call, status/question, live badge, connect-session wizard).
The actual gap
Decisions render only in the Decisions app. No chat component renders a
decision, so a question raised by an agent is invisible in the conversation where
it was asked. That is the seam Jay named, and it is the difference between taOS
being a viewer and taOS being the place the work happens.
Design: one decision, two surfaces, one resolution
DecisionStore stays the single source of truth. Chat does NOT get its own
question table. A question raised in chat IS a decision; the chat block is a
view of it, keyed by decision_id.
- A decision block in chat renders the same options as buttons inline.
- Answering from either surface resolves both, live, via the existing broker
so open clients update without a refresh. First answer wins.
- Idempotency is the hard requirement: the same decision is visible in two
places at once, so a second answer must be rejected cleanly (not silently
overwrite, not 500), and both surfaces must show the resolved state with who
answered and when. Assume the user has chat open on a phone and Decisions open
on a desktop, and taps both.
- Nothing is lost when answered elsewhere: a decision answered in the
Decisions app must visibly resolve in the chat thread it came from, in place.
Slices
- W1 decision blocks render inline in chat, read-only first (see it, cannot
answer it) - proves the join without touching write paths.
- W2 answer from chat, with idempotent first-answer-wins and live
propagation to every open surface.
- W3 taOStalk s1 renderers (already carded) so agent output reads correctly:
text, thinking, tool-call, status.
- W4 harness bridge: a Claude Code session's output posted into a taOS
channel as content blocks, and user replies delivered back to the session.
This is the piece that makes taOS a wrapper rather than a mirror; it needs
design before implementation and is NOT free-builder work.
Constraints
- No new question/answer store. Reusing
DecisionStore is the point.
- No credentials or tokens transit chat.
- Every surface answers as the real user identity; an agent must never be able to
answer its own question.
- Live update uses the existing broker/SSE machinery rather than polling.
EPIC: taOS as the harness wrapper - move all agent comms into taOS
Jay, 2026-07-26: all communication with the lead agents moves out of the Claude
app and into taOS. taOStalk becomes the chat surface, Projects becomes the work
surface, and the A2A realtime stream is the transport. The target is using taOS
to build taOS, on stream.
What already exists (verified in code, not assumed)
request_decisionagent tool ->DecisionStore-> Decisions app, withsingle_select,multi_select,approve_deny,free_text, optionsnormalised to
[{label, value}], priorities, and a notification on raise.content_blocks(chat/message_store.py).tool-call, status/question, live badge, connect-session wizard).
The actual gap
Decisions render only in the Decisions app. No chat component renders a
decision, so a question raised by an agent is invisible in the conversation where
it was asked. That is the seam Jay named, and it is the difference between taOS
being a viewer and taOS being the place the work happens.
Design: one decision, two surfaces, one resolution
DecisionStorestays the single source of truth. Chat does NOT get its ownquestion table. A question raised in chat IS a decision; the chat block is a
view of it, keyed by
decision_id.so open clients update without a refresh. First answer wins.
places at once, so a second answer must be rejected cleanly (not silently
overwrite, not 500), and both surfaces must show the resolved state with who
answered and when. Assume the user has chat open on a phone and Decisions open
on a desktop, and taps both.
Decisions app must visibly resolve in the chat thread it came from, in place.
Slices
answer it) - proves the join without touching write paths.
propagation to every open surface.
text, thinking, tool-call, status.
channel as content blocks, and user replies delivered back to the session.
This is the piece that makes taOS a wrapper rather than a mirror; it needs
design before implementation and is NOT free-builder work.
Constraints
DecisionStoreis the point.answer its own question.