Repository navigation
fix: deliver stranded and stuck-queue omp watcher wakes - #81
Merged
Merged
Conversation
An idle omp raises no event when text lands in its composer, so Firstmate wake text left unsent there was never delivered, and a lane restart that needs an empty composer was refused. The restored-wake check also skipped for good whenever omp still reported queued messages, and the live guard's restored-wake step failed on omp 18.8.1. - omp watch extension: poll the editor at a low rate while the session owns the watch, and deliver a complete, unchanged watcher wake found there through the prompt-starting API, removing only that wake. Operator text, edited or partial wakes, and wakes the extension still tracks stay as found; delivery is bounded per wake text. - Restored-wake check: wait a bounded time for queued messages to drain, then recover a wake from the composer, or resubmit an unconsumed wake to flush a queue omp will not run, and report the wait once through omp's notification when resubmission starts no turn. A wake omp accepts as a follow-up now schedules the check, and a run end re-arms its two-second settle instead of keeping an earlier timer. - Portable regression scenarios for each gap, failing on the previous extension: stranded text with and without the transport mark, beside a draft, several wakes, non-wake text, a running turn, text still changing, and the attempt bound; queued messages that drain, never drain, hold the wake itself, or ignore resubmission; and the run-end settle time. - Live guard: omp 18.8.1 never redraws its follow-up queue panel for a follow-up an extension queues, so the guard reads omp's own queued state and every editor change through a lab-only probe and keeps the pane readers as a second signal; a new stranded-wake step; the draft step waits for the draft alone before reading it. - Docs: watcher-continuity contract and dated verification evidence.
An idle omp raises no event when text lands in its composer, so Firstmate wake text left unsent there was never delivered, and a lane restart that needs an empty composer was refused. The restored-wake check also skipped for good whenever omp still reported queued messages, and the live guard's restored-wake step failed on omp 18.8.1. - omp watch extension: poll the editor at a low rate while the session owns the watch, and deliver a complete, unchanged watcher wake found there through the prompt-starting API, removing only that wake. Operator text, edited or partial wakes, and wakes the extension still tracks stay as found; delivery is bounded per wake text. - Restored-wake check: wait a bounded time for queued messages to drain, then recover a wake from the composer, or resubmit an unconsumed wake to flush a queue omp will not run, and report the wait once through omp's notification when resubmission starts no turn. A wake omp accepts as a follow-up now schedules the check, and a run end re-arms its two-second settle instead of keeping an earlier timer. - Portable regression scenarios for each gap, failing on the previous extension: stranded text with and without the transport mark, beside a draft, several wakes, non-wake text, a running turn, text still changing, and the attempt bound; queued messages that drain, never drain, hold the wake itself, or ignore resubmission; and the run-end settle time. - Live guard: omp 18.8.1 never redraws its follow-up queue panel for a follow-up an extension queues, so the guard reads omp's own queued state and every editor change through a lab-only probe and keeps the pane readers as a second signal; a new stranded-wake step; the draft step waits for the draft alone before reading it. - Docs: watcher-continuity contract and dated verification evidence.
…ible stranded candidates
…ll and option D ownership
…ation sensitivity
# Conflicts: # .omp/extensions/fm-primary-omp-watch.ts # docs/verification/runtime-backends.md # docs/watcher-continuity.md # tests/fm-omp-harness.test.sh # tests/fm-omp-wake-restore-live-e2e.test.sh
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.
Intent
I would like all bugs to be fixed so tomorrow can be focused entirely to Vernant and not problems preventning Vernant from getting built.
Context: PR #54 (fix: start omp watcher wakes in idle sessions, merged as b1b8856) fixed new idle-session wake stalls in the omp primary watcher extension. Its worker reported three remaining gaps, and the first one stopped Vernant lanes today: (1) wake text typed by older wiring and left unsent in an idle omp composer is never submitted or cleared - on 2026-10-08 five of seven Vernant lane restarts were refused because each lane's composer held such text, and two idle lanes sat with undelivered wakes until Main pressed Enter; (2) the live guard's restored-wake step already fails on main with omp 18.8.1 (the wake is not seen in the follow-up queue display); (3) the restored-wake check still skips when omp has pending messages.
What Changed
.omp/extensions/fm-primary-omp-watch.tsnow polls the idle omp editor every three seconds for a complete watcher wake that other wiring left unsent. When the same editor text is seen on two consecutive idle polls, it sends that wake alone through the prompt-starting API and removes only that wake and one blank-line separator, so operator drafts, edited or truncated wakes, and wakes the extension still tracks stay untouched. Delivery is bounded to three attempts per distinct wake text.agent_endcheck replaces a pending one so the editor is read two full seconds after the run ended.tests/fm-omp-harness.test.shadds stranded-wake, pending-queue, ownership, attempt-bound, and queue-episode scenarios.tests/fm-omp-wake-restore-live-e2e.test.shadds a lab-only probe extension that records omp's queued and idle answers and every editor change, uses it in place of the queue-panel scrape, and adds a stranded-wake step.docs/watcher-continuity.md,docs/verification/runtime-backends.md, and the omp harness reference describe the new behavior and its known limits.Risk Assessment
Testing
I drove the real installed omp 18.8.7 through bin/fm-herdr-lab.sh in a throwaway fm-lab-* Herdr session. The live guard covers all three gaps in the intent. Run 1 used the default Codex model. In that run, the stranded-wake and idle-wake steps passed, which need no tokens. The model steps could not run because the Codex account had no quota left. I re-ran the guard with
FM_OMP_WAKE_RESTORE_LIVE_MODEL=opus, and all 7 live steps passed. This includes the restored-wake step, which failed on main before this change and now runs without a skip. The portable omp harness suite passed 33 of 33. The guard removed its lab, and the worktree is clean. This change has no visual UI, so the evidence is CLI transcripts and no screenshots.Evidence: Live guard run 2 (opus): all 7 steps ok
Source: Live guard run 2 (opus): all 7 steps ok
ok - live omp idle wake: started its own turn for a wake that reached an idle lane behind an advisor note and left the operator draft unsent ok - live omp stranded wake: delivered wake text an older wiring left unsent in an idle composer as its own turn, cleared only that wake, and left the operator draft as typed ok - live omp wake restore: re-submitted a wake that Esc restored to the composer, and the lane handled it ok - live omp wake restore: left the operator's draft exactly as typed while it re-submitted the wake ok - live omp markers: kept both loaded markers on the session pid ok - live omp busy composer: reads empty and pending while a turn runs ok - live omp busy composer: took an injected doorbell mid-turn and left the composer empty exit=0Evidence: Live guard run 1 (default Codex model): steps 4-5 ok, then Codex usage limit
Source: Live guard run 1 (default Codex model): steps 4-5 ok, then Codex usage limit
Evidence: Portable omp harness suite (33 ok)
Source: Portable omp harness suite (33 ok)
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ No issues found.
✅ **Test** - passed
✅ No issues found.
FM_OMP_WAKE_RESTORE_LIVE=1 bash tests/fm-omp-wake-restore-live-e2e.test.sh(run 1, default model openai-codex/gpt-6-astra: steps 4 and 5 passed, then steps 1-3 stopped because Codex reported usage_limit_reached)omp -p 'reply with the word hi' --no-session --thinking low --model opus(checked that a different logged-in model answers)FM_OMP_WAKE_RESTORE_LIVE=1 FM_OMP_WAKE_RESTORE_LIVE_MODEL=opus bash tests/fm-omp-wake-restore-live-e2e.test.sh(run 2: all 7 live steps ok, exit 0)bash tests/fm-omp-harness.test.sh(portable extension suite: 33 ok, 0 not ok, exit 0)Cleanup check:git status --shortwas clean, the run's lab temp dirs were removed, and no lab processes were left✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.