A running sub-agent shows a clock and nothing else: tool calls are stored but never streamed
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 55/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- javascript, python, typescript
- Domain
- ai, backend-api-design, frontend
Research direction
Start with the AcpTurn update dispatch in raven/acp_client/acp_agent.py and trace how on_delta is implemented across the named backends. Then inspect the instance refresh interval in ui-web/src/live/230-tabs.js and the TurnClock surface. Reproduce with an ACP sub-agent using streams = True; done means tool calls and thoughts appear live rather than only after the turn completes.
Written by the indexing model from the issue text.
Description
Summary
While a sub-agent answers, the page can show only two things: how long the turn has been running, and whatever the agent says in prose. Every tool call it makes is collected and stored, and reaches the page only after the fact. For an agent whose work is mostly tool calls -- a deck build, a research sweep -- the live view is a clock and nothing else for minutes at a time.
Steps to reproduce
- Send a substantial task to a sub-agent instance (a deck rebuild will do).
- Watch the instance surface while it works.
Expected behavior
Some sign of what it is doing. The data exists: subagents.instance.history returns the tool rows afterwards, and the ACP protocol reports each tool call as it happens.
Actual behavior
The turn clock counts (ui-web/src/features/subagents/TurnClock.tsx, new in #405) and prose appears when the agent speaks. Nothing else. Reading the history over /rpc during a run shows the work that was invisible on screen at the time -- "13 pages of structure settled", "wrote 4606 bytes to build/build.py" -- while the page showed a clock.
Where it is decided
AcpTurn's update dispatch splits three kinds of update three ways (raven/acp_client/acp_agent.py):
| update | appended to self.events (stored) |
forwarded to on_delta (live) |
|---|---|---|
| answer text | yes | yes |
tool call / tool result (_BREAKING_UPDATES) |
yes | no |
thought (_THOUGHT_UPDATES) |
yes | no |
Only the text branch calls await self._on_delta(text). The other two branches build the record and return.
There is a second, smaller effect on top: the instance surface refreshes on a 2s setInterval (ui-web/src/live/230-tabs.js:229) rather than on an event, so even stored rows arrive on the next tick rather than as they land.
Why this is a seam and not an oversight
on_delta is typed Callable[[str], Awaitable[None]]: a string, nothing else. A tool call cannot travel through it without widening the signature, and that signature is shared by every backend implementation (acp_agent, openai_api, raven_loop, cli_agent, routing, plus anything third-party). So this is a protocol-level change, not a UI one, which is presumably why it landed where it did.
The codebase has already named the same gap once, from the storage side -- raven/agent/subagent/activity.py:
"A backend already knows far more than the string it hands back: which tools the sub-agent called, how many tokens it spent, how long it spent thinking. All of it went to a tracing span and nowhere else ... For an ACP agent that is doubly odd: the protocol reports every tool call as it happens, and the answer arrived with all of that already collected and then thrown away."
That module fixed the record. The live path still has the older shape.
Environment
macOS, raven from the repo working tree, web UI at current main, sub-agent on the ACP backend (streams = True).
- Dominant language
- Python
- Stars
- 4.1k
- Forks
- 94
- Avg merge
- 14h 31m
- Merged PRs (30d)
- 428
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from EverMind-AI/Raven
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
EverMind-AI/Raven#986 ·
Maintainers usually reply within 1 day
-
fix: two error hints tell users to install raven by name, which is Sentry's client on PyPIPossibly taken @TheIrvin claimed this 14 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
EverMind-AI/Raven#845 · 2 comments ·
Maintainers usually reply within 1 day
-
security: tool output scrubbing misses raven's own oauth token filesPossibly taken @akushonkamen claimed this 6 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
EverMind-AI/Raven#842 · 2 comments ·
Maintainers usually reply within 1 day
-
WeChat send silently succeeds when iLink returns non-zero ret with errcode=0Possibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
EverMind-AI/Raven#210 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
EverMind-AI/Raven#121 ·
Maintainers usually reply within 1 day
All issues in EverMind-AI/Raven
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
sierra-research/tau2-bench#635 ·
Maintainers usually reply within 1 day
-
The add-ssm-model skill requires a Cython simulator; the contributing guide allows Python onesPossibly taken @fmuia claimed this today. Opendocumentation skill
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
lnccbrown/ssm-simulators#406 ·
Maintainers usually reply within 4 days
-
Difficulty 1/5 Under an hour Newbie friendliness 95/100
btclib-org/btclib-ecc#309 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
jbacalso24/mimry#459 · 1 comment ·
Maintainers usually reply within 1 day
-
[Bug] POST /revoke with a FastMCP access token is a silent no-op (ownership gate never matches)Openauth bug high-priority
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day