Skip to content

feat(bin): add OMP harness support across tmux and Herdr backends - #1578

Closed
dnth wants to merge 66 commits into
kunchenguid:mainfrom
dnth:fm/dispatch-example-opus48-a1
Closed

dnth wants to merge 66 commits into
kunchenguid:mainfrom
dnth:fm/dispatch-example-opus48-a1

Conversation

@dnth

@dnth dnth commented Aug 3, 2026

Copy link
Copy Markdown

Intent

Audit docs/examples/crew-dispatch.json as a valid, current crew-dispatch example and replace both Claude Sonnet 5 profiles with Claude Opus 4.8: the claude harness profile claude-sonnet-5 becomes claude-opus-4-8 (verified bare full-name form), and the pi harness profile anthropic/claude-sonnet-5 becomes anthropic/claude-opus-4-8 (provider-qualified identifier, confirmed present in authenticated pi --list-models). Preserve the existing rule structure and intent unless the audit finds a concrete schema or launch-compatibility defect. Do not modify the captain's private config/crew-dispatch.json. Keep the diff limited to the example and any strictly necessary correction to its authoritative validation coverage.

What Changed

  • Adds OMP as a first-class agent harness: new bin/fm-omp-capabilities.sh and bin/fm-omp-process-lib.sh, OMP detection and marker/ancestry binding in fm-harness.sh, fm-session-lock-lib.sh, and fm-session-start.sh, plus OMP spawn, send, supervise, and teardown paths for the primary, secondmate, and worker roles.
  • Extracts the Pi watcher into a shared bin/fm-primary-watch-core.ts consumed by both .pi/extensions/fm-primary-pi-watch.ts and the new .omp/extensions/fm-primary-omp.ts, versioned via fm-primary-watch-version-lib.sh; the tmux backend now recognizes the OMP waiting footer and the composer strips prompt glyphs independent of locale.
  • Extends the Herdr backend for OMP session inventory, native reads, and refusal logging, adds ~2.6k lines of OMP unit and live e2e coverage under tests/, and updates the harness/AFK skills, architecture, backend, and verification docs; docs/examples/crew-dispatch.json moves both Claude profiles from Sonnet 5 to Opus 4.8 (claude-opus-4-8 bare, anthropic/claude-opus-4-8 for pi).

Note: the review and document gates both flagged that docs/examples/crew-dispatch.json has no automated schema validation — bootstrap's crew_dispatch_validate only reads the installed config, and tests/fm-bootstrap.test.sh uses inline fixtures. Pre-existing gap; the example was validated manually through bootstrap and real fm-spawn.sh runs for all six profiles.

Risk Assessment

✅ Low: The authored change is a two-line model-identifier swap in a documentation example that the schema validator does not inspect and that no runtime code imports, and it matches the intent's required substitutions exactly while leaving rule structure and every other profile untouched.

Testing

Installed the shipped example as an active crew-dispatch config and ran the repo's real validator in bin/fm-bootstrap.sh: it stays silent (valid) and, in verbose mode, reports the rules with claude/claude-opus-4-8/high and pi/anthropic/claude-opus-4-8/medium. Then drove real fm-spawn.sh with a fake tmux for every profile the example can resolve to, capturing the literal launch commands — the two changed profiles launch as claude --model 'claude-opus-4-8' --effort 'high' and pi --model 'anthropic/claude-opus-4-8' --thinking 'medium'. Confirmed both identifiers live: anthropic/claude-opus-4-8 appears in authenticated pi --list-models, and claude --model claude-opus-4-8 -p ... answered, proving the bare full-name form is accepted. Diff scope verified limited to the example with the captain's private config untouched and no residual sonnet-5 references in docs; the temporary evidence harness under tests/ was deleted and the worktree is clean.

Evidence: Bootstrap validation + verbose dispatch facts for the shipped example

$ FM_HOME=$H bin/fm-bootstrap.sh # valid config -> silent (no CREW_DISPATCH error line) $ FM_BOOTSTRAP_VERBOSE_FACTS=1 FM_HOME=$H bin/fm-bootstrap.sh BOOTSTRAP_INFO: crew dispatch active config/crew-dispatch.json BOOTSTRAP_INFO: crew dispatch rule: ...fresh news... -> grok BOOTSTRAP_INFO: crew dispatch rule: ...trivial mechanical edit... -> claude/haiku/low BOOTSTRAP_INFO: crew dispatch rule: ...big or ambiguous multi-file feature... -> quota-balanced[claude/claude-opus-4-8/high, codex/gpt-5.5/high] BOOTSTRAP_INFO: crew dispatch default: quota-balanced[codex/gpt-5.5/medium, pi/anthropic/claude-opus-4-8/medium]

$ cp docs/examples/crew-dispatch.json $FM_HOME/config/crew-dispatch.json
$ FM_HOME=$H bin/fm-bootstrap.sh            # valid config -> silent
(no CREW_DISPATCH error line)

$ FM_BOOTSTRAP_VERBOSE_FACTS=1 FM_HOME=$H bin/fm-bootstrap.sh
BOOTSTRAP_INFO: crew dispatch active config/crew-dispatch.json
BOOTSTRAP_INFO: crew dispatch rule: The task depends on fresh news, current events, live public facts, or recent market and product changes. -> grok
BOOTSTRAP_INFO: crew dispatch rule: The task is a trivial mechanical edit such as a rote rename, formatting sweep, targeted typo fix, or simple file gathering. -> claude/haiku/low
BOOTSTRAP_INFO: crew dispatch rule: The task is a big or ambiguous multi-file feature, a risky refactor, or work that requires holding many moving parts in mind. -> quota-balanced[claude/claude-opus-4-8/high, codex/gpt-5.5/high]
BOOTSTRAP_INFO: crew dispatch default: quota-balanced[codex/gpt-5.5/medium, pi/anthropic/claude-opus-4-8/medium]
Evidence: Literal fm-spawn launch commands for every example profile

--- example rule: claude/claude-opus-4-8/high (big-work rule) spawned $TASK_ID harness=claude kind=ship mode=no-mistakes ... CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false claude --dangerously-skip-permissions --model 'claude-opus-4-8' --effort 'high' "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')" --- example rule: pi/anthropic/claude-opus-4-8/medium (default) spawned $TASK_ID harness=pi kind=ship mode=no-mistakes ... FM_PI_HARNESS=pi pi --model 'anthropic/claude-opus-4-8' --thinking 'medium' -e '$FM_HOME/state/$TASK_ID.pi-ext.ts' "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: grok (fresh-news rule)
$ fm-spawn.sh $TASK_ID $PROJECT --harness grok
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-grok/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=grok kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-grok/wt
launch command sent to the pane:
grok --always-approve "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: claude/haiku/low (trivial-edit rule)
$ fm-spawn.sh $TASK_ID $PROJECT --harness claude --model haiku --effort low
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-haiku/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=claude kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-haiku/wt
launch command sent to the pane:
CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false claude --dangerously-skip-permissions --model 'haiku' --effort 'low' "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: claude/claude-opus-4-8/high (big-work rule)
$ fm-spawn.sh $TASK_ID $PROJECT --harness claude --model claude-opus-4-8 --effort high
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-opus48/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=claude kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-opus48/wt
launch command sent to the pane:
CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false claude --dangerously-skip-permissions --model 'claude-opus-4-8' --effort 'high' "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: codex/gpt-5.5/high (big-work rule)
$ fm-spawn.sh $TASK_ID $PROJECT --harness codex --model gpt-5.5 --effort high
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-codex-high/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=codex kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-codex-high/wt
launch command sent to the pane:
codex --model 'gpt-5.5' -c 'model_reasoning_effort="high"' --dangerously-bypass-approvals-and-sandbox -c "notify=[\"bash\",\"-c\",\"touch '$FM_HOME/state/$TASK_ID.turn-ended'\"]" "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: codex/gpt-5.5/medium (default)
$ fm-spawn.sh $TASK_ID $PROJECT --harness codex --model gpt-5.5 --effort medium
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-codex-med/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=codex kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-codex-med/wt
launch command sent to the pane:
codex --model 'gpt-5.5' -c 'model_reasoning_effort="medium"' --dangerously-bypass-approvals-and-sandbox -c "notify=[\"bash\",\"-c\",\"touch '$FM_HOME/state/$TASK_ID.turn-ended'\"]" "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"

--- example rule: pi/anthropic/claude-opus-4-8/medium (default)
$ fm-spawn.sh $TASK_ID $PROJECT --harness pi --model anthropic/claude-opus-4-8 --effort medium
warn: no registry at /tmp/fm-spawn-dispatch-profile.8boRq0/ex-pi-opus48/home/data/projects.md; defaulting project to no-mistakes off
spawned $TASK_ID harness=pi kind=ship mode=no-mistakes yolo=off window=firstmate:fm-$TASK_ID worktree=/tmp/fm-spawn-dispatch-profile.8boRq0/ex-pi-opus48/wt
launch command sent to the pane:
FM_PI_HARNESS=pi pi --model 'anthropic/claude-opus-4-8' --thinking 'medium' -e '$FM_HOME/state/$TASK_ID.pi-ext.ts' "$('$FM_REPO/bin/fm-operational-input.sh' encode launch-brief < '$FM_HOME/data/$TASK_ID/brief.md')"
Evidence: pi --list-models confirms anthropic/claude-opus-4-8

$ pi --list-models | grep -E "opus-4-8|sonnet-5" anthropic claude-opus-4-8 1M 128K yes yes anthropic claude-sonnet-5 1M 128K yes yes

$ pi --list-models | grep -E "opus-4-8|sonnet-5"
anthropic     claude-opus-4-8             1M       128K     yes       yes   
anthropic     claude-sonnet-5             1M       128K     yes       yes   
Evidence: claude CLI accepts the bare full-name claude-opus-4-8

$ claude --model claude-opus-4-8 -p "Reply with exactly: MODEL-OK" MODEL-OK

$ claude --model claude-opus-4-8 -p "Reply with exactly: MODEL-OK"
MODEL-OK

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

⚠️ **Rebase** - 1 warning
  • ⚠️ .agents/skills/afk/SKILL.md - branch carries 65 commit(s) that exist on your local main branch but were never pushed to origin/main; rebasing would bundle this unrelated work (113 file(s)) into the PR:
  • b6fe376 Merge pull request feat(bin): guard watcher liveness across supervision scripts #8 from dnth/fm/omp-harness-support-e1
  • c74d7c7 chore(merge): reconcile upstream supervision with OMP
  • 29fe743 no-mistakes(document): document OMP toolbelt scripts and AFK harness binding
  • 7a7c353 fix(ci): align snapshot and Herdr fixtures
  • b0ea297 docs(omp): bind lifecycle evidence to corrected head
  • 491bc80 no-mistakes(document): document OMP marker version, herdr ask proof, tmux gate
  • c5b2efb no-mistakes(review): bind watcher marker version to core, re-resolve OMP bun, gate tmux OMP probe
  • 1c38316 docs(omp): refresh final lifecycle evidence
  • 6b5d6bc no-mistakes(lint): omit explicit deliverAs for OMP watcher notifications
  • 0dac9ab no-mistakes(lint): add deterministic OMP offset TOCTOU regression test
  • 98e4550 no-mistakes(lint): bind OMP session offset newline check to recorded size
  • a2f23e6 no-mistakes(lint): order watcher signal signature as inode:size:mtime
  • 84be3a4 no-mistakes(lint): add same-second turn-end marker regression test
  • d136e7a no-mistakes(lint): distinguish same-second turn-end markers in watcher signal scan
  • 1819fee no-mistakes(lint): require exact structured ask result for blocked OMP answers
  • 165d256 no-mistakes(lint): confirm OMP blocked-ask answers via structured selectedOptions
  • 308970d no-mistakes(lint): replace fixture wake drain with primary-owned settle wait
  • eef42c6 no-mistakes(lint): drop duplicate secondmate status wake requirement
  • 840949a no-mistakes(lint): reuse production JSONL offset owner and tolerate ask-close race
  • 822e344 no-mistakes(lint): harden Herdr matrix JSONL offsets and event predicates
  • d2ad0ae no-mistakes(lint): accept idle-captain path for blocked worker answer
  • f0141f5 no-mistakes(lint): accept structured ask selectedOptions for routed worker choice
  • 6cc0841 no-mistakes(lint): bind primary wake drain and route blocked answer via captain
  • 1b53b61 no-mistakes(lint): quarantine native OMP agent read probe form
  • cb2037d no-mistakes(lint): bind OMP submit snapshot offset to complete JSONL boundary
  • ca7fca1 no-mistakes(lint): bind and drain secondmate recovery wake before resumed exit
  • e719b4a no-mistakes(document): point Pi generation-owner docs at shared watcher core
  • 64e2062 no-mistakes(document): correct stale OMP head-bound evidence and arm readiness contract
  • 15a09a8 no-mistakes(review): make herdr spawn fixture pane presence stateful
  • 5df7a43 no-mistakes(review): confirm OMP abort endpoint stop before destructive cleanup
  • 6633e9d docs(omp): refresh final lifecycle evidence
  • ce9ad11 fix(omp): await watcher readiness before arm success
  • 2b2e991 test(herdr): require fresh watcher before role matrix
  • 77c976a Merge remote-tracking branch 'origin/main' into fm/omp-herdr-matrix-fix-k3
  • 7720928 fix(tmux): recognize OMP waiting busy footer
  • d6133a4 test(composer): cover Unicode prompts under C locale
  • a73484c fix(composer): strip prompt glyphs independent of locale
  • 9b5e331 test(herdr): model session inventory and native reads
  • fe672a1 test(herdr): advance session-list fixture responses
  • 5cb73ea test: align Herdr fixtures with merged cleanup calls
  • e38f161 Merge origin/main into OMP Herdr matrix branch
  • 396e395 no-mistakes(document): record green corrected-head combined OMP runner evidence
  • 0970f85 no-mistakes(document): drop one-off draft-PR CI chronology from verification doc
  • ba12290 no-mistakes(document): correct stale OMP Herdr verification evidence provenance and pointers
  • f73ce10 no-mistakes(review): record green corrected OMP Herdr matrix rerun evidence
  • a8d124f no-mistakes(review): log every fixture Herdr refusal through shared refuse path; matrix rerun still in flight, doc transcript not yet replaced
  • f911a60 no-mistakes(review): admit bare Herdr client reads; assert refusal log
  • 246b0f4 test: correct OMP Herdr live matrix fixture
  • 0733c56 no-mistakes(document): document OMP scope, marker ancestry, and tmux submit exception
  • be1a26f no-mistakes(review): bind OMP harness marker to ancestry; scope tmux unknown branch; dedupe identity
  • 3b9b31d fix: correct OMP branch regressions
  • 9a6f58e no-mistakes(document): document OMP session-start, watcher continuity, and state artifacts
  • 88d3a72 no-mistakes(review): untrack .omc runtime artifacts and ignore them
  • 154be48 no-mistakes(review): bound exact-OMP ancestry probe to innermost harness
  • f44c239 test: stabilize guarded OMP Herdr evidence (feat: add scout task lifecycle #7)
  • f526a46 fix: close OMP harness verification gaps (feat: add scout task lifecycle #7)
  • 99010ba docs: close OMP branch standards review (feat: add scout task lifecycle #7)
  • e3584df test: harden OMP branch regression fixtures (feat: add scout task lifecycle #7)
  • c0cfd41 fix: address OMP branch review findings (feat: add scout task lifecycle #7)
  • 83160dc test: verify OMP support contract (feat: add scout task lifecycle #7)
  • 351ba31 feat: verify OMP lifecycle on Herdr (fix: reduce crewmate status wake noise #6)
  • c3921a3 feat: add OMP secondmate tmux support (ci: enforce contributor guardrails #5)
  • 8057eee feat: add OMP primary tmux support (fix(bin): coalesce watcher signals into one wake #4)
  • 63c86fe feat: add OMP worker harness support (docs: align tmux and harness guidance #3)
  • 899830b refactor: extract Pi-compatible watcher core (docs: polish README banner and repo housekeeping #2)

Push main to origin, or rebase your branch onto origin/main, before gating.

🔧 Fix applied.
1 warning still open:

  • ⚠️ .agents/skills/afk/SKILL.md - branch carries 65 commit(s) that exist on your local main branch but were never pushed to origin/main; rebasing would bundle this unrelated work (113 file(s)) into the PR:
  • b6fe376 Merge pull request feat(bin): guard watcher liveness across supervision scripts #8 from dnth/fm/omp-harness-support-e1
  • c74d7c7 chore(merge): reconcile upstream supervision with OMP
  • 29fe743 no-mistakes(document): document OMP toolbelt scripts and AFK harness binding
  • 7a7c353 fix(ci): align snapshot and Herdr fixtures
  • b0ea297 docs(omp): bind lifecycle evidence to corrected head
  • 491bc80 no-mistakes(document): document OMP marker version, herdr ask proof, tmux gate
  • c5b2efb no-mistakes(review): bind watcher marker version to core, re-resolve OMP bun, gate tmux OMP probe
  • 1c38316 docs(omp): refresh final lifecycle evidence
  • 6b5d6bc no-mistakes(lint): omit explicit deliverAs for OMP watcher notifications
  • 0dac9ab no-mistakes(lint): add deterministic OMP offset TOCTOU regression test
  • 98e4550 no-mistakes(lint): bind OMP session offset newline check to recorded size
  • a2f23e6 no-mistakes(lint): order watcher signal signature as inode:size:mtime
  • 84be3a4 no-mistakes(lint): add same-second turn-end marker regression test
  • d136e7a no-mistakes(lint): distinguish same-second turn-end markers in watcher signal scan
  • 1819fee no-mistakes(lint): require exact structured ask result for blocked OMP answers
  • 165d256 no-mistakes(lint): confirm OMP blocked-ask answers via structured selectedOptions
  • 308970d no-mistakes(lint): replace fixture wake drain with primary-owned settle wait
  • eef42c6 no-mistakes(lint): drop duplicate secondmate status wake requirement
  • 840949a no-mistakes(lint): reuse production JSONL offset owner and tolerate ask-close race
  • 822e344 no-mistakes(lint): harden Herdr matrix JSONL offsets and event predicates
  • d2ad0ae no-mistakes(lint): accept idle-captain path for blocked worker answer
  • f0141f5 no-mistakes(lint): accept structured ask selectedOptions for routed worker choice
  • 6cc0841 no-mistakes(lint): bind primary wake drain and route blocked answer via captain
  • 1b53b61 no-mistakes(lint): quarantine native OMP agent read probe form
  • cb2037d no-mistakes(lint): bind OMP submit snapshot offset to complete JSONL boundary
  • ca7fca1 no-mistakes(lint): bind and drain secondmate recovery wake before resumed exit
  • e719b4a no-mistakes(document): point Pi generation-owner docs at shared watcher core
  • 64e2062 no-mistakes(document): correct stale OMP head-bound evidence and arm readiness contract
  • 15a09a8 no-mistakes(review): make herdr spawn fixture pane presence stateful
  • 5df7a43 no-mistakes(review): confirm OMP abort endpoint stop before destructive cleanup
  • 6633e9d docs(omp): refresh final lifecycle evidence
  • ce9ad11 fix(omp): await watcher readiness before arm success
  • 2b2e991 test(herdr): require fresh watcher before role matrix
  • 77c976a Merge remote-tracking branch 'origin/main' into fm/omp-herdr-matrix-fix-k3
  • 7720928 fix(tmux): recognize OMP waiting busy footer
  • d6133a4 test(composer): cover Unicode prompts under C locale
  • a73484c fix(composer): strip prompt glyphs independent of locale
  • 9b5e331 test(herdr): model session inventory and native reads
  • fe672a1 test(herdr): advance session-list fixture responses
  • 5cb73ea test: align Herdr fixtures with merged cleanup calls
  • e38f161 Merge origin/main into OMP Herdr matrix branch
  • 396e395 no-mistakes(document): record green corrected-head combined OMP runner evidence
  • 0970f85 no-mistakes(document): drop one-off draft-PR CI chronology from verification doc
  • ba12290 no-mistakes(document): correct stale OMP Herdr verification evidence provenance and pointers
  • f73ce10 no-mistakes(review): record green corrected OMP Herdr matrix rerun evidence
  • a8d124f no-mistakes(review): log every fixture Herdr refusal through shared refuse path; matrix rerun still in flight, doc transcript not yet replaced
  • f911a60 no-mistakes(review): admit bare Herdr client reads; assert refusal log
  • 246b0f4 test: correct OMP Herdr live matrix fixture
  • 0733c56 no-mistakes(document): document OMP scope, marker ancestry, and tmux submit exception
  • be1a26f no-mistakes(review): bind OMP harness marker to ancestry; scope tmux unknown branch; dedupe identity
  • 3b9b31d fix: correct OMP branch regressions
  • 9a6f58e no-mistakes(document): document OMP session-start, watcher continuity, and state artifacts
  • 88d3a72 no-mistakes(review): untrack .omc runtime artifacts and ignore them
  • 154be48 no-mistakes(review): bound exact-OMP ancestry probe to innermost harness
  • f44c239 test: stabilize guarded OMP Herdr evidence (feat: add scout task lifecycle #7)
  • f526a46 fix: close OMP harness verification gaps (feat: add scout task lifecycle #7)
  • 99010ba docs: close OMP branch standards review (feat: add scout task lifecycle #7)
  • e3584df test: harden OMP branch regression fixtures (feat: add scout task lifecycle #7)
  • c0cfd41 fix: address OMP branch review findings (feat: add scout task lifecycle #7)
  • 83160dc test: verify OMP support contract (feat: add scout task lifecycle #7)
  • 351ba31 feat: verify OMP lifecycle on Herdr (fix: reduce crewmate status wake noise #6)
  • c3921a3 feat: add OMP secondmate tmux support (ci: enforce contributor guardrails #5)
  • 8057eee feat: add OMP primary tmux support (fix(bin): coalesce watcher signals into one wake #4)
  • 63c86fe feat: add OMP worker harness support (docs: align tmux and harness guidance #3)
  • 899830b refactor: extract Pi-compatible watcher core (docs: polish README banner and repo housekeeping #2)

Push main to origin, or rebase your branch onto origin/main, before gating.

⚠️ **Review** - 1 info
  • ℹ️ docs/examples/crew-dispatch.json:1 - docs/examples/crew-dispatch.json is not exercised by any automated check: bin/fm-bootstrap.sh crew_dispatch_validate only ever reads $CONFIG/crew-dispatch.json, and tests/fm-bootstrap.test.sh uses inline fixtures rather than the shipped example. The schema conformance claimed in the commit message was verified manually, so the copyable operator example can silently drift out of schema in future edits. Pre-existing gap, not introduced by this change; out of the intent's stated diff scope.
✅ **Test** - passed

✅ No issues found.

  • FM_HOME=$tmp FM_BOOTSTRAP_VERBOSE_FACTS=1 bin/fm-bootstrap.sh with docs/examples/crew-dispatch.json installed as config/crew-dispatch.json (crew_dispatch_validate: no CREW_DISPATCH error, full BOOTSTRAP_INFO profile block)
  • Drove real bin/fm-spawn.sh via the tests/fm-spawn-dispatch-profile.test.sh fixtures (fake tmux capturing send-keys -l) once per example profile: grok, --harness claude --model haiku --effort low, --harness claude --model claude-opus-4-8 --effort high, --harness codex --model gpt-5.5 --effort high|medium, --harness pi --model anthropic/claude-opus-4-8 --effort medium — all 6 spawned and threaded the expected model/effort flags
  • pi --list-models | grep claude-opus-4-8 (authenticated) — anthropic/claude-opus-4-8 present
  • claude --model claude-opus-4-8 -p &#34;Reply with exactly: MODEL-OK&#34; — bare full-name form accepted, returned MODEL-OK
  • Scope check: git show --stat ea2cfb9 (only docs/examples/crew-dispatch.json, 2 lines), git ls-files config/ (captain config untracked/untouched), grep -rn claude-sonnet-5 docs/ (no leftovers)
⚠️ **Document** - 1 info
  • ℹ️ docs/examples/crew-dispatch.json:1 - docs/examples/crew-dispatch.json has no automated validation coverage: nothing in tests/, bin/, or .github/ references the example path, so bootstrap's crew_dispatch_validate never runs against it and schema drift in the copyable example would go undetected. Not caused by this change and out of scope for a docs-only phase (adding it means a test change). Worth a follow-up that feeds the example file through crew_dispatch_validate in tests/fm-bootstrap.test.sh.
⚠️ **Lint** - 1 warning
  • ⚠️ linter found issues (exit code 127)
✅ **Push** - passed

✅ No issues found.

dnth added 30 commits July 31, 2026 14:55
…efuse path; matrix rerun still in flight, doc transcript not yet replaced
dnth added 28 commits August 1, 2026 20:59
Preserve launch-bound OMP identity inside the generalized session-lock matcher, combine test-lane and supervision ownership, and carry current upstream main without rewriting history.
Enable OMP as the native Firstmate harness
Update docs/examples/crew-dispatch.json, the starting-point example for
config/crew-dispatch.json:
- claude harness: claude-sonnet-5 -> claude-opus-4-8 (bare full-name form)
- pi harness: anthropic/claude-sonnet-5 -> anthropic/claude-opus-4-8
  (confirmed present in authenticated `pi --list-models`)

Rule structure and all other profiles (grok, claude/haiku, codex/gpt-5.5)
are unchanged. Validated against the repo's crew-dispatch schema in
bin/fm-bootstrap.sh crew_dispatch_validate: all harnesses verified and every
effort/harness pair supported (claude:low/high, codex:high/medium, pi:medium).
The schema does not validate model identifiers; they pass through to fm-spawn.
@dnth

dnth commented Aug 3, 2026

Copy link
Copy Markdown
Author

Closing: this PR was opened against the wrong target by the validation pipeline.

The intended change is a single-file docs example refresh (docs/examples/crew-dispatch.json, Sonnet 5 -> Opus 4.8). Because this branch is based on a fork main that is ahead of upstream, the PR here bundled 66 commits / 93 files of unrelated OMP-harness work under a mismatched title, and this repo has no CI checks configured for it.

Closing in favor of a corrected PR opened against the fork's own main (dnth/firstmate:main) containing only the one-file dispatch-example change. No merge performed.

@dnth dnth closed this Aug 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant