Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
aca46e3
fix(watch): absorb a turn-end whose pane churned since the previous poll
karotkriss Aug 23, 2026
a9e0e25
no-mistakes(review): Captain, guard pane-churn absorption from collis…
karotkriss Aug 23, 2026
ab4a298
no-mistakes(review): Captain, make watcher marker identities injective
karotkriss Aug 23, 2026
9cd80dc
no-mistakes(review): Captain, isolate ambiguous legacy markers and re…
karotkriss Aug 23, 2026
bbb5ab5
no-mistakes(review): Captain, localize pane-churn collision guard
karotkriss Aug 23, 2026
abc931c
no-mistakes(review): Captain, reject malformed pane-churn hashes
karotkriss Aug 23, 2026
cb27efc
no-mistakes(document): Document pane-churn turn-end evidence
karotkriss Aug 23, 2026
762ba9e
no-mistakes: apply CI fixes
karotkriss Aug 23, 2026
0b562ab
fix(watch): gate and bound the pane-churn turn-end absorb
karotkriss Aug 23, 2026
630b78d
no-mistakes(review): Fail closed on invalid churn deferral state
karotkriss Aug 23, 2026
428463f
no-mistakes(review): Validate persisted churn deadlines before arithm…
karotkriss Aug 23, 2026
b5bbc89
no-mistakes(review): Make churn deadlines transactional and bounds safe
karotkriss Aug 23, 2026
e7d1bb3
no-mistakes(review): Compose turn-end evidence per task from one snap…
karotkriss Aug 24, 2026
5537e3d
no-mistakes(review): Restore strict turn-end fallback guards
karotkriss Aug 24, 2026
13028f7
no-mistakes(document): Clarify pane-churn supervision documentation
karotkriss Aug 24, 2026
a1dfe86
no-mistakes(lint): Fix watcher arithmetic lint issues
karotkriss Aug 24, 2026
e4532c5
no-mistakes: apply CI fixes
karotkriss Aug 24, 2026
8c2feee
no-mistakes(document): Clarify pane-churn fail-closed documentation
karotkriss Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ config/startup-memory-budget primary-authoritative per-home startup-memory b
config/stow-pass-horizon optional presence flag opting this home in to /stow's default-off pass-count decay horizon; LOCAL, gitignored, and not inherited; see docs/configuration.md "Stow pass horizon"
config/herdr-presentation-spaces optional "off" opt-out from, or "on" opt-in to, Herdr's default-on disposable single-task visual projection, which is unconfigured-default-on only at or above a Herdr version floor; LOCAL, gitignored; inherited by secondmate homes; see docs/herdr-backend.md "Presentation spaces"
config/trace-context optional presence flag enabling default-off native W3C trace-context propagation to spawned agents; LOCAL, gitignored; inherited by secondmate homes; see docs/configuration.md "Trace context propagation" and docs/trace-context.md
config/turnend-churn-absorb optional presence flag opting this home into the default-off absorb of bare turn-end wakes on pane churn; LOCAL, gitignored, and not inherited; see docs/configuration.md "Turn-end pane-churn absorb"
config/cmux-socket-password optional cmux control-socket password; LOCAL, gitignored; read fresh on every cmux CLI call and passed through without ever overriding an operator's own ambient CMUX_SOCKET_PASSWORD when absent (docs/cmux-backend.md "Setup")
config/wedge-alarm optional away-mode wedge-alarm active-alert directives; LOCAL, gitignored; absent means auto (macOS Notification Center when available); see docs/wedge-alarm.md
config/watched-tools.json optional list of the tools this home depends on, read by the update check armed with bin/fm-tool-update-check.sh; LOCAL, gitignored, firstmate-maintained but human-editable, and NOT inherited by secondmate homes; see docs/configuration.md "Watched tool updates"
Expand Down Expand Up @@ -132,7 +133,7 @@ state/ runtime records and signals; gitignored
.watch.lock .wake-queue.lock watcher singleton and queue serialization locks
.claude-autoarm.lock .claude-autoarm-epoch .claude-autoarm-failure-notified .claude-autoarm-failure-alarmed .turnend-claude-blocks .turnend-claude-blocks.lock Claude Stop auto-arm single-flight, epoch, failure-episode, attended-alarm, guard-budget, and budget-lock records; never touch
.cursor-park-owner .cursor-park-owner.lock .turnend-cursor-blocks Cursor stop-hook owner record, publication and commit lock, and bounded repair-nag budget; never touch
.hash-* .count-* .stale-* .stale-since-* .paused-* .wedge-escalations-* .writing-* .seen-* .hb-surfaced-* .last-* .heartbeat-streak watcher internals; never touch
.hash-* .count-* .stale-* .stale-since-* .churn-since-* .paused-* .wedge-escalations-* .writing-* .seen-* .hb-surfaced-* .last-* .heartbeat-streak watcher internals; never touch
.watch-triage.log watcher's absorbed-wake debug log (size-capped); never relied on, safe to delete
.last-watcher-beat watcher liveness beacon, touched every poll (including while absorbing benign wakes); guard scripts read it
.subsuper-* .supervise-daemon.* sub-supervisor internals; never touch
Expand Down
19 changes: 12 additions & 7 deletions bin/fm-classify-lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1167,8 +1167,10 @@ window_to_task() {
# captain-relevant last line; 1 otherwise. Pass the space-separated file list that
# follows the "signal:" prefix. Non-.status arguments (e.g. .turn-ended markers,
# which never carry a verb) are skipped. A 1 here is NOT "benign" on its own: a
# no-verb signal (a bare turn-end, a working: note) is only benign when the crew is
# also provably working (signal_crew_provably_working below); otherwise it surfaces.
# no-verb signal (a bare turn-end, a working: note) is only benign on positive work
# evidence. signal_crew_provably_working below owns the shared authoritative proof;
# fm-watch.sh separately owns the opt-in, bounded pane-churn fallback that is
# limited to bare turn-ends.
signal_reason_is_actionable() { # <file> ...
local f last
for f in "$@"; do
Expand Down Expand Up @@ -1213,11 +1215,14 @@ crew_absorb_class() { # <id>

# 0 if crew <id> shows POSITIVE evidence it is still working (crew_absorb_class
# reports `working`). This is the "provably working" predicate at the heart of
# absorb-only-when-provably-working: a no-verb turn-end or stale wake is absorbed
# ONLY when this returns 0, and SURFACED otherwise (the crew may be done, waiting
# on a decision, or wedged). For stale panes it is checked before trusting the
# status log so a pre-validation captain-relevant line does not override an active
# run. See crew_absorb_class for the exact working/paused/none decision.
# absorb-only-on-positive-evidence. This is the sole proof for stale wakes and the
# shared authoritative proof for no-verb signals. Where a home opts in, fm-watch.sh
# may additionally absorb a bare turn-end on bounded pane churn, while every other
# failed verdict surfaces
# because the crew may be done, waiting on a decision, or wedged. For stale panes
# it is checked before trusting the status log so a pre-validation captain-relevant
# line does not override an active run. See crew_absorb_class for the exact
# working/paused/none decision.
crew_is_provably_working() { # <id>
[ "$(crew_absorb_class "$1")" = working ]
}
Expand Down
Loading
Loading