fix: harden supervision feedback and worker launches - #31
Merged
BohnBawerick merged 24 commits intoOct 4, 2026
Merged
Conversation
…read's nonzero incomplete verdict while retaining output assertions. `tests/fm-procevent.test.sh`, `tests/fm-bearings-board-render.test.sh`, `bin/fm-lint.sh`, and `git diff --check` pass. Serial 8 was a transient runner failure and passed six local runs
…e assertion to match nested path metadata output and added fm-codex-catalog-lib.sh to the synthetic remote-root fixture. Both affected test files pass locally. Bash syntax and git diff checks also pass
A forge read killed by its five-second cap was recorded as forge unavailable, staled the observation, and rang a false supervision wake whenever a healthy read ran slow beside its five parallel siblings. Treat every deadline-cut read, budget deadline or per-read cap, as unmeasured: the prior record is kept and the URL is observed first on the next poll. A genuine forge failure still records the error and wakes once per episode. publish_pending hashed its wake key with shasum, which this Arch host carries only under /usr/bin/core_perl; a watcher PATH without it minted empty wake keys and broke wake dedup. Hash through shasum or sha256sum and fail with a named error when neither exists. The same sha256sum fallback is folded into the pending-reply correlation-id fallback. Regression tests cover both: a slow parallel read keeps the prior record without a wake, and a PATH without core_perl still publishes a 64-hex wake key exactly once.
… test for Pi 1.0's renderer API while retaining older compatibility, and increased two test-only process startup windows to avoid loaded-runner flakes. All three focused tests pass; timing-sensitive tests passed five repeated runs each. ShellCheck, actionlint, Bash syntax, and git diff checks pass
BohnBawerick
deleted the
fm/fm-contributions-read-cap-false-unavailable
branch
October 4, 2026 02:01
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
[captain] The captain's standing rule for all projects, verbatim: "Fix what you find. Lint failures and flaky tests get fixed even when the current task did not cause them."
Context, found 2026-10-03: bin/fm-contributions.sh observes each owned PR with one core read and then six parallel forge reads, each capped at 5 seconds. For #20 (head 72dbec0) the commit check-runs read with filter=all returns about 67 KB and takes 1 to 3 seconds alone, but when it runs beside the other five reads it hits the 5 second cap about one poll in four on this host. A timeout that is not the poll budget's own deadline counts as forge-unavailable, so the PR's record gets error "forge observation unavailable or changed during read", its observation goes stale, and the supervisor gets a "contributions: observation unavailable" check wake each failure episode. A traced poll showed rc=124 on one parallel read with every other read returning 0; running the six reads in parallel by hand four times gave one rc=124 on a commits read. https://github.com/BohnBawerick/VoiceMaster/pull/35 shows the same steady error.
The same file has a second known host fault, filed as fm-contributions-shasum-missing-on-linux on 2026-09-19: publish_pending computes its wake key with shasum -a 256, and on this Arch host shasum lives only in /usr/bin/core_perl, which may be absent from the watcher's PATH, giving an empty key; tests/fm-contributions.test.sh failed locally for that reason.
Firstmate specification (requirements, not the captain's literal words):
What Changed
maxeffort on installed catalog support during validation and launch, with warnings relayed through local and remote recovery paths.Risk Assessment
✅ Low: The timeout and hashing changes are bounded, satisfy the stated intent, preserve genuine forge failure handling, and add no unnecessary behavior.
Testing
Drove a healthy baseline and all four required boundary cases through isolated product paths against real PR 20, captured the CLI transcript, ran both focused regression scripts, and confirmed cleanup. Everything passed.
shasumunreachable, a 64-character contribution wake key from the real poll, and a 16-character pending-reply ID.fm-pending-reply: no SHA-256 hasher available (need shasum or sha256sum).Evidence: Live PR 20 contribution and hashing validation
Source: Live PR 20 contribution and hashing validation
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
.agents/skills/harness-adapters/references/harness/codex.md- branch carries 21 commit(s) that exist on your local main branch but were never pushed to origin/main; these may be unintended bundled work (proposed PR changes 28 file(s)):tests/fm-procevent.test.sh,tests/fm-bearings-board-render.test.sh,bin/fm-lint.sh, andgit diff --checkpass. Serial 8 was a transient runner failure and passed six local runsConfirm these commits belong in this PR before approving, or manually separate the intended work onto origin/main before gating.
🔧 **Review** - 1 issue found → auto-fixed ✅
bin/fm-pending-reply-lib.sh:163- Requirement 4 requires sharedshasumcallers to receive a working fallback. Under the library's documentedset -ucontract, a caller whose PATH hassha256sumbut lacksopensslandshasumaborts while expanding unsetrawbefore reaching this new branch. Ifopensslfails and neither hasher exists, unsethexalso aborts without the required named error. Initialize both variables and explicitly handle the no-hasher case.🔧 Fix applied.
✅ Re-checked - no issues remain.
🔧 **Test** - 1 issue found → no changes applied ✅
bash tests/fm-contributions.test.shbash tests/fm-pending-reply.test.shReplayedtests/fm-contributions.test.shagainst archived base commit71bd89cd2ba7819d71e647849c163e695371106bto confirm the regression fails before the fixRan four isolatedbin/fm-contributions.sh pollcalls through the authenticated real GitHub CLI againsthttps://github.com/BohnBawerick/firstmate/pull/20Checked host PATH resolution for/usr/bin/core_perl/shasumand/usr/bin/sha256sumConfirmed the source tree remained clean and temporary test directories were removed🔧 No changes applied.
✅ Re-checked - no issues remain.
shasumunreachable, a 64-character contribution wake key from the real poll, and a 16-character pending-reply ID.fm-pending-reply: no SHA-256 hasher available (need shasum or sha256sum).bash .live-contributions-validation.sh 2>&1 | tee ~/.no-mistakes/evidence/01M40RQWFX32PEFM1FFR0B4EXA/live-contributions-pr20.txtusing an isolated FM_HOME and real PR 20bash tests/fm-contributions.test.shbash tests/fm-pending-reply.test.shInspected the saved evidence for record preservation, notification behavior, identifier formats, and the named missing-hasher errorConfirmed the transient validation directory and driver were removed andgit status --short --untracked-files=allwas empty✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.