@@ -185,9 +185,15 @@ test_agent_alive_dispatcher_routes_and_falls_back() {
185185# diagnostics need to stay quiet (mirrors tests/fm-secondmate-sync.test.sh's
186186# make_fake_toolchain), MINUS tmux - callers add their own controllable tmux.
187187make_toolchain () {
188- local dir=$1 fakebin
188+ local dir=$1 fakebin real_node
189189 fakebin=$( fm_fakebin " $dir " )
190- fm_fake_exit0 " $fakebin " node gh-axi chrome-devtools-axi lavish-axi
190+ real_node=$( command -v node) || fail " node is required for the liveness fixtures"
191+ fm_fake_exit0 " $fakebin " gh-axi chrome-devtools-axi lavish-axi
192+ cat > " $fakebin /node" << SH
193+ #!/usr/bin/env bash
194+ exec "$real_node " "\$ @"
195+ SH
196+ chmod +x " $fakebin /node"
191197 cat > " $fakebin /gh" << 'SH '
192198#!/usr/bin/env bash
193199exit 0
541547}
542548
543549test_enforced_recovery_sweep_installs_meta_with_inherited_lock () {
544- local w workspace fb tmuxfb fake_root fake_af log out meta account_task native_dir_file refreshed
550+ local w workspace source_root source_branch fb tmuxfb fake_root fake_af log out meta account_task native_dir_file refreshed
545551 w=$( new_world sweep-enforced-inherited-lock)
546- add_sm_home " $w " sm1 firstmate:fm-sm1 claude
552+ source_branch=$( git -C " $ROOT " for-each-ref --format=' %(refname:short)' --points-at HEAD refs/heads | sed -n ' 1p' )
553+ [ -n " $source_branch " ] || source_branch=${GITHUB_HEAD_REF:- fm-test-source}
554+ source_root=" $w /firstmate-source"
555+ git clone --quiet --no-local " $ROOT " " $source_root "
556+ git -C " $source_root " switch --quiet -C " $source_branch " HEAD
557+ git clone --quiet --bare " $source_root " " $w /firstmate-origin.git"
558+ git -C " $source_root " remote set-url origin " file://$w /firstmate-origin.git"
559+ git clone --quiet --no-local --branch " $source_branch " " $source_root " " $w /sm1"
560+ git -C " $w /sm1" switch --quiet --detach HEAD
561+ mkdir -p " $w /sm1/data" " $w /sm1/state" " $w /sm1/config" " $w /sm1/projects"
562+ printf ' %s\n' sm1 > " $w /sm1/.fm-secondmate-home"
547563 workspace=$( cd " $w /sm1" && pwd -P)
548564 meta=" $w /home/state/sm1.meta"
565+ {
566+ printf ' window=firstmate:fm-sm1\n'
567+ printf ' kind=secondmate\n'
568+ printf ' harness=claude\n'
569+ printf ' home=%s\n' " $workspace "
570+ } > " $meta "
571+ touch " $w /home/state/.fake-endpoint"
572+ mkdir -p " $w /home/data"
573+ printf -- ' - sm1 - liveness fixture (home: %s; scope: liveness recovery; projects: ; added 2026-07-31)\n' \
574+ " $workspace " > " $w /home/data/secondmates.md"
549575 account_task=fm-test-sm1-a1234
550576 cat >> " $meta " << EOF
551577worktree=$workspace
@@ -562,8 +588,6 @@ generation_id=account:$account_task:a1234
562588EOF
563589 mkdir -p " $w /home/data/sm1"
564590 printf ' enforce\n' > " $w /home/config/account-routing-mode"
565- cp " $ROOT /bin/fm-account-routing-lib.sh" " $w /sm1/bin/fm-account-routing-lib.sh"
566- cp " $ROOT /bin/fm-spawn.sh" " $w /sm1/bin/fm-spawn.sh"
567591
568592 fake_root=" $w /fake-root"
569593 mkdir -p " $fake_root /bin"
622646 native_dir_file=" $w /native-dir"
623647 refreshed=" $w /session-refreshed"
624648 out=$( run_bootstrap " $tmuxfb :$fb " " $w /home" zsh " $log " \
625- FM_ROOT_OVERRIDE=" $fake_root " FM_TEST_REAL_ROOT=" $ROOT " \
649+ FM_ROOT_OVERRIDE=" $fake_root " FM_TEST_REAL_ROOT=" $source_root " \
626650 FM_AGENT_FLEET_BIN=" $fake_af " FM_ACCOUNT_SESSION_WAIT_SECONDS=2 \
627651 FM_MANAGED_WORKSPACE=" $workspace " \
628652 FM_MANAGED_NATIVE_DIR_FILE=" $native_dir_file " FM_MANAGED_SESSION_REFRESHED=" $refreshed " \
0 commit comments