Skip to content

fix: reconcile stale Git hook overrides on worker relaunch - #23

Merged
MrGTV-love merged 5 commits into
mainfrom
fm/fm-relaunch-stale-git-hook-env
Oct 5, 2026
Merged

MrGTV-love merged 5 commits into
mainfrom
fm/fm-relaunch-stale-git-hook-env

Conversation

@MrGTV-love

@MrGTV-love MrGTV-love commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Intent

We need to get rid of or fix bad guards. We can't allow them to continue encumbering our work. I want judgement applied. The better answer lies in better engineering instead of more engineering.

Context: the existing ST-A3 publication recovery stops before publishing because its supported relaunch retains an obsolete Firstmate-generated git-hook override from the original terminal shell, even though keep-ai-trailers now selects the repository's own hooks. Git's command-scope output proves the stale override. The preserved work is unchanged; this task fixes that specific launcher defect, not Vernant code or its guards.

What Changed

  • Reconcile task-generated Git hook overrides in the persistent launch shell and after environment filtering, removing stale selections when keeping AI trailers and preserving unrelated Git entries and operator hook overrides.
  • Add real-tmux Bash and ksh regression coverage for same-task relaunches, attribution transitions, configuration preservation, and environment filtering; replace brittle launch-string assertions with executable probes and remove implementation-specific checks.
  • Document launch and relaunch hook-selection behavior and record model-free runtime verification evidence.

Risk Assessment

✅ Low: The fix is narrowly scoped to task-owned Git hook routing, reconciles both persistent and filtered launch environments, and introduces no substantiated material defect or unnecessary behavioral component.

Testing

Reproduced the original stale Git-hook override, then passed the target's real fm-spawn/private-tmux/Git transitions in Bash and ksh, including allowlisted persistent-shell reconciliation, configuration preservation, and idempotent strip re-enablement. Related executable environment/argv checks also passed. The socket-path setup issue was resolved locally, four product-output logs were retained, and disposable fixtures were removed. No full suite, linters, live vendor workers, publication actions, or Herdr lifecycle actions were run.

  • Live validation: ✅ go - 5 of 5 scenarios driven live against the product
Scenario Result Live Evidence
Relaunch a stopped strip-enabled task with keep-ai-trailers and recover repository hook selection ✅ pass live stale-hooks-baseline.log and stale-hooks-target.log: the base retained the generated command-scope hooksPath; the target returned only local .project-hooks in both Bash and ksh, retaining the same end…
Remove a stale hook entry embedded among unrelated duplicate keys and shell-like literal values ✅ pass live stale-hooks-target.log: both shells preserved 'first value', literal '$(false); tail', and command-scope fixture.operator=explicit while removing the task-owned hooks entry.
Preserve an explicit operator hooks override and re-enable stripping without accumulating generated entries ✅ pass live stale-hooks-target.log: the other.git-hooks operator path survived keep mode; two successive strip relaunches retained it and selected exactly one current-task generated hook entry in both shells.
Enable keep-ai-trailers and an empty allowlist after an unfiltered strip launch, clearing stale exports in the persistent pane ✅ pass live stale-hooks-target.log: filtered workers saw only local .project-hooks; persistent panes retained the operator hooks path and unrelated value, compacted to GIT_CONFIG_COUNT=2, and no longer exported t…
Re-enable stripping under an empty allowlist while preserving persistent-pane operator configuration ✅ pass live stale-hooks-target.log: filtered workers received the current-task strip hooks without unrelated pane configuration; persistent panes retained operator routing and unrelated values alongside one task-…
Evidence: Base launcher reproduces stale command-scope hook selection

Source: Base launcher reproduces stale command-scope hook selection


[bash] worker Git scope (task=hooks-relaunch-bash-65912 pane=%1 endpoint=firstmate:fm-hooks-relaunch-bash-65912)
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.yc0ZlA/relaunch-bash/home/state/hooks-relaunch-bash-65912.git-hooks

[bash] worker Git scope (task=hooks-relaunch-bash-65912 pane=%1 endpoint=firstmate:fm-hooks-relaunch-bash-65912)
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.yc0ZlA/relaunch-bash/home/state/hooks-relaunch-bash-65912.git-hooks

[bash] observed assertion state
observed: keep-ai-trailers relaunch retained the obsolete command-scope strip override
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.yc0ZlA/relaunch-bash/home/state/hooks-relaunch-bash-65912.git-hooks
not ok - keep-ai-trailers relaunch retained the obsolete command-scope strip override (expected 'local	.project-hooks', got 'local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.yc0ZlA/relaunch-bash/home/state/hooks-relaunch-bash-65912.git-hooks')
Evidence: Target Bash and ksh relaunch Git scopes and persistent-pane environment

Source: Target Bash and ksh relaunch Git scopes and persistent-pane environment


[bash] worker Git scope (task=hooks-relaunch-bash-81485 pane=%1 endpoint=firstmate:fm-hooks-relaunch-bash-81485)
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/hooks-relaunch-bash-81485.git-hooks

[bash] worker Git scope (task=hooks-relaunch-bash-81485 pane=%1 endpoint=firstmate:fm-hooks-relaunch-bash-81485)
local	.project-hooks

[bash] observed assertion state
observed: keep-ai-trailers relaunch retained the obsolete command-scope strip override
actual:
local	.project-hooks

[bash] observed assertion state
observed: relaunch lost or evaluated unrelated numbered Git configuration
actual:
first value
literal $(false); tail

[bash] observed assertion state
observed: relaunch lost explicit operator configuration
actual:
command	explicit

[bash] observed assertion state
observed: relaunch replaced the endpoint
actual:
firstmate:fm-hooks-relaunch-bash-81485

[bash] observed assertion state
observed: relaunch replaced the pane
actual:
%1

[bash] observed assertion state
observed: relaunch replaced the isolated copy
actual:
~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/wt

[bash] observed assertion state
observed: strip launch lost operator routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/hooks-relaunch-bash-81485.git-hooks

[bash] observed assertion state
observed: strip launch lost unrelated configuration
actual:
operator

[bash] observed assertion state
observed: strip launch lost operator routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/hooks-relaunch-bash-81485.git-hooks

[bash] observed assertion state
observed: strip launch lost unrelated configuration
actual:
operator

[bash] observed assertion state
observed: allowlisted keep-ai-trailers worker selected a command-scope hook override
actual:
local	.project-hooks

[bash] observed assertion state
observed: allowlist leaked unrelated pane Git configuration
actual:


[bash] observed assertion state
observed: allowlisted relaunch replaced the endpoint
actual:
firstmate:fm-hooks-relaunch-bash-81485

[bash] observed assertion state
observed: allowlisted relaunch replaced the pane
actual:
%1

[bash] observed assertion state
observed: allowlisted relaunch replaced the isolated copy
actual:
~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/wt

[bash] observed assertion state
observed: persistent pane retained obsolete hooks or lost operator routing
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/other.git-hooks

[bash] observed assertion state
observed: persistent pane lost unrelated Git configuration
actual:
operator
persistent pane numbered Git environment:
GIT_CONFIG_VALUE_0=~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/other.git-hooks
GIT_CONFIG_VALUE_1=operator
GIT_CONFIG_GLOBAL=/dev/null
GIT_CONFIG_NOSYSTEM=1
GIT_CONFIG_KEY_0=core.hooksPath
GIT_CONFIG_KEY_1=fixture.preserved
GIT_CONFIG_COUNT=2

[bash] observed assertion state
observed: allowlisted strip worker lost task hooks or inherited operator routing
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/hooks-relaunch-bash-81485.git-hooks

[bash] observed assertion state
observed: strip launch bypassed the environment filter
actual:


[bash] observed assertion state
observed: allowlisted strip launch lost pane routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-bash/home/state/hooks-relaunch-bash-81485.git-hooks

[bash] observed assertion state
observed: allowlisted strip launch lost pane Git configuration
actual:
operator
ok - supported same-task bash tmux relaunch reconciles generated hooks and preserves operator configuration

[ksh] worker Git scope (task=hooks-relaunch-ksh-81485 pane=%1 endpoint=firstmate:fm-hooks-relaunch-ksh-81485)
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/hooks-relaunch-ksh-81485.git-hooks

[ksh] worker Git scope (task=hooks-relaunch-ksh-81485 pane=%1 endpoint=firstmate:fm-hooks-relaunch-ksh-81485)
local	.project-hooks

[ksh] observed assertion state
observed: keep-ai-trailers relaunch retained the obsolete command-scope strip override
actual:
local	.project-hooks

[ksh] observed assertion state
observed: relaunch lost or evaluated unrelated numbered Git configuration
actual:
first value
literal $(false); tail

[ksh] observed assertion state
observed: relaunch lost explicit operator configuration
actual:
command	explicit

[ksh] observed assertion state
observed: relaunch replaced the endpoint
actual:
firstmate:fm-hooks-relaunch-ksh-81485

[ksh] observed assertion state
observed: relaunch replaced the pane
actual:
%1

[ksh] observed assertion state
observed: relaunch replaced the isolated copy
actual:
~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/wt

[ksh] observed assertion state
observed: strip launch lost operator routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/hooks-relaunch-ksh-81485.git-hooks

[ksh] observed assertion state
observed: strip launch lost unrelated configuration
actual:
operator

[ksh] observed assertion state
observed: strip launch lost operator routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/hooks-relaunch-ksh-81485.git-hooks

[ksh] observed assertion state
observed: strip launch lost unrelated configuration
actual:
operator

[ksh] observed assertion state
observed: allowlisted keep-ai-trailers worker selected a command-scope hook override
actual:
local	.project-hooks

[ksh] observed assertion state
observed: allowlist leaked unrelated pane Git configuration
actual:


[ksh] observed assertion state
observed: allowlisted relaunch replaced the endpoint
actual:
firstmate:fm-hooks-relaunch-ksh-81485

[ksh] observed assertion state
observed: allowlisted relaunch replaced the pane
actual:
%1

[ksh] observed assertion state
observed: allowlisted relaunch replaced the isolated copy
actual:
~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/wt

[ksh] observed assertion state
observed: persistent pane retained obsolete hooks or lost operator routing
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/other.git-hooks

[ksh] observed assertion state
observed: persistent pane lost unrelated Git configuration
actual:
operator
persistent pane numbered Git environment:
GIT_CONFIG_COUNT=2
GIT_CONFIG_GLOBAL=/dev/null
GIT_CONFIG_KEY_0=core.hooksPath
GIT_CONFIG_KEY_1=fixture.preserved
GIT_CONFIG_NOSYSTEM=1
GIT_CONFIG_VALUE_0=~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/other.git-hooks
GIT_CONFIG_VALUE_1=operator

[ksh] observed assertion state
observed: allowlisted strip worker lost task hooks or inherited operator routing
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/hooks-relaunch-ksh-81485.git-hooks

[ksh] observed assertion state
observed: strip launch bypassed the environment filter
actual:


[ksh] observed assertion state
observed: allowlisted strip launch lost pane routing or accumulated generated entries
actual:
local	.project-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/other.git-hooks
command	~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-git-strip-ai-trailers.HMTshf/relaunch-ksh/home/state/hooks-relaunch-ksh-81485.git-hooks

[ksh] observed assertion state
observed: allowlisted strip launch lost pane Git configuration
actual:
operator
ok - supported same-task ksh tmux relaunch reconciles generated hooks and preserves operator configuration
Evidence: Delivered Claude environment and permission arguments plus compound-launch commit object

Source: Delivered Claude environment and permission arguments plus compound-launch commit object

ok - claude forwards firstmate's CLAUDE_CONFIG_DIR so the crewmate uses the same credential store
ok - config/claude-permission-mode=auto replaces --dangerously-skip-permissions with --permission-mode auto
ok - config/claude-permission-mode=auto reaches scout launches too
ok - a chained raw launch commits through the AI-trailer strip in every step
Commit object from executed compound launch:
fix: chained raw launch

Executed launch probe: config-dir
Delivered value: ~/.no-mistakes/worktrees/32d18ed9638d/01M45B303VFRE0SMS32M722XNX/.gate-live-validation/tmp/fm-spawn-dispatch-profile.lafakj/profile-claude-cfgdir/claude-work
Executed launch probe: permissions
Delivered value: --permission-mode auto
Executed launch probe: permissions
Delivered value: --permission-mode auto
Evidence: Delivered compact-adviser environment across both relaunch allowlist postures

Source: Delivered compact-adviser environment across both relaunch allowlist postures

Executed environment probe: a relaunched agent with allowlist=absent must start with the compact adviser disabled, exactly as a fresh spawn does
Delivered COMPACT_ADVISER_DISABLE=1
Executed environment probe: a relaunched agent with allowlist=enabled must start with the compact adviser disabled, exactly as a fresh spawn does
Delivered COMPACT_ADVISER_DISABLE=1
ok - relaunch rebuilds the compact-adviser switch for the replacement agent in both allowlist postures

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 2 issues found → auto-fixed (2) ✅
  • 🚨 bin/fm-spawn.sh:5257 - The new destination-shell function assumes local exists, but accepted ksh panes do not provide that builtin. tmux preserves the configured pane shell, and ksh is explicitly classified as an agent-free shell in bin/fm-agent-process-lib.sh:54. With the allowlist absent, the staged launch is sourced directly in that shell. Both declarations at bin/fm-spawn.sh:5257-5258 fail, leaving fm_count empty; line 5259 then returns successfully without reconciling anything. A strip-to-keep relaunch retains the stale generated hooksPath, while a fresh strip-enabled launch never selects the strip hooks. The invocation at bin/fm-spawn.sh:5287 continues into the harness in both cases. Make variable handling in this shared prefix compatible with the accepted destination shells while retaining reconciliation in the persistent pane shell.
  • 🚨 tests/fm-spawn-dispatch-profile.test.sh:1635 - The replacement assertions still search emitted executable shell source rather than verify the claimed worker behavior, contrary to the required test-quality rule. The new permission assertions at tests/fm-spawn-dispatch-profile.test.sh:1635-1636 can pass when matching flags occur in comments or unexecuted commands; the changed CLAUDE_CONFIG_DIR assertion at :1061 likewise does not prove which credential store reaches the worker. Directly related retained assertions have the same issue at :1651-1652 (scout permissions) and tests/fm-kimi-harness.test.sh:297-299 (delivered effort and turn-end arguments). Remove these source-content-only assertions or execute the captured launch with environment/argv probes and assert the actual delivered values. The new claude_launch_arg helper already demonstrates the executable approach.

🔧 Fix applied.
2 errors still open:

  • 🚨 bin/fm-spawn.sh:5257 - The new destination-shell function assumes local exists, but accepted ksh panes do not provide that builtin. tmux preserves the configured pane shell, and ksh is explicitly classified as an agent-free shell in bin/fm-agent-process-lib.sh:54. With the allowlist absent, the staged launch is sourced directly in that shell. Both declarations at bin/fm-spawn.sh:5257-5258 fail, leaving fm_count empty; line 5259 then returns successfully without reconciling anything. A strip-to-keep relaunch retains the stale generated hooksPath, while a fresh strip-enabled launch never selects the strip hooks. The invocation at bin/fm-spawn.sh:5287 continues into the harness in both cases. Make variable handling in this shared prefix compatible with the accepted destination shells while retaining reconciliation in the persistent pane shell.
  • 🚨 bin/fm-spawn.sh:5286 - Round 1 fixes ksh portability but leaves the allowlisted path inconsistent with the human requirement to "reconcile in the same persistent destination shell." The changed hunk at :5286-5287 places reconciliation inside LAUNCH, which :5411 wraps in the existing env -i /bin/sh child. Concrete supported sequence: launch with stripping and no allowlist, stop the agent, enable keep-ai-trailers and an empty launch-env-allowlist, then relaunch the same task. The replacement worker is correctly filtered, but the persistent pane sourced at :5462 retains its obsolete generated Git override because the child cannot unset its parent's exports. This is an acceptance-criterion contradiction, not a demonstrated worker-publication failure. Reconcile the task-owned stale entry at the shared persistent-shell boundary before the existing filter, retaining filtered-worker hook selection, unrelated entries, and operator overrides. Related sites: docs/configuration.md:978 promises destination-shell reconciliation; tests/fm-git-strip-ai-trailers.test.sh:398-416 covers only the unfiltered transition.

🔧 Fix applied.
✅ Re-checked - no issues remain.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 5 of 5 scenarios driven live against the product
Scenario Result Live Evidence
Relaunch a stopped strip-enabled task with keep-ai-trailers and recover repository hook selection ✅ pass live stale-hooks-baseline.log and stale-hooks-target.log: the base retained the generated command-scope hooksPath; the target returned only local .project-hooks in both Bash and ksh, retaining the same end…
Remove a stale hook entry embedded among unrelated duplicate keys and shell-like literal values ✅ pass live stale-hooks-target.log: both shells preserved 'first value', literal '$(false); tail', and command-scope fixture.operator=explicit while removing the task-owned hooks entry.
Preserve an explicit operator hooks override and re-enable stripping without accumulating generated entries ✅ pass live stale-hooks-target.log: the other.git-hooks operator path survived keep mode; two successive strip relaunches retained it and selected exactly one current-task generated hook entry in both shells.
Enable keep-ai-trailers and an empty allowlist after an unfiltered strip launch, clearing stale exports in the persistent pane ✅ pass live stale-hooks-target.log: filtered workers saw only local .project-hooks; persistent panes retained the operator hooks path and unrelated value, compacted to GIT_CONFIG_COUNT=2, and no longer exported t…
Re-enable stripping under an empty allowlist while preserving persistent-pane operator configuration ✅ pass live stale-hooks-target.log: filtered workers received the current-task strip hooks without unrelated pane configuration; persistent panes retained operator routing and unrelated values alongside one task-…
  • git diff 1070d7ed698014e49087d7182d10485baf2974ab cbe2ce79662de87182c08d23ed2503924705e2a3 for the changed launcher, documentation, and targeted tests.
  • VALIDATION_BASELINE=1 bash tests/.gate-stale-hooks-live.test.sh — disposable observation driver using the base commit's fm-spawn.sh; reproduced the obsolete command-scope hooks override after keep-ai-trailers relaunch.
  • VALIDATION_BASELINE=0 bash tests/.gate-stale-hooks-live.test.sh — executed the existing private-tmux relaunch scenarios against the target launcher in Bash and ksh, observing worker Git scopes, persistent-pane environment, and unchanged task endpoint, pane, and worktree.
  • bash tests/.gate-profile-probes.test.sh — selected tests from fm-spawn-dispatch-profile.test.sh for executable Claude config-directory forwarding, ship/scout auto-permission arguments, and compound-launch trailer stripping.
  • bash tests/.gate-compact-relaunch.test.sh — selected test_relaunch_rebuilds_the_switch from fm-spawn-compact-adviser-disable.test.sh, executing replacement launch probes with the allowlist absent and enabled.
  • Used a short worktree-local private tmux socket after the initial fixture socket exceeded macOS's socket-path limit; removed disposable drivers, baseline launcher, fixture directories, and private tmux servers after validation.
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…le serial 7. The new multiline launch prefix exposed tests that parsed semicolon positions or matched anchored executable source. Replaced those assertions with model-free workers executing the complete captured launch and observing delivered argv/environment, including sibling Claude brief/credential and trace-cleanup paths. Production reconciliation, shell selection, and allowlist behavior remain unchanged. Updated the existing verification documentation. Local verification: bash bin/fm-test-run.sh --jobs 1 tests/fm-control-relaunch.test.sh tests/fm-trace-context-spawn.test.sh tests/fm-claude-trust.test.sh tests/fm-git-strip-ai-trailers.test.sh — all four suites passed, zero failures and zero gate skips. Private Bash/ksh tmux proofs passed, including persistent-pane cleanup across the allowlisted relaunch transition. Two non-fatal BSD sed diagnostics appeared in an unrelated Pi-session case. The full portable CI shard was not rerun
@MrGTV-love
MrGTV-love merged commit 2cd3d49 into main Oct 5, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant