fix: avoid false stalls for supervising secondmates - #3036
Conversation
An idle kind=secondmate pane is healthy while its home still has dispatched workers under way. Classify that at absorb time so stale and push-transition triage do not wedge the manager, including when a declared pause was recorded only to silence a false alarm.
…dren A secondmate with live child work and an empty instruction inbox is healthy even when its foreign wake queue still holds an aged row. Unread manager instructions still surface the stall check.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains. Reviews (4): Last reviewed commit: "no-mistakes: apply CI fixes" | Re-trigger Greptile |
|
Speaking as Kun's firstmate: first look on current class=corrective. Stops false stall/wedge on an idle kind=secondmate manager whose registered home still has working children. Inheritance applies only after the manager's own verdict is VISION.md (inspected
This HEAD: Not first-time. No workflow approval this pass. Security: none. Local status folds and home ownership file; supervising marker is a regular state file with the same path guard as the stall marker. Overlap: classify-lib / watch / wake-lib with open #2801 and wedge #3001; same-author sibling #3031. Land-eligible rec: NO (attestation mismatch; CI not green). Captain-flag NOW: no. This is waiting-on-author for a HEAD-matching |
Intent
Stop Firstmate from treating an idle manager pane as stalled when that manager has busy workers. Close the hole at classification time. A manager with at least one busy or working child must not be classified as a stalled/wedge pane solely because the manager's own pane is idle. An idle secondmate with no unread instruction and with live child work must not emit stale:/possible-wedge escalation or secondmate wake-loop stalled checks. Keep true wedges: looping, unresponsive, or unacknowledged instruction. Do not absorb blocked push-transitions or mask failed/blocked/needs-decision/captain-held because a child is busy. Captain-held must survive masking status lines. Push to bingb0t5/firstmate fork only.
What Changed
Risk Assessment
🚨 High: The central child-work inheritance path contradicts the explicit requirement that failed manager state survive masking status lines, so the durable fix remains incomplete.
Testing
Exercised the real watcher, stale-pane classification, and secondmate wake-loop paths. Idle managers with active children stayed quiet, while unread instructions, failed/blocked states, open decisions, and captain-held states still escalated. All targeted commands passed. CLI transcript evidence was captured; no screenshot was applicable because this change has no rendered UI surface.
Evidence: Idle manager with busy child E2E evidence
Source: Idle manager with busy child E2E evidence
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
bin/fm-classify-lib.sh:1352- Intent requires that a busy child must not maskfailed, but the durable quietness guard only folds open decisions and captain-held transfers. Concrete path:failed [key=deploy]: rollout brokefollowed byworking: dispatched recovery, with an idle manager and a working child.fm-crew-statereturnsworking · status-logfrom the last line,status_open_decisionsignoresfailed, and this function reports quiet, so the child changes the classification toworkingand suppresses escalation. Track unresolved failures at this shared status-fold boundary, or otherwise prove they were explicitly cleared before allowing inheritance.✅ **Test** - passed
✅ No issues found.
bash tests/fm-watch-triage.test.shbash tests/fm-wake-queue.test.shbash tests/fm-secondmate-safety.test.shgit status --shortconfirmed testing left no worktree changes✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.