feat(context): a reply names what it answers #603
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!603
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/a-reply-names-its-subject"
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?
closes #579
What was happening
Current()carried only the member's own text.ReferencedMessagewas read for the summon check and for trace lookup, and never for the prompt.So the replied-to message reached the model only if it happened to fall inside the channel history window. The subject of a reply depended on how many messages had arrived since, and disappeared entirely for a reply to anything older than the window — exactly the report: "the harness treats it as if responding to the latest channel message, losing the reply context entirely."
Discord supplies the referenced message inline, so carrying it costs no lookup.
The rendering
Both branches of
buildTurnContextrender it, because a reply can be the first message in an empty window. A turn that is not a reply renders exactly as before, held by a test in both branches.One thing worth recording
ReplySubjectis deliberately not aTranscriptEntry. I wrote it as a self-referential*TranscriptEntryfirst. It compiles, it passesvet, and then:The MCP tool schema walks
TurnInputand cannot express a cycle. I found that by running the tests, not by reasoning about it — nothing in the type system or the linters objects, and the failure is at startup rather than at build.The flat type is the better shape regardless: a reply target has no provenance of its own and no reply of its own, so
Assertedand a nestedReplyTowere fields that could only ever be wrong. It keepsCounterpart, so a reply to this service does not read as a reply to a member.ward exec gategreen.