feat: let a turn be silent #913
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!913
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-895-silent-turn"
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?
Lets a turn produce no final text, so an agent that already answered through a tool can decline to answer twice. Implements Kai's decision recorded on the issue.
What changed
ParseReplyreads an empty reply as silence rather than an error, and a silent turn posts nothing.RequireReplykeeps the strict parse for the three callers with no silence to express: the evaluation scorer,board.go, and job content messages. Their behaviour is byte-identical, including the error string.turn.reply.silentrecords the choice with the executed tool count.The revisit condition, handled up front
The decision reserved the right to reopen if silence "turns out to hide real failures, because a turn that produces nothing becomes indistinguishable from a turn that broke."
Silence is a choice only once the turn has done something. An empty reply from a turn that ran no tool is not a decision, and it stays the parse failure it was: same check name (
parse), same stage, same notice, and the proxy's repair loop still fires for it. That signal comes off the turn rather than out of a sentinel the model has to emit, so nothing depends on the model cooperating.The evidence that this is the right seam:
TestProxyClientRepairsEmptyReplyOnceis untouched and still passes. It pins the old empty-completion repair, and it has no tool calls.What this does not do
No standing ban on write tools aimed at the reply channel, per the decision.
deploy#631anddeploy#632can come off once this rolls, and that is deploy's call rather than mine.Tests
silentturn_test.goruns both halves throughrunTurn: a model that answered through a tool and returned nothing posts nothing, and a model that ran no tool and returned nothing still fails.decision_test.gocovers the parse contract on both functions.just gatePASS.closes #895