⚓ firstmate field guide
Using firstmate

Daily commands

The six slash commands you actually type — /bearings, /ahoy, /afk, /quiet, /stow, /updatefirstmate — with what each does step by step.

Most of the time you just talk to the first mate in plain language. Six built-in skills are user-invocable. Claude Code and Grok use the slash form; Codex uses $afk, $bearings, and so on.

Command Use it to
/bearings Get the fleet status digest ("where did I leave off?")
/ahoy Recap what happened since your last message and clear open decisions one at a time
/afk [words] Step away and leave standing instructions
/quiet Stay, but only hear about decisions, failures and review-ready work
/stow Save what the session learned before a reset
/updatefirstmate Pull the latest firstmate and restart every mate onto it

/bearings — where do we stand?#

The first mate runs one deterministic snapshot, bin/fm-bearings-snapshot.sh --json. It is the only source allowed: no ad-hoc probes and no scraping reports. It renders four sections, always in this order, always present:

Section Contains Empty state
Captain's Call Live questions and approvals waiting on you "Nothing needs your action right now"
Recently Landed Merged PRs, finished scouts "No recent completions are in the current baseline."
Underway Running tasks and their current state "Nothing is underway."
Charted Next Queued work, plus holds that are dated, blocked or aged, each with the reason "Nothing is queued."

PRs always appear as full https:// URLs.

Variants. Only the literal option words trigger these. "Make me a board" does not.

/bearings                    chat digest only
/bearings file               + replace data/status-report-<YYYY-MM-DD>.md
/bearings lavish             + interactive HTML fleet board via lavish-axi
/bearings include PRs        + live GitHub PR enrichment (--include-prs)
/bearings file include PRs   combinations work

The lavish board (bin/fm-bearings-board.sh) renders one card per held decision, merge and dispatch. You answer by clicking. Board answers come back as process events and flow into the same decision intake as chat. A board "Merge now" click is your explicit merge word for that exact PR. It is still verified green before merging.

/ahoy — what did I miss?#

It reads only the visible conversation: no shell, no files.

  1. It finds your last real message, skipping injected operational rows.
  2. It recaps outcomes since then: landed work, failures, decisions made, new decisions needed, what is still running.
  3. It scans the whole visible history for decisions you never answered. A later, unrelated message doesn't close an earlier question.
  4. It then walks you through open decisions one at a time, most impactful first. Each comes with the decision, why it matters, the options, and its recommendation.

If /ahoy is the first thing you type in a session, there is nothing to recap, so it runs /bearings instead.

/afk — step away#

/afk
/afk merge anything green in xyz; hold everything else for me; back around 6pm
  1. Same turn, no confirmation. It runs bin/fm-afk-launch.sh enter --words-file <f> [--expected-return <UTC>]. That writes state/.afk-contract with your words verbatim. "No parser, tokenizer, classifier, or grammar reads them." They are applied with judgment, through guarded scripts.
  2. Sub-supervision starts.
    • On Pi, the in-process supervision branch takes over.
    • Where the home runs the supervision host, the host does. A Claude primary runs it by default unless config/supervision-host says off; Cursor, OpenCode, omp, Grok and Codex run it only when that file exists.
    • Otherwise a hidden daemon, bin/fm-supervise-daemon.sh, handles routine wakes. It injects one batched, single-line digest into your pane, and only when the pane is idle and the input box is empty.
  3. It reads back its understanding of your words in plain sentences, and says which ones it could not act on. This is informational only. It doesn't wait for a reply.

While you're away:

  • PRs green at their live head may merge under away authority.
  • Destructive, irreversible or security-sensitive actions can never be pre-authorized, whatever your words say.
  • If a digest can't be delivered within FM_MAX_DEFER_SECS (300s), the wedge alarm fires (config/wedge-alarm). That can be a macOS notification, Herdr, or any command, such as an ntfy.sh push to your phone:
# config/wedge-alarm
osascript
command: curl -fsS -H "Title: firstmate wedge alarm" -d "$1" https://ntfy.sh/replace-with-your-topic

Coming back: there is no /back. Your first genuine message is the return. Before acting on it, the first mate runs bin/fm-afk-return.sh. That shuts down the daemon, archives the posture, presents the wakes that queued up, and keeps every open blocked: item live until it is dealt with. Then it tears down whatever landed.

/quiet — stay, but less noise#

First it checks whether quiet mode is needed at all. On Pi, and wherever bin/fm-afk-launch.sh quiet-check exits 0 because an attended supervision host is already running (the default on a Claude primary), it enters nothing: no record, no flag, no daemon. The first mate tells you that routine events already stay out of the chat, and /quiet off then needs nothing either.

Only when quiet-check exits 1 does it use the same machinery as /afk (FM_AFK_MODE=quiet, so state/.afk reads quiet). The difference is that ordinary chat does not exit it. Only /quiet off does.

Captain, quiet mode is active; I will batch routine updates and surface only decisions, failures, credentials, or review-ready work — ordinary chat will not exit this, say /quiet off when you want normal per-wake responses back. — the skill's acknowledgement

It changes presentation only. It never hides a decision, a failure, a credential need or review-ready work, and it grants no extra authority. It also holds nothing for a return: you are present, so a merge, dispatch or landing you ask for goes ahead now, under normal attended authority. Running /afk during quiet mode replaces the quiet record with an away record, and hold-for-return starts.

/stow — save what this session learned#

Kun's description: "different from compaction which summarizes and drops context, /stow persists it" (2026-07-03).

Inside firstmate it curates three files within a token budget (config/startup-memory-budget, default 7,500 estimated tokens), because they load at every session start:

File Holds Default tier
data/captain.md your preferences and working style (this home) pinned
data/captain-shared.md preferences shared read-only to secondmates pinned
data/learnings.md fleet-local facts and gotchas aging (30 days)

Tiers. Entries carry trailing markers: <!--P--> pinned, <!--a:YYYY-MM-DD--> aging, <!--p:YYYY-MM-DD--> perishable (7 days, with a named expiry condition). An entry is reinforced only on real evidence from this session; plausibility doesn't count. Stale entries move to data/memory-archive.md. They are never deleted.

Every pass:

  1. Report the budget.
  2. Read all three files.
  3. Plan retention.
  4. Reinforce what this session proved.
  5. Expire what is past its clock.
  6. Consolidate.
  7. If still over budget: archive, then offload to a private untracked skill, then evict the oldest aging entries.
  8. Re-check the budget.

It ends by saying whether it is safe to reset. In a primary home it cascades to every secondmate (bin/fm-stow-cascade.sh).

Use /stow outside firstmate too

A standalone public version lives at skills/stow. Install it into any project: npx skills add kunchenguid/firstmate --skill stow. It routes findings to your explicit instruction first, then an existing convention (CLAUDE.md, AGENTS.md, TODO), then a private gitignored .stow-notes.md. It ends with a copy-pasteable RESUME POINTER.

/updatefirstmate — pull the latest distro#

  1. bin/fm-update.sh fast-forwards the checkout. After a squash-merge it can also do a guarded reset --keep when the local result already exists upstream. It updates every registered secondmate the same way, and skips and reports anything dirty, diverged or offline.
  2. It prints reread-firstmate: yes|no, restart-secondmates: ... and nudge-secondmates: ....
  3. It re-reads AGENTS.md, then restarts each live secondmate with bin/fm-secondmate-restart.sh. Each mate first writes down its open work.

It restarts even secondmates whose files didn't change. Launch-time wiring (hooks, harness flags) only re-resolves in a fresh process, so "no tracked files changed" doesn't prove the running agent is current. It never touches data/, state/, config/ or projects/.

Plain-language requests that just work#

You don't need commands for these. Say them:

  • "add github.com/me/repo as a direct-PR project" / "give xyz yolo"
  • "what's blocking PR 42?" / "peek at the dark-mode worker"
  • "relaunch the stuck one on codex high"
  • "set up a remote secondmate on my mac mini for iOS work"
  • "later" (to a decision). This defers it to a date instead of dropping it.
  • "why did you do X?" The first mate can read its own AGENTS.md, skills and scripts to answer, and can change them.
Unofficial guide built 2026-09-26 from kunchenguid/firstmate, the AXI repos, and Kun Chen's public posts. The repo moves daily; when this guide and the repo disagree, the repo wins.