Skip to content
This repository was archived by the owner on Jul 15, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
e1f4782
feat: run firstmate as a Kubernetes agent OS
robinbraemer Jul 12, 2026
b2dba24
docs: design persistent root agent toolchains
robinbraemer Jul 12, 2026
5519cb7
docs: plan persistent root agent toolchains
robinbraemer Jul 12, 2026
868903a
feat: bundle the Firstmate toolchain
robinbraemer Jul 12, 2026
ea04e93
feat: persist agent-installed tools
robinbraemer Jul 12, 2026
c167dc7
feat: isolate root agents with user namespaces
robinbraemer Jul 12, 2026
b53e32c
fix: run root agents on local OrbStack
robinbraemer Jul 12, 2026
25b506a
docs: explain persistent root agents
robinbraemer Jul 12, 2026
6910099
feat: scaffold Agent OS operating tool
robinbraemer Jul 12, 2026
7afe7a0
feat: add Akua mate packaging
robinbraemer Jul 12, 2026
4d4294b
feat: bundle k9s in agent image
robinbraemer Jul 12, 2026
9837e8a
refactor: keep mate workflows tool-native
robinbraemer Jul 12, 2026
7c73fcc
feat: add Akua Firstmate bootstrap package
robinbraemer Jul 12, 2026
aa94fa9
fix: probe model capacity and portable evidence
robinbraemer Jul 12, 2026
82db241
Prove persistent Kubernetes mate recovery
robinbraemer Jul 13, 2026
2f9d19a
Pin Terra in remote mate demo
robinbraemer Jul 13, 2026
aa6cca5
fix: isolate codex spawn auth boundary
robinbraemer Jul 13, 2026
761223c
fix: select rebuilt local demo image
Jul 13, 2026
7679bda
Merge pull request #3 from akua-dev/fm/fix-local-rebuild-image-r2
robinbraemer Jul 13, 2026
0c65885
Record GitHub issue to PR fleet proof
robinbraemer Jul 13, 2026
d31cfa9
Record fleet task reconciliation
robinbraemer Jul 13, 2026
ff57e0b
docs: keep Agent OS work tracking private
robinbraemer Jul 13, 2026
83e69ab
no-mistakes(review): Captain, generalize Codex auth-boundary guidance
robinbraemer Jul 13, 2026
2364817
fix: guard secondmate primary sessions from blind turn ends (#505)
kunchenguid Jul 13, 2026
ce2e34d
docs: separate Kubernetes core from Akua integration
robinbraemer Jul 13, 2026
84df313
no-mistakes(test): Captain: fix bootstrap fixture and Zellij creation…
robinbraemer Jul 13, 2026
e912d1f
no-mistakes(test): Captain: stabilize Herdr and Zellij startup races
robinbraemer Jul 13, 2026
547acd7
fix: make bootstrap diagnostics backend-aware (#519)
kunchenguid Jul 13, 2026
32bb941
feat: make Agent OS package portable
robinbraemer Jul 13, 2026
ff336b2
no-mistakes(test): Captain: stabilize real-Herdr fixture shell readiness
robinbraemer Jul 13, 2026
86cc876
no-mistakes(document): Clarify Codex and backend launch boundaries
robinbraemer Jul 13, 2026
07c48ee
docs: add Herdr source compliance bundle
robinbraemer Jul 13, 2026
b708731
fix: preserve follow-up platform context after inbox cleanup (#520)
kunchenguid Jul 13, 2026
d47b44c
fix: recover empty zellij new-tab IDs
robinbraemer Jul 13, 2026
dc8122c
feat(pi): use native watcher-only supervision
robinbraemer Jul 12, 2026
f05c72f
no-mistakes(review): Captain, prevent Pi watcher restart after shutdown
robinbraemer Jul 13, 2026
309285f
no-mistakes(review): Captain, fix Pi AFK ownership and credential cle…
robinbraemer Jul 13, 2026
3afa83e
no-mistakes(review): Captain, defer Pi pending wakes during away mode
robinbraemer Jul 13, 2026
e872d80
no-mistakes(review): Captain, contain and retry Pi pending-wake failures
robinbraemer Jul 13, 2026
019e009
no-mistakes(review): Captain, defer settled Pi wakes during away mode
robinbraemer Jul 13, 2026
108c736
no-mistakes(review): Captain, harden Pi settlement deferral and retry
robinbraemer Jul 13, 2026
049a740
no-mistakes(review): Captain, suppress false Pi AFK stop failures
robinbraemer Jul 13, 2026
f78e431
no-mistakes(review): Captain, harden Pi wake delivery and AFK restart…
robinbraemer Jul 13, 2026
3396ea1
no-mistakes(test): Captain, align Pi scanner test with zombie-aware l…
robinbraemer Jul 13, 2026
9b4d65d
no-mistakes(document): Align Pi watcher lifecycle documentation
robinbraemer Jul 13, 2026
a318580
merge: synchronize kunchenguid/firstmate main
robinbraemer Jul 13, 2026
85b7a29
fix: preserve secondmate routing markers in terminal sends (#533)
kunchenguid Jul 13, 2026
8c0d9eb
fix: align Grok effort handling with 0.2.99 (#527)
korallis Jul 13, 2026
ceb1f90
merge: synchronize kunchenguid/firstmate main
robinbraemer Jul 13, 2026
4c691f2
Merge Agent OS and Firstmate sync lineage
robinbraemer Jul 14, 2026
71c886e
Merge live upstream Firstmate
robinbraemer Jul 14, 2026
15ddf76
Merge Firstmate PR 442 Pi watcher lifecycle
robinbraemer Jul 14, 2026
9eaaf87
Merge Firstmate PR 521 Codex backend boundaries
robinbraemer Jul 14, 2026
e6042d3
Merge stricter Zellij recovery superseder
robinbraemer Jul 14, 2026
56caa0a
feat: close Agent OS source provenance
robinbraemer Jul 14, 2026
e5e5738
fix: harden Zellij lifecycle recovery
robinbraemer Jul 14, 2026
16c676e
no-mistakes(review): Captain, harden Agent OS deployment and publicat…
robinbraemer Jul 14, 2026
a4b9b2d
no-mistakes(review): Harden Agent OS ownership, provenance, and publi…
robinbraemer Jul 14, 2026
06a0dd7
no-mistakes(review): Harden Kubernetes ownership and publication fres…
robinbraemer Jul 14, 2026
c27e3b1
no-mistakes(review): Close publication, rollback, and delete races
robinbraemer Jul 14, 2026
b9e8847
no-mistakes(document): Align Agent OS documentation with runtime cont…
robinbraemer Jul 14, 2026
12ddffe
no-mistakes(lint): Captain: suppress literal-only ShellCheck warnings
robinbraemer Jul 14, 2026
0ce7cf2
Merge preserved Agent OS source lineage
robinbraemer Jul 15, 2026
ea7d5d8
test: align source provenance with reusable CI gate
robinbraemer Jul 15, 2026
590418f
fix: retain derived Kubernetes installation identity
robinbraemer Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .agents/skills/bootstrap-diagnostics/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name: bootstrap-diagnostics
description: >-
Agent-only handling playbook for session-start bootstrap diagnostics.
Use whenever the session-start digest's bootstrap section prints any diagnostic or capability line - MISSING, NEEDS_GH_AUTH, TANGLE, CREW_HARNESS_OVERRIDE, CREW_DISPATCH, FLEET_SYNC, SECONDMATE_SYNC, SECONDMATE_LIVENESS, TASKS_AXI, NUDGE_SECONDMATES, or FMX - or when a standalone bin/fm-bootstrap.sh run prints one.
Use whenever the session-start digest's bootstrap section prints any diagnostic or capability line - MISSING, MISSING_MANUAL, BACKEND_INVALID, NEEDS_GH_AUTH, TANGLE, CREW_HARNESS_OVERRIDE, CREW_DISPATCH, FLEET_SYNC, SECONDMATE_SYNC, SECONDMATE_LIVENESS, TASKS_AXI, NUDGE_SECONDMATES, or FMX - or when a standalone bin/fm-bootstrap.sh run prints one.
A silent bootstrap section means all good and needs no skill load.
user-invocable: false
metadata:
Expand All @@ -20,6 +20,8 @@ The inline rules in `AGENTS.md` section 3 still bind: detect, then consent, then
For `no-mistakes`, this also covers an installed version older than 1.31.2, because crewmate validation briefs delegate gate mechanics to no-mistakes' version-matched guidance.
For `tasks-axi`, this also covers an installed build that fails the compatibility probe (`docs/configuration.md` "Backlog backend" owns the definition); `config/backlog-backend=manual` only suppresses the `TASKS_AXI: available` capability line, not this missing-tool report.
For `quota-axi`, bootstrap requires it because crew-dispatch `quota-balanced` may call it; `bin/fm-dispatch-select.sh` still degrades at runtime when quota data is unavailable.
- `MISSING_MANUAL: <tool> (instructions: <url>)` - tell the captain why the tool is required and give them the printed instructions URL, but do not pass the tool to `bin/fm-bootstrap.sh install`; wait for the captain to complete the manual installation, then rerun session start to confirm the dependency is present.
- `BACKEND_INVALID: <name> (known: <names>)` - the resolved runtime backend has no verified dependency or lifecycle contract, so do not dispatch work until the invalid `FM_BACKEND` or `config/backend` value is corrected to one of the listed backends.
- `NEEDS_GH_AUTH` - ask the captain to run `! gh auth login` (interactive; you cannot run it for them).
- `TANGLE: <remediation>` - the primary checkout is stranded on a feature branch instead of its default branch; `AGENTS.md` section 8 explains why this guard exists and what it protects.
The work is safe on that branch ref; restore the primary to its default branch with the printed `git -C <root> checkout <default>`, then re-validate that branch in a proper worktree.
Expand All @@ -39,7 +41,7 @@ The inline rules in `AGENTS.md` section 3 still bind: detect, then consent, then
- `TASKS_AXI: available` - a default-backend capability fact, not a problem; record it silently and use `AGENTS.md` section 10 for backlog mutations.
It prints only when `config/backlog-backend` is absent or set to `tasks-axi` and the shared compatibility probe passes (`docs/configuration.md` "Backlog backend").
If the backend is not opted out and `tasks-axi` is missing or incompatible, bootstrap reports the `MISSING: tasks-axi` line but firstmate still hand-edits routine backlog updates and never blocks work.
If `config/backlog-backend=manual`, firstmate hand-edits routine backlog updates and bootstrap does not suggest installing `tasks-axi`.
If `config/backlog-backend=manual`, firstmate hand-edits routine backlog updates and suppresses only this capability line; a missing or incompatible `tasks-axi` is still handled by the `MISSING` rule above.
- `NUDGE_SECONDMATES: fm-<id>...` - the secondmate sweep fast-forwarded one or more *running* secondmate homes to firstmate's current version and their instruction surface (`AGENTS.md`, `bin/`, or `.agents/skills/`) actually changed; send a one-line re-read nudge with `FM_HOME=<this-firstmate-home> bin/fm-send.sh <id> 'firstmate was updated to the latest - please re-read your AGENTS.md to pick up the new instructions.'` unless `FM_HOME` is already set to the active firstmate home.
This mirrors `/updatefirstmate`'s `nudge-secondmates:` report: it is a gentle steer, never an interruption, and the fast-forward already landed safely.
A secondmate that was skipped, already current, or whose advance changed no instructions is not listed and must not be disturbed.
Expand Down
11 changes: 7 additions & 4 deletions .agents/skills/fmx-respond/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ How the reply lands depends on whether the work finishes during this turn:
- **Work that spawns a real, longer-running job** (dispatching a crewmate, a scout investigation, a ship task) cannot report an outcome yet, so it follows **acknowledge first -> act -> follow up on completion**:
1. **Acknowledge first.** Post an immediate, public-safe reply that you have the captain's order and are on it (the normal answer endpoint, via `bin/fm-x-reply.sh`). This is the legitimate, work-backed version of "aye, will do": it is paired with actually starting the work in the same turn, never a promise left empty.
2. **Act.** Dispatch the work through the normal lifecycle right away.
3. **Link it for the follow-up, before clearing the inbox.** Associate the spawned task with this mention so completion follow-ups can be posted later: `bin/fm-x-link.sh <task-id> <request_id>` (records the request id, a timestamp, a follow-up counter, and reply-platform context).
3. **Link it for the follow-up, before clearing the inbox.** Associate the spawned task with this mention so completion follow-ups can be posted later: `bin/fm-x-link.sh <task-id> <request_id>` (records the request id, a timestamp, a follow-up counter, and reply platform/budget context).
Do this right after the task is spawned, and always **before** removing the inbox file (step 2f).
`bin/fm-x-link.sh` reads the mention's platform from the still-present inbox payload, so linking before cleanup is what keeps a longer Discord follow-up on the Discord budget instead of the X 280-char one; if the inbox is already gone it falls back to an authoritative relay lookup by request_id and, failing even that, warns loudly - but the local link-before-cleanup order is the fast, correct path, so keep it.
Linking before cleanup lets `bin/fm-x-link.sh` copy the context directly from the inbox, while the durable per-request context recorded by the poll preserves it independently for delayed and concurrent follow-ups.
The exact resolution and fail-safe posting contract is owned by `docs/configuration.md`.
If a recovery respawns the same relay request onto a successor task, relink with the paired `--carry-count <n> --carry-ts <epoch>` flags plus any prior `x_platform=` and `x_reply_max_chars=` as `--carry-platform <x|discord> --carry-max <n>` so the successor keeps the consumed follow-up count, original 7-day window, and reply split budget.
4. **Follow up on genuine milestones, sparingly.** Firstmate gets up to **three** follow-ups per mention, within a 7-day window, chained in the same thread - spend them only on changes the captain would actually want to hear about (e.g. investigation done and a build started, work shipped or ready, or the task failing), never on routine internal churn.
The task's final outcome - shipped / reported / merged / failed - is always posted with `--final`, which clears the link regardless of how many follow-ups remain.
Expand Down Expand Up @@ -137,7 +138,8 @@ Treat `state/x-inbox/` as the source of truth and process **every** file you fin
c. **Act on an actionable request through the normal lifecycle.** Treat it exactly as a captain prompt typed in session: run ordinary intake (resolve the project), then file the backlog item, dispatch a crewmate, start a scout, or ship through the gate - whatever the request calls for.
**Destructive, irreversible, or security-sensitive work is the exception** (X mode is a public, relayed channel and does not carry full in-session trust): do not execute it from the mention. Flag it to the captain through the normal trusted channel first - the same carve-out as `yolo` (AGENTS.md §1, §7) - act only on the captain's word, and in step 2d say only that it has been flagged for the captain.
**If the request spawned a real, longer-running task** (you ran `bin/fm-spawn.sh`), link that task to this mention so milestone and completion follow-ups can be posted: `bin/fm-x-link.sh <task-id> <request_id>`.
**Link here, in step 2c, before the step 2f inbox cleanup** - `bin/fm-x-link.sh` reads the mention's reply platform from the still-present inbox payload, so linking after the file is removed strands a longer Discord follow-up on the X 280-char budget (it then falls back to a relay lookup and, failing that, a loud warning, but the correct order avoids both).
**Link here, in step 2c, before the step 2f inbox cleanup** - `bin/fm-x-link.sh` can copy both the mention's reply platform and explicit budget from the still-present inbox payload without a relay lookup.
If that local context is incomplete it uses the durable resolution contract in `docs/configuration.md` and warns loudly, while the follow-up path refuses to post unless both values can be resolved authoritatively.
Then step 2d's reply is an **acknowledgement** ("on it, captain"), and genuine milestone updates plus the final outcome come later as follow-ups (see "Completion follow-up" below), with the terminal one posted using `--final`.
If the work completed in this turn (a backlog item filed, a question answered), there is no task to link and step 2d reports the outcome directly.
d. **Compose the reply.** For a **question**, answer `.text` from the fleet state gathered in step 1. For an **actionable request that completed now**, report the outcome of step 2c (what was done, or - for escalated work - that it has been flagged for the captain). For an **actionable request that spawned a linked task**, acknowledge that you have the order and are on it - milestone updates and the final outcome follow later as completion follow-ups, so do not promise a result you do not yet have. Either way keep it short, in firstmate's voice, and public-safe.
Expand All @@ -163,7 +165,7 @@ Treat `state/x-inbox/` as the source of truth and process **every** file you fin
It posts nothing, stops the re-offer, and prevents the offline auto-reply; it echoes the `request_id` and exits 0 on success (it honors `FMX_DRY_RUN` like `bin/fm-x-reply.sh`, recording the would-be dismiss to `state/x-outbox/` instead of posting). Do **not** call `bin/fm-x-reply.sh` for a skip.
f. **On success (a posted reply, or a relay dismiss for a skip), remove that inbox file:** `rm -f state/x-inbox/<request_id>.json` (and your temporary reply file).
This is the local idempotency guard - a cleared file is never answered twice.
For an acknowledged actionable request that spawned a task, this cleanup comes **after** the step 2c link, never before: `bin/fm-x-link.sh` reads the reply platform from this inbox payload, so removing it first would strand the follow-up on the wrong split budget.
For an acknowledged actionable request that spawned a task, this cleanup comes **after** the step 2c link, never before, so the link can copy the reply platform and budget directly from the inbox payload.
g. **On failure** (a non-zero exit from `bin/fm-x-reply.sh` or `bin/fm-x-dismiss.sh`), leave that inbox file in place, move on to the next, and do not retry blindly.
If you had already acted on this mention in step 2c before the post failed, do **not** redo that work on a later drain - check whether it is already done (e.g. the backlog item exists, the crewmate is already running) and only retry the reply.
If a reply or dismiss fails twice, surface it to the captain as a blocker with the stderr detail; for live post failures include the relay's HTTP status when available.
Expand Down Expand Up @@ -197,6 +199,7 @@ This skill's own responsibility during the mention-handling turn is linking the
When the update carries one real visual artifact, add `--image <path>`; the helper forwards it to `bin/fm-x-reply.sh --followup` so the same image contract used for ordinary replies applies here too.
- On a terminal wake (PR merged / scout report / local merge / failed), firstmate posts the task's **final** outcome ("done, here's the result"; for a failure, an honest "this one didn't pan out") with `bin/fm-x-followup.sh <task-id> --final --text-file <path>`, which always clears the link after that post regardless of how many follow-ups remain under the cap.
- Every follow-up is held to the exact same public-safety bar as every reply here: outcomes only, no task ids, internals, captain-private material, or secrets. Past the window, past the cap, or on the relay's own rejection of an exhausted binding, a follow-up attempt is skipped silently and the link is cleared - never treated as a failure worth retrying.
- If either a follow-up's platform or explicit budget cannot be authoritatively resolved from per-request context, inbox payload, or relay answer, `bin/fm-x-followup.sh` does NOT post it: the fail-safe holds it (the link is kept, exit non-zero) rather than use a local default. This is a retryable hold - a later milestone wake retries it once both values are recoverable.

## Notes

Expand Down
Loading