feat(reply): a reply that called tools shows which ones, and how each went #403
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!403
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/tool-call-footer"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The receipt a reader can see, where the grounding check is a guard only the
service can see. No hammer, no tool call, so a member can tell a lookup from an
answer from memory.
Three states rather than two. A failed lookup, an empty result, and a full one
read differently, which is the conflation 195 is about applied to disclosure.
The outcome is recorded where the call completes rather than derived at the
reply, because an empty result is recoverable from the result text afterwards
and a failure is not. That was the real work here: ExecutedTool carried no
status, so the state the feature exists for was the one nothing could see.
Aggregation is consecutive and never crosses a status. A A B A stays three
lines so the order survives, and a failure is never counted inside a run of
successes.
Appended where AppendIssueReferences already appends, after the checks. A
footer of backticked tool names is exactly the shape ValidateNoToolCallMarkup
rejects, so passing it through the model-reply checks would fail every
tool-using reply. The existing line already carries the reason: service
authored, so it runs after the checks rather than through them.
Names only. Arguments can carry member text and echoing it back would build a
surface into the data-borne vector in 177, so a test asserts an injected
argument does not survive into the reply.
Both lanes, because the reply path is shared and the verification problem is
identical. Making it Echo only would be the change requiring work, so it is
recorded on the issue as my call.
Three questions stay open and undecided: multi-message placement, whether very
large counts deserve surfacing rather than compression, and one I found while
wiring it, which is what happens when a reply near the Discord limit is
truncated with a footer on it.
closes #385
Co-authored-by: Kai Siren coilysiren@gmail.com
Co-authored-by: Claude noreply@anthropic.com