Repository navigation
Conversation
|
Speaking as Kun's firstmate: thank you @i098 — porting the Pi continuity fix (#5489) to omp is useful work, and the issue write-up in #7207 made it easy to check.
Waiting on you right now: just the live evidence above. ( |
|
Speaking as Kun's firstmate: thanks @i098. Moving the node heredocs into files for Bash 3.2 is a clean fix. The no-mistakes attestation matches the new tip ( Re-look:
Waiting on you right now: just the live evidence. |
|
Live evidence for the two cases in the review. The later head
The How the cases were driven:
Superseded confirmation on
|
|
Speaking as Kun's firstmate: thank you @i098 — that hand-driven omp 18.7.0 evidence is exactly what was needed. Re-look (tip still
Live ask: cleared (fixture-only rows in the attestation body are fine now that these two product traces are on the thread). Attestation MATCH at Contract-class: still new-default. CI: run Waiting on: nothing from you right now. Next gate is green CI on a reasonably current base + green |
98cad9c to
0648e4a
Compare
|
Speaking as Kun's firstmate: thanks @i098 for rebasing this onto current main. The attestation binds the new head I re-read it against main contract-class: new-default (unchanged): omp's documented confirm/retire path moves onto Pi's semantics. VISION: every rule aligns (honest wakes, no false FAILED turns, repair that actually recovers). There's nothing you need to do right now. If CI comes back green, Kun makes the merge-or-leave call. |
…and dead arm children Port the Pi watcher-continuity contract to the omp watch extension. A handling confirmation that exits 3 means the recovery marker moved past this restoration's generation, so a newer pipeline owns the episode. omp reported it as "watcher: FAILED - handling delivery confirmation was rejected (status=3)" on a wake that delivered fine. It now delivers the wake plain, confirms and retries against the restoration's own recovery token, and retires the current arm only when the failed token names its exact watcher pid and generation and that pid is dead. An arm child whose process is gone but whose close event has not fired (a straggler holds its stdio) kept the single-flight slot, so repair and scheduled retry answered "unchanged" and started nothing. liveArmChild treats such a child as an empty slot. docs/watcher-continuity.md scopes the token confirm, retry, retire guard, and superseded delivery to Pi and omp. OpenCode keeps its current behavior.
0648e4a to
b740983
Compare
Closes #7207
Intent
Port the merged Pi watcher-continuity fix to the omp watch extension (.omp/extensions/fm-primary-omp-watch.ts). Today a handling confirmation that exits 3 (the recovery marker already moved to another generation, meaning a newer pipeline owns the episode) is reported to the primary as 'watcher: FAILED - handling delivery confirmation was rejected (status=3 ...)' on a wake that delivered fine, so the primary spends turns on a non-failure. It must deliver the wake plain, confirm and retry against the restoration's own recovery token, and retire the current arm only when the failed token names its exact watcher pid and generation and that pid is dead. Also, an arm child whose process is gone but whose close event has not fired (a straggler holds its stdio pipes) keeps the single-flight slot, so repair (fm_watch_arm_omp) and scheduled retry answer 'unchanged' and start nothing; such a child must count as an empty slot, as on Pi (liveArmChild). Restore only: no new knob and no default change; OpenCode keeps its current behavior.
What Changed
.omp/extensions/fm-primary-omp-watch.tsnow ports the Pi contract from fix(pi): restore watcher continuity across successor gaps and make extension log opt-in #5489 (closing Pi watcher continuity: successor-gap confirmations and a dead-but-unclosed arm child block repair/retry recovery #5492).A handling confirmation that exits 3 means the recovery marker moved to another generation, so a newer pipeline owns the episode.
omp delivers that wake plain, with no
watcher: FAILED - handling delivery confirmation was rejected (status=3 ...)line.After a failed confirmation it retires the current arm only when the failed token names that arm's exact watcher pid and generation and that pid is dead.
liveArmChildtreats an arm child whose process is gone, but whose close event has not fired because a straggler holds its stdio, as an empty slot.Repair, scheduled retry, and deferred close start a fresh arm instead of answering "unchanged".
docs/watcher-continuity.mdscopes those sentences to Pi and omp.OpenCode has the same gap and is not touched here.
tests/fm-omp-harness.test.sh, each failing onmainand passing here:a superseded confirmation (exit 3) is not a failure while a refused one (exit 1) still is;
a failed confirmation for a stale successor spares a newer arm;
a dead-but-unclosed arm child frees the slot for repair and for the scheduled retry.
Risk Assessment
✅ Low: This restores existing Pi behavior in the omp extension, with no new setting and no default change.
The retire guard now acts on fewer cases than before, never more.
The deferred-close path uses the same
liveArmChildcall as repair and retry, and it has no test of its own.Testing
Run before and after, with a Node host running the real extension over a fake omp API and a stub
bin/fm-watch-arm.sh:watcher: FAILED - handling delivery confirmation was rejected (status=3 generation=gen-1 ...)rejected (status=1 ...)mainretires the current arm once the failed token's watcher pid is dead, newer or notfm_watch_arm_ompunchanged - omp extension already owns an arm childstarted omp extension arm childThe retire-guard test also fails when only the pid and generation check is removed.
bin/fm-test-run.sh --allon Linux with no ruby and no agent harness installed, detached from omp: 254 scripts, 16 fail.The same 16 fail the same way on clean
main20dcbf91, so this change adds no failure:fm-backend-herdr-presentation-e2e,fm-ci-workflow,fm-control-relaunch,fm-extension-binding,fm-harness-liveness-drift-live-e2e,fm-nm-test-contract,fm-pr-check-security,fm-procevent-quota,fm-procevent,fm-public-followup,fm-remote-secondmate-lifecycle-e2e,fm-remote-transport-lanes,fm-secondmate-restart,fm-session-lock-ancestry,fm-supervision-host,fm-test-run.Two of them print
ruby is required, and one printsno verified harness is installed here.tests/fm-omp-harness.test.shpasses when run detached from omp.It fails when run from inside an omp session, on
mainand here alike, because its detection test sees the real omp ancestor.Live validation: one scenario ran live, a real omp 18.7.0 that loaded the changed extension, armed a watcher through it, started a successor, and delivered one wake.
The other four scenarios (exit 3, exit 1, the newer-arm guard, the dead-child slot) ran only in the fixture host, with a fake omp API, real arm child processes, and the real confirm script.
The Test step therefore reports the live-validation verdict as inconclusive.
The merged Pi PR shipped with the same limitation.
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
⏭️ **Rebase** - skipped
Step was skipped.
✅ **Review** - passed
✅ No issues found.
tests/fm-omp-primary-live-e2e.test.sh- The live omp e2e (FM_OMP_LIVE_E2E=1 tests/fm-omp-primary-live-e2e.test.sh, real omp 18.12.1 over RPC, started from a clean tmux ancestor) fails at its step 2: 'the session-start digest did not reach model context before the first turn'. The model replied that no digest was present, and the log shows oneextension_errorframe. This is before the arm/deliver steps, so no live watch scenario could be reached. The diff changes only.omp/extensions/fm-primary-omp-watch.ts,docs/watcher-continuity.mdandtests/fm-omp-harness.test.sh, so this looks like omp 18.12.1 drift or an environment issue. I did not run the script on the base commit to confirm that. The portable suite, which runs the same extension over a fake omp API, passes fully from a clean ancestor.env -u NO_MISTAKES_GATE TMUX_TMPDIR=$LAB/tmux tmux -L fm-lab new-session ... FM_OMP_LIVE_E2E=1 bash tests/fm-omp-primary-live-e2e.test.sh(real omp 18.12.1): step 1 ok (both extensions auto-discovered), step 2 not ok (session-start digest), exit 1bash tests/fm-omp-harness.test.shfull run from a clean tmux ancestor (fm-lab socket): 19 ok, 0 not ok, exit 0Earlier: the nine watch-extension tests run with the ten earlier tests removed, all ok✅ **Document** - passed
✅ No issues found.
⏭️ **Lint** - skipped
✅ **Push** - passed
✅ No issues found.
I am new to open source, and this pull request was made with AI assistance.