Skip to content

chore: sync fork with upstream main (f5e89b9) - #4

Merged
lattice-interstellar merged 8 commits into
mainfrom
fm/sync-upstream-x1
Jul 7, 2026
Merged

lattice-interstellar merged 8 commits into
mainfrom
fm/sync-upstream-x1

Conversation

@lattice-interstellar

Copy link
Copy Markdown
Owner

Syncs this fork's main with upstream kunchenguid/firstmate main (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-mistakes check will therefore be red on this PR — that is expected and firstmate handles it.

Upstream commits pulled in (6)

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 a Selecting backend=codex-app fails… doc-pointer sentence. Kept our lease sentence (it supersedes upstream's plain treehouse get) and appended upstream's codex-app sentence. Surrounding codex-app additions (line-level rejects codex-app as unknown, backend override note, skills list) auto-merged cleanly.
  • docs/scripts.md (script table): our fork's fm-spawn.sh row carries lease wording plus two extra rows (fm-treehouse-lib.sh, fm-home-lib.sh); upstream's fm-spawn.sh and fm-backend.sh rows added codex-app rejection wording. Merged both: kept our lease text and extra rows, and folded upstream's rejects backend=codex-app / deliberately keeps codex-app out of known/spawn-capable backends clauses into the respective rows.
  • CONTRIBUTING.md (test list) auto-merged cleanly with both sides' additions present: our fm-teardown/fm-secondmate-safety/fm-spawn-lease/fm-home-resolution lines and upstream's fm-backend/fm-backend-herdr/fm-watcher-lock lines.

Merge-seam test fix (follow-up commit eeee401)

tests/fm-backend.test.sh failed after the merge: its pre-refactor old-bin fixture symlinks a fixed sibling list, but fm-spawn.sh/fm-teardown.sh source bin/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 old fm-spawn.sh from, at which point the extracted old script aborted sourcing a missing fm-home-lib.sh. Fixed by adding fm-home-lib.sh to OLD_BIN_UNCHANGED_SIBLINGS, mirroring the existing fm-treehouse-lib.sh entry.

Validation

  • shellcheck bin/*.sh bin/backends/*.sh tests/*.sh — clean (exit 0).
  • Full test suite (tests/*.test.sh) run once — 47/47 pass (the one initial failure, fm-backend.test.sh, is fixed by commit eeee401 above).

kunchenguid and others added 8 commits July 6, 2026 19:35
…-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.
@lattice-interstellar
lattice-interstellar merged commit cc431c0 into main Jul 7, 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.

4 participants