Skip to content

Commit 7419ff5

Browse files
committed
Merge remote-tracking branch 'origin/main' into fm/retired-gate-delivery-k9
# Conflicts: # bin/fm-auto-reap.sh
2 parents 247da3b + ca8efbe commit 7419ff5

183 files changed

Lines changed: 1756 additions & 28660 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/bootstrap-diagnostics/SKILL.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ The inline rules in `AGENTS.md` section 3 still bind: detect, then consent, then
1717

1818
- `MISSING: <tool> (install: <command>)` - list the missing tools to the captain with a one-line purpose each plus the printed install commands, wait for consent (one approval may cover the list), then run `bin/fm-bootstrap.sh install <approved tools...>`.
1919
For `treehouse`, this also covers an installed version whose `treehouse get` lacks `--lease`; treat it as an upgrade request.
20-
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.
2120
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.
2221
For `quota-axi`, bootstrap requires it because crew-dispatch `quota-balanced` may call it and direct account-directory selection uses it; `bin/fm-dispatch-select.sh` still degrades at runtime when quota data is unavailable.
2322
Direct account-directory selection also requires Agent Fleet's read-only profile registry to enforce worker-pool eligibility.

.agents/skills/firstmate-codexapp/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ git log --oneline --max-count=3
4747
```
4848

4949
For writable repo work, instruct the worker to use the Codex-created current directory.
50-
Do not tell it to `cd` into the saved project checkout for edits, commits, no-mistakes, pushes, or PR work.
50+
Do not tell it to `cd` into the saved project checkout for edits, commits, pushes, or PR work.
5151

5252
When sending follow-up instructions, use `send_message_to_thread`.
5353
If the user types directly into the visible thread, treat that as authoritative and reconcile from `read_thread` instead of undoing it.

.agents/skills/firstmate-coding-guidelines/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Firstmate adds this skill's load instruction to firstmate-repo briefs by hand in
7575
- Plain dash `-`, never an em dash.
7676
- Never add an agent name as a commit co-author.
7777
- `bin/*.sh` and `bin/backends/*.sh` must pass `shellcheck`.
78-
- Run `bin/fm-lint.sh` before treating a script change as done; it is the single owner of the lint definition (file set, config, and pinned ShellCheck version) that CI and the no-mistakes pre-push gate use with the same full-or-focused Azure-service scope, and it refuses to run under any other ShellCheck version.
78+
- Run `bin/fm-lint.sh` before treating a script change as done; it is the single owner of the lint definition (file set, config, and pinned ShellCheck version) used by local development and CI, and it refuses to run under any other ShellCheck version.
7979
- Colocate tests with the existing pattern in `tests/`, name them `<subject>.test.sh`, and extend an existing script rather than inventing a new runner.
8080
- `bin/*.py` runs under whichever `python3` is first on the invoking shell's `PATH`, which is often older than the version CI pins, so a newer-only API fails at runtime rather than in CI.
8181
- Prefer the idiom already used across `bin/`: `os.stat(path, follow_symlinks=...)`, not the Python 3.10+ `Path.stat(follow_symlinks=...)`.

.agents/skills/fmx-respond/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ The asker being your own captain (owner-only routing) does **not** relax this: a
8080
Never include, in any form:
8181

8282
- Task ids, branch names, worktree paths, PR/issue numbers, or repo-internal identifiers.
83-
- Tooling/internal vocabulary: crewmate, scout, ship, secondmate, harness names, watcher, heartbeat, brief, teardown, no-mistakes, yolo, delivery modes.
83+
- Tooling/internal vocabulary: crewmate, scout, ship, secondmate, harness names, watcher, heartbeat, brief, teardown, yolo, delivery modes.
8484
- Captain-private material: the captain's name, product strategy, unreleased plans, revenue, internal URLs, file contents, or anything the captain has not made public.
8585
- Secrets of any kind: tokens, keys, credentials, the pairing token, hostnames.
8686

.agents/skills/harness-adapters/SKILL.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ Do not manually reproduce backend-specific timing.
109109

110110
Use `stuck-crewmate-recovery` for the full escalation ladder.
111111
A low context indicator is not evidence of a stuck agent.
112-
Do not change shared daemon lifecycle while recovering a no-mistakes task.
113112

114113
## Verifying a new adapter
115114

.agents/skills/secondmate-provisioning/SKILL.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,12 @@ Direct seed without a preexisting brief requires `FM_SECONDMATE_CHARTER`.
9393
Run `bin/fm-home-seed.sh validate` when checking registry integrity; it refuses duplicate ids, duplicate homes, and nested or overlapping homes.
9494

9595
Seeding is transactional.
96-
If validation, cloning, no-mistakes initialization, or registry update fails, generated briefs, new homes, new project clones, and registry edits are rolled back.
96+
If validation, cloning, or registry update fails, generated briefs, new homes, new project clones, and registry edits are rolled back.
9797
Home provisioning, child spawn, and retirement use one canonical home lifecycle lock.
9898
The lock order is home lifecycle, task lifecycle, then registry; recursive retirement acquires parent homes before child homes and holds each home lock through its final state check, removal, and registry update.
9999

100-
Secondmate project lists may include `no-mistakes` and `direct-PR` projects only.
100+
Secondmate project lists may include `direct-PR` projects only.
101101
`local-only` projects stay with the main firstmate.
102-
For `no-mistakes` projects, seeding initializes only projects newly cloned into a secondmate home and refuses to mutate a preexisting clone that is not already initialized.
103102

104103
## Backlog handoff
105104

.agents/skills/stow/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ The goal is a session that is safe to reset or destroy because everything durabl
3535
- Project-intrinsic knowledge: never hand-write a project's `AGENTS.md`.
3636
Route it through a normal ship task so a crewmate records it via `bin/fm-ensure-agents-md.sh` and commits it through that project's delivery pipeline, exactly as section 6 describes.
3737
If the fleet is live, delegate this to a crewmate rather than doing it inline.
38-
- Knowledge generalizable to every firstmate user: this repo's own `AGENTS.md` (or other shared, tracked material), shipped through the normal branch -> no-mistakes -> PR -> captain-merge pipeline for this repo (section 1), never hand-committed straight to `main`.
38+
- Knowledge generalizable to every firstmate user: this repo's own `AGENTS.md` (or other shared, tracked material), shipped through the normal branch -> PR -> green CI -> exact-head Crosscheck -> approved merge pipeline for this repo (section 1), never hand-committed straight to `main`.
3939
- Task-scoped notes: inspect the relevant backlog item with `tasks-axi show <id> --full`, judge whether the new note is new, duplicate, superseding, or obsolete, then write a considered replacement body by running `tasks-axi update <id> --body-file <path>` through `bin/fm-data-write.py --data "$FM_HOME/data" -- <command>`.
4040
When the replacement intentionally supersedes prior state that should remain recoverable, add `--archive-body` to that update command so the prior body stays recoverable without copying it into the replacement.
4141
Never append.

.agents/skills/stuck-crewmate-recovery/SKILL.md

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
name: stuck-crewmate-recovery
33
description: >-
44
Agent-only playbook for stuck firstmate direct reports.
5-
Use after a stale wake, permission-prompt or system-dialog suspicion, no-mistakes reattach socket read timeout, looping pane, repeated confusion, an answered-by-brief question, an unresponsive crewmate, or a failed steer.
6-
Routes permission grants and home-scoped validation recovery before the ordinary peek, steer, interrupt, relaunch, and failed-status ladder.
5+
Use after a stale wake, permission-prompt or system-dialog suspicion, looping pane, repeated confusion, an answered-by-brief question, an unresponsive crewmate, or a failed steer.
6+
Routes permission handling before the ordinary peek, steer, interrupt, relaunch, and failed-status ladder.
77
user-invocable: false
88
metadata:
99
internal: true
@@ -16,19 +16,6 @@ Use this playbook when a direct report is stale, permission-blocked, looping, re
1616
Load `harness-adapters` before handling a permission prompt or sending an interrupt, exit command, resume command, or harness-specific skill invocation.
1717
The target window's harness is recorded as `harness=` in `state/<id>.meta`.
1818

19-
## No-mistakes reattach timeout branch
20-
21-
Handle an error shaped as `drive run: reconcile run ...: read response: ... socket: i/o timeout` before the ordinary ladder.
22-
That signature means an established daemon connection missed the bounded run-snapshot response deadline; it is not evidence that the daemon stopped.
23-
24-
1. Run `FM_HOME=<this-firstmate-home> bin/fm-no-mistakes-reattach.sh <id>` from the active firstmate repository unless `FM_HOME` already names the active home.
25-
2. Let the helper own retry timing and task identity checks.
26-
It retries only the observed transient signature and requires the daemon to report running before every attempt. This read-only preflight narrows risk but cannot guarantee no start because ordinary `axi run` calls `EnsureDaemon` after the check; strict protection requires an upstream attach-only operation.
27-
3. Treat a returned gate or outcome as the current run result and continue the ordinary validation decision or completion workflow.
28-
4. If the helper exhausts its retries, preserve its exact final error and escalate the lane as blocked without changing daemon lifecycle state.
29-
5. Do not use this branch for another daemon error.
30-
Diagnose that error through the ordinary ladder and retain the shared-daemon prohibition.
31-
3219
## Permission-blocked branch
3320

3421
Handle permission evidence before the ordinary recovery ladder because approving, denying, interrupting, or relaunching can change the security decision or hide the only useful evidence.

.agents/skills/updatefirstmate/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ metadata:
99
# updatefirstmate
1010

1111
Self-update firstmate in place.
12-
Firstmate is its own repo behind the same no-mistakes gate as any project, so shared tracked material reaches `main` and then waits for each running firstmate to pull it; `AGENTS.md` section 12 owns that material's self-update boundary.
12+
Firstmate is its own repo, so shared tracked material reaches `main` through a green PR and exact-head Crosscheck, then waits for each running firstmate to pull it; `AGENTS.md` section 12 owns that material's self-update boundary.
1313
Only `AGENTS.md`, `bin/`, and `.agents/skills/` are a running firstmate instruction surface; public `skills/` is installer-facing and is not loaded by firstmate.
1414
This skill performs that pull for the running main firstmate and every secondmate, without disturbing any in-flight work.
1515

1616
The update is **fast-forward only** - the same sanctioned self-write as the fleet sync firstmate already runs.
1717
It never forces, never creates a merge commit, never stashes, and advances a target only on a clean fast-forward; anything dirty, diverged, offline, or on the wrong branch is skipped and reported.
18-
A tracked-files fast-forward leaves the gitignored operational dirs (data/, state/, config/, projects/, .no-mistakes/) untouched, so a secondmate's in-flight work is never disrupted.
18+
A tracked-files fast-forward leaves the gitignored operational dirs (data/, state/, config/, projects/) untouched, so a secondmate's in-flight work is never disrupted.
1919
This touches only the firstmate repo and its own worktrees, never anything under `projects/`.
2020

2121
## What it does

.github/workflows/ci.yml

Lines changed: 4 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ permissions:
1212
jobs:
1313
lint:
1414
name: Lint shell scripts
15-
needs: behavior-test-plan
1615
runs-on: ubuntu-latest
1716
steps:
1817
- uses: actions/checkout@v6
@@ -23,59 +22,15 @@ jobs:
2322
set -eu
2423
bin/fm-install-shellcheck.sh "$RUNNER_TEMP/bin"
2524
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
26-
# Single owner of the lint definition (file set + config + version). Do not
27-
# re-spell the shellcheck command here; keep CI and the pre-push gate on it.
25+
# Single owner of the lint definition (file set + config + version).
26+
# Do not re-spell the shellcheck command here.
2827
- run: bin/fm-lint.sh
29-
if: needs.behavior-test-plan.outputs.mode == 'full'
30-
- name: Lint changed Azure service shell files
31-
if: needs.behavior-test-plan.outputs.mode == 'focused'
32-
shell: bash
33-
run: |
34-
set -euo pipefail
35-
files=()
36-
while IFS= read -r path; do
37-
[ -n "$path" ] && files+=("$path")
38-
done < <(python3 bin/fm-azure-service-test-scope.py shell \
39-
"${{ github.event.pull_request.base.sha }}" \
40-
"${{ github.event.pull_request.head.sha }}")
41-
if [ "${#files[@]}" -gt 0 ]; then
42-
bin/fm-lint.sh "${files[@]}"
43-
else
44-
echo "No changed shell files in focused Azure service diff"
45-
fi
4628
# ShellCheck cannot see the .mjs tools, and nothing else parsed them: a
4729
# syntax error in one reached main green.
4830
- run: bin/fm-lint-node.sh
4931

50-
behavior-test-plan:
51-
name: Behavior test shard plan
52-
runs-on: ubuntu-latest
53-
outputs:
54-
mode: ${{ steps.scope.outputs.mode }}
55-
steps:
56-
- uses: actions/checkout@v6
57-
with:
58-
fetch-depth: 0
59-
- name: Select focused or full behavior coverage
60-
id: scope
61-
shell: bash
62-
run: |
63-
set -euo pipefail
64-
mode=full
65-
if [ "$GITHUB_EVENT_NAME" = pull_request ]; then
66-
mode=$(python3 bin/fm-azure-service-test-scope.py mode \
67-
"${{ github.event.pull_request.base.sha }}" \
68-
"${{ github.event.pull_request.head.sha }}")
69-
fi
70-
printf 'mode=%s\n' "$mode" >> "$GITHUB_OUTPUT"
71-
printf 'FM_BEHAVIOR_MODE %s\n' "$mode"
72-
- name: Prove complete, disjoint shard coverage
73-
run: bin/fm-behavior-shards.sh --check 8
74-
7532
behavior-tests:
7633
name: Behavior tests (shard ${{ matrix.shard }}/8)
77-
needs: behavior-test-plan
78-
if: needs.behavior-test-plan.outputs.mode == 'full'
7934
runs-on: ubuntu-latest
8035
timeout-minutes: 25
8136
strategy:
@@ -155,66 +110,27 @@ jobs:
155110
if-no-files-found: warn
156111
overwrite: true
157112

158-
behavior-tests-focused:
159-
name: Behavior tests (focused Azure service)
160-
needs: behavior-test-plan
161-
if: needs.behavior-test-plan.outputs.mode == 'focused'
162-
runs-on: ubuntu-latest
163-
timeout-minutes: 10
164-
steps:
165-
- uses: actions/checkout@v6
166-
- uses: actions/setup-python@v6
167-
with:
168-
python-version: "3.11"
169-
- name: Run focused Azure service behavior tests
170-
shell: bash
171-
run: |
172-
set -euo pipefail
173-
tests=()
174-
while IFS= read -r path; do
175-
[ -n "$path" ] && tests+=("$path")
176-
done < <(python3 bin/fm-azure-service-test-scope.py list)
177-
[ "${#tests[@]}" -gt 0 ]
178-
FM_TEST_SKIP_HERDR=1 tests/run.sh "${tests[@]}"
179-
180113
behavior-tests-complete:
181114
# Preserve the historical required-check name while proving the union of
182115
# what the eight runners actually executed, not only the planned inventory.
183116
name: Behavior tests
184-
needs: [behavior-test-plan, behavior-tests, behavior-tests-focused]
117+
needs: behavior-tests
185118
if: always()
186119
runs-on: ubuntu-latest
187120
steps:
188121
- uses: actions/checkout@v6
189-
- name: Require one selected behavior mode
190-
env:
191-
BEHAVIOR_MODE: ${{ needs.behavior-test-plan.outputs.mode }}
192-
run: |
193-
case "$BEHAVIOR_MODE" in
194-
full|focused) ;;
195-
*) echo "invalid behavior mode: $BEHAVIOR_MODE" >&2; exit 1 ;;
196-
esac
197122
- name: Download executed-test manifests
198-
if: needs.behavior-test-plan.outputs.mode == 'full'
199123
uses: actions/download-artifact@v4
200124
continue-on-error: true
201125
with:
202126
pattern: behavior-shard-*
203127
path: ${{ runner.temp }}/behavior-manifests
204128
merge-multiple: true
205129
- name: Verify complete execution union
206-
if: needs.behavior-test-plan.outputs.mode == 'full'
207130
run: bin/fm-behavior-shards.sh --verify 8 "$RUNNER_TEMP/behavior-manifests"
208-
- name: Verify focused execution
209-
if: needs.behavior-test-plan.outputs.mode == 'focused'
210-
env:
211-
FOCUSED_RESULT: ${{ needs.behavior-tests-focused.result }}
212-
run: test "$FOCUSED_RESULT" = success
213131

214132
agent-fleet:
215133
name: Agent Fleet package
216-
needs: behavior-test-plan
217-
if: needs.behavior-test-plan.outputs.mode == 'full'
218134
runs-on: ubuntu-latest
219135
steps:
220136
- uses: actions/checkout@v6
@@ -246,7 +162,7 @@ jobs:
246162
- name: Personal fleet paths must not be tracked
247163
run: |
248164
set -eu
249-
tracked=$(git ls-files -- data state config projects .no-mistakes)
165+
tracked=$(git ls-files -- data state config projects)
250166
if [ -n "$tracked" ]; then
251167
echo "::error::Personal fleet paths are tracked in git:"
252168
printf '%s\n' "$tracked"

0 commit comments

Comments
 (0)