diff --git a/.agents/skills/bootstrap-diagnostics/SKILL.md b/.agents/skills/bootstrap-diagnostics/SKILL.md index 0aad884638..eafee05212 100644 --- a/.agents/skills/bootstrap-diagnostics/SKILL.md +++ b/.agents/skills/bootstrap-diagnostics/SKILL.md @@ -18,7 +18,7 @@ When any diagnostic needs captain attention, report the plain consequence and re - `MISSING: (install: )` - 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 `. For `treehouse`, this also covers an installed version whose `treehouse get` lacks `--lease`; treat it as an upgrade request. - 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 `no-mistakes`, this also covers an installed version older than 0.40.0, because crewmate validation briefs delegate gate mechanics to no-mistakes' version-matched guidance. For any axi-family tool - `gh-axi`, `lavish-axi`, `tasks-axi`, `quota-axi` - an installed version below its floor is a plain upgrade request; [`bin/fm-bootstrap.sh`](../../../bin/fm-bootstrap.sh) owns the floor policy, and never argue the floor down to whatever the home happens to have installed. For `tasks-axi`, this additionally covers an installed build that fails the separate feature probe (`bin/fm-tasks-axi-lib.sh` owns the definition); `config/backlog-backend=manual` only suppresses the verbose `BOOTSTRAP_INFO: tasks-axi available` fact, not this missing-tool report. For `quota-axi`, bootstrap requires it because firstmate reads its current output directly before resolving every crew-dispatch profile array; without it, report the missing requirement and do not choose around an unexamined candidate. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 19aa158b09..d67118017f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,7 @@ GitHub Actions and Dependabot are exempt so their automation keeps working, but 1. Fork the repo, then clone the parent repo or set your local `origin` back to the parent (`git@github.com:kunchenguid/firstmate.git`). 2. Create a branch and make your changes. -3. Initialize the gate with your fork as the push target: `no-mistakes init --fork-url git@github.com:/firstmate.git` (firstmate expects **no-mistakes v1.31.2+**; without a fork, plain `no-mistakes init` still works for maintainers with push access). +3. Initialize the gate with your fork as the push target: `no-mistakes init --fork-url git@github.com:/firstmate.git` (firstmate expects **no-mistakes v0.40.0+**; without a fork, plain `no-mistakes init` still works for maintainers with push access). 4. Commit your changes. 5. Push through the gate instead of pushing to `origin`: diff --git a/bin/fm-bootstrap.sh b/bin/fm-bootstrap.sh index 47203fc17b..6c354ff6cb 100755 --- a/bin/fm-bootstrap.sh +++ b/bin/fm-bootstrap.sh @@ -51,7 +51,7 @@ # treehouse is also MISSING when its installed version lacks # "treehouse get --lease" support. # no-mistakes is also MISSING when its installed version is older than -# 1.31.2. +# 0.40.0. # The AXI-family floor policy is owned beside GH_AXI_MIN and # LAVISH_AXI_MIN below; the per-tool owners point there. An installed # build below its floor reports MISSING like no-mistakes, so the operator @@ -792,7 +792,12 @@ if ! BACKEND_TOOLS=$(fm_backend_required_tools "$BACKEND"); then BACKEND_TOOLS="" fi TOOLS="$BACKEND_TOOLS $COMMON_TOOLS" -NO_MISTAKES_MIN=1.31.2 +# NO_MISTAKES_MIN is the minimum-compatibility floor: the oldest no-mistakes +# release that supports firstmate's crewmate-validation workflow. Unlike the +# axi-family floors below, it is NOT bumped to the latest release on each +# captain update; it moves only when firstmate requires a newer no-mistakes +# capability and the install base has had time to catch up. +NO_MISTAKES_MIN=0.40.0 # AXI-FAMILY FLOOR POLICY. Every axi-family floor is the CURRENT LATEST published # version of that tool, captain-bumped periodically to keep the whole fleet on the # newest axi tools. It is NOT the minimum feature-introduced version. These floors diff --git a/docs/configuration.md b/docs/configuration.md index a861b40678..39304d9771 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -315,7 +315,7 @@ Secondmate homes inherit this file from the primary, so a secondmate's own crewm On session start the first mate detects what its required toolchain is missing or too old and lists each problem with either an exact install command or manual instructions. It installs automatically supported tools only after you say go; manual-only tools remain for you to install from the printed instructions. Required tools come in two parts: a universal toolchain every home needs regardless of backend, and a per-backend delta that follows the runtime backend actually resolved for this home. -The universal toolchain is node, git, gh with GitHub auth via `gh auth login`, no-mistakes v1.31.2 or newer, compatible gh-axi, chrome-devtools-axi, compatible lavish-axi, compatible tasks-axi per "Backlog backend" above, and compatible quota-axi. +The universal toolchain is node, git, gh with GitHub auth via `gh auth login`, no-mistakes v0.40.0 or newer, compatible gh-axi, chrome-devtools-axi, compatible lavish-axi, compatible tasks-axi per "Backlog backend" above, and compatible quota-axi. [`bin/fm-bootstrap.sh`](../bin/fm-bootstrap.sh) owns the axi-family floor policy and the gh-axi and lavish-axi floors, while [`bin/fm-tasks-axi-lib.sh`](../bin/fm-tasks-axi-lib.sh) and [`bin/fm-quota-axi-lib.sh`](../bin/fm-quota-axi-lib.sh) hold their own tools' floor constants. This section is the single owner of that universal toolchain list; backend guides' prerequisites point here and add only their backend-specific tools. In that list, no-mistakes runs the validation pipeline, gh-axi, chrome-devtools-axi, and lavish-axi cover GitHub, browser, and rich-review operations, and tasks-axi plus quota-axi back backlog mutations and quota-aware array dispatch. diff --git a/tests/fm-bootstrap.test.sh b/tests/fm-bootstrap.test.sh index 1810e6b5f0..39c1c176ac 100755 --- a/tests/fm-bootstrap.test.sh +++ b/tests/fm-bootstrap.test.sh @@ -79,7 +79,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' "${FM_FAKE_NO_MISTAKES_VERSION:-no-mistakes version v1.31.2 (fake) 2026-06-27T00:02:18Z}" + printf '%s\n' "${FM_FAKE_NO_MISTAKES_VERSION:-no-mistakes version v0.40.0 (fake) 2026-06-27T00:02:18Z}" exit 0 fi exit 0 @@ -332,10 +332,10 @@ test_no_mistakes_min_version() { [ "$out" = "$missing" ] || fail "$label: expected '$missing', got: $out" ;; esac done <<'ROWS' -minimum no-mistakes version is accepted^no-mistakes version v1.31.2 (fake)^empty -newer no-mistakes minor is accepted^no-mistakes version v1.32.0 (fake)^empty -newer no-mistakes major is accepted^no-mistakes version v2.0.0 (fake)^empty -older no-mistakes patch reports an upgrade^no-mistakes version v1.31.1 (fake)^missing +minimum no-mistakes version is accepted^no-mistakes version v0.40.0 (fake)^empty +newer no-mistakes minor is accepted^no-mistakes version v0.41.0 (fake)^empty +newer no-mistakes major is accepted^no-mistakes version v1.0.0 (fake)^empty +older no-mistakes patch reports an upgrade^no-mistakes version v0.39.9 (fake)^missing unparseable no-mistakes version reports an upgrade^no-mistakes development build^missing ROWS pass "bootstrap enforces no-mistakes minimum version" diff --git a/tests/fm-secondmate-harness.test.sh b/tests/fm-secondmate-harness.test.sh index 4db6f78169..9fee15050c 100755 --- a/tests/fm-secondmate-harness.test.sh +++ b/tests/fm-secondmate-harness.test.sh @@ -1088,7 +1088,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake)' + printf '%s\n' 'no-mistakes version v0.40.0 (fake)' exit 0 fi exit 0 diff --git a/tests/fm-secondmate-liveness.test.sh b/tests/fm-secondmate-liveness.test.sh index 84795f6c72..14fad14a1e 100755 --- a/tests/fm-secondmate-liveness.test.sh +++ b/tests/fm-secondmate-liveness.test.sh @@ -233,7 +233,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake)' + printf '%s\n' 'no-mistakes version v0.40.0 (fake)' exit 0 fi exit 0 diff --git a/tests/fm-secondmate-sync.test.sh b/tests/fm-secondmate-sync.test.sh index 326bdcda72..5e8d64684b 100755 --- a/tests/fm-secondmate-sync.test.sh +++ b/tests/fm-secondmate-sync.test.sh @@ -340,7 +340,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake)' + printf '%s\n' 'no-mistakes version v0.40.0 (fake)' exit 0 fi exit 0 diff --git a/tests/fm-session-start.test.sh b/tests/fm-session-start.test.sh index e74eceb7ab..c076fd297a 100755 --- a/tests/fm-session-start.test.sh +++ b/tests/fm-session-start.test.sh @@ -99,7 +99,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake) 2026-06-27T00:02:18Z' + printf '%s\n' 'no-mistakes version v0.40.0 (fake) 2026-06-27T00:02:18Z' exit 0 fi exit 0 diff --git a/tests/fm-shared-captain-inheritance.test.sh b/tests/fm-shared-captain-inheritance.test.sh index 904e8887b4..de3936c169 100755 --- a/tests/fm-shared-captain-inheritance.test.sh +++ b/tests/fm-shared-captain-inheritance.test.sh @@ -232,7 +232,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake)' + printf '%s\n' 'no-mistakes version v0.40.0 (fake)' exit 0 fi exit 0 diff --git a/tests/fm-startup-memory-budget.test.sh b/tests/fm-startup-memory-budget.test.sh index 9107d27103..482ab5cda1 100755 --- a/tests/fm-startup-memory-budget.test.sh +++ b/tests/fm-startup-memory-budget.test.sh @@ -44,7 +44,7 @@ SH cat > "$fakebin/no-mistakes" <<'SH' #!/usr/bin/env bash if [ "${1:-}" = --version ]; then - printf '%s\n' 'no-mistakes version v1.31.2 (fake)' + printf '%s\n' 'no-mistakes version v0.40.0 (fake)' fi SH cat > "$fakebin/tasks-axi" <<'SH'