fix: deliver away-mode alerts to Claude sessions with titled composers - #33
Merged
Merged
Conversation
added 7 commits
October 2, 2026 06:23
…way escalations deliver Claude Code writes a session title into the composer's top rule once the session has one (a resumed or backgrounded primary). The rule stopped being a solid separator, no pair formed, and an idle composer classified unknown on every cursorless backend, so the away daemon deferred every escalation. A titled rule now opens a pair only when an agent-glyph row sits between it and the next solid rule; a typed draft, a dead shell prompt, and a blank or unreadable region still defer.
…ontributions test’s wall-clock race, and the Herdr mock’s indirect-use lint annotation. Targeted lint, contributions, daemon, and available calm-mode checks passed. Interactive Pi E2E verification remains blocked because tmux is absent from PATH
…public expansion state instead of a transient startup hint. Available Calm tests, targeted lint, and diff checks passed. Interactive E2E verification remains blocked because tmux is absent from PATH
…emote trace-context fixture commit to prevent repacking from racing both seed clones. The full regression, clone integrity checks, targeted lint, and diff checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
"start the recommended four"
One of the four is this queued firstmate item: fix away-mode alerts that never reach the first mate while the captain is away. While away on 2026-09-30 and again on 2026-10-01, escalations were never delivered to the Claude primary session running on Herdr for about 7 and about 10.5 hours; the supervising process logged every attempt as deferred and raised its stuck alarm.
What Changed
Risk Assessment
✅ Low: The change addresses the documented titled-composer failure at the shared classifier while preserving refusal of drafts, dead shells, and unproven blank regions.
Testing
Focused composer and daemon tests passed. Real Claude on isolated Herdr labs proved delivery and six safety scenarios after setup retries. Terminal evidence was saved, all labs were torn down, and the worktree is clean. Claude's later processing was blocked by unavailable login; visual evidence renders captured terminal output rather than a native screenshot.
claude auth statusalso returned loggedIn=false. Disposable configuration cannot supply valid credentials, and this g…Evidence: Live observations and setup retries
Source: Live observations and setup retries
Evidence: Rendered terminal captures
Source: Rendered terminal captures
Evidence: Submitted alert in real Claude TUI
Source: Submitted alert in real Claude TUI
Evidence: Exited-shell and closed-pane guards
Source: Exited-shell and closed-pane guards
Evidence: Delivered operational alert record
Source: Delivered operational alert record
Evidence: Normal Claude authentication status
Source: Normal Claude authentication status
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
🔧 **Test** - 2 issues found → auto-fixed ✅
bin/fm-supervise-daemon.sh:1454- The dead-session guard allows injection into this machine's zsh prompt, which uses ❯. In the isolated lab, process-info confirmed only zsh remained after Claude exited, yet the composer classified empty and inject_msg returned success. The captured shell shows the operational doorbell was submitted as shell input. Both base and target exhibit this pre-existing safety failure. Require positive live-harness verification before typing an escalation.bash tests/fm-composer-lib.test.shherdr --version,claude --version, andclaude auth statusbin/fm-lab-home.sh createwith a worktree-local disposable homebin/fm-herdr-lab.sh provision/viewer start/runon named sessionfm-lab-afk-gate-3607, using a drained 40x120 PTYExecuted base and target composer guards against the same real Claude titled viewportDrove typed-draft and agents-view refusals throughescalate_flushRan the real watcher and away daemon against a disposable decision event and captured its delivery to ClaudeConfirmed a zsh-only target using Herdr process-info, then exercised the dead-shell and closed-pane injection guardsRendered captured ANSI viewports and saved reviewer-visible screenshotsStopped the scoped Claude background session and browser, completed guarded Herdr cleanup with the default-session tripwire passing, removed temporary files, and confirmed a clean worktree🔧 Fix applied.
✅ Re-checked - no issues remain.
claude auth statusalso returned loggedIn=false. Disposable configuration cannot supply valid credentials, and this g…TMPDIR="$PWD/.live-validation-r2/tmp" bash tests/fm-composer-lib.test.shTMPDIR="$PWD/.live-validation-r2/tmp" bash tests/fm-daemon.test.shclaude --version,herdr --version, andclaude auth statusbash .live-validation-r2/run-live.sh: real Claude TUI, daemon delivery, draft retention, delay alarm, agents-view and attended guardsbash .live-validation-r2/run-exit.sh: real adapter/exitsubmission, shell process proof, retained escalation and closed-pane refusalCompared base and target composer classifiers against the live titled viewportCaptured ANSI viewports, rendered HTML and a browser screenshot; inspected the screenshotGuarded Herdr teardown, browser shutdown, disposable-file removal and final cleangit status --short✅ **Document** - passed
✅ No issues found.
🔧 **Lint** - 1 issue found → auto-fixed ✅
🔧 Fix applied.
✅ Re-checked - no issues remain.
✅ **Push** - passed
✅ No issues found.