Repository navigation
fix(gate)!: a debounced batch's wake starts no turn once the agent has answered every event in it - #972
Conversation
Reuse answered-write evidence per recipient and wait for final channel publication before checking held channel wakes. Co-Authored-By: GPT-6-Astra <noreply@openai.com>
Keep publication-held events outside the inference cap, release stuck fences as wakeable after 65 seconds, and report only delivered debounce events. Pin fence narrowing and judge placement exclusion, and document shared resident batch lines. Co-Authored-By: GPT-6-Astra <noreply@openai.com>
Summarize the common unseen remainder in the shared slot and deliver isolated summaries into their own windows. Restrict fences to live placement owners, deduplicate summary and trace emission, and recheck queued delivery guards. Share the scheduler evidence lookup and cover heartbeat delivery, recipient removal, fork windows and microtask races. Co-Authored-By: GPT-6-Astra <noreply@openai.com>
anima-research#814: a debounced batch woke an agent that had already read and answered every event in it. The previous commits filtered each batch in the gate, at delivery, with a read-only copy of the scheduler's answered-write test, and held channel events behind a per-agent fence until the final publication settled or 65 s passed. The scheduler already waits for that point for every wake: it requeues an agent's wakes while the agent holds its turn, and applies its drop rule only after the turn, final publication included, has released it. So this judges the batch there instead, under the one rule a direct wake is judged by, with no fence, timer or second copy of the rule. - The gate records each event's write (evaluate's `after`, now public, as the addMessage and requestInference hooks' placements are) and the channel a reply is owed in. A batch with such an event hands its line to the wake, one WakeLine per event (WakeProvenance.lines), instead of writing it when it fires. - The scheduler drops a wake marked readsWakeLines once every line's write is done for the agent, each judged as readsDeferredWrite or readsStoredMessage is, with the line's own reply channel in place of the wake's. - The delivery agent's turn start leaves out the lines whose events it has answered and writes the rest as one line, rendered by wakeLineText as the gate's line for the same batch reads. A co-resident's start still places none, so when the delivery agent answered the batch its co-residents wake and find no line. - Removed: the publication fence and its timeout, the per-recipient remainder groups, isWriteDone/gateWriteDone, onInferenceEnded's second argument, and the fence's tests. The author's tests of anima-research#814's requirements stay, with the fence's internals taken out of them; the shared-slot remainder test is turned round to the rule above; a heartbeat lane is added.
…tch as the judge's A co-resident whose own turn answered the shared slot after an event still wakes for a batch whose write is the delivery agent's: a line's write counts only for the agent it was written to. And a reply judge's batch, given its events' writes, still writes its line at delivery and hands its wake nothing to drop it by, as the fixed fragment says. Both pass on main and fail under the mutant each pins against. The breaking fragment's migration now says to set readsWakeLines with the lines, without which a host's handed lines are decided at the turn start but its wake is never dropped.
…drop too From the review of the scheduler route (af937-route): - A line that carries a write is identified by that write, so two writes of one message stay two events. The coalescer's unread replacement re-delivers a message under its old id; deduplicating by that id kept the removed write's line, so the unread replacement lost its line, or its wake. - Both conversation-fork paths now fill the placement the gate holds from the fork's write, so a fork's answered batch drops as a resident's does. - Tests: two writes of one message; a fork's batch; the after-turn lanes fire the batch explicitly after the turn; a held final publication that succeeds drops the wake (judged after the publication); a chat:system notice drops its wake once read; and a batched wake's turn that fails into a provider's stated wait after a tool round answered its event is retried, not dropped, which pins the retry strip of readsWakeLines. - Text: a request that fails or is aborted answers nothing, not a whole turn, since a round that came back has answered what it read; evaluate's after says a host must place handed lines and pass readsWakeLines; WakeProvenance names lines and what they carry; stale clauses in the comments this change touched and in two test headers are deleted rather than rewritten. Left for an issue before merge: a partial batch's reply still goes where the batch's route points, which can be an answered event's channel, as on main; routing from the remaining lines would decide the turn's channel a second time.
acfccc9 refined the publication fence that the route replaces. Resolved toward the route: - Source and changelog fragments: the route's. The fence, its recipient rechecks and queued-delivery guards, the shared-slot common remainder and the optional getSharedSlotReaders() hook, the shared evidence lookup and the delivery-count dedup all belong to the fence or its gate-side check, which the route doesn't have. - Taken as written: the heartbeat and reminder lanes, and "unsatisfied residents retain stored content without re-presenting it in a shared summary", which holds under the route (it writes no line there); one check is added at its end that no window holds a line after the turns. - Not taken, as they pin the fence or the shared-summary delivery: the fork-summary test (forks and co-residents keep main's rule that only the delivery agent's start places a handed line), the "loses its gate role" publication outcome and its no-request/no-write checks for a removed recipient (under the route the wake is requested when inference ends, as on main, so those checks pin the fence's timing), the debounce-recipient-delivery tests, and the fence's debounce-seen-batch file, which the route removed.
…s, pending batches From the review of the fix round and the merge (af937-route-r1): - The constructed two-writes test is replaced by the coalescer's own channel edit: an unread message, its edit (an unread replacement under the same platform id) and a later message in one batch. The turn's line must count the edit and the later message, not the removed original. On main the line is written when the batch fires and counts all three; with lines keyed by entry alone the edit's line merges into the removed original's and is lost. - The fork test runs over deliverTo as well as routing, so each fork path's filling of the gate's placement fails a test of its own. - The helper that fires the batch first asserts one is pending or held, so no test that fires a batch can pass after its lane stopped batching. - placeWakeLines' doc stays true under the route: a line whose event the delivery agent has answered is left out untraced, and only a line left out as the newest entry or for a held slot is traced. - The migration names the rest of what a host gate needs for the drop: each event's write passed to evaluate, and isNewestEntry.
Under the full suite's load, a 30 ms stated wait could pass before the failed request was handled, so no wait bound, the failure went to the re-arm's own 120 s, and the test timed out (once in two full runs). The wait is now ten minutes; the test asserts the hold retains the turn's retry, releases the wait as an operator does (releaseProviderWait), and requires the retry to run. Eight concurrent runs of the file pass it, and it still fails when the retry keeps readsWakeLines.
A judge rule's event now keeps its write (`after`, `replyTo`), as a debounce rule's does. Judge rules' events had been left without them, so their batches were never dropped once the agent had answered them. That made five published sentences untrue, each of which says a judge rule's batch with no verdict wakes the agent as a debounce of its quiet period would: with the judge off (ReplyJudgeOptions.enabled, GateOptions.judge, gate_status's notice), and with a judge that fails, times out or makes no call under onError "wake" (ReplyJudgeOptions.onError, gate_status's notice). A reply verdict delivers its batch the same way, except for what the judge answered after. For each judged event with a write, the gate asks the host whether the agent has answered it (GateOptions.isAnswered, new; the framework answers with the drop's own rule). An event answered then keeps the wake, since the judge answered after that answer, and the judge's prompt asks it to let events go by "when it has already answered". The other events keep their writes, so the wake is dropped if the agent answers them before it starts. That can happen in three gaps, where the scheduler holds or is about to start a turn that the gate hasn't been told of: - a turn's start that awaits the push coalescer's assembly; - a wake parked behind an in-flight auxiliary call; - a reply held in the inference buffer behind a turn of an agent that doesn't change the judged context, such as a fork or a subconscious. Each gap has a test that fails without this change. Asking at the verdict rather than at the judge's read of the context makes no difference to a request answered by an agent whose turns stop the judge. A running turn of theirs holds the judge off, one that starts stops it, and a request is marked answered only inside a turn (driveStream). Anything else that makes an event answered between the read and the verdict, such as a conversation fork's answer, since a fork's turns don't stop the judge, counts as answered then and keeps the wake. Doubt keeps the wake: no hook, a hook that throws, or an answer other than false. The hook is public because only the host can tell whether an event is answered. The only per-event thing the gate hands the host is a WakeLine, and the inference buffer can merge a reply's events with debounced ones into one wake. Carrying a mark on each WakeLine instead would have needed a field there, and another on the verdict or the judge's preview to fill it. The judge's upcoming wakes: a pending debounced batch with a written event, on a host that takes handed lines (isNewestEntry), now only may wake the agent (certain: false), since an answered batch starts no turn. So does the framework's queued wake when every queued request names the messages it's for (readsDeferredWrite, readsStoredMessage, readsWakeLines), which for a direct wake naming its message was already only a maybe in 0.32.0, though the judge was told it was certain. JudgeConfig's "On reply the batch is delivered as a debounce's is" gains that exception. The fragments name the hook (.added), the upcoming wakes (.changed) and judge rules (.fixed).
The judge is told that a pending debounced batch, or a wake already queued, only may wake the agent (`certain: false`) when the scheduler would drop it once the agent has answered it. The rule the previous commit gave it was wider than the drop in three ways: - A batch with one event given a write and one given none was a maybe. The drop takes a batch's wake only when every one of its lines is answered, and a line with no write never counts as answered, so that batch always starts a turn. - An event counts as answered only by the agent its write went to (readsWriteFor gives no mark for another agent). A batch wakes every gate recipient with the same lines, so with two recipients it always wakes the one whose window the writes didn't go to, as "one resident reading a shared write does not cancel another resident's wake" shows. A write that names no agent counts for none. - A queued request that reads handed lines was a maybe whatever its lines held, none included. A batch is now a maybe only where its lines are handed and each of its events was written to the window of each agent it wakes. A queued request is a maybe only where each of its lines, or its one read, has a mark for its own agent: the test the drop applies before it reads whether the agent has answered. The tests that pinned the old rule are turned round, with a row for each case above.
On a reply verdict the gate asks the host, for each judged event with a
write, whether the agent has answered it; an event answered then keeps
the wake, since the judge answered after that answer. The framework
answered with the drop's own rule, and two of its answers turned that
around:
- The drop waits for the answer's publication where a reply is owed. The
turn's end tells the gate before its final publication, and a judge
held for the turn runs then, so it could read the answer in the
agent's context and say reply, and the wake was dropped once the
publication landed.
- The drop's doubts all answer "not done", which keeps its wake: a store
that throws, a watermark on another branch, a write drained but not
yet stored, a queued write whose landing the store can't settle, a
placement that names no message. For the verdict, "not answered" keeps
the write, so the drop could take the wake once the doubt cleared.
EventGate's `isAnswered(after)` option, which loses `replyTo`, now asks
whether the agent answered a request that carried the write, its
publication not required, and is false only when the host knows it
hasn't: the write still queued with its landing settled, no answered
watermark yet, or its row above the answered watermark on the current
branch. The drop's helpers take whether a doubt answers true; the drop
keeps false, so its path is unchanged. An event whose write names an
agent that's gone also counts as answered. With no answered watermark
yet the agent has answered nothing it could mark, so that one is known;
an answered request that carried no watermark leaves the one before it
in place, which neither the drop nor the option can tell from a write
left unanswered.
The message of "fix(gate): judge rules take the answered-batch drop",
its docs and the `.added` fragment named the option
`GateOptions.isAnswered`. It's an option of EventGate's constructor, as
`isNewestEntry` is; the docs and fragment now say so.
A judge's batch delivered with no verdict starts no turn if the agent
has answered every event, as a debounce's does, and on a reply so does
one whose events it answered after the verdict. So "wakes the agent
(fail open)" in JudgeConfig, the trace's `woke` ("whether the batch then
woke the agent"), the verdicts counter ("woke the agent") and two log
lines said more than holds. They now say the batch is delivered to wake
the agent, and JudgeConfig says when that starts no turn. The field
keeps its name.
Tests: the no-call branch (a judge refused admission, `onError: "wake"`)
delivers an answered batch as a debounce, as a failure does; the
no-verdict unit tests carry an addressed channel event and check each
line's `replyTo` as well as `after`; the fork tests check that the
ambient message reached the fork's request before its batch fires.
The `debounceMs` description that `wake_add_rule` shows the model said a debounce rule wakes the agent once after its quiet period. Under the answered-batch drop the batch's wake starts no turn when, by the time it would start the agent's turn, the agent has read and answered every event in the batch, so the description now says that too.
One conflict, in admitInbound (src/framework.ts), between this branch's `after` parameter and main's anima-research#957 (wake onboarding), which records the gate's whole decision there. Both are kept: the method takes `after` and returns the decision with `gateDecision`, and its gate evaluation passes `after` into `evaluate` while recording the decision. Every other file merged without conflict, and the branch's own +/- lines against main are unchanged but for those two lines.
The review of this branch found that a batch whose lines were handed to
the wake had them placed only by the delivery agent's own start. A
co-resident that started first read the slot with no line, and a start
that found the slot held by another reader's live turn left the lines
out, with no later start of the wake to write them, where the base wrote
them into the slot when the batch fired. A probe showed it: the
subconscious's turn alive, the resident's woken turn started, and
neither request carried the line, nor did the slot after both.
A line with a write is now owed to the residents' shared slot from the
moment the gate hands it to a wake, in the order batches fire, and the
first fresh start of any agent that reads the slot writes what's owed and
not yet answered for the agent it was written for, whatever woke that
agent. A start that finds the slot held, or the host quiesced, leaves
them owed for the next one. A line with no write, handed for its newest
message, keeps main's rule, decided by the delivery agent's starts of its
own wake: it can't be judged answered, so another reader's start could
follow that agent's answer, which main's test of the delivery agent going
first pins. The set is held in memory; a restart between a batch's firing
and the slot's first start loses its lines.
A write the host never filled in (`{ agent: '' }`, a silent push, a fork
route that never wrote) no longer counts as a write: such a batch's line
is written when it fires, as one with no write is.
The fragments now say what the review found unsaid: an event counts only
for the agent it was written for; under explicit prose routing a turn a
tool ends doesn't wait for its deliveries, so a batch whose answer is
still publishing wakes the agent; which module responses carry a write; a
partly answered batch keeps its whole batch's route; the line's
omissions and the restart window; `gate:judge-verdict.woke`; and the
changed `debounceMs` description's one-time prompt-cache miss. The tests
that showed only that no second turn ran now first show the wake was
requested with its line.
…omission keeps its wake's rule Two findings on the previous commit, each shown by a probe: - A line left out as newest stayed owed, so a later start wrote it after whatever had come since: the next wake's start, for another message still newest, wrote both lines as one and lost that message's own newest omission, and a start with no lines of its own wrote the first. The newest omission is the start deciding the agent is reading the event at the end of its window; main decides it again only on later starts of its own wake. A line left out as newest now leaves the owed set, and only the delivery agent's later starts of its wake decide it again, as a newest message's line with no write is; a line left out because the slot was held stays owed to any reader. - A batch with one event given a write was handed whole, so its events with no write were handed too, and only the delivery agent's starts could write their lines: lost when every such start found the slot held, or when the delivery agent receives no gate wakes, where main wrote the batch's line when it fired. Such a batch can't be judged answered whole, so its wake was never droppable. Now only a batch whose every event has a filled write is handed; any other batch's line is written when it fires, naming every event, and its wake comes as on main. A reply verdict's batch with an event answered when the judge answered is such a batch: that event keeps the wake without its write. The fragments say which batches the line rule covers, and how a newest omission is decided again.
…ts id The review of the branch found: - A line whose write went to a conversation fork joined the residents' owed set, where it was judged against the delivery agent, which never finds it answered: it stayed owed until any resident's start wrote it into the trunk's window, after the fork had answered it or when no batch had woken the trunk. A line is now owed to the slot only when its write went to the slot's own agent, the one whose answer the slot's check can see; any other line is decided by the delivery agent's starts of its own wake, as before. - A placement naming its agent with no message or deferred id counted as a write in the gate's handing, in what the reply judge is told of upcoming wakes, and in the owed set, though the scheduler can't judge it. One predicate, isWrite, an agent and an id, now decides all of them. Tests the earlier message said now show the wake was requested with its line didn't all: every no-second-turn test now asserts it before what happened to the wake. The provider-hold retry test pins its premise (the batch's wake with its line, answered by the failed attempt) and that the held retry no longer reads its lines; the fork tests pin that the line's write names the fork's own stored message. The fragments now say which writes the line rule covers, how one start's line orders its parts and counts a channel per name, which entries the newest omission reads, how a reply verdict's batch with an answered event is written, and the wider scope of gate:wake-line-omitted; the debounceMs description says every event has to be written for the agent.
…the house rule The review of the branch at 0ee4ab7 found WakeLine's doc saying a line not written is decided again by "the next such start", and that a single newest line is left out, neither now exact: a line left out for a held slot stays owed to the next start of a reader only if it was owed, and one left out as newest goes to the delivery agent's later starts of its own wake; a line of the wake already written and still unanswered keeps the newest one from being left out. The doc says so. `.fixed`'s judge exception now says what the isAnswered hook asks, an answer to a request that carried the write, its publication not required. The test that a newest line isn't written by a later start of another wake now asserts its premise: the line left out as newest, and no line. Comments this branch added on private code, which narrate it, are gone, per the house's comment rule; their reasons are these: - owedWakeLines holds the lines owed to the residents' shared slot, in the order their batches fired, in memory only, so a restart between a batch's firing and the slot's first start loses them. - newestWakeLines marks lines a start left out as newest: like a line with no write, they're decided again only by the delivery agent's later starts of their own wake. - owedToSlot owes a line only when its write went to the slot's own agent, the one whose answer wakeLineDone can judge; any other line, a fork's among them, goes the delivery agent's own-wake path, since another reader's start could come after the agent's turn for it. - writtenCause: a line of the start's own wake already written and still unanswered is another cause of the wake, so the newest message isn't its whole cause. - isWrite: a placement counts as a write only with its agent and the id its message waits or is stored under, which the scheduler needs to judge it. The test helpers' headers go too. placeWakeLines' doc keeps main's form, changed only where main's no longer holds, and the gate's note on handing is trimmed to the rule.
The review of the branch at c46a77d found: - A line whose write went to a conversation fork goes the delivery agent's own-wake path, but was judged answered against the delivery agent, whose check never finds another agent's write answered: the trunk's start wrote the fork's line into the trunk's window even after the fork had read and answered the message, against WakeLine's "the agent it was written for". Each line is now judged by the agent its write names, the delivery agent where it names none, and a write whose agent is gone counts as answered, as the gate's isAnswered counts it. A fork-answered line is dropped; an unanswered one is still written into the trunk's window, as on main. - The judge's tool description still said a failed or timed-out judge wakes the agent, which an answered batch no longer does. It says so now; it's part of wake_add_rule's definition, which the changed debounceMs description already changes. Tests: the fork tests pin that the trunk gets no line for the fork's answered message; an owed line left out for a held slot is written by another reader's later start with no lines of its own; a reply verdict asks isAnswered when the judge answers, not before. Four test titles that said the line stays now say for events with no write. The fragments say that a start decides a held line again rather than always writing it, that answered lines are dropped rather than traced, and that a reply verdict's line is written when its batch is delivered; placeWakeLines' doc says an answered line is dropped and which start decides a line left out.
…d wake The review of the branch at d766b6e found: - The reply judge's isAnswered hook was asked about any event with a placement, the framework's unfilled { agent: '' } among them, though its contract promises a write. It's asked about writes only now (isWrite); an event without one is never handed whatever the answer, so nothing a host sees changes but the calls it gets. - The migration note and evaluate's doc said readsWakeLines makes a wake droppable. Only AgentFramework's scheduler reads it; a host that builds its own EventGate runs its own scheduler. The texts now say the gate hands lines with their writes, AgentFramework's scheduler drops a request with readsWakeLines once every line is answered, and a host with its own scheduler judges the drop from each line's `after`. - The test that a line written to another agent's window isn't owed named an agent that didn't exist, which counts as answered, so it passed with every line owed. It now writes to a real second agent's stored message that agent hasn't answered, and fails when every line with a write is owed. The fork tests assert that the trunk's wake ran after the fire before asserting it wrote no line. The judge parameter's description now says a failed or timed-out judge doesn't wake an agent for whom every event in the batch was written and already read and answered, as debounceMs's does.
The review of the branch at 825693e found four texts that said more than the code: - isAnswered's doc still said the other events of a judged batch are handed on with their writes. An event answered before the judge answered loses its write, so the batch is delivered as any batch with an event without a write is: its line written at delivery and nothing handed, or, for one message still the newest entry, its line handed to the delivery agent's start. The doc and `.fixed`'s judge clause say so. - gate:judge-verdict's `woke`, gate_status's reply count and `.changed` said the batch was delivered; the verdict is traced and counted before delivery runs. They say the gate goes on to deliver it. - InferenceRequest.wakeLines said a line is left for a later start of the same wake; a line owed to the window is decided by any reader's start. It defers to WakeLine.
|
/review |
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. Automatic review of Findings, most severe first:
|
Conflicts only in src/framework.ts, all where this branch's write placement for the gate meets main's anima-research#975 (event suppression). Each keeps both sides: - admitInbound takes main's `opts` ({ suppressible, decided }) as its second parameter and this branch's `after` as its third, so the coalesced push lane's call, which passes `opts` alone, reads as on main. - The channel lane declares its placement before admission, as this branch does, so the placement the gate's evaluation is given is the one the fork's write or the resident's write later fills. It passes main's suppression options, then the placement. Its later write keeps main's suppressed-row stamp and drops main's declaration of the placement there, since it's declared above. - The push lane passes main's earlier suppression decision, where there is one, then the placement. - A module event's gate evaluation carries main's `suppressionAsked` and passes this branch's `added`. Every other file merged without conflict.
…more or less - Wake onboarding's offer describes a suggested debounce rule with the condition debounceMs's description already gives: it wakes once after a burst goes quiet, unless by the time it would start the agent's turn every event in the burst was written for the agent and the agent has read and answered it. The .changed fragment says so. - The .breaking fragment names hosts that render an InferenceRequest's wakeLines themselves, since wakeLineText and WakeLine.shown change for them too. Its migration says which lines the gate hands: for a batch whose every event has a write, each line with that write, and, as before, for a single event still the newest entry, its line, carrying its write where it has one. On a reply verdict, an event isAnswered counts as answered loses its write first. - The .fixed fragment's exception for a judge's reply verdict names what isAnswered counts as answered. AgentFramework's counts an event in a request the agent had already answered, and one whose writer or message is gone or where it can't tell, not only the first. - The isNewestEntry comment says which start decides a handed line: the first start of any reader of the window where its write went to the delivery agent, and otherwise the delivery agent's starts of the wake. Two test headers that said a fresh start of the wake's turn decides it now point at WakeLine's rule. - debounce-seen-wake's addressed, ambient and system cases check that the first turn read the event. An event lost before then counts as gone, and so as answered, so the ambient and system cases passed without it. On Linux with Node 24.22.2, tsc exits 0, and the 23 test files run here pass, 687 tests. With framework.ts as at the parent, wake-onboarding fails the two tests whose patterns gained the clause. With a framework.ts that loses every event deferred to a tool boundary, the three channel-event cases fail at their new premise; with the parent's test file, the ambient and system cases pass under it.
…ven when none, a module's own wake keeps its row, a read fault at the start keeps the turn - upcomingWakes: a debounced batch is certain for the agents asked where some agent's events, as delivery splits the batch by recipient, don't all carry a write to that agent's window. It required every event's write to belong to every agent asked, so a batch split between two agents read as certain for each. - A batch's wake always carries the rows its line can name (BATCH_LINE_ROWS, then BATCH_ROWS), empty where it names nothing, such as a silent tick's or an unplaced push's. A merged turn then takes it as a batch's wake and names the other batch's rows, where before it read as a wake that isn't a batch's and left the merged turn with no line. - A module's own wake for its one message takes the placement main gave it (one message, no surface, no channel), so it carries readsRow again; the gate alone keeps the stricter placement (stored now, no audience, not held from the residents). - placeBatchLine's reads (windowHolds, getMessage, batchIsNewest, the channel names) are guarded as its write is: a fault is logged, the line stays undecided, and the start goes on. It went up through beginAgentTurn, which drops the trigger. - Text: isAnswered's doc says it's asked for each event whose write names a stored message; UpcomingWake.certain and the .changed line say a batch is told by the events delivery gives each agent; .breaking says what's unchanged. - Test premise: the unread edit's batch is read by its events' contents, since the original's event stays in the batch beside its edit. - Test: the reply test's pin of a batch wake's shape takes lineRows: [], since every batch wake now carries its line rows.
…atch's cut Two conflicts, each resolved as a union: - src/framework.ts: MarkedRequest carries main's BUDGET_WAIT beside this branch's BATCH_ROWS, with batchRowsOf kept; a quiesce's parked wakes are keyed by this branch's readsRows as well as main's budget-wait mark. - test/presentation-points.test.ts: main's three closing-fork tests are kept; the wake-lines test beside them stays removed, as this branch removes placeWakeLines.
…e wake's row (red) - A waiting first start a batched wake made stands on its rows: a suppression of one releases it, and a rollback past all of them drops it. - A wake that joined a wait and reads rows is dropped once every one of its rows is gone, and kept while one is there. - A held continuation of a turn a batched wake started stands on every row of its batch: a suppression of one keeps it, and of both drops it. A suppression of one of the turn's own rows drops it, as on a single row. - The final publication's cases check, once the publication has started, that the turn is still under way and no second call was made.
…e wake's row The budget hold (anima-research#361) reads a wake's readsRow in three places; a batched wake reads its rows as readsRows here. - A fresh turn a batched wake started stands on the wake's rows, and its hold is dropped only when every one of them has left the window, since one removed message leaves the others still to answer. A turn on one row stands on it as before. The wait carries the rows (BudgetWait.rows, for its one row before), so its released start is dropped on the same rule. - A wake that joined a hold is dropped early once every row it reads is gone, as one reading a gone row was. - A continued turn's hold is dropped when any of its own rows since its start leaves, or when every row its wake read has left. The turn's routing keeps those rows (TurnRouting.triggerRows, for its one first row before), and the hold keeps the two lists apart (BudgetHold.standsOn and ownRows). On a wake of one row that is the rule as before.
…batch The doc still said a batch only may wake where each event's write was placed for each agent asked. The code asks per agent, over the events delivery gives that agent, and an agent given none doesn't count.
|
Answering the automatic review of
CreditsAda-1017 made the call on each finding. Gordon-2414 read the round and the catch-ups. Paloma-2644 built the round and wrote this comment. — Paloma-2644 |
|
/review — Paloma-2644 |
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of 55 of the 76 runs differ between the base and this head. In the files profiled hosts loaded, 52 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,151 → 208,157 tokens sent a request, 70.8% of them read from the cache, 147,211,706 → 147,199,818 written to it, 3,952,944 → 3,951,849 output, 24 thinking blocks dropped, USD 0.5823 → USD 0.5824 at list price a priced request and 123 requests with no list price. The figures of 55 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: Summariser requests carry a changed wake-rule tool definition In runs that send conversation material to a model for summarising, on compression requests carrying the tool for adding wake rules.
Delta 2: The settings tool listing changes In the wake-rule exercises, when the resident reads the available settings tools and subsequent requests retain that tool result.
Delta 3: Batch notices disappear from retained conversation In the wake-rule exercises, in context prepared for channel batches and subsequently retained in resident requests or unsent context preparations.
Delta 4: An answered batch no longer wakes after judge failure In H5/W12, which exercises wake rules, when the decision model fails after the resident has already read the batch and published an answer in its channel.
Delta 5: Wake-rule offers explain the answered-burst exception In the wake-rule exercises, when a server offers suggested wake rules and subsequent resident requests retain the offer alongside the earlier changed conversation. Follows from Delta 4.
Delta 6: Suppression-review notices carry changed numeric details (the description doesn't mention it) In the wake-rule exercises, when a review of hidden messages wakes the resident and subsequent requests retain its notice. Follows from Delta 5.
Delta 7: History searches report changed search sizes (the description doesn't mention it) In the wake-rule exercises, after the resident searches for published messages and in subsequent requests retaining those search results. Follows from Delta 6.
Delta 8: A publication result names a different message (the description doesn't mention it) In the wake-rule exercise that answers a batch before its judge fails, when the resident begins looking up a message they published.
Delta 9: Other request bodies change without changing listed messages In the wake-rule exercises, on requests continuing tool work, requests deciding whether batches should wake the resident, and requests naming the console session.
Delta 10: The final internal context receipt has an earlier sequence (the description doesn't mention it) At the end of the wake-rule exercise that answers a batch before its judge fails. Follows from Delta 4.
Delta 11: The run records a lower compiled-request total At the end of the wake-rule exercise that answers a batch before its judge fails. Follows from Delta 4.
Delta 12: Request checks judge fewer cases (the description doesn't mention it) At the end of the wake-rule exercise that answers a batch before its judge fails. Follows from Delta 4.
Runs whose records differ: 55 of 76, with 12 changes
|
H1/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,234,764 | 1,092,728 | 24,133 | 0 | 13.8844 | 0 | |
| summariser | 22 | 462,067 → 462,194 | 803,554 → 806,094 | 93,002 → 93,129 | 54,102 | 0 | 4.9947 → 4.9979 | 0 |
H1b/continuation/from-0.9.0 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 143,380 | 1,259,891 | 993,917 | 20,252 | 24 | 9.1819 | 0 | |
| summariser | 14 | 341,367 | 528,194 → 529,845 | 60,746 → 60,873 | 38,296 | 0 | 2.7230 → 2.7243 | 0 |
H1b/continuation/from-0.23.0 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 143,380 | 1,327,077 | 862,775 | 20,252 | 0 | 8.1462 | 0 | |
| summariser | 21 | 375,040 | 804,737 → 807,277 | 77,113 → 77,240 | 52,401 | 0 | 3.3260 → 3.3276 | 0 |
H1b/continuation/fresh |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 78 | 286,615 | 6,908,754 | 2,980,345 | 122,172 | 0 | 28.8144 | 0 | |
| summariser | 67 | 1,301,765 → 1,302,146 | 2,464,716 → 2,472,463 | 221,111 → 221,492 | 145,091 | 0 | 10.3707 → 10.3768 | 0 |
H1/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 192 | 1,167,886 | 41,157,946 | 3,123,362 | 236,990 | 0 | 63.5768 | 0 | |
| summariser | 87 | 1,577,199 → 1,577,580 | 3,311,858 → 3,322,399 | 177,032 → 177,159 | 174,000 | 0 | 15.6622 → 15.6707 | 0 |
H4/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 206 | 1,150,617 | 42,313,313 | 2,818,410 | 250,641 | 0 | 61.3599 | 0 | |
| summariser | 88 | 1,525,874 → 1,526,255 | 3,514,791 → 3,525,459 | 184,921 → 185,048 | 176,000 | 0 | 15.6360 → 15.6445 | 0 |
H4b/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 212 | 1,146,418 | 47,744,443 | 2,663,639 | 241,037 | 0 | 62.2666 | 0 | |
| summariser | 85 | 1,449,588 → 1,449,969 | 3,811,128 → 3,821,415 | 179,856 → 179,983 | 170,000 | 0 | 15.2021 → 15.2104 | 0 |
C3h/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 5,841,443 | 6,327,183 | 2,861,592 | 179,757 | 0 | 65.4807 | 0 | |
| summariser | 81 | 2,650,483 → 2,650,864 | 3,117,342 → 3,126,994 | 295,168 → 295,422 | 162,000 | 0 | 21.8128 → 21.8220 | 0 |
H1/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 635,688 | 26,473,291 | 10,166,262 | 181,036 | 0 | 122.6036 | 0 | |
| summariser | 123 | 2,782,111 → 2,782,492 | 4,746,672 → 4,761,658 | 346,030 → 346,284 | 246,000 | 0 | 25.8942 → 25.9061 | 0 |
H1b/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 651,979 | 24,753,546 | 11,147,479 | 182,725 | 0 | 100.3930 | 0 | |
| summariser | 123 | 2,836,342 → 2,836,723 | 4,739,740 → 4,754,726 | 344,022 → 344,276 | 247,845 | 0 | 20.0024 → 20.0089 | 0 |
C5h/W5 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 27 | 0 | 3,524,279 | 3,797,623 | 68,198 | 0 | 41.4433 | 0 | |
| summariser | 15 | 425,312 | 543,911 → 545,562 | 115,966 → 116,220 | 30,000 | 0 | 4.3082 → 4.3115 | 0 |
C8h/W6 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 27 | 0 | 4,314,093 | 2,426,435 | 30,521 | 0 | 27.1844 | 0 | |
| summariser | 7 | 248,083 | 272,812 → 273,574 | 62,702 → 62,829 | 14,000 | 0 | 2.3538 → 2.3555 | 0 |
C3h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 3,086,010 | 5,197,821 | 1,701,005 | 69,457 | 0 | 36.7754 | 0 | |
| summariser | 31 | 697,805 | 1,535,381 → 1,539,064 | 155,258 → 155,512 | 32,165 | 0 | 6.6134 → 6.6178 | 0 |
H1/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 365,297 | 13,699,570 | 2,370,770 | 79,969 | 0 | 34.3832 | 0 | |
| summariser | 36 | 722,845 | 1,934,400 → 1,938,718 | 165,560 → 165,814 | 42,165 | 0 | 7.2912 → 7.2958 | 0 |
H1/W7/merges-rejected |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 42 | 109,678 | 8,206,592 | 3,422,600 | 49,542 | 0 | 40.1162 | 0 | |
| summariser | 10 | 160,352 | 453,356 → 454,372 | 131,084 → 131,338 | 20,000 | 0 | 2.8393 → 2.8423 | 0 |
H2/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 41 | 3,111 | 4,968,984 | 253,841 | 53,133 | 0 | 6.3668 | 0 | |
| summariser | 27 | 532,271 → 533,033 | 1,023,663 → 1,026,203 | 69,114 → 69,241 | 34,110 | 0 | 4.7171 → 4.7234 | 0 |
H1/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 373,090 | 13,975,020 | 2,459,140 | 73,587 | 0 | 35.2840 | 0 | |
| summariser | 28 | 584,277 | 1,103,812 → 1,107,114 | 165,552 → 165,806 | 48,044 | 0 | 6.3299 → 6.3341 | 0 |
C14h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 376,775 | 13,548,600 | 2,832,665 | 78,455 | 0 | 38.9462 | 0 | |
| summariser | 38 | 1,776,773 → 1,781,599 | 0 | 0 | 46,165 | 0 | 10.0380 → 10.0621 | 0 |
C15h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 355,394 | 13,849,614 | 2,424,895 | 69,267 | 0 | 34.6824 | 0 | |
| summariser | 28 | 594,632 | 1,092,970 → 1,096,272 | 163,002 → 163,256 | 46,055 | 0 | 6.3010 → 6.3052 | 0 |
C16h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 333,737 | 14,037,943 | 2,412,150 | 71,642 | 0 | 34.6002 | 0 | |
| summariser | 30 | 702,555 → 703,190 | 966,333 → 969,254 | 132,834 → 133,088 | 47,803 | 0 | 6.5194 → 6.5265 | 0 |
C17h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 375,158 | 14,169,593 | 2,051,389 | 74,176 | 0 | 31.3289 | 0 | |
| summariser | 37 | 805,873 → 806,254 | 1,885,728 → 1,889,792 | 165,388 → 165,642 | 44,165 | 0 | 7.7302 → 7.7367 | 0 |
C17h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 396,516 | 13,723,056 | 2,493,041 | 75,613 | 0 | 35.6648 | 0 | |
| summariser | 31 | 634,642 → 634,769 | 1,195,984 → 1,199,540 | 167,408 → 167,662 | 52,055 | 0 | 6.7467 → 6.7516 | 0 |
C3h/W8/unenforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 1,466,835 | 1,561,916 | 589,545 | 37,113 | 0 | 14.9384 | 0 | |
| summariser | 7 | 159,821 | 199,545 → 200,180 | 102,526 → 102,780 | 14,000 | 0 | 2.2741 → 2.2770 | 0 |
C6h/W8/enforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 0 | 4,461,984 | 2,961,108 | 35,724 | 0 | 32.7352 | 0 | |
| summariser | 7 | 249,799 | 264,916 → 265,678 | 61,386 → 61,513 | 14,000 | 0 | 2.3453 → 2.3470 | 0 |
H1/W8/enforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 86,503 | 4,517,213 | 2,784,035 | 40,960 | 0 | 31.5555 | 0 | |
| summariser | 9 | 291,372 | 341,820 → 342,836 | 65,538 → 65,665 | 18,000 | 0 | 2.7331 → 2.7349 | 0 |
H4/W8/unenforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 34 | 23,492 | 478,809 | 346,169 | 19,848 | 0 | 4.3148 | 0 | |
| summariser | 1 | 7,319 | 0 | 49,069 → 49,196 | 2,000 | 0 | 0.5773 → 0.5786 | 0 |
H3/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 49 | 13,657,707 | 1,390,596 | 1,668,172 | 50,817 | 0 | 86.9360 | 0 | |
| summariser | 1 | 44,916 → 45,043 | 0 | 0 | 2,000 | 0 | 0.2746 → 0.2752 | 0 |
C3h/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 49 | 1,323,976 | 1,225,802 | 1,289,340 | 52,943 | 0 | 21.4498 | 0 | |
| summariser | 32 | 714,936 → 715,063 | 1,422,907 → 1,426,336 | 399,027 → 399,535 | 64,000 | 0 | 9.8764 → 9.8838 | 0 |
C6h/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 52 | 84,064 | 6,970,269 | 3,793,772 | 52,392 | 0 | 43.1530 | 0 | |
| summariser | 41 | 762,583 → 762,710 | 1,818,929 → 1,823,501 | 329,594 → 330,102 | 82,000 | 0 | 10.0683 → 10.0763 | 0 |
H1/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 52 | 189,718 | 9,926,744 | 4,177,967 | 57,851 | 0 | 49.1379 | 0 | |
| summariser | 38 | 787,582 → 787,709 | 1,663,543 → 1,667,734 | 317,853 → 318,361 | 76,000 | 0 | 9.8482 → 9.8560 | 0 |
H1/W14 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 9 | 19,070 | 1,613,759 | 636,498 | 10,584 | 0 | 7.5318 | 0 | |
| summariser | 2 | 26,218 | 53,996 → 54,123 | 56,024 → 56,151 | 4,000 | 0 | 0.8183 → 0.8197 | 0 | |
| transition | 1 | 7,097 | 0 | 0 | 30 | 0 | 0.0362 | 0 |
C6h/W11 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 28 | 0 | 3,994,137 | 3,287,251 | 30,609 | 0 | 35.6348 | 0 | |
| summariser | 7 | 249,799 | 363,534 → 364,296 | 204,604 → 204,731 | 14,000 | 0 | 3.8268 → 3.8285 | 0 |
H1/W11 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 28 | 80,281 | 4,048,614 | 2,866,842 | 36,507 | 0 | 32.0068 | 0 | |
| summariser | 7 | 250,857 | 350,302 → 351,064 | 190,892 → 191,019 | 14,000 | 0 | 3.6884 → 3.6900 | 0 |
P1/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 0 | 1,183,772 | 1,556,914 | 35,099 | 0 | 3.3836 | 0 | |
| summariser | 22 | 0 | 0 | 1,360,960 → 1,363,776 | 54,102 | 0 | 3.9434 → 3.9505 | 0 |
P2/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,221,746 | 3,139,456 | 0 | 35,099 | 0 | 0.0000 | 15 | |
| summariser | 22 | 1,362,453 → 1,365,269 | 0 | 0 | 166,102 | 0 | 0.0000 | 22 |
P3/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,166,341 | 1,161,151 | 24,133 | 0 | 0.0000 | 15 | |
| summariser | 22 | 462,067 → 462,194 | 716,916 → 719,202 | 179,640 → 180,021 | 54,102 | 0 | 0.0000 | 22 |
P4/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 78 | 286,166 | 7,903,455 | 9,158,247 | 136,066 | 0 | 0.0000 | 78 | |
| summariser | 61 | 1,149,186 → 1,149,567 | 2,237,272 → 2,244,384 | 190,050 → 190,304 | 132,102 | 0 | 0.0000 | 61 |
P5/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 0 | 2,839,523 | 1,484,463 | 27,940 | 0 | 0.0000 | 15 | |
| summariser | 22 | 0 | 0 | 1,361,145 → 1,363,961 | 54,102 | 0 | 0.0000 | 22 |
H5/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 84 → 83 | 51,148 → 51,235 | 8,891,870 → 8,733,952 | 1,221,665 → 1,212,551 | 68,546 → 67,451 | 0 | 14.5505 → 14.3876 | 0 | |
| concepts | 26 | 82,771 | 0 | 0 | 1,878 | 0 | 0.0922 | 0 | |
| judge | 2 | 6,255 | 23,664 → 23,523 | 23,664 → 23,523 | 67 | 0 | 0.0039 → 0.0038 | 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,440 | 4,912,357 → 4,911,245 | 3,593,509 → 3,591,971 | 64,704 | 0 | 27.0965 → 27.0868 | 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,604 | 7,606,472 → 7,590,344 | 752,607 → 751,371 | 70,580 | 0 | 10.8793 → 10.8631 | 0 | |
| concepts | 18 | 70,737 | 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 |
H6/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 141,509 | 1,010,635 | 1,305,716 | 24,594 | 0 | 2.9770 | 0 | |
| summariser | 20 | 461,693 → 461,820 | 712,854 → 715,140 | 78,806 → 78,933 | 50,102 | 0 | 0.9411 → 0.9417 | 0 |
H7/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 4,243,499 | 0 | 0 | 26,149 | 0 | 21.8712 | 0 | |
| summariser | 20 | 1,199,951 → 1,202,491 | 0 | 0 | 50,102 | 0 | 7.2523 → 7.2650 | 0 |
H1c/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 637,626 | 25,441,174 | 10,971,724 | 174,105 | 0 | 129.9786 | 0 | |
| summariser | 123 | 2,826,779 → 2,827,160 | 4,723,190 → 4,738,176 | 345,632 → 345,886 | 247,845 | 0 | 19.9737 → 19.9803 | 0 |
H1d/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 646,903 | 25,311,334 | 11,448,786 | 181,181 | 0 | 134.9076 | 0 | |
| summariser | 122 | 2,798,146 → 2,798,527 | 4,687,637 → 4,702,496 | 345,656 → 345,910 | 245,830 | 0 | 19.8120 → 19.8185 | 0 |
C9h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,773,046 | 1,356,930 | 24,133 | 0 | 16.2956 | 0 | |
| summariser | 21 | 445,011 → 445,138 | 755,473 → 757,886 | 89,192 → 89,319 | 52,282 | 0 | 4.8018 → 4.8049 | 0 |
C11h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,784,543 | 1,366,786 | 24,133 | 0 | 16.3999 | 0 | |
| summariser | 22 | 462,067 → 462,194 | 803,554 → 806,094 | 93,002 → 93,129 | 54,102 | 0 | 4.9947 → 4.9979 | 0 |
C12h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,097,317 | 908,575 | 508,866 | 24,133 | 0 | 11.6329 | 0 | |
| summariser | 19 | 456,394 → 456,521 | 707,050 → 709,209 | 84,890 → 85,017 | 48,102 | 0 | 4.6869 → 4.6899 | 0 |
C20h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,094,290 | 908,271 | 508,586 | 24,133 | 0 | 11.6148 | 0 | |
| summariser | 19 | 456,394 → 456,521 | 707,050 → 709,209 | 84,890 → 85,017 | 48,102 | 0 | 4.6869 → 4.6899 | 0 |
C18h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,930,333 | 1,400,959 | 24,133 | 0 | 16.8145 | 0 | |
| summariser | 32 | 364,311 | 1,165,505 → 1,169,442 | 82,863 → 82,990 | 74,102 | 0 | 5.0855 → 5.0887 | 0 |
C13h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,940,023 | 1,417,560 | 24,133 | 0 | 16.9854 | 0 | |
| summariser | 29 | 339,330 | 1,478,633 → 1,482,189 | 111,253 → 111,380 | 68,102 | 0 | 5.2510 → 5.2541 | 0 |
C19h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,167,405 | 1,179,518 | 24,133 | 0 | 14.7187 | 0 | |
| summariser | 17 | 165,241 | 1,852,992 → 1,855,024 | 129,501 → 129,628 | 44,102 | 0 | 4.1503 → 4.1525 | 0 |
C21h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,917,191 | 1,321,706 | 24,133 | 0 | 16.0154 | 0 | |
| summariser | 18 | 458,438 → 458,565 | 634,327 → 636,359 | 66,638 → 66,765 | 46,102 | 0 | 4.4283 → 4.4312 | 0 |
C23h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,234,764 | 1,092,728 | 24,133 | 0 | 13.8844 | 0 | |
| summariser | 22 | 494,665 → 494,792 | 785,302 → 787,842 | 78,806 → 78,933 | 54,102 | 0 | 5.0066 → 5.0098 | 0 |
H1/W18 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 6 | 14,883 | 1,016,484 | 596,000 | 8,708 | 0 | 6.7604 | 0 | |
| summariser | 3 | 27,862 | 98,636 → 98,890 | 49,318 → 49,445 | 4,001 | 0 | 0.7818 → 0.7832 | 0 |
The figures of the other 21 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 4230–4231, 4256–4257, 7270, 7607, 7609, 7618, 7620, 7857–7860, 20527, 22960, 22966–22969, 35077–35079, 35146–35148, 35155–35156, 35159–35160, 35162–35164, 35184, 35196 and 35209–35211 ran in no profiled drive; lines 979, 1302–1310, 1317, 1325–1326, 1329, 1398, 1402–1403, 1570–1571, 3187–3188, 3190–3191, 4228–4229, 4232–4233, 4236–4240, 4283–4284, 4817, 4942–4945, 5728–5729, 5776–5777, 6875–6880, 6906–6911, 7262, 22955–22956, 23059–23066, 23247–23248, 28057–28060, 28093–28094, 35061–35070, 35080–35081, 35084–35085, 35092–35113, 35149, 35165, 35168–35178, 35189–35192, 35198–35199 and 35212–35214 map to nothing the host runs.
src/gate/event-gate.ts: lines 3511, 4237–4238, 4240, 4414–4421, 4475 and 4537–4538 ran in no profiled drive; lines 53, 125–131, 137–138, 160–164, 167–168, 180–189, 193, 241–250, 417–424, 426, 2484–2486, 2488–2497, 3457–3465, 4195, 4265, 4386–4392, 4455–4457 and 4539–4541 map to nothing the host runs.
src/gate/types.ts: no profiled host loaded it: changed lines 65–68, 72–77, 392–395, 400–404 and 582–584 and its deletion after line 544.
src/index.ts: line 84 maps to nothing the host runs.
src/mcpl/tags.ts: lines 66–67 and 70–71 map to nothing the host runs.
src/types/agent.ts: lines 672–678 map to nothing the host runs; its deletions after lines 4 and 794 have no code line on either side.
src/types/trace.ts: lines 682–684 map to nothing the host runs; its deletion after line 697 has no code line on either side.
Held the same in base and head: connectome-host ba3db1807ccd, chronicle 0.6.0, context-manager 0.27.0 (the view chose it for both arms, since connectome-host's lockfile holds 0.25.0, which doesn't meet ^0.27.0 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 (5)
|
…) into gideon2613/af937-scheduler
…d a merged start's certainty (red) A start merged from wakes the scheduler could each drop once read is told to the judge as certain (review 4's 8): red here. The rest pin behaviour this change already has, each where a mutant of it passed every test before: - the line marks a supplied opening in a channel's name and id (4); - seven no-line cases now check the start's request holds the batch's message, so the verdict means something (6); - the newest-row scan reads 32 rows: a DM 31 clock rows back gets no line, 32 back gets one (12); - three targeted batches run their starts before the no-line check (13); - the line gives the oldest message's age as of the start (14); - the line's message:added trace names its row (15); - an agent given none of a targeted batch's events doesn't make its wake certain (16).
… a maybe to the judge upcomingWakesFor tells the judge and health whether a queued or provider-held request will wake the agent. A start that came back before it took its token carries the wakes it was merged from (MERGED_BATCH), and has no rows of its own, since the merge clears them where its wakes read different rows. It counted as certain, though the scheduler judges its wakes one by one and drops each the agent has answered (review 4's 8). droppableAsRead now looks inside such a start: it could be dropped when every wake in it could. Docs only, besides: - the start's comment on the line names a provider hold's release as a fresh start of the wake, which decides a line left undecided (3); - upcomingWakes' doc says it's a host whose scheduler drops a wake by its writes, as AgentFramework's does, that starts no turn (17).
… each read rows Fix 8 (155ab2a) made droppableAsRead look inside a start merged from wakes (MERGED_BATCH), so upcomingWakesFor counts such a start a maybe when every wake in it reads rows. upcomingWakes' doc said so; the type's doc, which hosts read, still named only a queued wake that reads a row. It now names the merged start too, and says "reads rows" for the queued wake, since droppableAsRead takes readsRow or readsRows. Docs only: no code or test changes.
|
Answering the automatic review of
CreditsAda-1017 made the call on each finding. Gordon-2414 read the round and the catch-up. Myrtle-2415's read of the description found the type's doc that — Paloma-2644 |
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of 55 of the 76 runs differ between the base and this head. In the files profiled hosts loaded, 54 changed source lines that map to code ran in no profiled drive: Usage: the agents' requests, subagents' included, in the 76 runs, base → head: 207,765 → 207,770 tokens sent a request, 70.8% of them read from the cache, 147,279,677 → 147,267,789 written to it, 3,958,852 → 3,957,757 output, 24 thinking blocks dropped, USD 0.5808 → USD 0.5809 at list price a priced request and 123 requests with no list price. The figures of 55 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: Summariser requests carry a changed wake-rule tool (the description doesn't mention it) In runs that write summaries, in requests to the summariser.
Delta 2: The inspected settings catalogue changes In the runs exercising wake rules, after the resident inspects the settings tools, including preparation that sends nothing.
Delta 3: Batch-count notices leave the conversation history In the runs exercising wake rules, when channel-message batches wake the resident and in later conversation history, including preparation that sends nothing. Follows from Delta 2.
Delta 4: An answered batch stays quiet after judge failure In H5/W12, which exercises wake rules, when the reply judge fails after the resident has already answered the batch through a publish tool.
Delta 5: Wake-rule offers describe the answered-event exception In the runs exercising wake rules, in the offer of suggested rules and resident requests retaining that offer. Follows from Delta 3.
Delta 6: Auxiliary review requests have changed bodies (the description doesn't mention it) In the runs exercising wake rules, in requests asking whether a batch warrants a reply or reviewing suppressed messages.
Delta 7: Suppression-review notices report different values (the description doesn't mention it) In the runs exercising wake rules, in resident requests carrying the suppression-review notice. Follows from Delta 5.
Delta 8: History searches report smaller search pools (the description doesn't mention it) In the runs exercising wake rules, in resident requests carrying search results for published or refused messages. Follows from Delta 7.
Delta 9: A publish confirmation names a different message (the description doesn't mention it) In H5/W12's wake-rule exercise, when the resident is asked to search history after publishing a message.
Delta 10: The skipped turn changes closing bookkeeping (the description doesn't mention it) At the end of H5/W12's wake-rule exercise. Follows from Delta 4.
Delta 11: Tool continuations carry changed conversation bodies (the description doesn't mention it) In the runs exercising wake rules, in resident requests continuing after tool results.
Runs whose records differ: 55 of 76, with 11 changes
|
H1/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,234,764 | 1,092,728 | 24,133 | 0 | 13.8844 | 0 | |
| summariser | 22 | 462,058 → 462,185 | 803,374 → 805,914 | 92,993 → 93,120 | 54,102 | 0 | 4.9945 → 4.9976 | 0 |
H1b/continuation/from-0.9.0 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 143,380 | 1,259,891 | 993,917 | 20,252 | 24 | 9.1819 | 0 | |
| summariser | 14 | 341,367 | 528,077 → 529,728 | 60,737 → 60,864 | 38,296 | 0 | 2.7229 → 2.7242 | 0 |
H1b/continuation/from-0.23.0 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 143,380 | 1,327,077 | 862,775 | 20,252 | 0 | 8.1462 | 0 | |
| summariser | 21 | 375,040 | 804,557 → 807,097 | 77,104 → 77,231 | 52,401 | 0 | 3.3259 → 3.3274 | 0 |
H1b/continuation/fresh |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 78 | 286,615 | 6,908,754 | 2,980,345 | 122,172 | 0 | 28.8144 | 0 | |
| summariser | 67 | 1,301,738 → 1,302,119 | 2,464,167 → 2,471,914 | 221,084 → 221,465 | 145,091 | 0 | 10.3703 → 10.3764 | 0 |
H1/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 192 | 1,167,886 | 41,157,946 | 3,123,362 | 236,990 | 0 | 63.5768 | 0 | |
| summariser | 87 | 1,577,172 → 1,577,553 | 3,311,111 → 3,321,652 | 177,023 → 177,150 | 174,000 | 0 | 15.6616 → 15.6701 | 0 |
H4/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 206 | 1,150,617 | 42,313,313 | 2,818,410 | 250,641 | 0 | 61.3599 | 0 | |
| summariser | 88 | 1,525,847 → 1,526,228 | 3,514,035 → 3,524,703 | 184,912 → 185,039 | 176,000 | 0 | 15.6354 → 15.6439 | 0 |
H4b/W1 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 212 | 1,146,418 | 47,744,443 | 2,663,639 | 241,037 | 0 | 62.2666 | 0 | |
| summariser | 85 | 1,449,561 → 1,449,942 | 3,810,399 → 3,820,686 | 179,847 → 179,974 | 170,000 | 0 | 15.2015 → 15.2098 | 0 |
C3h/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 5,841,443 | 6,327,183 | 2,861,592 | 179,757 | 0 | 65.4807 | 0 | |
| summariser | 81 | 2,650,456 → 2,650,837 | 3,116,658 → 3,126,310 | 295,150 → 295,404 | 162,000 | 0 | 21.8121 → 21.8214 | 0 |
H1/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 635,688 | 26,473,291 | 10,166,262 | 181,036 | 0 | 122.6036 | 0 | |
| summariser | 123 | 2,782,084 → 2,782,465 | 4,745,610 → 4,760,596 | 346,012 → 346,266 | 246,000 | 0 | 25.8933 → 25.9053 | 0 |
H1b/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 651,979 | 24,753,546 | 11,147,479 | 182,725 | 0 | 100.3930 | 0 | |
| summariser | 123 | 2,836,315 → 2,836,696 | 4,738,678 → 4,753,664 | 344,004 → 344,258 | 247,845 | 0 | 20.0019 → 20.0085 | 0 |
C5h/W5 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 27 | 0 | 3,524,279 | 3,797,623 | 68,198 | 0 | 41.4433 | 0 | |
| summariser | 15 | 425,312 | 543,794 → 545,445 | 115,948 → 116,202 | 30,000 | 0 | 4.3079 → 4.3113 | 0 |
C8h/W6 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 27 | 0 | 4,314,093 | 2,426,435 | 30,521 | 0 | 27.1844 | 0 | |
| summariser | 7 | 248,083 | 272,758 → 273,520 | 62,693 → 62,820 | 14,000 | 0 | 2.3537 → 2.3554 | 0 |
C3h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 3,086,010 | 5,197,821 | 1,701,005 | 69,457 | 0 | 36.7754 | 0 | |
| summariser | 31 | 697,805 | 1,535,120 → 1,538,803 | 155,240 → 155,494 | 32,165 | 0 | 6.6131 → 6.6175 | 0 |
H1/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 365,297 | 13,699,570 | 2,370,770 | 79,969 | 0 | 34.3832 | 0 | |
| summariser | 36 | 722,845 | 1,934,094 → 1,938,412 | 165,542 → 165,796 | 42,165 | 0 | 7.2908 → 7.2955 | 0 |
H1/W7/merges-rejected |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 42 | 109,678 | 8,206,592 | 3,422,600 | 49,542 | 0 | 40.1162 | 0 | |
| summariser | 10 | 160,352 | 453,284 → 454,300 | 131,066 → 131,320 | 20,000 | 0 | 2.8391 → 2.8421 | 0 |
H2/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 41 | 3,111 | 4,968,984 | 253,841 | 53,133 | 0 | 6.3668 | 0 | |
| summariser | 27 | 532,217 → 532,979 | 1,023,483 → 1,026,023 | 69,105 → 69,232 | 34,110 | 0 | 4.7166 → 4.7230 | 0 |
H1/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 373,090 | 13,975,020 | 2,459,140 | 73,587 | 0 | 35.2840 | 0 | |
| summariser | 28 | 584,277 | 1,103,578 → 1,106,880 | 165,534 → 165,788 | 48,044 | 0 | 6.3296 → 6.3338 | 0 |
C14h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 376,775 | 13,548,600 | 2,832,665 | 78,455 | 0 | 38.9462 | 0 | |
| summariser | 38 | 1,776,431 → 1,781,257 | 0 | 0 | 46,165 | 0 | 10.0363 → 10.0604 | 0 |
C15h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 355,394 | 13,849,614 | 2,424,895 | 69,267 | 0 | 34.6824 | 0 | |
| summariser | 28 | 594,632 | 1,092,736 → 1,096,038 | 162,984 → 163,238 | 46,055 | 0 | 6.3007 → 6.3049 | 0 |
C16h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 333,737 | 14,037,943 | 2,412,150 | 71,642 | 0 | 34.6002 | 0 | |
| summariser | 30 | 702,510 → 703,145 | 966,126 → 969,047 | 132,816 → 133,070 | 47,803 | 0 | 6.5188 → 6.5260 | 0 |
C17h/W7/merges-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 375,158 | 14,169,593 | 2,051,389 | 74,176 | 0 | 31.3289 | 0 | |
| summariser | 37 | 805,846 → 806,227 | 1,885,440 → 1,889,504 | 165,370 → 165,624 | 44,165 | 0 | 7.7298 → 7.7363 | 0 |
C17h/W7/chunk-refused |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 59 | 396,516 | 13,723,056 | 2,493,041 | 75,613 | 0 | 35.6648 | 0 | |
| summariser | 31 | 634,633 → 634,760 | 1,195,732 → 1,199,288 | 167,390 → 167,644 | 52,055 | 0 | 6.7463 → 6.7513 | 0 |
C3h/W8/unenforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 1,466,835 | 1,561,916 | 589,545 | 37,113 | 0 | 14.9384 | 0 | |
| summariser | 7 | 159,821 | 199,500 → 200,135 | 102,508 → 102,762 | 14,000 | 0 | 2.2739 → 2.2768 | 0 |
C6h/W8/enforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 0 | 4,461,984 | 2,961,108 | 35,724 | 0 | 32.7352 | 0 | |
| summariser | 7 | 249,799 | 264,862 → 265,624 | 61,377 → 61,504 | 14,000 | 0 | 2.3452 → 2.3468 | 0 |
H1/W8/enforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 32 | 86,503 | 4,517,213 | 2,784,035 | 40,960 | 0 | 31.5555 | 0 | |
| summariser | 9 | 291,372 | 341,748 → 342,764 | 65,529 → 65,656 | 18,000 | 0 | 2.7330 → 2.7348 | 0 |
H4/W8/unenforced |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 34 | 23,492 | 478,809 | 346,169 | 19,848 | 0 | 4.3148 | 0 | |
| summariser | 1 | 7,319 | 0 | 49,060 → 49,187 | 2,000 | 0 | 0.5772 → 0.5785 | 0 |
H3/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 49 | 13,657,707 | 1,390,596 | 1,668,172 | 50,817 | 0 | 86.9360 | 0 | |
| summariser | 1 | 44,907 → 45,034 | 0 | 0 | 2,000 | 0 | 0.2745 → 0.2752 | 0 |
C3h/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 49 | 1,323,976 | 1,225,802 | 1,289,340 | 52,943 | 0 | 21.4498 | 0 | |
| summariser | 32 | 714,927 → 715,054 | 1,422,664 → 1,426,093 | 398,991 → 399,499 | 64,000 | 0 | 9.8759 → 9.8833 | 0 |
C6h/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 52 | 84,064 | 6,970,269 | 3,793,772 | 52,392 | 0 | 43.1530 | 0 | |
| summariser | 41 | 762,574 → 762,701 | 1,818,605 → 1,823,177 | 329,558 → 330,066 | 82,000 | 0 | 10.0678 → 10.0758 | 0 |
H1/W9 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 52 | 189,718 | 9,926,744 | 4,177,967 | 57,851 | 0 | 49.1379 | 0 | |
| summariser | 38 | 787,573 → 787,700 | 1,663,246 → 1,667,437 | 317,817 → 318,325 | 76,000 | 0 | 9.8477 → 9.8555 | 0 |
H1/W14 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 9 | 19,070 | 1,613,759 | 636,498 | 10,584 | 0 | 7.5318 | 0 | |
| summariser | 2 | 26,218 | 53,987 → 54,114 | 56,015 → 56,142 | 4,000 | 0 | 0.8182 → 0.8196 | 0 | |
| transition | 1 | 7,097 | 0 | 0 | 30 | 0 | 0.0362 | 0 |
C6h/W11 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 28 | 0 | 3,994,137 | 3,287,251 | 30,609 | 0 | 35.6348 | 0 | |
| summariser | 7 | 249,799 | 363,480 → 364,242 | 204,595 → 204,722 | 14,000 | 0 | 3.8267 → 3.8283 | 0 |
H1/W11 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 28 | 80,281 | 4,048,614 | 2,866,842 | 36,507 | 0 | 32.0068 | 0 | |
| summariser | 7 | 250,857 | 350,248 → 351,010 | 190,883 → 191,010 | 14,000 | 0 | 3.6882 → 3.6899 | 0 |
P1/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 0 | 1,183,772 | 1,556,914 | 35,099 | 0 | 3.3836 | 0 | |
| summariser | 22 | 0 | 0 | 1,360,784 → 1,363,600 | 54,102 | 0 | 3.9430 → 3.9500 | 0 |
P2/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,221,746 | 3,139,456 | 0 | 35,099 | 0 | 0.0000 | 15 | |
| summariser | 22 | 1,362,277 → 1,365,093 | 0 | 0 | 166,102 | 0 | 0.0000 | 22 |
P3/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,166,341 | 1,161,151 | 24,133 | 0 | 0.0000 | 15 | |
| summariser | 22 | 462,058 → 462,185 | 716,754 → 719,040 | 179,613 → 179,994 | 54,102 | 0 | 0.0000 | 22 |
P4/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 78 | 286,166 | 7,903,455 | 9,158,247 | 136,066 | 0 | 0.0000 | 78 | |
| summariser | 61 | 1,149,159 → 1,149,540 | 2,236,768 → 2,243,880 | 190,032 → 190,286 | 132,102 | 0 | 0.0000 | 61 |
P5/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 0 | 2,839,523 | 1,484,463 | 27,940 | 0 | 0.0000 | 15 | |
| summariser | 22 | 0 | 0 | 1,360,969 → 1,363,785 | 54,102 | 0 | 0.0000 | 22 |
H5/W12 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 88 → 87 | 73,672 → 73,846 | 9,240,385 → 9,080,460 | 1,281,106 → 1,271,992 | 69,169 → 68,074 | 0 | 15.3860 → 15.2225 | 0 | |
| concepts | 26 | 82,771 | 0 | 0 | 1,878 | 0 | 0.0922 | 0 | |
| judge | 2 | 8,199 | 24,351 → 24,211 | 24,351 → 24,211 | 67 | 0 | 0.0041 | 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,347 → 46,434 | 4,912,225 → 4,911,113 | 3,593,245 → 3,591,707 | 64,704 | 0 | 27.0948 → 27.0851 | 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,686 → 54,598 | 7,606,112 → 7,589,984 | 752,583 → 751,347 | 70,580 | 0 | 10.8789 → 10.8627 | 0 | |
| concepts | 18 | 70,737 | 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 |
H6/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 141,509 | 1,010,635 | 1,305,716 | 24,594 | 0 | 2.9770 | 0 | |
| summariser | 20 | 461,684 → 461,811 | 712,692 → 714,978 | 78,797 → 78,924 | 50,102 | 0 | 0.9411 → 0.9417 | 0 |
H7/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 4,243,499 | 0 | 0 | 26,149 | 0 | 21.8712 | 0 | |
| summariser | 20 | 1,199,771 → 1,202,311 | 0 | 0 | 50,102 | 0 | 7.2514 → 7.2641 | 0 |
H1c/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 637,626 | 25,441,174 | 10,971,724 | 174,105 | 0 | 129.9786 | 0 | |
| summariser | 123 | 2,826,752 → 2,827,133 | 4,722,128 → 4,737,114 | 345,614 → 345,868 | 247,845 | 0 | 19.9732 → 19.9798 | 0 |
H1d/W2 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 147 | 646,903 | 25,311,334 | 11,448,786 | 181,181 | 0 | 134.9076 | 0 | |
| summariser | 122 | 2,798,119 → 2,798,500 | 4,686,584 → 4,701,443 | 345,638 → 345,892 | 245,830 | 0 | 19.8115 → 19.8180 | 0 |
C9h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,773,046 | 1,356,930 | 24,133 | 0 | 16.2956 | 0 | |
| summariser | 21 | 445,002 → 445,129 | 755,302 → 757,715 | 89,183 → 89,310 | 52,282 | 0 | 4.8015 → 4.8047 | 0 |
C11h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,784,543 | 1,366,786 | 24,133 | 0 | 16.3999 | 0 | |
| summariser | 22 | 462,058 → 462,185 | 803,374 → 805,914 | 92,993 → 93,120 | 54,102 | 0 | 4.9945 → 4.9976 | 0 |
C12h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,097,317 | 908,575 | 508,866 | 24,133 | 0 | 11.6329 | 0 | |
| summariser | 19 | 456,385 → 456,512 | 706,897 → 709,056 | 84,881 → 85,008 | 48,102 | 0 | 4.6867 → 4.6897 | 0 |
C20h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 1,094,290 | 908,271 | 508,586 | 24,133 | 0 | 11.6148 | 0 | |
| summariser | 19 | 456,385 → 456,512 | 706,897 → 709,056 | 84,881 → 85,008 | 48,102 | 0 | 4.6867 → 4.6897 | 0 |
C18h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,930,333 | 1,400,959 | 24,133 | 0 | 16.8145 | 0 | |
| summariser | 32 | 364,311 | 1,165,226 → 1,169,163 | 82,854 → 82,981 | 74,102 | 0 | 5.0853 → 5.0885 | 0 |
C13h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,940,023 | 1,417,560 | 24,133 | 0 | 16.9854 | 0 | |
| summariser | 29 | 339,330 | 1,478,381 → 1,481,937 | 111,244 → 111,371 | 68,102 | 0 | 5.2508 → 5.2539 | 0 |
C19h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,167,405 | 1,179,518 | 24,133 | 0 | 14.7187 | 0 | |
| summariser | 17 | 165,241 | 1,852,848 → 1,854,880 | 129,492 → 129,619 | 44,102 | 0 | 4.1501 → 4.1524 | 0 |
C21h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 2,917,191 | 1,321,706 | 24,133 | 0 | 16.0154 | 0 | |
| summariser | 18 | 458,429 → 458,556 | 634,183 → 636,215 | 66,629 → 66,756 | 46,102 | 0 | 4.4281 → 4.4310 | 0 |
C23h/continuation |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 15 | 147,291 | 3,234,764 | 1,092,728 | 24,133 | 0 | 13.8844 | 0 | |
| summariser | 22 | 494,656 → 494,783 | 785,122 → 787,662 | 78,797 → 78,924 | 54,102 | 0 | 5.0064 → 5.0095 | 0 |
H1/W18 |
kind | requests | input | read from the cache | written to it | output | thinking dropped | list price, USD | unpriced |
|---|---|---|---|---|---|---|---|---|---|
| agent | 6 | 14,883 | 1,016,484 | 596,000 | 8,708 | 0 | 6.7604 | 0 | |
| summariser | 3 | 27,862 | 98,618 → 98,872 | 49,309 → 49,436 | 4,001 | 0 | 0.7817 → 0.7831 | 0 |
The figures of the other 21 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 4230–4231, 4260–4263, 7277, 7614, 7616, 7625, 7627, 7864–7867, 20534, 22967, 22973–22976, 35085–35087, 35154–35156, 35163–35164, 35167–35168, 35170–35172, 35192, 35204 and 35217–35219 ran in no profiled drive; lines 979, 1302–1310, 1317, 1325–1326, 1329, 1398, 1402–1403, 1570–1571, 3187–3188, 3190–3191, 4228–4229, 4232–4233, 4236–4240, 4256–4259, 4289–4290, 4823, 4948–4951, 5734–5735, 5782–5783, 6881–6887, 6913–6918, 7269, 22962–22963, 23066–23073, 23254–23255, 28064–28068, 28101–28102, 35069–35078, 35088–35089, 35092–35093, 35100–35121, 35157, 35173, 35176–35186, 35197–35200, 35206–35207 and 35220–35222 map to nothing the host runs.
src/gate/event-gate.ts: lines 3511, 4237–4238, 4240, 4415–4422, 4476 and 4538–4539 ran in no profiled drive; lines 53, 125–131, 137–138, 160–164, 167–168, 180–189, 193, 241–250, 417–424, 426, 2484–2486, 2488–2497, 3457–3465, 4195, 4265, 4386–4393, 4456–4458 and 4540–4542 map to nothing the host runs.
src/gate/types.ts: no profiled host loaded it: changed lines 65–68, 72–77, 392–395, 400–405 and 583–585 and its deletion after line 545.
src/index.ts: line 84 maps to nothing the host runs.
src/mcpl/tags.ts: lines 66–67 and 70–71 map to nothing the host runs.
src/types/agent.ts: lines 672–678 map to nothing the host runs; its deletions after lines 4 and 794 have no code line on either side.
src/types/trace.ts: lines 682–684 map to nothing the host runs; its deletion after line 697 has no code line on either side.
Held the same in base and head: connectome-host 3e715b4e08cf, chronicle 0.6.0, context-manager 0.27.0 (the view chose it for both arms, since connectome-host's lockfile holds 0.25.0, which doesn't meet ^0.27.0 from the base), membrane 0.8.1.
|
Reviewed at
|
main brings, among much else, the wake scheduler's batch rows (anima-research#972), the budget wait that holds a refused turn (anima-research#361) and the renamed rewind notice (anima-research#1000). Where they meet this change, each side is kept: - InferenceRequest keeps this change's openingMessages beside main's readsRows, and MarkedRequest is main's, with BUDGET_WAIT and BATCH_ROWS, beside this change's FollowOnMarks type. - A module's answer. main splits the write a wake reads (wakeAfter, which feeds readsRowFor) from the write the gate counts as in the window (added, now only a stored write given no audience and not held from residents). The opening ids stay collected from every stored placement, whatever added's rule says: added decides what the gate counts as in the window, which isn't what the speech hook is told about the turn's opening. - The hold's fold of a merged start's own causes. main's wait-marked branch comes first, unchanged: a start that carries a wait when no member of its batch does, and equals none of them, goes back as its own member. Where main folds the start's own channels into the batch's first member, its own opening ids fold in with them (mergedMarks), and main's wait mark then goes to the member equal to the start, as before. - The quiesce park's keep takes mergedMarks of the pair, which gives main's channels and adds the opening ids, then main's batch rows. The wakeLines field this change carried at the park and the merged start is gone with main's removal of it. - The merged start keeps this change's openingMessages line beside main's readsRows and batch rows. - docs/dendrite.md keeps this change's paragraph on the hook, with main's added start name ("while your turn waited", after a wait for compression). - anima-research#972 added readsRows and the batch rows to what sameInferenceRequest compares, and to the test file's identityKeys. The two hold tests for opening messages take main's form, as the tests beside them do: symbol-keyed records with keys from identityKeys. One of them had its own list, naming the removed wakeLines and lacking the two new keys; the other no longer typechecked with the symbol in the list. - anima-research#1000 renamed the rewind notice's tag. The receipts test that checks the retry after a rewind reads NOTICE_TAG.refusalRewind instead of the old literal, since it's about the retry, not the tag's spelling.
…ed batch leaves the tick's silent turn Since anima-research#972, a debounced batch's wake starts no turn once the agent has answered every event in it. Delivery took a batch's silent ticks out before building the other events' wake, and woke an agent as the tick only where nothing else woke it. So an agent whose share held a tick and an answered event lost the tick's turn: the batch's wake was dropped, and no tick's wake was left. Delivery now wakes every agent the ticks reach as the batch's last tick, beside any wake for the other events. Where those events are answered, their wake drops and the tick's silent turn runs. Where they aren't, both wakes start one turn, which is ordinary, as any merge with a non-silent wake is. The tick's wake carries the batch-line rows mark, empty, so that merge keeps the other batch's [Gate:] line. Tests: - The channel-message and reminder cases are now batched with no turn running, so nothing answers them first; each checks one ordinary turn with the batch's line. - A new case has the last turn answer the message, and checks the tick's silent turn. - The origin-silent push case moves to the no-line rule for an event stored as its own message: it checks the message is stored and its wake is the batch's. - The fork-line case is retired. Under that rule no line is written at delivery for a reminder batch, and each start decides its own, so "one line, not two" can no longer fail. What a tick left in the grouping still breaks is the reminder's writes, which the answered-message case catches. - debounce-seen-wake's tick case reads the tick's own wake.
…-calls Five files conflicted. The docs keep both sides: the trace's woke, JudgeConfig, UpcomingWake and its certain, the verdicts with refused, the judge parameter's text, health's upcoming wakes and EventGate.upcomingWakes. The failure log line takes main's "is delivered to wake the agent" and keeps this branch's "is dropped without waking the agent". A reply's delivery takes main's answeredWhenJudged mapping, with this branch's policyName for deliverOrBuffer. A refused call keeps this branch's refusedJudging, which under "wake" delivers the batch and its queue with their writes, as main's path for a call that made none did. The debounce entry keeps this branch's condition, a judge rule's batch with no judge wired listed as a debounce's, with main's per-agent certainty. Four tests are turned to the merge. main's debounce-seen-wake case for a refused call traces 'refused', this branch's verdict for it. main's strict-rules test of a batch whose line can't be written quotes the error, as this branch's logUnsent does. This branch's tests of a refused batch decided once the refusal's wait ends, and of a batch queued behind a call delivered with it on a reply, read the wake's writes where they read a "Gate: 2 events matched" line, which main no longer writes for events stored at arrival; their gate is told the agent hasn't answered (isAnswered), so a reply keeps each event's write.
… certainty, as anima-research#972 meets them anima-research#972 lists a queued wake, and a turn a provider hold keeps, as only maybe waking the agent when every request in it reads rows, since the scheduler drops such a wake once the agent has answered them. The reply judge's failed-turn line chose its ending only from certain wakes, so such a turn read as nothing running it again. It now says, after a certain queued wake and a certain held one, that a queued wake, else the soonest held one, may be dropped without running a turn, and that if it is, anything that woke the last turn and hasn't been answered stays unanswered until something else wakes the agent, with the held wake's time where it has one. Events buffered behind a turn or the host's quiesce go out through the same delivery as a fired debounce's batch, so their wake carries the events' writes and starts no turn once the agent has answered every one. Their entry in upcomingWakes is now certain only where a debounced batch's is, by one helper both entries call (surelyWakes): delivering events surely wakes one of the agents named when one of them is given an event without a message of its own whose write was placed for it; otherwise it only may, since a host whose scheduler drops such a wake by its WakeProvenance.writes, as AgentFramework's does, starts no turn for an agent that has read and answered every one. UpcomingWake.certain's doc names them, and the changed and fixed fragments say both.
Under H5 alone, after the paired batch, the agent adds two rules: one debouncing for 60 s anything whose text carries `[[mix]]`, the other debouncing for 60 s the watched mount's changes to a path holding `w12-mix`. A message on `w12-mix` and one typed at the console, each carrying `[[mix]]`, form one batch. The agent reads the channel message in a turn `w12-always` wakes before the window ends, and the step that moves the clock past the window delivers the batch. Then a file written into the watched mount, whose change the workspace stores as one message, forms a batch of the second rule, delivered at the next step that moves the clock past its window. No run's batch held console input, which the host stores at arrival and agent-framework quotes in a gate line all the same, nor a module event that stores a message, so a change to which of a batch's events its gate lines quote, such as anima-research/agent-framework#972's, showed in no record. Requirement: the record shows, for each batch, the gate lines its wake's request carries, which events they quote and which they count as shown already, and that the batch's wake still starts a turn. Not here: batches a judge rule holds while its judge is still deciding on an earlier one, and a batch held behind a turn that's running, which agent-framework merges into the next. Reaching those so that every run puts each request at the same step takes harness pieces of their own: the stand-in's reply judge holding its answer while a step's acts run, a judged step knowing the window of a rule the agent adds as it runs, a decision waiting for two verdicts, a clock move that ends where a hold's acts left the clock past its target, and a decision on a delivered step. They go in a later release, with their own review. Neither batch has a message addressed to the agent, so each turn speaks with no channel of its own, as the paired batch's does, and both steps are marked so. It adds seven steps under H5: the rules' turn, a delivery and a console message held for the batch, the reading turn, the batch's turn, the file write and the second batch's turn. H5/W12 took 19.1 s against 16.8 s before it, where H5b/W12 and H5c/W12, which it doesn't change, each moved by 0.9 s in the same arms, so about 1.4 s of the difference is the steps'. H5's fixture registers one more channel at its start, which moves a store id the suppression review's notice names, so H5/W12's record differs from `review` on. CHECKS.md's W12 paragraph says what the steps do. Two unit tests' lists change with it: W12's turns no addressed message wakes gain `mix.console`, `mix.fire` and `mix.wfire`, and its console steps gain `mix.console`, held by its rule. Shown by a view of #972, with packs of its base and merge (both 0.34.0) forced over connectome-host `3e715b4`. With the harness before this commit the arms differ in all three runs, first at `set`, from #972's changes to what W12 already does. With this commit, at `mix.fire` the base's request carries one line, "[Gate: 2 events matched]", quoting the console message and counting the w12-mix message as shown already, and the merge's carries two one-event lines, one quoting the console message, one counting the w12-mix message; at `mix.wfire` the base's line quotes the workspace event, and the merge's request carries none. Each batch started one turn in both arms. Under each pack, H5b's and H5c's records are the harness's before it. Every run passed in all four arms, and the harness's unit tests pass.
…tes for them Three things the W12 steps don't reach were said only in commit messages, not where a reader of a view meets W12, and two sentences stopped being true when the steps came in. - What W12 leaves out now names a grep's `incomplete` list, which no step makes; a second batch joining a turn already open, which needs a provider hold the driver can't wait out; and batches a judge rule holds while its judge decides on another, or held behind a running turn, which need harness pieces it doesn't have. - The gate line: anima-research/agent-framework#972 writes none for a batch whose events were stored at arrival and shown, such as the watched file's change at `mix.wfire`, but for the `[[mix]]` batch it writes one line quoting the console message and one counting the channel message as shown already. CHECKS.md said it writes none for all of W12's events. - The partly read batch: W12 checks it of every batch the agent read in part, the `[[mix]]` batch now among them, as CHECKS.md says. - W12's property said a batch's request carries "the gate's line counting them", where the check only holds a line, when there is one, to no more events than the batch holds, and asks for the events the agent hadn't read. It now says so.
…s main The acceptance job built agent-framework at aa134e75fc (Nov 8). main has moved since, among them the wake scheduler's batch rows (anima-research/agent-framework#972), which change how the host drops a wake whose rows the agent has read, and that is how 2.0's wakes reach an agent. The job now builds 36b6dfe9de, with a lockfile made from a checkout of it by `npm install --package-lock-only`: agent-framework 0.34.0, context-manager 0.27.0, membrane 0.10.2, chronicle 0.6.0 and mcpl-core 0.4.0. The three host constants the code derives its bounds from are unchanged there, so no bound changes: DEFAULT_REQUEST_TIMEOUT_MS (60 s) and INITIALIZE_TIMEOUT_MS (30 s) in src/mcpl/server-connection.ts, and DEFAULT_TOOL_RESULT_INLINE_MAX_CHARS (24,000) in src/tool-result-history.ts. Their comments now cite the new commit.
…w ends anima-research/agent-framework#972 gives the push lane's write placement to admission, so a debounced push's batch wake carries the rows it is for, and the scheduler drops it once an answered request has carried them, and, for a push its server didn't mark ambient or a system notice, once the agent has also spoken in its channel after reading it. No run debounced a push, so nothing showed whether such a wake still starts a turn. W13's recipe gains `w13-held-push`, after `w13-quiet`: push events whose text holds `[[held-push]]`, debounced 30 s, the shortest delay the harness's virtual timers take. It is in every setup's recipe, since a workload's recipe replaces a setup's rules and isn't told the setup. Only Hlatest's new pushes carry the mark. Under Hlatest, after the re-pin and before the last turn: - `held`: a push on `w13-push` tagged `chat:ambient` and `chat:from-human`, as discord-mcpl tags a message on a channel the agent hasn't opened that doesn't mention it. The rule holds it, so no request comes at its step. - `held.wake`: the clock moves 31 s and the batch starts a turn. Its first round calls the fixture's tool, the reply held while a second such push arrives through the hold's `push` act. The next round carries the second push, and `skip_reply` ends the turn, which writes no receipt. - `held.again`: the clock moves 31 s, past the second push's window, with a `skip_reply` spare and no fate. The pushes are ambient because a push not marked so has its wake dropped only once the agent has spoken in its channel, and no W13 turn speaks in `w13-push`. CHECKS.md lists that case as left out. Run on a Linux VPS, every W13 run, with this harness and with its parent, each against #972's base (6c78109) and merge (36b6dfe) packed over connectome-host 3e715b4: - with the parent, no W13 record differs between base and merge; - with this harness, only Hlatest/W13's record differs from the parent's, first at `held.wake`; - `held.wake` makes two requests in both arms, the second carrying the second push; - at the base, `held.again` starts one turn, whose request carries the base's `[Gate: 1 event matched]` line; at the merge it starts none, and the host logs one dropped wake; - every run passes, with no flag, and Hlatest/W13 took 0.2 to 0.4 s longer per drive, within the other W13 runs' variation between the two harnesses.
main brings the debounce notices' wake channels (anima-research#948), the scheduler's merges (anima-research#972), budget holds' turn carries, and batched wakes that read rows. Seven hunks conflicted, in src/framework.ts and src/types/agent.ts; the rest merged cleanly. The rewind retries carry both the answered message and the wake channels. This branch queues all three retries (refusal-rewind-retry, unstick-retry, inference-failure-rewind-retry) through rewindRetry, which gives a retry the channel and message its turn answered. main gives the same retries their turn's wake channels (wakeChannelsMark). Neither replaces the other, so rewindRetry now takes the turn's routing and reads both from it: routing.answers for channelId, channelServerId and answersMessageId, and wakeChannelsMark(routing) for wakeChannels. doRewind passes streamRouting, as main does, which is the object turnRouting holds for the stream's life (beginAgentTurn sets it at each start; only disposal deletes it). The breaker passes turnRouting's entry, as both sides did. Kept both sides: - answersSameMessage beside main's droppableAsRead. wakeLineKey goes, since main removed its last use. - holdRequest: this branch's clearing of answersMessageId for two wakes of different messages, beside main's read of the kept request's carry, which comes first. - The quiesce's coalescing: the same clearing, beside main's wakeChannels and batch rows. mergeWakeLines goes, as on main. - The merged start: answersMessageId only where every merged wake answers the trigger's message, beside main's readsRows and batch rows. wakeLines goes. - InferenceRequest: answersMessageId beside readsRows. main's gate batch wakes (requestInference, readsRowsFor) set no answersMessageId, so a batch still answers no single message, as answersMessageId's doc says. This branch's four answersOn wake sites and its turn-start answers came through unchanged.
Why. Under a
debouncerule, an agent that has already read and answered an event still gets a second turn for it, whose only new input is a[Gate: …]line about messages already in its window. #970 proposed writing that line at the turn's start; this change writes one there only where something else follows the batch's messages, since otherwise they're the last thing the agent reads.A debounced batch's wake now starts no turn for an agent that has read and answered every event in it. The
[Gate: …]line written when the batch is delivered names only the events that have no message of their own in the window. The turn's start names the batch's other messages only where something else follows them.This addresses #814 and #970.
Events with a message of their own are MCPL channel messages and pushes, message-mode heartbeat ticks and reminders, and some module events. Such a module event's response stored exactly one message, for every agent and not held from the residents. It was stored as the event arrived, not kept in memory by a surgery's hold or for its agent's recovery. Neither the event nor that message names a channel, and the event isn't console or API input. A silent heartbeat tick stores nothing, so it has no message of its own and no text to quote.
A batch the agent has read and answered
main): the agent gets a turn for it. Where the batch's messages are already in its window, that turn's only new input is the batch's[Gate: …]line.chat:ambientorchat:system, the agent must also have published there since reading it. An event whose message is gone counts as answered. UnderproseRouting: 'explicit', a reply still being delivered when a tool ends the turn doesn't count yet, so there the batch's wake still starts a turn, as onmain.main.judgerules: where no judge decided ajudgerule's batch, it's dropped as adebouncebatch is. No judge decided it when none is wired, or when the judge failed, timed out or made no call underonError: "wake". On a reply verdict the batch is dropped the same way, except that an event the agent had already answered when the judge answered keeps the wake.The batch's
[Gate: …]linemain): it's written when the batch is delivered. It counts MCPL channel messages and pushes by channel, as "2 messages in work (oldest ~0s ago) — already shown above at arrival; this is a batched wake, not new content". It quotes every other event, a module event whose response stored its own message among them. For a batch of one message that's still the newest entry, the line is left to the turn's start, which writes it only if something else follows the message by then.main's words, as the agent's own row. A message with no channel is named "with no channel". Clock rows, stored injections, the start's own notices, the batch's own quote line and an unobserved co-resident's own round don't count. The agent's own rows do. Past the window's 32 newest rows that don't count, the start writes the line.maindoes this for a batch of one message. The head does it for any batch, once per wake, in each woken agent's own window.main, a line quoting it. Under conversation routing, the trunk is woken for a fork's messages, which aren't in its window. It no longer gets a line saying they were "already shown above". A silent heartbeat tick, which has no text, gets no line either.main's line counted it as a message "already shown above at arrival", which was false.What the reply judge and
healthSnapshot()are told of upcoming wakesmain): a pending debounced batch, a queued wake and a turn a provider cooldown holds are eachcertain: true.certain: falsewhere it starts no turn once the agent has answered what it's for. For a pending debounced batch, that's where each event delivery gives that agent has a message of its own written to its window. For a queued or held turn, it's where each of its requests carriesreadsRoworreadsRows, or is a start merged from wakes that each do.The descriptions agents read
main):wake_add_rule'sdebounceMs: "Shorthand for { debounce: ms }: wake once after ms of quiet (100–300000)."wake_add_rule'sjudge: "If the judge fails or times out you are woken, unless your host set it to stay quiet then."debouncerule: "wake you once, ‹span› after a burst goes quiet".debounceMs: "Shorthand for { debounce: ms }: wake once after ms of quiet (100–300000), unless by the time it would start your turn every event in the batch was written for you and you've read and answered it."judge: "If the judge fails or times out you are woken, unless your host set it to stay quiet then or every event in the batch was written for you and you've already read and answered it."The docs hosts read
main):JudgeConfig: "On reply the batch is delivered as a debounce's is; on wait the agent isn't woken" and "A judge that fails or times out wakes the agent (fail open), unless the host set itsonErrorto"skip"."UpcomingWake: "Something that will (or, for a batch going to the judge, may) wake the agent with no new event". Itscertain: "False when it only may wake the agent (a judge rule's batch goes to the judge then)."gate:judge-verdict'swoke: "whether the batch then woke the agent (an error does by the host's onError)".GatePolicyStats'verdicts: "Verdicts so far: woke the agent, let the batch go by, and judge failures."WakeProvenance: "Ids only, never content or display names, exceptline, which is the batch's own text for the agent's window."JudgeConfig: "On reply the batch is delivered as a debounce's is, except that an event the agent had already answered when the judge answered keeps the wake, since the judge answered after it (EventGate'sisAnswered; a host without it keeps the wake for every event); on wait the agent isn't woken" and "A judge that fails or times out delivers the batch as a debounce's is (fail open), unless the host set itsonErrorto"skip". The wake then carries the batch's writes where the host gaveevaluateone for each event in the window (WakeProvenance.writes), so a host that drops an answered wake, as AgentFramework does, starts no turn when the agent has answered every event."UpcomingWake: "Something that will (or, for a batch going to the judge, or a wake that starts no turn once the agent has answered what it is for, may) wake the agent with no new event (certain)". Itscertain: "False when it only may wake the agent: a judge rule's batch goes to the judge then, and a debounced batch whose events delivery gives the agent each have a message of its own written to its window (WakeProvenance.writes), or a queued wake that reads rows, or a start merged from wakes that each read rows, starts no turn once the agent has read and answered them."woke: "whether the gate goes on to deliver the batch to wake the agent (an error's is by the host's onError). JudgeConfig says when such a delivery starts no turn."verdicts: "Verdicts so far: reply (the batch sent on to delivery to wake the agent, as JudgeConfig says), wait (the batch let go by), and judge failures."WakeProvenance: "Ids only, never content or display names."The API (breaking)
main):EventGate'sisNewestEntryoption,WakeProvenance.line,InferenceRequest.wakeLines, theWakeLineandwakeLineTextexports, and thegate:wake-line-omittedtrace, all published in 0.27.0. A batched wake that writes its line passes the line's placement asrequestInference'safter. The delivery agent's request carries the line'sreadsRow.afterand carries noreadsRow. Its writes, the line's among them, areWakeProvenance.writes. The framework's request carries them asreadsRows, and the framework drops the wake once the agent has read and answered each. Added:EventGate.evaluate(info, after), theWakeWritetype,InferenceRequest.readsRowsand EventGate'sisAnswered(after)option. Unchanged: when the gate requests a wake, and a wake that isn't a batch's, which still carriesreadsRowwheremaingave it one.EventGate: if it givesevaluateno write, it gets no line for channel messages and pushes. Its batch's wake then always starts a turn.evaluateignores a write given with a folded render (GateEventInfo.folds).@antra-tess, this changes the eight documented rules quoted above, and removes the six published names above.
Prompt cache:
wake_add_rule's parameter descriptions change. So an agent that has that tool misses the prompt cache once, from its tool definitions on, at its first request after the upgrade.It's built on #937, by @theaspirational, and carries its commits. It replaces that pull request's publication fence and 65-second deadline with the scheduler's own wait.
The tests drive the framework and the gate with mock providers. No live host ran this change.
changelog.d/debounce-answered-writes.breaking.md,.added.md,.changed.mdand.fixed.md.Credits
@theaspirational wrote #814's requirement tests and
evaluate(info, after)in #937. Gideon-2613 built the earlier rounds, which Cordelia-2434 and Crispin-2713 read, and Crispin-2713 mergedmaininto them. Paloma-2644 rebuilt it onmainas this change. Myrtle-2415's read of this description found the case of a message held from the residents. Hamish-2699, Humphrey-2407 and Hilda-2681 read it, Gordon-2414 checked its architecture fit and whether it's ideal and read each later round and merge, and Ada-1017 chose the route. Paloma-2644 wrote this description.Details for agents
At
34ec10068edd, whose merge base withmainis6c7810995c34.Problem
At
152ee76fbadd, adebouncerule's batch is delivered when its timer fires. If a turn or the host's quiesce holds it then, it's delivered once neither does. The gate writes the batch's[Gate: …]line then, and the delivery agent's wake carries that line'sreadsRow. Suppose the agent read and answered the batch's events before that, at a tool boundary for instance. Then the line is a row the agent hasn't read, so the wake starts a second turn, whose only new input is the line. #814 shows it at 0.27.0 with aclock:reminderevent under{ debounce: 200 }. At152ee76fbadd, each of #814's ten requirement cases in this change'stest/debounce-seen-wake.test.tsmakes a second model call (Tests).Changes
src/gate/event-gate.ts:evaluate(info, after)takes where the host put the event's own message (WritePlacement). The host may fill it in until the event's batch is delivered. An event given one counts as in the window, as an MCPL event does. A folded render takes none: agent-framework never gives it one, and the gate ignores one given.deliverBatchquotes in the line only the events not in the window. It writes no line when there are none.writes: each in-window event's write, with the channel a reply is owed in. Where a line was written, the line's own placement is among them.writesis present only when every in-window event was given its write.BATCH_LINE_ROWS, an internal mark, not part ofWakeProvenance). They are the line's placement where a line was written, and each in-window event's placement, whether or notwritesis present. The list is empty where the batch has nothing to name, so a merged turn still takes the wake as a batch's.isAnswered(after)for each event whose write names a stored message (answeredWhenJudged). An event answered then loses its write, so the batch's wake carries no writes and starts its turn. Its placement stays among the line's rows.upcomingWakesmarks a pending debounced batchcertain: falsewhere each agent asked is given none of its events, or each event delivery gives that agent is in the window, with a write placed for it.isNewestEntry,referenceLine,wakeLineText,WakeLineandGateEntryRef.src/framework.ts:readsRowsFormaps a wake's writes to rows for the woken agent. A write placed for another agent leaves the wake plain. So a co-resident's wake, and the trunk's for a fork's message, start their turns.rowDone, with each row's ownreplyTo), asmaindrops a wake's onereadsRow.evaluatefrom the channel lane, routed anddeliverToforks included, and from the push lane and the heartbeat. From the module path, it passes one only for an event with a message of its own, as the top defines it. A message stored only for the agents its response asked inference for, one held from the residents, or one kept in memory by a surgery's hold or for its agent's recovery gets none, so its event is quoted, as onmain. The module's own wake for its one message still carriesmain'sreadsRow.isAnswered. That counts an event answered when a request the agent answered carried it, whether or not the agent had published there. It also counts one whose writer or message is gone, or where it can't tell. A store it can't read is logged.upcomingWakesFormarks queued and provider-held turnscertain: falsewhere each request carriesreadsRoworreadsRows(droppableAsRead). A start merged from several wakes (MERGED_BATCH) counts so where each of them does, since the scheduler judges them one by one.debounceMs, the judge parameter and the onboarding offer.BATCH_LINE_ROWSnames (BATCH_ROWS, an internal mark, not on the exported type). At a fresh start that doesn't resume a turn, after the turn's inputs and before its own notices,placeBatchLinewrites one line naming those rows its window holds, by count and channel, a channel by thechannelNameits message carries where it has one, wherebatchIsNewestfinds a row a reply could be meant for after them. That reads the presented window, the start's request, past clock rows, stored injections and the batch's own quote line. A window still in legacy mode, its write-down refused, is read as the record through the agent's view, and there only the delivery agent writes the slot's line. A fault reading the window is logged, the line stays undecided, and the start goes on, as for a write that fails.placedBatchRows), and none while quiesced. A line left out is decided again at a later fresh start, such as a provider hold's release.mergedBatchRows). When a wake that isn't a batch's is merged in, it gets none, since the merged turn speaks where its newest message is. A batch's wake with nothing to name, such as a silent tick's, carries an empty list and doesn't take the line away. The quiesce park's dedup merges the same way, and a hold keeps two wakes apart that differ only in their rows (sameInferenceRequest).readsRow. A fresh turn a batched wake started, held for compression, stands on the wake's rows, and is dropped only when every one has left the window. A wake that joined the hold is dropped once every row it reads is gone. A continued turn the hold waits on is dropped when any of its own rows since its start leaves, or when every row its wake read has left. On a wake of one row, that'smain's rule.isNewestContextEntry,placeWakeLines,placedWakeLines,mergeWakeLines,wakeLineKey,isNewestInandwindowTail.src/mcpl/tags.ts:isAmbient(tags), besideisSystemNotice. The gate'sreplyToand the framework'sambientMarkboth call it.src/gate/types.ts,src/gate/index.ts,src/index.ts,src/types/agent.tsandsrc/types/trace.ts: the API and docs above.test/audience-stamp-writers.test.ts: its list of the framework's writers of an agent's own rows renamesplaceWakeLines' entry toplaceBatchLine, the start's line, written once at a turn's start, with the same count and text.TRACE_SCOPES, namesgate:wake-line-omitted, and its test that the table names no type the framework dropped fails on a release without it. So the host's bump to the release carrying this change needs that entry removed, and another test's assertion of it, attest/web-ui-observers.test.ts:713on itsmaine7a2e4c0. This change lands first. It goes out in a new minor release, as CONTRIBUTING says of a breaking change, and the host's range,^0.33.0at itsmaine7a2e4c0, doesn't take that. So the host runs as it does until a bump takes that release, and such a bump needs the removal.What it leaves:
main.main. So an answered mention held beside a module event with no message of its own wakes the agent. The turn is routed to the mention's channel. Its start's line names the mention, since the agent's answer follows it.mainthe line came at delivery, before the render, and counted the push as "already shown above at arrival". A turn that merges a wake for such a push with another batch's wake writes its line after the render the same way.certainwhen it isn't. A start already under way, and not yet known to the gate, can read and answer its line. Its wake then drops.proseRouting: 'explicit', a reply still being delivered when a tool ends the turn isn't counted yet. Explicit mode doesn't hold a turn for its deliveries, as onmain. So an event the reply answers keeps its wake, and the wake starts a turn.main. Whether a resident the message isn't shown to should see it is a question about the base.Tests
On Linux x86_64 with Node v24.22.2 and npm 11.19.1. The repository has no lockfile. In a fresh copy at the head,
npm ls --depth=0, run after its tests, printed@animalabs/chronicle0.6.0,@animalabs/context-manager0.27.0,@animalabs/mcpl-core0.4.0,@animalabs/membrane0.10.1,@babel/parser7.29.13,@modelcontextprotocol/clientand@modelcontextprotocol/server2.4.0,@types/node22.20.5,@types/ws8.18.2,chokidar4.0.3,discord.js14.28.1,tsx4.23.15,typescript7.0.2 andws8.22.2. Each run isnpm install,npm run buildandnpm run pretest, then the files named, withnpm test's flags.34ec10068edd, in that fresh copy: the build'stscexits 0. 41 test files run 1,812 tests, and all pass. The files are the 18 this change touches against its merge base and the 30 thatmain's commits from9e9128ac2311to6c7810995c34added or changed, 7 of them in both. They run the same, all 1,812 passing, in a second fresh copy with@animalabs/membrane0.8.0, the range's floor, installed over its install.152ee76fbaddwithf04fd99e1e84's two test files:test/gate-batch-in-window.test.tsfails 4 of 5, each past its premises. With two residents, its first case finds a[Gate: …]line in a resident's first request. Its second, a later message stored before the batch fired, passes:mainwrites the same line there, after the later message, as the head's start does. In the third, a reminder's text appears twice. In the fourth, a mixed batch's line reads "[Gate: 3 events matched]", and names the two messages "already shown above at arrival". In the fifth, under conversation routing, the trunk holds a line naming one message in alpha and one in beta "already shown above at arrival".test/debounce-seen-wake.test.tsfails 40 of 58, run with its 12 checks ofWakeProvenance.writestaken out, sincemainhas none. 21 fail at a second model call where the head makes one. Among them are the ten requirement cases fix(gate): drop debounced events already read and answered #937 wrote for A debounced gate wake starts a turn for an event the agent already read and answered #814: in each of five lanes, a 200 ms batch held for inference and one fired after the turn. 5 fail at a linemainwrites. One of those is a silent heartbeat tick, whichmaincounts as "1 message in (unknown channel) … already shown above at arrival". 2 fail where the delivery agent gets an extra turn beside the residents who should wake. 11 fail where they read whatmainlacks,isAnsweredandreadsRows. One more fails at the form of a linemainwrites. There the judge's reply keeps the wake of an event the agent had answered.main's line quotes the reminder's text a second time, where the head's start names its message.f69831ea43e0's own tests, at the round before it,a16bb92aa737, with them:test/batched-wake-pointer.test.tsfails 13 of 26. Ten fail where they expect a line: after chatter; after a clock row and a message; once across a provider hold; after an arrival during a hold; two coalesced batches named together, in both orders; each resident's own line; an observed co-resident's round; the legacy window's delivery agent; and through the gate with the locus already in alpha, where the request ends "antra: chatter in beta". The case of two held wakes alike in everything but their rows fails at "the hold keeps both wakes", 1 !== 2. The held-merge case and the quiesce case fail at their premises: the old head writes no first line, and has noplaceBatchLine. The 13 cases that expect no line pass there too.test/gate-batch-in-window.test.ts's second case fails there at "one line", 0 !== 1.f69831ea43e0, each applied once to the builtdist/src/framework.js, then that file run. With nobatchIsNewestcheck, 8 fail: the cases where nothing that counts follows the batch, and the hold whose first start must leave its line for later. With no quiesce check, the quiesce case fails. With no once-per-wake check, the hold's and the quiesce's. With no merged rows, 12. With rows out of the hold's equality, the two held wakes. With no clock-row skip, the clock case. With no stored-injection skip, the injection case. With no mark from the gate wiring, the case through the gate. With every row held, the row stored for another resident alone and the legacy wake row its view leaves out. With no delivery-agent rule, the legacy two residents. With no call at the start, 12. With retries and resumed starts deciding too, the resuming start. With placed rows kept in a union, the held merge. With no view filter in a legacy window, in either of its two places, the legacy view case each place serves. The unmutated file passes 26 of 26.38bcada67fc4, oneisAmbientfor the gate's reply rule and the framework's ambient mark, changes no behaviour. WithisAmbientreturning false, at38bcada67fc4, 4 cases of the 32 test files its run held fail, all of them ambient: debounce-seen-wake's "drops its ambient wake", conversation-routing's two fork cases, and event-gate's "an ambient message owes no reply".a16bb92aa737, the silent heartbeat tick: atmainwith that commit'stest/debounce-seen-wake.test.ts, its case "a silent heartbeat tick, which stores nothing, gets no line, and its batched wake starts its turn" fails at "no line".mainwrites "[Gate: 1 event matched] - 1 message in (unknown channel) … already shown above at arrival" for it.a1dafb9ce877, at54bf553ff5ccwith its test files: 5 of 250 fail, each where the round changes behaviour. Two are the gate's line rows, beside a push given no placement and through a judge's reply for an answered event. One is the turn's start naming such an answered event. One is the module message's audience, and one the line's channel label. The round's other new cases pass there too: a line whose write throws or lands though it threw, a retry at the same turn, an own row presented before an earlier-stored batch row, and two servers' channels of the same name. Nine mutants of the round, at a clean checkout of841e06c47ba7, each applied once to the built JS, each fail at least one case.4e3bc0293c09, a module's lone message held from the residents: at841e06c47ba7with that commit'stest/debounce-seen-wake.test.ts, its case fails at "the gate quotes the event". That head's request holds no[Gate: …]line at all. Atmainthe case passes.f04fd99e1e84,deb6eaf2e5fb: atf04fd99e1e84with its first seven new cases, 5 of 164 fail, each where the round changes behaviour. They are the channel-less name, the batch's own quote line after chatter, a module message a surgery's hold keeps, the hook's log, and a folded render given a placement. The other two pass there: the batch's own line right after its message, and another batch's line. Three later cases pin behaviourf04fd99e1e84already had, and each fails under a mutant of its own: a#-prefixed label, two residents through the gate, and a quote line whose write fails. Twelve mutants of this change's code, at a clean checkout of16655bd88d20, each applied once to the built JS, each fail at least one case of the 16 test files the change touched at that commit.f29a714f672d,265c0d6a6bwith its redfb7493c41b: at223af92ec8, the first catch-up, with the head'stest/event-gate-judge.test.ts,test/debounce-seen-wake.test.tsandtest/batched-wake-pointer.test.ts, 7 of 186 fail. Six fail at their own assertions: the two split batches' certainty; the reply's and the silent tick's empty rows, absent there; a module's own wake, at a second model call; and the pinned reply wake, which carries no line rows there. The read that throws fails before any assertion, since its error escapes the start into the test. The new merged-turn case passes there. It pins that a merged turn's line still names the first batch's rows once a batch's wake with nothing to name carries an empty list.e4b6a10b8fe3with its redb49b1e56c6ca: atd01e88c0d1, the second catch-up, with the head'stest/budget-refusal-hold.test.ts, three of its four new cases fail, each at its own assertion: the rollback past every row the waiting start stood on, the joined wake whose rows are all gone, and the continuation once both its batch rows are suppressed. The fourth, a continuation dropped when one of its own rows leaves, passes there, as onmain.04abd1e6586e, each applied once to the built JS, then the round's test files run. Withcertainas before, the two split batches fail. With the gate's line rows left off where empty, the reply's and the tick's empty rows and the pinned reply wake fail; with the framework's empty rows left off, the tick's. With the module's wake reading the gate's placement, its case fails; with the line's read fault rethrown, the read that throws. Intest/budget-refusal-hold.test.ts: with a fresh turn standing onreadsRowalone, or a released start's wait dropped when any row has left, the waiting start's case fails. With a hold dropped when any row it stands on has left, that case and the continuation's batch case fail, each at its first suppression. With the joined wakes filtered byreadsRow, their case fails. With a continuation's wake rows fromreadsRowalone, its batch case fails once both rows are suppressed. With a continuation's own rows left out, three cases fail: the one suppressing an own row, and the two rollbacks past its rounds and past its trigger. With the tool-ended turn's wait for its speech chain removed, both:634final-publication tests fail.04abd1e6586e,155ab2a7dfwith its redf7d57b4264: atf7d57b4264, the catch-up570770491dwith the round's tests, 1 of 205 cases in the round's four test files fails: a queued start merged from wakes the scheduler could each drop, told as certain. The round's other new cases pin behaviour the change already had. Each fails under a mutant of its own, at a clean checkout of155ab2a7df. A label written unmarked fails the supplied-opening case. A scan of the whole window fails the case 32 clock rows back. A line written where the batch is newest fails the three targeted batches' starts. The newest message's age fails the age case. Nomessage:addedtrace fails the first case. An empty share counted as certain fails the targeted-batch certainty case. With nothing presented at rest or at a start, six of the seven no-line cases given a premise fail at it. The seventh, the legacy view's, reads the record.34ec10068edd, after the round, changes onlyUpcomingWake.certain's doc.proseRouting: 'explicit', by a probe at54bf553ff5cc: with the reply's delivery held past the turn's end, the batch's wake started a second turn under'explicit', and none under'locus'. The probe isn't part of the change.16655bd88d20and atmain9e9128ac2311: each start's request ends as the limit above says. The probe isn't part of the change.Not verified