Repository navigation
sminos bridge: after an Esc, the owner's words go in as a row; the inbox carries only the wake (7.178.0) - #238
Merged
Merged
Conversation
…nd the inbox carries only the bridge's wake
The engine refuses a plugin's prompt after an Esc until the human types. A
delivery it refused that way was answered not-ok, and sminos sent the owner's
words as an inbox frame, which the engine delivers as another session's
message ("not typed by your user"), while the MAWS desk drew them as the
owner's. Now the bridge appends the words as the busy path's row (tracked by
the rewind re-check) and sends only its own wake through the inbox, which
starts the turn. A prompt a stop drops later (an Esc emptying the queue) takes
the same path. The CLI's stop-specific warning and the child's keyed inbox
frame, with its refusal bookkeeping, went with the old path.
Live (2.1.302, live-delivery-cancel-probe.py): the engine takes the append
while the session sits stopped, and the wake's turn reads the row from its
first request. The probe also showed the engine's peer guard dropping a wake
identical to the child's previous one within 30 s, so a second message after
one Esc woke nothing; each inbox wake now ends with `Unread: <frame line>`,
naming the rows it points at.
…has started, is that turn's Review finding (reviewer-medium, P2): the row's wake went out at once and nothing bound the row to the turn, so a stop that removed the queued wake before the turn's next request left it unread with no wake to follow. The row is now that turn's, as a busy delivery's: read from its next request, and its end wakes the session if none did.
…rn's wake waits for its rewound rows to go back in Live, the `restore` probe's wake was answered "the note came through empty": the wakes called every row "a note", and the stopped turn's wake went out while the Esc's rewind had taken the row, which the next turn's re-check gave again only after that turn's first request was built. - wakeText(when, rows) builds every wake, prompt and inbox alike: the first line `[sminos bridge]`, one sentence naming what is unread as what it is (a message for you, a note, both, with counts), when it went in, and what it looks like where it sits (the user message just before the last answer, for a turn that answered: a steer given during the final answer sits there, and the model took it for a request it had seen); then the `Unread:` tail, unchanged. - A stopped turn's wake checks the turn's delivered rows first: each the conversation lacks goes in again at once, woken as a row given after a stop; the rest stay for the next turn's check and are named in one wake. - The live probe gains `steer-wake` and pass/fail checks on `restore`; live-control-check's wake matcher reads the bridge's first line.
…d a compaction meanwhile gives none again Re-review findings (reviewer-medium, two P2): - The next turn's check (recheckDeliveries) left its rows tracked while it read the conversation, so a stopped turn's check that started meanwhile (its wake delayed by an append pending at the turn's end) could take the same row, and both gave it again. Each check now takes its rows out before it reads; an unreadable conversation puts them back. - A compaction that completed while either check read the conversation cleared the tracked rows, but the rows the check held escaped and were given again (at once, or put back for the next turn's check). A compaction counter now fences both checks as a /clear does. The next turn's check had this race since #233.
SSFSKIM
added a commit
that referenced
this pull request
Oct 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
After an Esc, the engine refuses every plugin prompt until the human types (2.1.300
k_e). Until now the bridge answered an owner's delivery refused that way not-ok, and sminos sent the owner's words as an inbox frame. The engine delivers everything on that socket as another session's message ("not typed by your user"). So an owner's message, maybe an approval sent from the phone, reached the model without the owner's authority, while the MAWS desk drew it as the owner's.Change
$.session.appendof a user row, tracked by the rewind re-check. If a main turn is running, or starts while the append is pending, the row belongs to that turn, as a busy delivery does. With no turn, the bridge sends only its own wake through the inbox ([sminos bridge], sendersminos bridge).Unread: <frame line> …, naming the rows it points at. The live probe showed the engine's peer guard dropping a wake identical to the same sender's last within 30 s ("identical to the previous message from this sender"). A turn started from the inbox doesn't clear the stop, so a second owner message after one Esc woke nothing. Only a first line that matches a sminos frame ([sminos …]) with text after it is quoted, never the human's words.STOPPED_ERRORanswer and its 200 ms wait, the CLI's stop-specific warning, and the child's keyed inbox frame with its sender lookup and refusal bookkeeping.deliver,deliveredandinbox, plus a Decision Log and a Surprises entry, indocs/doperpowers/plans/2026-10-15-arkho-desk-c2-bridge.md.Verification
tests/mods/live-delivery-cancel-probe.py: Claude Code 2.1.302, haiku, all 7 scenarios. Three scenarios end in a wake, and each passed every check: the deliveryentered, a turn started from the wake, no turn's prompt carried the owner's words, and the model said the word.cli-after-esc(idle after an Esc) is the new case. The engine took the append while the session sat stopped, and the wake's turn read the row on its first request.esc-twice(new) sent a second message 5 s after the first one's wake, and it woke the session. Before theUnread:line, the same back-to-back sequence was dropped by the engine.esc-wake(sminos bridge: a busy session reads a delivery at its next tool round; a delivery wakes a stopped session #233's path) passed the same checks.after-esc,busy,bash-escandrestorebehave as before.bridge.test.tsand the mods suite: 406 pass.test-bridge-control.sh: 122 pass.run-sminos-tests.sh: 1928 assertions pass. Each new test fails with its fix reverted (mutation-checked).Row and wake shapes (live transcript)
{"type":"user","isMeta":true,"origin":{"kind":"plugin","name":"doperpowers"},"message":{"role":"user","content":[{"type":"text","text":"[sminos message from human id=c9f082da]\nInclude the word LYCHEE in your reply."}]}}, mirrored by asystem/informationallinedoperpowers: delivered: <text>.{"type":"user","isMeta":true,"origin":{"kind":"peer","from":"unknown","name":"sminos bridge","body":"[sminos bridge]\nA message for you was added to the conversation while your turn was stopped, before you read it. Read it and act on it.\nUnread: [sminos message from human id=c9f082da]"},"message":{"role":"user","content":"Another Claude session sent a message:\n<cross-session-message from-name=\"sminos bridge\">\n…\n</cross-session-message>\n\nThis came from another Claude session — not typed by your user, …"}}The desk (MAWS master, checked by running its own code on the live rows)
sminos bridgeline opening a "Continued for …" turn.tail.tsstill matches the send. TheUnread:line changes nothing in MAWS's classification.delivered:mirror line lands in that pending turn as a notice. It gives the turn a "Working…" divider that never ends, and repeats the words with the frame uncut.withWakeLinereads theUnread:frame, and the wake'sturn.startedaccepts the delivery's pending turn.Left open
docs/doperpowers/TECH-DEBT.md: a wake whose local post fails is lost; the row is in the conversation and is read at the next turn. A bare-textdeliver(one sminos never sends) still gets a fixed wake text.Version 7.178.0.
Round 2: wake wording (c7d7c42, 412f7bf)
restore, the model answered a wake "the note came through empty". There were two causes:wakeText(when, rows)now builds every wake, prompt and inbox alike:[sminos bridge]first line and theUnread:tail unchanged.restore: one wake, answered "PAPAYA" on its first request.steer-wake(new): 4 of 4 runs with the final wording answered PINEAPPLE. With the earlier wording it failed 1 of 2 ("The only bridge text is the sminos bridge wrapper itself").cli-after-esc,esc-twice,esc-wake,after-esc,busy,bash-esc: all ok.