chore: sync fork with upstream main (f5e89b9) - #4
Merged
Merged
Conversation
…-governance section (kunchenguid#307) * Encode project AGENTS authoring bar * no-mistakes(review): Captain, centralize CLAUDE promotion governance * no-mistakes(review): make ensure_maintenance_section idempotent-success, drop || true guards * no-mistakes(review): separate appended maintenance section on newline-less CLAUDE.md promotion * no-mistakes(review): assert maintenance heading present before separator check in test * no-mistakes(document): sync docs with AGENTS.md authoring bar and self-governance --------- Co-authored-by: fmtest <fmtest@example.invalid>
…chenguid#300) * Add captain-invocable bearings skill Generates a pick-up-where-I-left-off status report from live fleet state to data/status-report-<YYYY-MM-DD>.md plus a concise chat summary. Read-mostly procedure: reads backlog, per-task crew state via bin/fm-crew-state.sh, open PRs via gh-axi, scout reports, pending decisions, and date-gated queued work; composes the exemplar's sections (TL;DR, Check first, Landed, In flight, Plans, Decisions pending, Date-gated/queued); never tears down, merges, or mutates task state as a side effect. * no-mistakes(document): docs: list new /bearings skill in README built-in skills table
* fix(watcher): pin LC_ALL=C in fm_pid_identity for locale-invariant identity ps's lstart date format follows the caller's LC_TIME/LC_ALL. The watcher records its process identity under one locale, but arm/guard/turn-end re-read it under the machine's ambient locale. On a non-C locale (e.g. ko_KR) the two strings differ only in the date portion, so fm_watcher_lock_matches_pid / fm_watcher_healthy reject a genuinely live watcher - breaking fm-watch-arm.sh, fm-guard.sh, and fm-turnend-guard.sh on every non-C-locale machine. Pin LC_ALL=C on that one ps call so the write and read sides agree regardless of machine locale, matching the LC_ALL=C determinism the file already uses elsewhere. Add a colocated regression test asserting fm_pid_identity is locale-invariant across exported LC_ALL/LC_TIME. * no-mistakes(document): Document watcher PID identity coverage
* docs: reconcile Codex App backend contract * no-mistakes(document): Sync backend docs * docs: clarify Codex Desktop bridge blocker * no-mistakes(document): Align Codex App backend docs * no-mistakes(test): Captain, stabilize watcher self-eviction test cadence * no-mistakes(document): Document Codex App backend contract * no-mistakes(document): Captain, document blocked codex-app coverage * docs: make Codex App contract doc authoritative * no-mistakes(document): Align Codex App backend docs * docs: redact local Codex App smoke paths --------- Co-authored-by: Stephen Brouhard <vesta@stephens-macbook-air.tail2122af.ts.net>
* docs: add Codex App coordination skill * no-mistakes(review): Captain, mark Codex App skill agent-only * no-mistakes(document): Document Codex App backend boundary * no-mistakes(document): Captain, document Codex Desktop backend boundary * no-mistakes(lint): Captain, lint clean * no-mistakes(document): Document Codex Desktop boundaries * docs: narrow Codex App skill playbook
* fix(afk): recognize unbordered herdr composer rows to stop escalation redelivery loop fm_backend_herdr_composer_state only recognized bordered composer rows (the grok shape). Real claude and codex render their live input row with no border at all, so once a harness's own startup banner scrolled out of the capture window the classifier read the composer as unknown forever. fm_backend_herdr_send_text_submit never confirmed "empty", so escalate_flush never cleared state/.subsuper-escalations, and the away-mode daemon retyped and resubmitted the same buffered digest every housekeeping cycle - reproduced live against a real herdr+claude pane (5+ identical deliveries in 40s). The classifier now recognizes an unbordered (bare) composer row led by a known prompt glyph alongside the existing bordered shape, keeping whichever match is bottom-most so a stale decorative box never outranks the live composer. * no-mistakes(review): Narrow herdr bare prompt matcher * no-mistakes(document): Sync herdr composer docs
…upstream-x1 # Conflicts: # AGENTS.md # docs/scripts.md
fm-spawn.sh and fm-teardown.sh source bin/fm-home-lib.sh (added in the FM_HOME cross-home guard work), but the pre-refactor old-bin fixture in fm-backend.test.sh never symlinked it in. The gap was latent until the guard commit became the merge-base baseline the fixture extracts from, at which point the extracted old fm-spawn.sh aborted sourcing a missing fm-home-lib.sh. Mirror the existing fm-treehouse-lib.sh entry.
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.
Syncs this fork's
mainwith upstreamkunchenguid/firstmatemain (f5e89b9) via a true merge commit, so upstream main becomes an ancestor of fork main and future syncs stay cheap.This is an upstream-sync merge; the no-mistakes pipeline was deliberately skipped, because the pipeline replays branches and would linearize the merge commit, defeating the sync. The repo's CI
Require no-mistakescheck will therefore be red on this PR — that is expected and firstmate handles it.Upstream commits pulled in (6)
f5e89b9fix(afk): stop herdr escalation redelivery loop (fix(afk): stop herdr escalation redelivery loop kunchenguid/firstmate#317)a790a20docs: add Codex Desktop coordination skill (docs: add Codex Desktop coordination skill kunchenguid/firstmate#275)0a7cb88docs: document codex app backend contract (docs: document codex app backend contract kunchenguid/firstmate#222)49ffe5dfix(watcher): make PID identity locale-invariant (fix(watcher): make PID identity locale-invariant kunchenguid/firstmate#285)463cb51feat(skills): add captain-invocable bearings status-report skill (feat(skills): add captain-invocable bearings status-report skill kunchenguid/firstmate#300)138a9d0feat(bin): encode project AGENTS.md authoring bar with canonical self-governance section (feat(bin): encode project AGENTS.md authoring bar with canonical self-governance section kunchenguid/firstmate#307)Conflicts resolved (keep-both-sides)
AGENTS.md(section 7 spawn paragraph): both sides edited the same "For ship and scout tasks…" sentence. Our fork's version leases the worktree (treehouse get --lease/lease_holder=); upstream's version added aSelecting backend=codex-app fails…doc-pointer sentence. Kept our lease sentence (it supersedes upstream's plaintreehouse get) and appended upstream's codex-app sentence. Surrounding codex-app additions (line-levelrejects codex-app as unknown, backend override note, skills list) auto-merged cleanly.docs/scripts.md(script table): our fork'sfm-spawn.shrow carries lease wording plus two extra rows (fm-treehouse-lib.sh,fm-home-lib.sh); upstream'sfm-spawn.shandfm-backend.shrows addedcodex-apprejection wording. Merged both: kept our lease text and extra rows, and folded upstream'srejects backend=codex-app/deliberately keeps codex-app out of known/spawn-capable backendsclauses into the respective rows.CONTRIBUTING.md(test list) auto-merged cleanly with both sides' additions present: ourfm-teardown/fm-secondmate-safety/fm-spawn-lease/fm-home-resolutionlines and upstream'sfm-backend/fm-backend-herdr/fm-watcher-locklines.Merge-seam test fix (follow-up commit
eeee401)tests/fm-backend.test.shfailed after the merge: its pre-refactor old-bin fixture symlinks a fixed sibling list, butfm-spawn.sh/fm-teardown.shsourcebin/fm-home-lib.sh(added in the fork's FM_HOME cross-home guard work) which was never in that list. The gap was latent until the guard commit became the merge-base baseline the fixture extracts its oldfm-spawn.shfrom, at which point the extracted old script aborted sourcing a missingfm-home-lib.sh. Fixed by addingfm-home-lib.shtoOLD_BIN_UNCHANGED_SIBLINGS, mirroring the existingfm-treehouse-lib.shentry.Validation
shellcheck bin/*.sh bin/backends/*.sh tests/*.sh— clean (exit 0).tests/*.test.sh) run once — 47/47 pass (the one initial failure,fm-backend.test.sh, is fixed by commiteeee401above).