Skip to content

docs: no-mistakes(document): Clarify project path documentation - #1889

Open
verbagem wants to merge 15 commits into
kunchenguid:mainfrom
verbagem:fm/firstmate-capacity-night-2864
Open

docs: no-mistakes(document): Clarify project path documentation#1889
verbagem wants to merge 15 commits into
kunchenguid:mainfrom
verbagem:fm/firstmate-capacity-night-2864

Conversation

@verbagem

@verbagem verbagem commented Aug 7, 2026

Copy link
Copy Markdown

Intent

Run a GNHF Companion-mode Capacity Night against Firstmate itself, with the host only orchestrating and reviewing GNHF output. Fix exactly two proven Firstmate control-plane defects: registered external absolute-path projects such as pai-agent must resolve their declared delivery posture without basename guessing or free-form prose parsing, and unchanged non-actionable paused/parked/terminal workers must not produce repetitive captain-facing stale interruptions while real actionable state changes, credentials, decisions, failed checks, PR-ready outcomes, X-mode obligations, dead or missing active workers, and genuine wedges still wake. The implemented branch uses structured data/projects.md path=/absolute/project annotations plus canonical in-home projects/ path matching, preserves unknown-path no-mistakes/off default diagnostics, refuses ambiguous or malformed structured path identities, and updates spawn/fleet-sync callers so brief mode, task metadata, and guarded landing posture agree. The watcher changes coalesce due declared-pause rechecks into one interruption per scan and absorb already-surfaced parked/terminal stale panes while preserving active-run and new-actionable wakes. A detached origin/main comparison worktree at /Users/temp/.treehouse/firstmate-7bab20/2/firstmate-origin-main-baseline-2864 proved the six broad local validation failures reproduce equivalently under the same environment; the receipt and full logs are in .no-mistakes/baseline-receipts/firstmate-capacity-night-2864/. Let the pipeline judge those baseline-aware failures rather than treating them as branch regressions. Do not merge.

What Changed

1fb6685 no-mistakes(document): Clarify project path documentation
536a858 no-mistakes(review): Escalate AFK paused validation outcomes
c32fd09 no-mistakes(review): Surface AFK paused validation outcomes
0a62443 no-mistakes(review): Surface paused validation outcomes once
9b320c7 no-mistakes(document): Update capacity-night docs
50ca7ab no-mistakes(review): Track same-hash terminal run wedges
eb8dae6 no-mistakes(review): Surface same-hash run outcomes
c7dac1d no-mistakes(review): Version run outcome stale markers
e8f8bcb no-mistakes(review): Fix watcher and project path regressions
bbe1891 no-mistakes(review): Fix watcher stale dedupe and path normalization
75637e1 gnhf 1: Captain, Defect 1 is corrected narrowly: path lookups now ignore registry description prose/backticks and resolve external projects only through structured path=/absolute/project annotations or canonical in-home projects/<name> paths.
bb32456 gnhf 3: Captain, this iteration fixed the remaining parked/terminal stale-noise boundary and validated it with focused watcher, continuity, daemon, lint, and whitespace checks.
2c0d125 gnhf 2: Captain, this iteration fixed the remaining live declared-pause stale path so idle paused workers stay on the bounded pause cadence instead of producing bare repeated stale notifications.
c077dd0 gnhf 1: Captain, this iteration root-caused the duplicate declared-pause noise to per-window paused recheck wake exits, added a regression, and fixed the paused-stale path to batch due rechecks from one scan into one watcher interruption.
462a5e5 gnhf 1: Captain, this iteration fixed Defect 1 by making registered project delivery posture resolve by canonical project path instead of basename guessing.

Risk Assessment

✅ Low: The changes are narrowly scoped to path-based project posture resolution and watcher/away-mode stale dedupe behavior, with the latest AFK validation-outcome path now emitting a daemon-distinguishable wake reason while preserving ordinary paused stale self-handling.

Testing

Verified and attached the existing origin/main comparison receipt instead of rerunning the broad baseline suite, ran the targeted task-delivery, fleet-sync, crew-state, daemon, and watcher-triage suites successfully, captured manual end-to-end CLI evidence for the external-path and stale-wake behavior, and confirmed the worktree remained clean.

Evidence: Manual end-to-end CLI evidence

External path lookup resolved pai-agent, free-form prose path defaulted safely, fm-spawn.sh reported the standing posture for pai-agent, paused stale rechecks batched into one wake, and already-surfaced parked/terminal panes stayed quiet until a new decision status was appended.

manual evidence dir: /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/manual-e2e-corrected-20260807054639

## project-mode and spawn path identity
$ FM_HOME=<fixture> bin/fm-project-mode.sh --raw --with-name --path <external pai-agent>
pai-agent no-mistakes off
$ FM_HOME=<fixture> bin/fm-project-mode.sh --with-name --path <canonical projects/canon>
canon direct-PR off
$ FM_HOME=<fixture> bin/fm-project-mode.sh --path <free-form prose-only path>
warn: no project registered for path "/var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/manual-e2e-corrected-20260807054639/project-mode/external/unknown/agent"; defaulting agent to no-mistakes off
no-mistakes off
$ fm-spawn external pai-agent with explicit local-only task mode
notice: delivery-extpath-e1 ships mode=local-only while the standing posture for pai-agent is no-mistakes - less rigor than the captain's standing posture; proceed only on a current explicit captain instruction or an intake judgment you can state
spawn_exit=1 (fake tmux is expected to stop launch after delivery checks)

## watcher paused stale batch
watch_stdout:
  stale: paused recheck batch (2): test:fm-held-alpha, test:fm-held-beta
wake_queue_stale_records:
  stale test:fm-held-alpha stale: test:fm-held-alpha (paused 501s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
  stale test:fm-held-beta stale: test:fm-held-beta (paused 501s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)

## watcher parked terminal dedupe and new decision wake
already_surfaced_watch_still_alive_after_2s=yes
already_surfaced_stdout_bytes=0
already_surfaced_queue_bytes=0
new_decision_watch_stdout:
  signal: /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/manual-e2e-corrected-20260807054639/watch-terminal-dedupe/state/alpha-parked.status
manual_evidence_complete
Evidence: Baseline receipt verification

diff -qr between the driver receipt and the worktree receipt produced 0 bytes; 19 receipt files were hashed and copied into evidence.

verified byte-identical driver and worktree baseline receipt
      19 /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/baseline-receipt-20260807053646/receipt-sha256.txt
Evidence: Attached baseline receipt README

Receipt states the same six broad local validation failures reproduced equivalently on detached origin/main and the task branch under the same environment.

# Baseline Receipt - firstmate-capacity-night-2864

Comparison date: 2026-08-07.

Task branch: `fm/firstmate-capacity-night-2864` at `75637e1b584dcd3341ab8f73807735beca13b84d`.

Baseline worktree: `/Users/temp/.treehouse/firstmate-7bab20/2/firstmate-origin-main-baseline-2864`.

Baseline commit: `70aeba855527f7693082f6dd1bc731e334d0269f`.

The same six exact failing tests were run on detached `origin/main` and on the task branch under the same local environment.

All six failures reproduced equivalently.

| Test | origin/main exit | task branch exit | Decisive matching diagnostic |
| --- | ---: | ---: | --- |
| `tests/fm-gotmp.test.sh` | 1 | 1 | `not ok - teardown exited non-zero with a valid tasktmp` |
| `tests/fm-calm-pi-extension.test.sh` | 1 | 1 | `not ok - /export did not complete while calm mode was on` |
| `tests/fm-decision-hold-lifecycle.test.sh` | 1 | 1 | `fm-decision-hold: compatible tasks-axi is required` and `not ok - could not register route hold` |
| `tests/fm-kimi-harness.test.sh` | 1 | 1 | `fm-kimi-turnend-hook: refused: python3 with tomllib is required to validate config.toml.` |
| `tests/fm-muse-harness.test.sh` | 1 | 1 | `not ok - fm-harness.sh under process 'muse-bin-0.1.0-R708.1' reported '', expected muse` |
| `tests/fm-backend.test.sh` | 1 | 1 | `fm-decision-hold: compatible tasks-axi is required` and `expected exit 0, got 1` |

Full logs are colocated in this directory:

- `origin-main-*.log`
- `task-branch-*.log`
- `origin-main-summary.tsv`
- `task-branch-summary.tsv`
Evidence: fm-task-delivery targeted test log
ok - fm-spawn: a ship spawn requires a valid explicit mode and yolo before anything is created
ok - fm-spawn: scout and secondmate spawns refuse ship delivery flags
ok - fm-spawn: the brief's recorded mode and the spawn's explicit mode must agree
ok - fm-spawn: a rigor downgrade against the registered posture is announced, never blocked
ok - fm-spawn: registry deviation notices resolve external absolute paths to their registered project name
ok - fm-spawn: a scout spawn resolves no delivery posture from the registry
ok - fm-promote: promotion requires the delivery contract and records it exactly once
ok - fm-project-mode: the conditional policy is accepted, mapped for mechanical callers, and readable raw
ok - fm-project-mode: path lookup handles external, in-tree, unknown, ambiguous, and malformed identities
ok - fm-project-mode: path normalization keeps relative overrides based at the caller cwd
# all fm-task-delivery tests passed
Evidence: fm-watch-triage targeted test log
ok - signal_reason_is_actionable: benign absorbed, captain verbs and coalesced batches surfaced
ok - stale_is_terminal: terminal status surfaces, non-terminal and no-status are benign
ok - scan_captain_relevant_statuses lists only captain-relevant statuses
ok - classifier primitives: keyed decisions and activity phases, captain relevance, window-to-task, and overrides
ok - crew_is_provably_working: only working+run-step/pane is provable; idle/finished/parked/failed/unknown surface
ok - status_is_paused: only the leading paused verb matches, and paused is not captain-relevant
ok - crew_absorb_class: working/paused/none from one read; crew_is_paused and crew_is_provably_working agree
ok - signal_crew_provably_working: benign only when every referenced crew is provably working
ok - a no-verb signal whose crew is provably working is absorbed (no exit, no queue, suppressor advanced, beacon present)
ok - a bare turn-end whose crew is provably working (busy pane) is absorbed
ok - a bare turn-end whose crew is not provably working is surfaced (the swallowed-finish fix)
ok - a no-verb working: note whose crew is idle with no running pipeline is surfaced
ok - captain-relevant signal is surfaced (queue + exit) and marked surfaced
ok - a stale pane sitting on a terminal status is surfaced (queue + exit)
ok - already-surfaced parked and terminal stales are absorbed, while a new decision status still wakes
ok - already-surfaced terminal statuses still wake once for parked, PR-ready, or failed run states
ok - already-surfaced terminal stale classification uses one crew-state sample
ok - identical PR-ready and failed run outcomes surface once per validation generation
ok - same-hash working states wedge-track, and PR-ready and failed outcomes surface once
ok - a stale terminal-looking status is overridden and absorbed while a run is actively working, then wedge-escalated
ok - provably-working non-terminal stale is absorbed on first sight, then wedge-escalated past the threshold
ok - consecutive wedge escalations on the same pane accumulate and demand deep inspection at the threshold
ok - a pane becoming active again resets the consecutive wedge-escalation counter
ok - a busy worker below the turn-age bound remains working with no escalation
ok - a busy worker with a stable pane hash still escalates once its completed-turn age reaches the bound
ok - a busy worker whose pane hash changes every poll still escalates once its completed-turn age reaches the bound
ok - touching a busy worker's completed-turn marker resets the age and prevents an old-age escalation
ok - repeated busy turn-age escalations reuse the existing escalation counter and demand deep inspection at the threshold
ok - the production default busy-turn-age bound is 3600s (5min under does not wedge, 66min over does)
ok - a not-provably-working non-terminal stale is surfaced immediately (never left to wait out the timer)
ok - a declared pause is absorbed on first sight, then re-surfaced as a recheck past the threshold, never wedge-escalated
ok - declared pauses use bounded labeled cadence and a later status resumes normal stale behavior
ok - multiple paused stale rechecks from one scan produce one watcher interruption with both durable records queued
ok - a declared paused secondmate re-surfaces on the bounded normal-mode cadence
ok - a non-paused secondmate retains normal stale suppression
ok - a resumed secondmate clears pause and stale tracking before stale exemption
ok - unchanged stale hashes reclassify when a crew enters or leaves pause
ok - a declared pause is periodically rechecked against authoritative active-run state
ok - a paused status overridden by authoritative working preserves its wedge timer and escalates
ok - paused last-status panes wake once for PR-ready or failed run outcomes
ok - AFK paused stale panes wake once for PR-ready or failed run outcomes
ok - matching non-terminal stale suppressors repair missing or corrupt stale-since timers
ok - triage log capping handles wc byte counts with leading spaces
ok - a captured process-event result wakes a healthy watcher proactively, with no manual drain
ok - a process-event wake is delivered once: no duplicate wake while queued, and none once handled
ok - complete process-event queue keys map to distinct seen markers
ok - queue revalidation, proactive output, and marker commit serialize with drain
/Users/temp/.no-mistakes/worktrees/acee6d463bcf/01KZDY0N5G1RCWNRNX87K8225N/bin/fm-push-transition-lib.sh: line 92: echo: write error: Broken pipe
tests/wake-helpers.sh: line 254: 50109 Killed: 9               PATH="$dir/fakebin:$PATH" FM_HOME="$dir" FM_PROCEVENT_CLAIM_ROOT="$dir/claims" FM_CREW_STATE_BIN="$dir/fakebin/fm-crew-state.sh" FM_POLL=0.2 FM_SIGNAL_GRACE=1 FM_CHECK_INTERVAL=999999 FM_HEARTBEAT=999999 "$WATCH" > "$out"
tests/wake-helpers.sh: line 254: 50763 Killed: 9               PATH="$dir/fakebin:$PATH" FM_HOME="$dir" FM_PROCEVENT_CLAIM_ROOT="$dir/claims" FM_CREW_STATE_BIN="$dir/fakebin/fm-crew-state.sh" FM_POLL=0.2 FM_SIGNAL_GRACE=1 FM_CHECK_INTERVAL=999999 FM_HEARTBEAT=999999 "$WATCH" > "$out"
ok - surfacing failures replay before marker commit and suppress only after delivered output
ok - marker failure exits through the shared wake owner, releases its lock, and replays later
ok - a heartbeat with no captain-relevant change is absorbed and backs off the cadence
ok - heartbeat backstop fail-safe surfaces a captain-relevant status the per-wake path missed
ok - the liveness beacon stays fresh while the watcher absorbs benign wakes (fm-guard never false-alarms)
ok - with .afk present the watcher reverts to one-shot so the daemon owns triage (no double-triage)
ok - AFK changed paused panes hand off plain stale identities for daemon-owned pause triage
Evidence: fm-fleet-sync targeted test log
ok - detached clean ancestor is re-attached and fast-forwarded (recovered)
ok - detached HEAD with unique commits is reported STUCK and left untouched
ok - detached clean ancestor with diverged local default is reported STUCK and left untouched
ok - dirty working tree is reported STUCK and left untouched
ok - non-default named branch is reported STUCK and left untouched
ok - diverged default branch is reported STUCK and left untouched
ok - on-default clean behind clone still fast-forwards
ok - already-current clone is reported unchanged
ok - no-origin clone is skipped (benign), not flagged STUCK
ok - local-only clone is skipped (benign), not flagged STUCK
ok - external registered local-only project paths are skipped before remote sync
ok - single-project form accepts a bare project name
ok - single-project bare name resolution is not cwd-sensitive
ok - single-project form accepts a projects/<name> relative name
ok - single-project projects/<name> resolution is not cwd-sensitive
ok - single-project form leaves a genuinely bad name unresolved
ok - whole-fleet form processes every clone under projects/
ok - bootstrap relays recovered: and STUCK: fleet-sync outcomes
ok - orphaned provably-stale packed-refs.lock is cleared and the clone syncs
ok - a live packed-refs.lock is never removed and the sync fails loudly
ok - a live process holding the clone worktree dir blocks lock removal (clone-dir liveness)
ok - a transient packed-refs.lock that self-clears is retried without a force-remove
ok - a non-packed-refs.lock fetch failure keeps today's behavior (no retry)
Evidence: fm-crew-state targeted test log
ok - active run-step is authoritative
ok - stale needs-decision over active run is superseded
ok - stale blocked over active run is superseded
ok - genuine parked run is not flagged superseded
ok - scalar gate parked run is not flagged superseded
ok - gate block parked run is not flagged superseded
ok - ci-ready status log beats monitoring run
ok - ci-monitoring run with checks already green surfaces done
ok - top-level ci status uses ci log green marker
ok - terminal no-checks ci-monitor marker surfaces done
ok - base-advance rearm after green stays working
ok - pending no-checks ci-monitor marker stays working
ok - ci-monitoring run with checks not yet green stays working
ok - a fresh issue after an earlier green reading is not masked
ok - stale checks-green status log does not mask CI relapse
ok - ci fixing is not overridden by an earlier green marker
ok - top-level fixing is not overridden by a stale ci running row
ok - top-level fixing is not overridden by a stale done log
ok - terminal passed run is authoritative
ok - terminal failed run is authoritative
ok - cross-branch run is attributed via the real runs list
ok - cross-branch attribution picks the branch's most recent row
ok - coarse run does not probe another branch's ci log
ok - another branch's run is ignored, falls back
ok - no run + a busy semantic record reads working, attributed to its source
ok - a converted adapter never reads working from rendered footer text
ok - grok still reads working through its isolated rendered-tail fallback
ok - herdr's native busy verdict reads working with no record present
ok - a mid-tool-call crew stays working because its record outranks herdr's generation state
ok - an idle record with idle agent_status stays not-busy (no regression for a human-blocked agent)
ok - no run + idle pane uses the status-log verb
ok - no run + idle pane parses keyed status syntax
ok - no run + idle pane on a paused: status reports state: paused with its reason
ok - no run + idle pane honors the configured paused verb
ok - a trailing resolved: event does not corrupt state render (idle stays idle)
ok - dead window ignores stale status log
ok - closed pane still reports a terminal run-step
ok - closed pane still reports an active run-step
ok - no timeout command uses perl bound
ok - scout skips the run lookup
ok - torn-down worktree is handled gracefully
ok - missing meta is handled gracefully
ok - crew_is_provably_working absorbs a validating crew found only via the runs-list fallback
ok - crew_is_provably_working still surfaces a genuinely stopped crew (safety property preserved)
ok - usage error exits 2
ok - historical same-branch rewritten head is not attributed as current
ok - active run with valid descendant fix head remains current
ok - local work advanced past run head invalidates attribution
ok - missing run head falls back instead of matching by branch
all fm-crew-state tests passed
Evidence: fm-daemon targeted test log
ok - fm-afk-start.sh fails before daemon startup when the afk flag cannot be written
ok - fm-afk-start.sh ignores stale pidfile-only live pids
ok - fm-afk-start.sh reclaims stale daemon locks whose live pid identity no longer matches
ok - supervise daemon state root is scoped by FM_HOME
ok - routine signal self-handles
ok - captain-relevant status verbs escalate
ok - check + unknown escalate; heartbeat self-handles
ok - transient stale self-handles and records a persistence marker
ok - enriched stale wedges bypass status absorption without disturbing busy workers
ok - stale + terminal status escalates immediately
ok - paused reasons with captain phrases remain pause-classified
ok - handle_wake on a paused stale records a pause marker, drops the wedge marker, and does not escalate
ok - paused stale validation run outcomes escalate instead of self-handling
ok - handle_wake records a declared pause from a routine signal for long-cadence rechecks
ok - a terminal signal clears pause and stale tracking across both supervisors
ok - housekeeping migrates a normal-watcher's declared pause into daemon tracking
ok - housekeeping clears an already-resumed watcher pause across both supervisors
ok - housekeeping seeds pause tracking from status without a watcher marker
ok - persistent stale escalates after threshold and clears its marker
ok - resumed (busy) stale clears its marker without escalating
ok - housekeeping re-surfaces a stale declared pause on the long cadence and resets its window
ok - housekeeping clears a paused marker whose pane became busy again, without escalating
ok - housekeeping clears a paused marker once the crew is no longer declaring the pause
ok - housekeeping moves an existing stale marker to pause before wedge escalation
ok - housekeeping clears tracking when a crew leaves pause
ok - persistent herdr stale resolves the target from metadata and escalates
ok - herdr idle busy-footer stale clears through capture corroboration
ok - resumed herdr stale clears through backend-aware busy state
ok - persistent Orca stale resolves the terminal from metadata
ok - multiple escalations flush as a single batched digest
ok - batch flush measures max-delay from the first append, not the last
ok - catch-all scan escalates a missed terminal once, not twice
ok - handle_wake routes routine->self and captain->escalate
ok - INJECT_SKIP forces self-handle, bypassing captain-relevant classification
ok - is_wake_reason distinguishes watcher wake reasons from singleton-status stdout
ok - terminal-stale escalate removes its marker so housekeeping does not re-escalate
ok - captain signal escalate marks seen so the catch-all scan does not re-fire
ok - _collapse_newlines replaces newlines with literal separator
ok - afk flag absent: daemon does not inject, buffer preserved
ok - busy-guard defers injection when supervisor pane is busy
ok - marker detection: marker -> stay afk, no marker -> exit afk
ok - /afk invocation is exempt from afk exit (no self-cancel)
ok - should_exit_afk returns false when afk is not active
ok - strip_injection_marker removes the sentinel marker cleanly
ok - pane_input_pending detects partial input on the cursor line
ok - pane_input_pending: blank cursor line is not pending
ok - pane_input_pending: only proven empty agent prompts pass
ok - fm_tmux_composer_state: a bare shell prompt ($/%/#/>) reads unknown, never empty (dead-shell injection safety)
ok - fm_tmux_composer_state: a bordered composer box and bare agent glyphs (❯/›) still read empty
ok - fm_tmux_composer_state: only matching edge borders form a composer box
ok - pane_input_pending honors FM_COMPOSER_IDLE_RE after border stripping
ok - classify_signal dedupes against the catch-all scan seen marker
ok - classify_stale dedupes against the signal path seen marker
ok - AFK nonterminal working:+merged keeps wedge aging and re-escalates at bound
ok - genuine done: and merge-check events still escalate
ok - pane_input_pending: an idle bordered composer is NOT pending (afk-invx-i5)
ok - pane_input_pending: text inside a bordered composer is still pending
ok - submit-ACK confirms a submit when the composer returns to a bordered-empty box
ok - submit-ACK reports pending on a persistently swallowed Enter (type-once)
ok - max-defer on an empty stuck pane types once, alarms, and preserves the buffer
ok - max-defer flushes and clears the buffer on an empty bordered pane
ok - max-defer on a pending composer alarms without typing
ok - normal flush clears a stale wedge marker
ok - below MAX_DEFER: no inject, no alarm, buffer preserved
ok - max-defer does not flush or alarm while afk is inactive
ok - library mode: sourcing the daemon defaults FM_WEDGE_ALARM_EXEC to discard (no test can fire a real notification)
ok - wake helpers replace inherited notifier overrides with the safe recorder
ok - the discard seam suppresses every notifier, including command: (fires nothing)
ok - direct notifier helpers honor the discard seam, including command:
ok - osascript channel routes through the notifier seam with the summary (never a real notification)
ok - herdr channel routes through the notifier seam with the summary (never a real notification)
ok - command channel runs the captain command with the summary on $1 and on stdin
ok - command channel failures redact configured commands while logging their exit status
ok - unknown channel directives are redacted while the alarm keeps running
ok - off disables every active alert regardless of directive position (marker and tmux flash are unaffected)
ok - auto resolves to the macOS osascript notifier on Darwin (default-on)
ok - auto on a non-macOS platform selects no built-in OS channel (the marker or a configured command carries it)
ok - config/wedge-alarm selects every configured channel and skips comment and blank lines
ok - a failing channel logs and falls back to the next channel, never crashing the alarm
ok - a hung notifier is bounded, logged, and falls through to the next channel
ok - a backgrounded command notifier remains bounded until its process group is reaped
ok - a hung notifier override is bounded, logged, and proceeds to the next channel
/Users/temp/.no-mistakes/worktrees/acee6d463bcf/01KZDY0N5G1RCWNRNX87K8225N/bin/fm-supervise-daemon.sh: line 751: 99909 Terminated: 15          sh -c 'sleep 30 & printf "%s" "$!" > "$1"; wait' sh "$child_file"
ok - daemon shutdown stops and reaps the active notifier process group
ok - inject_wedge_alarm writes the marker AND emits the active alert even with no tmux status-line (herdr backend)
ok - in-process wedge throttle prevents alert spam when the marker cannot persist
ok - fm-send exits non-zero on a confirmed swallow, zero on a clean submit
ok - fm-send exits non-zero when initial text send fails
ok - fm-send exits non-zero unless delivery is proven empty
ok - discover_supervisor_backend: override > TMUX_PANE > HERDR_ENV+HERDR_PANE_ID > tmux fallback
ok - discover_supervisor_target: override > TMUX_PANE > herdr '<session>:<pane-id>' composition > firstmate:0 fallback
ok - pane_is_busy: herdr native busy_state='busy' short-circuits without a capture fallback
ok - primary busy guard isolates rendered signatures by detected harness
ok - pane_is_busy: omitted backend defaults to tmux for Grok's isolated fallback
ok - pane_input_pending: dispatches through fm_backend_composer_state for backend=herdr
ok - inject_msg: herdr busy-guard defers before ever attempting a submit
ok - inject_msg: herdr composer-guard defers before ever attempting a submit
ok - inject_msg: herdr pane-gone check defers before any busy/composer/submit call
ok - inject_msg: dispatches busy-guard/composer-guard/submit through the herdr backend and succeeds on a confirmed empty composer
ok - inject_msg: defers on a dead-shell/unreadable composer (unknown), never typing the escalation into a shell
ok - inject_msg: unrecognized composer states defer by default
- Outcome: 🔧 1 issue found → auto-fixed ✅ across 2 runs (46m4s)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 1 issue found → auto-fixed (3) ✅
  • 🚨 bin/fm-watch.sh:409 - Intent requires that "failed checks" and "PR-ready outcomes" still wake, but the new paused-status branch reduces every non-working crew state to paused. crew_absorb_class returns none for run-step parked, done, and failed, so a worker that resumes validation while its last status is still paused: can later reach PR-ready/failed/parked and this path will still record a paused stale instead of surfacing the run outcome.

🔧 Fix: Surface paused validation outcomes once
1 error still open:

  • 🚨 bin/fm-watch.sh:1064 - Intent requires that "failed checks" and "PR-ready outcomes" still wake, but the paused run-outcome surfacer is disabled in away mode by ! afk_present. If a paused pane already has the same stale hash and its no-mistakes run later reaches PR-ready or failed while state/.afk exists, the AFK branch never reads fm-crew-state and the outcome is not surfaced.

🔧 Fix: Surface AFK paused validation outcomes
1 error still open:

  • 🚨 bin/fm-watch.sh:1064 - Intent requires that "failed checks" and "PR-ready outcomes" still wake, but the AFK path now calls the paused run-outcome surfacer and that surfacer still emits only a generic stale: &lt;window&gt; reason. The away daemon consumes that stdout, classifies it from the unchanged paused: status line as an ordinary pause, and self-handles it; because the run-state marker was already written, the same PR-ready/failed generation will not retry.

🔧 Fix: Escalate AFK paused validation outcomes
✅ Re-checked - no issues remain.

🔧 **Test** - 1 issue found → auto-fixed ✅
  • ⚠️ .no-mistakes/baseline-receipts/firstmate-capacity-night-2864 - The intent says the origin/main comparison receipt and full logs are in .no-mistakes/baseline-receipts/firstmate-capacity-night-2864/, but that directory is absent from this checked-out worktree. I could not independently verify the baseline-aware broad-failure evidence and did not rerun the broad validation suite.
  • bash tests/fm-task-delivery.test.sh > /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/fm-task-delivery.test.log 2>&1
  • bash tests/fm-fleet-sync.test.sh > /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/fm-fleet-sync.test.log 2>&1
  • bash tests/fm-crew-state.test.sh > /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/fm-crew-state.test.log 2>&1
  • bash tests/fm-watch-triage.test.sh > /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/fm-watch-triage.test.log 2>&1
  • bash tests/fm-daemon.test.sh > /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/fm-daemon.test.log 2>&1
  • Manual project registry fixture exercising bin/fm-project-mode.sh --with-name --path &lt;external&gt;, in-home path matching, unknown-path default, free-form prose non-parsing, ambiguous path refusal, and malformed path refusal.
  • Manual external git fixture exercising FM_HOME=&lt;fixture&gt; FM_ROOT_OVERRIDE=&lt;repo&gt; bin/fm-fleet-sync.sh &lt;external/agent&gt; to confirm pai-agent: skipped: local-only project.
  • Manual watcher fixture exercising due paused stale recheck batching, already-surfaced terminal stale absorption, and new needs-decision: signal wake through bin/fm-watch.sh.
  • find .no-mistakes/baseline-receipts/firstmate-capacity-night-2864 -maxdepth 2 -type f -print
  • git status --short --branch

🔧 Fix: Attach baseline receipt evidence
✅ Re-checked - no issues remain.

  • diff -qr /Users/temp/.treehouse/firstmate-7bab20/2/firstmate/.no-mistakes/baseline-receipts/firstmate-capacity-night-2864 .no-mistakes/baseline-receipts/firstmate-capacity-night-2864
  • bash tests/fm-task-delivery.test.sh
  • bash tests/fm-fleet-sync.test.sh
  • bash tests/fm-crew-state.test.sh
  • bash tests/fm-daemon.test.sh
  • bash tests/fm-watch-triage.test.sh
  • Manual CLI evidence in /var/folders/85/0xf5ctz126717j1k2wfdc_4w0000gn/T/no-mistakes-evidence/01KZDY0N5G1RCWNRNX87K8225N/manual-e2e-corrected-20260807054639/manual-e2e-transcript.log using fm-project-mode.sh, fm-spawn.sh, fm-watch.sh, and wake queue records.
  • git status --short --untracked-files=normal
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

verbagem added 15 commits August 6, 2026 23:49
…roject delivery posture resolve by canonical project path instead of basename guessing.
…use noise to per-window paused recheck wake exits, added a regression, and fixed the paused-stale path to batch due rechecks from one scan into one watcher interruption.
…se stale path so idle paused workers stay on the bounded pause cadence instead of producing bare repeated stale notifications.
…tale-noise boundary and validated it with focused watcher, continuity, daemon, lint, and whitespace checks.
…ore registry description prose/backticks and resolve external projects only through structured `path=/absolute/project` annotations or canonical in-home `projects/<name>` paths.
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