Repository navigation
feat(drafts): a send's result says what it holds; the receipt names each draft's reason - #1002
nissa-seru wants to merge 8 commits into
Conversation
…ach draft's reason A send that may have posted holds the turn's plain speech aimed where it posted. The resident heard of a hold only once its speech was held. On a stream that presents injected messages (the native path), a mid-turn notice said so, with its reason. On the XML path, and on a stream that doesn't present injected messages, nothing said so until the turn-end receipt, after the resident had stopped. The receipt gave no reason on any path. A model-issued send's result now gains one line, where the turn's plain speech is routed and the turn isn't private. On the native path, the plain speech to that place, this round's included, is held until a new message arrives or the turn ends. On the XML path, the turn's plain speech there, earlier rounds included, is held. A send whose place can't be told says the plain speech anywhere is held, and why, in the words the held-draft notice already uses. A send that reached nowhere adds no line. The line goes where each send's answer is read: a drafts resend's content gains a text block, an MCPL send's text gets the line appended, channel_publish's object a routing field as channel_open's result has, and an answer that is an error alone its error text. The turn-end receipt's held line gives each draft's reason after its id.
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of 8 of the 76 runs differ between the base and this head. In the files profiled hosts loaded, 10 changed source lines that map to code ran in no profiled drive: Usage: the agents' requests, subagents' included, in the 76 runs, base → head: 208,163 → 208,167 tokens sent a request, 70.8% of them read from the cache, 146,596,163 → 146,597,751 written to it, 3,943,783 output and 24 thinking blocks dropped. The figures of 8 runs moved, for any kind of request; they're under "Usage that differs", below. The figures are the stand-in's model of each provider's published caching and token rules, not a measurement; the stand-in answers the same every time, so a difference between the arms comes from the change. A model's account of those records: Delta 1: Send results explain the hold on plain speech In the runs exercising wake rules and built-in modules, automatic continuation, console arrivals and closed channels, and a tuned-out channel across a restart, where send confirmations enter requests or compiled context checks.
Delta 2: Delivery reports give each held draft's reason In the runs exercising wake rules and built-in modules, automatic continuation, hybrid speech routing and locked speech destinations, where delivery reports describing held drafts appear in conversation history.
Delta 3: Later requests carry expanded confirmations and draft reports together In the runs exercising built-in modules with alternate settings and automatic continuation, where resident requests carry earlier send confirmations alongside delivery reports about held drafts. Follows from Delta 1.
Delta 4: Earlier cache boundaries move (the description doesn't mention it) In the automatic-continuation run and the built-in-module run with a paused heartbeat and reply judging disabled, in later resident requests carrying the changed conversation history. Follows from Delta 3.
Delta 5: Further resident request bodies differ In the runs exercising wake rules and built-in modules, a reader across branch changes and a restart, automatic continuation, hybrid or locked speech destinations, and console arrivals and closed channels, in resident requests whose named conversation messages remain the same.
Delta 6: Auxiliary model request bodies differ (the description doesn't mention it) In the wake-rule and built-in-module runs under the default module settings and under settings with a paused heartbeat and reply judging disabled, in auxiliary model requests.
Runs whose records differ: 8 of 76, with 6 changes
|
H4/W15 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 13 | 15,935 → 16,043 | 212,842 | 57,070 | 7,713 | 0 |
H5/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 84 | 51,197 → 51,360 | 8,889,710 → 8,896,391 | 1,221,438 → 1,222,201 | 68,546 | 0 | |
| concepts | 26 | 82,771 → 82,818 | 0 | 0 | 1,878 | 0 | |
| judge | 2 | 6,255 | 23,664 | 23,664 | 67 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 10,035 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,352 | 0 | 0 | 55 | 0 |
H5b/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 72 | 46,403 → 46,483 | 4,909,666 → 4,910,074 | 3,594,196 → 3,594,684 | 64,704 | 0 | |
| concepts | 19 | 65,482 | 0 | 0 | 1,605 | 0 | |
| judge | 2 | 1,492 | 684 | 684 | 67 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 11,495 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,924 | 0 | 0 | 55 | 0 |
H5c/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 70 | 54,692 → 54,772 | 7,602,824 → 7,603,592 | 752,265 → 752,361 | 70,580 | 0 | |
| concepts | 18 | 70,737 → 70,745 | 0 | 0 | 1,536 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 13,372 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,930 | 0 | 0 | 55 | 0 |
Hcont/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 19 | 893 → 972 | 402,144 → 403,600 | 26,728 → 26,832 | 1,906 | 0 |
Hhyb/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 12 | 402 | 252,289 → 252,300 | 26,748 → 26,759 | 1,563 | 0 |
Hlock/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 13 | 644 | 278,731 → 279,096 | 27,079 → 27,126 | 1,856 | 0 |
H1/W17 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 24 | 7,479 → 7,558 | 922,901 → 924,323 | 57,045 → 57,124 | 22,981 | 0 | |
| naming | 1 | 598 | 0 | 0 | 9 | 0 |
The figures of the other 68 runs are the same in the base and this head.
Upgraded runs beside their fresh twins
| On the base | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
| On the head | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
A run that writes its own history first, as a fresh twin does, is shown without that history's requests, so its figures are its workload's alone, as the upgraded runs' are.
Changed source lines and deletions not seen to run, by file
src/framework.ts: lines 22849, 22851–22853, 22861 and 22876–22880 ran in no profiled drive; lines 1837, 22844, 22854–22855 and 22862–22863 map to nothing the host runs.
Held the same in base and head: connectome-host 75b9e445d87b, chronicle 0.6.0, context-manager 0.25.1 (the view chose it for both arms, since connectome-host's lockfile holds 0.25.0, which doesn't meet ^0.25.1 from the base), membrane 0.8.0.
|
Automatic review of About these findingsThe findings below came from reading this PR and relevant code; not a holistic understanding of the project's functional intent and its architecture choices. Finding precision is higher for flagging issues than identifying ideal changes/fixes. This review prioritizes recall - minor findings (in particular) may be nits. Before actioning a finding, consider the relevant code from first principles given the functional+architectural intent. In particular, when considering adding machinery/logic, scrutinize whether the incremental value of such pays rent for the complexity it adds to the codebase - kudzu has a direct negative impact on our future ability to work with the codebase. Consider explicitly mentioning which findings you accept/decline (by code-formatted numerical id) and why; this enables future rounds of automated review to take your notes into account. Findings, most severe first:
|
…lands where its answer is read (red) Answering the automatic review of 9c89827 (issuecomment-6742348175): - 1, 2: a resend beside narration and no other send, and a send beside a same-round private think or a refused wake, keep the round's prose, so the line names what comes after the round; a send beside a skip_reply that ends the turn gets no line; - 6, 14: on the XML path, after an earlier round kept private, the line claims no earlier rounds, and the XML wording says until a new message reaches you or the turn ends; - 3, 7, 8: a module's send answer with no data and no error is the line, an error answer with data takes it after its error, and an array of records that isn't content gains no record of it; - 10: the no-line test's arms each check their send reached the connector.
…ands where its answer is read Answering the automatic review of 9c89827 (issuecomment-6742348175). The line's claim is decided at dispatch, from the round's own calls and think (holdClaimOf), not from the turn's silence as the send answers: - a skip_reply that isn't refused ends the turn, so no line; - a round that keeps its own prose (a refused wake; on the native path a same-round private think, or a drafts round with no other send) says the plain speech after this round is held; - on the XML path the turn's speech is claimed with its earlier rounds where no round was kept private, and otherwise except a round where skip_reply was refused; - every wording says until a new message reaches you or this turn ends, as the hold rule does (1, 2, 6, 14). draftsCause reads the same keepsDraftsRound. The line goes where the answer is read (3, 7, 8): an error answer's error text, whatever its data, and an answer of no data or null whose error text the serializer reads; the whole of an answer with no data, or null, and no error; after a string, a number or a boolean; a content array's text block; and no array that isn't content. The fragments say so, and that the routing field is on the model's own channel_publish, not a script's (12).
|
This answers the automatic review of
CreditsHamish-2699 made the changes and wrote this reply. Ada-1017 decided each finding, and Paloma-2644 read the changes. Details for agentsHead
Runs: Linux x86_64, Node v24.22.2, npm 11.19.1. With — Hamish-2699 |
|
/review — Hamish-2699 |
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of 8 of the 76 runs differ between the base and this head. In the files profiled hosts loaded, 10 changed source lines that map to code ran in no profiled drive: Usage: the agents' requests, subagents' included, in the 76 runs, base → head: 208,163 → 208,167 tokens sent a request, 70.8% of them read from the cache, 146,596,163 → 146,597,751 written to it, 3,943,783 output and 24 thinking blocks dropped. The figures of 8 runs moved, for any kind of request; they're under "Usage that differs", below. The figures are the stand-in's model of each provider's published caching and token rules, not a measurement; the stand-in answers the same every time, so a difference between the arms comes from the change. A model's account of those records: Delta 1: Send results explain the hold on plain speech In conversations exercising wake rules and host tools, automatic continuation, console input and channel lifecycle, and sending into a tuned-out channel, when send results are prepared or carried in conversation history.
Delta 2: Draft receipts give reasons beside draft identifiers In conversations exercising wake rules and host tools, automatic continuation, hybrid speech routing and speech locked to drafts, when delivery receipts are retained in the resident's context.
Delta 3: Resident requests carry changed message bodies In conversations exercising wake rules and host tools, a reader watching a tuned-out channel, automatic continuation, hybrid speech routing, speech locked to drafts, and console input with channel lifecycle, in resident requests starting or continuing turns.
Delta 4: Helper requests carry changed content In the conversations exercising wake rules and host tools, in requests to helper models.
Delta 5: Cache boundaries move in retained conversation history In the conversation where turns automatically continue after an answer and the wake-rule conversation with paused heartbeat and a disabled reply judge, in requests retaining earlier conversation history. Follows from Delta 2.
Runs whose records differ: 8 of 76, with 5 changes
|
H4/W15 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 13 | 15,935 → 16,043 | 212,842 | 57,070 | 7,713 | 0 |
H5/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 84 | 51,197 → 51,360 | 8,889,710 → 8,896,391 | 1,221,438 → 1,222,201 | 68,546 | 0 | |
| concepts | 26 | 82,771 → 82,818 | 0 | 0 | 1,878 | 0 | |
| judge | 2 | 6,255 | 23,664 | 23,664 | 67 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 10,035 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,352 | 0 | 0 | 55 | 0 |
H5b/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 72 | 46,403 → 46,483 | 4,909,666 → 4,910,074 | 3,594,196 → 3,594,684 | 64,704 | 0 | |
| concepts | 19 | 65,482 | 0 | 0 | 1,605 | 0 | |
| judge | 2 | 1,492 | 684 | 684 | 67 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 11,495 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,924 | 0 | 0 | 55 | 0 |
H5c/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 70 | 54,692 → 54,772 | 7,602,824 → 7,603,592 | 752,265 → 752,361 | 70,580 | 0 | |
| concepts | 18 | 70,737 → 70,745 | 0 | 0 | 1,536 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | |
| relevance | 2 | 13,372 | 0 | 0 | 42 | 0 | |
| review | 1 | 1,930 | 0 | 0 | 55 | 0 |
Hcont/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 19 | 893 → 972 | 402,144 → 403,600 | 26,728 → 26,832 | 1,906 | 0 |
Hhyb/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 12 | 402 | 252,289 → 252,300 | 26,748 → 26,759 | 1,563 | 0 |
Hlock/W13 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 13 | 644 | 278,731 → 279,096 | 27,079 → 27,126 | 1,856 | 0 |
H1/W17 |
kind | requests | input | read from the cache | written to it | output | thinking dropped |
|---|---|---|---|---|---|---|---|
| agent | 24 | 7,479 → 7,558 | 922,901 → 924,323 | 57,045 → 57,124 | 22,981 | 0 | |
| naming | 1 | 598 | 0 | 0 | 9 | 0 |
The figures of the other 68 runs are the same in the base and this head.
Upgraded runs beside their fresh twins
| On the base | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
| On the head | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
A run that writes its own history first, as a fresh twin does, is shown without that history's requests, so its figures are its workload's alone, as the upgraded runs' are.
Changed source lines and deletions not seen to run, by file
src/framework.ts: lines 22875–22877, 22884, 22888 and 22904–22908 ran in no profiled drive; lines 1791–1793, 1799–1800, 1852, 22863, 22870, 22878–22879 and 22890–22891 map to nothing the host runs.
Held the same in base and head: connectome-host fc9684c7fb07, chronicle 0.6.0, context-manager 0.25.1 (the view chose it for both arms, since connectome-host's lockfile holds 0.25.0, which doesn't meet ^0.25.1 from the base), membrane 0.8.0.
|
Automatic review of About these findingsThe findings below came from reading this PR and relevant code; not a holistic understanding of the project's functional intent and its architecture choices. Finding precision is higher for flagging issues than identifying ideal changes/fixes. This review prioritizes recall - minor findings (in particular) may be nits. Before actioning a finding, consider the relevant code from first principles given the functional+architectural intent. In particular, when considering adding machinery/logic, scrutinize whether the incremental value of such pays rent for the complexity it adds to the codebase - kudzu has a direct negative impact on our future ability to work with the codebase. Consider explicitly mentioning which findings you accept/decline (by code-formatted numerical id) and why; this enables future rounds of automated review to take your notes into account. Findings, most severe first:
Raised before, still answered (2)
|
…ng any round kept private; answers kept before the line; each draft's reason (red) Every live-path send's line now reads "…, from this round on, is held as drafts until a new message reaches you or this turn ends, except in a round that keeps its speech private.", beside a private think, a refused wake or a drafts resend too, and the XML path's line reads "… this turn is held as drafts until …, except in a round that keeps its speech private." The pins of the old four wordings are turned round. Also pins that a send's own answer survives before its line (an object's fields before `routing`, and the text a send or a drafts resend answered before the line, as the result is read), that the locked receipt gives a draft its "no destination" reason in full, and that a receipt holding drafts of two reasons gives each its own.
…ding of its round's calls The line's claim was a second reading of the round's routing facts, made at dispatch from its direct calls, and it drifted from what routeRound does: a watched script's refused skip_reply, private think or send in the same round, a hybrid drafts round that holds its >>> envelopes, and a later round kept private each made the line untrue. So did the non-live line's exception for a round where skip_reply was refused alone, since a native round cut off at the output limit beside a private think is kept private there too (refusedWakeRounds). The line now says the plain speech there, from this round on (live) or this turn (not live), is held "except in a round that keeps its speech private", whatever the round's other calls. holdClaimOf reads only an unrefused private call (no line) and the path; HoldClaim has two kinds, its privateThink and keptEarlier inputs go, and HOLD_CLAIM_TEXT holds only each kind's span. keepsDraftsRound, which the claim shared with draftsCause, goes back inline as main has it. The fragments say so, name the answer shapes the line changes and the cache effect, and say a publish beside an accepted skip_reply carries no routing.
|
This answers the automatic review of
CreditsHamish-2699 made the changes and wrote this reply. Ada-1017 decided each finding, and Paloma-2644 read the changes. Details for agentsHead
Runs: Linux x86_64, Node v24.22.2, npm 11.19.1. With — Hamish-2699 |
|
/review — Hamish-2699 |
|
Automatic review of About these findingsThe findings below came from reading this PR and relevant code; not a holistic understanding of the project's functional intent and its architecture choices. Finding precision is higher for flagging issues than identifying ideal changes/fixes. This review prioritizes recall - minor findings (in particular) may be nits. Before actioning a finding, consider the relevant code from first principles given the functional+architectural intent. In particular, when considering adding machinery/logic, scrutinize whether the incremental value of such pays rent for the complexity it adds to the codebase - kudzu has a direct negative impact on our future ability to work with the codebase. Consider explicitly mentioning which findings you accept/decline (by code-formatted numerical id) and why; this enables future rounds of automated review to take your notes into account. Findings, most severe first:
Raised before, still answered (9)
|
…out content after a live one takes the round's line (red) On a turn routed at its end, the hold lasts the turn: a new message resets the turn's silence but not its sends, so the turn's line now pins "this turn is held as drafts until this turn ends". And a send in a round whose stream gives no round content, after a round routed as it streamed, takes the from-this-round line, as the turn's routing does. The XML stand-in can strip round content from a given round on, to make that case.
…s kind follows the turn's routing On a turn routed at its end, trailingSilence is the turn's sends for the whole turn; adoptInjectedRound resets the silence on a new message but not the sends, so a new message doesn't end the hold there, as main's sendHoldText already says by giving "until a new message reaches you" to a live round alone. The turn's line now ends "until this turn ends", and HOLD_CLAIM_TEXT holds each kind's span and its end. holdClaimOf read this round's round content alone, while the turn's trailing routing reads liveProseRouting, which stays true once a round was routed as it streamed; so a round without content after a live one said "this turn", though earlier rounds had published. The claim now reads liveProseRouting. The fragment says which turns hold until a new message and which until the turn ends.
|
This answers the automatic review of
CreditsHamish-2699 made the changes and wrote this reply. Ada-1017 decided each finding, and Crispin-2406 read the changes. Details for agentsHead
Runs: Linux x86_64, Node v24.22.2, npm 11.19.1. With — Hamish-2699 |
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of 5 of the 66 runs it could compare differ between the base and this head. Couldn't tell whether 10 changed source lines ran, since H1/W13: its profiled drive failed at step 877092.refuse: turn 877092.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told; and 9 more reasons. 10 changed source lines map to nothing the host runs: 10 of 10 runs couldn't be compared; the reasons are below. Usage: the agents' requests, subagents' included, in the 66 runs, base → head: 215,433 → 215,438 tokens sent a request, 70.7% of them read from the cache, 146,965,568 → 146,967,414 written to it, 3,936,949 output, 24 thinking blocks dropped, USD 0.6046 at list price a priced request and 123 requests with no list price. The figures of 5 runs moved, for any kind of request; they're under "Usage that differs", below. The figures are the stand-in's model of each provider's published caching and token rules, not a measurement; the stand-in answers the same every time, so a difference between the arms comes from the change. A list price is what each arm's host prices those figures at with its own table (connectome-host's A model's account of those records: Delta 1: Send results explain the hold on ordinary speech In the conversations testing wake rules, console input with channel opening and closing, and a tune-out reader across branch changes and restart, in retained send-result text, including a preview that sends nothing.
Delta 2: Draft receipts include reasons In the conversations testing wake rules, when delivery receipts for speech held as drafts enter the resident's model context.
Delta 3: Later history carries warnings alongside draft reasons In the wake-rule conversations with alternative module settings, in resident requests retaining draft receipts and successful posting results together. Follows from Delta 2.
Delta 4: A cache boundary moves in the retained history In the wake-rule conversation with the reply judge disabled, when a stalled model call is made and retried. Follows from Delta 3.
Delta 5: Other resident request bodies differ In resident requests during the wake-rule conversations, the tune-out reader conversation with branch changes and restart, and the conversation mixing console input with channel opening and closing.
Delta 6: Supporting model request bodies differ In supporting model calls during the wake-rule conversations with default module settings or with the reply judge disabled.
Runs whose records differ: 5 of 66, with 6 changes
|
H4/W15 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 13 | 15,935 → 16,085 | 212,842 | 57,070 | 7,713 | 0 | 0.9496 → 0.9504 | 0 |
H5/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 84 | 51,148 → 51,367 | 8,891,870 → 8,900,595 | 1,221,665 → 1,222,652 | 68,546 | 0 | 14.5505 → 14.5621 | 0 | |
| concepts | 26 | 82,771 → 82,818 | 0 | 0 | 1,878 | 0 | 0.0922 | 0 | |
| judge | 2 | 6,255 | 23,664 | 23,664 | 67 | 0 | 0.0039 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | 0.0007 | 0 | |
| relevance | 2 | 10,035 | 0 | 0 | 42 | 0 | 0.0102 | 0 | |
| review | 1 | 1,352 | 0 | 0 | 55 | 0 | 0.0002 | 0 |
H5b/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 72 | 46,353 → 46,461 | 4,912,357 → 4,912,877 | 3,593,509 → 3,594,137 | 64,704 | 0 | 27.0965 → 27.1013 | 0 | |
| concepts | 19 | 65,482 | 0 | 0 | 1,605 | 0 | 0.0735 | 0 | |
| judge | 2 | 1,492 | 684 | 684 | 67 | 0 | 0.0003 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | 0.0007 | 0 | |
| relevance | 2 | 11,495 | 0 | 0 | 42 | 0 | 0.0117 | 0 | |
| review | 1 | 1,924 | 0 | 0 | 55 | 0 | 0.0002 | 0 |
H5c/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 70 | 54,692 → 54,800 | 7,606,472 → 7,607,464 | 752,607 → 752,731 | 70,580 | 0 | 10.8793 → 10.8811 | 0 | |
| concepts | 18 | 70,737 → 70,745 | 0 | 0 | 1,536 | 0 | 0.0784 | 0 | |
| naming | 1 | 617 | 0 | 0 | 9 | 0 | 0.0007 | 0 | |
| relevance | 2 | 13,372 | 0 | 0 | 42 | 0 | 0.0136 | 0 | |
| review | 1 | 1,930 | 0 | 0 | 55 | 0 | 0.0002 | 0 |
H1/W17 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 24 | 7,479 → 7,586 | 922,901 → 924,827 | 57,045 → 57,152 | 22,981 | 0 | 1.6438 → 1.6464 | 0 | |
| naming | 1 | 598 | 0 | 0 | 9 | 0 | 0.0006 | 0 |
The figures of the other 61 runs are the same in the base and this head.
Upgraded runs beside their fresh twins
| On the base | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
| On the head | requests | tokens sent a request | read from the cache | written to it | output | thinking dropped | last request dropped | calibration |
|---|---|---|---|---|---|---|---|---|
H1b/continuation/from-0.9.0 |
15 | 159,813 | 52.6% | 993,917 | 20,252 | 24 | 0 | 1.28, confirmed after a reset |
H1b/continuation/fresh |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
H1b/continuation/from-0.23.0 |
15 | 155,549 | 56.9% | 862,775 | 20,252 | 0 | 0 | 1.29, confirmed |
A run that writes its own history first, as a fresh twin does, is shown without that history's requests, so its figures are its workload's alone, as the upgraded runs' are.
Changed source lines and deletions not seen to run, by file
Couldn't tell for any line or deletion not seen to run, since H1/W13: its profiled drive failed at step 877092.refuse: turn 877092.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hlock/W13: its profiled drive failed at step 555886.refuse: turn 555886.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hexpl/W13: its profiled drive failed at step 282696.refuse: turn 282696.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hdis/W13: its profiled drive failed at step 830687.refuse: turn 830687.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hcont/W13: its profiled drive failed at step 292517.refuse: turn 292517.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hpriv/W13: its profiled drive failed at step 467880.refuse: turn 467880.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hhyb/W13: its profiled drive failed at step 377404.refuse: turn 377404.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hretry/W13: its profiled drive failed at step 3465.refuse: turn 3465.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hoff/W13: its profiled drive failed at step 531330.refuse: turn 531330.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
Couldn't tell for any line or deletion not seen to run, since Hlatest/W13: its profiled drive failed at step 476258.refuse: turn 476258.refuse spoke, where its script ends it with no speech, so what it would have run after that can't be told.
src/framework.ts: lines 1800–1801, 1804, 1856, 23429, 23434, 23442–23443 and 23454–23455 map to nothing the host runs; couldn't tell whether lines 23439–23441, 23448, 23452 and 23468–23472 ran.
Held the same in base and head: connectome-host e7a2e4c01413, chronicle 0.6.0, context-manager 0.25.1 (the view chose it for both arms, since connectome-host's lockfile holds 0.25.0, which doesn't meet ^0.25.1 from the base), membrane 0.8.0.
Why. Nothing told a resident before an explicit send held its plain speech from the same turn as a draft. On the XML path, and on streams that don't present injected messages, the first it heard came after it had stopped: a turn-end receipt that gave no reason.
A send's own result now says what that send holds of the turn's plain speech, and the turn-end receipt gives each held draft's reason beside its id.
A send's result
main): the send's answer alone.The turn-end receipt
main): "2 plain-speech segment(s) held as drafts d-a, d-b (not sent — drafts can resend them unchanged, or dismiss them)"The line is added only where a send may hold plain speech: in locus, hybrid and locked modes. A turn whose plain speech is already kept private, such as after a module's
skip_reply, gets no line, and neither does a send beside askip_replythat ends the turn. A send that posted nowhere gets no line either. Apart from thatskip_reply, the line doesn't read the round's other calls. It excepts any round that keeps its speech private, such as one beside a same-round private think, a refused wake or adraftsresend with no other send, so it stays true whatever a script in the round, or a later round, does. Its place comes from the same reading of the send's answer that decides the hold. The line follows the send's own answer, where that answer is read. It comes after an error answer's text, and after a value that's text, a number or a boolean. An answer with nothing in it, ornull, is the line itself. On an object answer, such aschannel_publish's, it goes in aroutingfield, the field namechannel_open's result uses. No tool description changes. A request whose history holds a send's result or receipt made after this carries its new words, the judge's requests over that history included, so its cache boundaries can fall elsewhere. A result or receipt stored before this keeps its words.On a stream that presents injected messages (the native path), a mid-turn notice still names the draft a round's speech became. The line and the notice say different things. The line, in the send's result, says what will be held from then on. The notice, beside it, names the draft made, where it was going, and the call that resends it.
Limits. A send made by a
code_executionscript gets no line, because the script reads its result. Such a send holds the turn's plain speech where the script's code names the send tool. A name the script builds at run time isn't seen, so its round routes at once and that send may hold nothing. A send whose answer is an array that isn't content, or passes the inline cap, gets no line where the answer is read. Neither does a result the tool-result guard withholds, whose stub keeps only its marked fields, nor an answer that is itself a reference or an embedded resource, which is shown as that reference's text. In each of these cases the hold itself is unchanged, and the turn-end receipt names it with its reason. In a turn locked to drafts, the lock, not the send, holds all the turn's plain speech, and keeps holding it after the end the line names, as the turn's routing line says. A send there still gets its line. Sends were run against the repository's test connector, not a live one such as Discord.With #995. That change makes a turn holding an operator's private message speak in no channel. Its plain speech isn't held as drafts, so this line would be false in such a turn. Whichever of the two merges second needs the line skipped where
turnRouting.privateholds.changelog.d/send-hold-line.changed.mdandchangelog.d/send-hold-routing.added.md.Credits
Hamish-2699 built it and wrote this description. Hilda-2580 established the facts, Phoebe-2419 did the rent pass, Paloma-2644 read it, Ada-1017 made the design calls, Oscar-1808 ruled its changelog kind, and nissa approved it.
Details for agents
Head
cd03ad1bf2, eight commits onmain33e349479b: the change, its fragment, and rounds answering the first review (#1002 (comment)), the second (#1002 (comment)) and the third (#1002 (comment)).Problem
At
main, a send's result carries only the send's answer. A resident whose plain speech a send holds hears of it only after it is held. On a stream that presents injected messages, a mid-turn notice says so, with its reason. Otherwise only the turn-end receipt says so. The receipt names each held draft by id alone, with no reason. The red below showsmain's send results and receipts.Changes
src/framework.ts:ScriptRound.holdLineis set where a round waits on its sends: in locus, hybrid and locked modes, with a channel registry. It gives no line when the turn's silence isprivate.holdClaimOfdecides what the line claims from two facts. An unrefusedskip_replyin the send's round gives no line. Otherwise, once a round of the turn has been routed as it streams (liveProseRouting, which the turn's trailing routing reads), it claimsfrom-round, and before thatturn.sendHoldLinewords the line from the send's reach. That issendReachOf's reading, which the round then holds by. The claim's span and end come fromHOLD_CLAIM_TEXT: "until a new message reaches you or this turn ends" forfrom-round, and "until this turn ends" forturn, whose trailing hold is the turn's sends, which a new message doesn't reset (adoptInjectedRound). Every line ends "except in a round that keeps its speech private". A known place is named. An unknown place reads "anywhere", with its reason fromUNKNOWN_REACH_TEXT, whichsendHoldTextnow shares. Reachnowheregives no line.settleScriptRoundadds the line to each model-issued send's result as its reach is read.withHoldLinewrites it where the answer is read. An error answer gains it after its error text: one marked as an error, whatever its data, and one with no data beside an error's text, which is when the history reads the error. An answer with no data, ornull, is the line. Text, a number or a boolean gains a new line. A content array (isContentArray) gains a text block, and any other array nothing. An object gains aroutingfield.DRAFT_REASON_SHORTafter its id.sendCallIds(src/framework.ts:28958) takes only the round's model-issued sends, andsettleScriptRound(:31299) adds the line to those alone, so a script's send gets none.scriptMayRoute's reading of a script's code (:31335) doesn't see a tool name built at run time.withHoldLine(:22869) gives an array that isn't content nothing. An answer past the inline cap is cut wherebuildStoredToolResultContent(:31625) stores it, and the line, at the answer's end, goes with the cut. The guard's stub keeps only a result's marked fields (src/tool-result-guard.ts:66–71). The history shows a reference or an embedded resource at a result's root as its stored text (src/tool-result-history.ts:461–468). A turn locked with no place holds every plain word as a draft (src/framework.ts:23661), and its routing line says so (:25258).send-hold-line.changed.mdandsend-hold-routing.added.md.Tests
Runs on Linux x86_64, Node v24.22.2, npm 11.19.1. The repository has no root lockfile, so dependency versions aren't pinned.
main33e349479b'ssrcwithcd03ad1bf2's four changed test files gives 527 tests, 23 failing.prose-drafts.test.ts, 18 fail: twelve line tests, five receipt tests, and the test that holds drafts of two reasons in one turn. The tests that expect no line pass: a send that posted nowhere, in explicit mode, in a silent turn or in a turn kept private; a send beside askip_replythat ends the turn; and a send tool's array of records.present-while-acting.test.ts, 3 fail: two receipt tests, one of them run for bothsayandwhisper.explicit-prose-routing.test.ts, 1 fails: its receipt test.locked-prose-routing.test.ts, 1 fails: its receipt test, which requires "(no destination)".cd03ad1bf2.prose-drafts.test.ts, each failing the tests that pin what it changes:skip_replythat isn't refused: theskip_replytest;nowhere: the no-line test;withHoldLine's placements removed, renamed or widened (an error's text, no data,nullread as no data, text, numbers and booleans, a content array, other arrays, an object'sroutingfield): that placement's tests;draftstests that read a resend's or dismissal's own answer.Not verified