Skip to content

fix(bin): let routine-wake triage close pause rechecks of merge-word waits after the agent exits - #48

Closed
talktejas wants to merge 3 commits into
mainfrom
fm/fm-jev-wake-triage-no-checks-2
Closed

talktejas wants to merge 3 commits into
mainfrom
fm/fm-jev-wake-triage-no-checks-2

Conversation

@talktejas

Copy link
Copy Markdown
Owner

Intent

The first Jev item, merged as pull request 38, was accepted from a proposal table as: "Routine monitoring checks - Jev decides: does this check need firstmate, or is it routine? - Stops the stream of 'nothing new' turns; routine checks are closed without a message." All Jev items were then ordered merged: "merge all jev items".

It is live but is not closing the checks it was built for. Since it went live the supervisor has still been woken, one at a time, for every "stale: (paused Ns, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)" recheck of the ten JewelTrek pull requests that are open and waiting for a merge word (jeweltrek2627-slim pull requests 222 to 231; examples at 18:49Z and 18:51Z on 2026-10-05 for tasks jt-diamond-cert-mismatch-flag and jt-diamond-consignor-statement, whose metadata carry pr= and whose pull requests are open). state/.watch-triage.log in the firstmate home shows exactly one "jev triage" line all evening (a different task, delivered at confidence 0.61) and none for these.

What Changed

  • jev_triage_task_evidence in bin/fm-watch.sh now offers a paused task to Jev when its agent state is dead as well as alive, and adds a worker_agent field (running or exited) to the evidence. Previously anything but alive was refused, although an exited agent is the state that routes an ordinary crew to the pause recheck. Missing, ambiguous, unreadable and unverified endpoints are still delivered unasked.
  • The triage instructions and criteria now say that an open pull request awaiting only its merge or merge word, whoever gives it, is routine whether the agent is running or exited. With an exited agent every other wait is needs_firstmate, and waiting on a person for anything other than that merge still is.
  • tests/fm-jev-wake-triage.test.sh covers the exited-agent pause recheck (asked once, nothing queued, no wake, worker_agent reported) and adds pull-request-read cases: no-checks reads stay eligible, while a pending required check, a draft, and a conflict alongside no checks are delivered. docs/configuration.md and docs/verification/jev-wake-triage.md are updated to match.

Risk Assessment

✅ Low: The fix round changed only one commit reference in the verification doc (now 3ac9b3d, confirmed an ancestor of HEAD that carries the fm-watch.sh change), and the underlying change is a small bounded gate widening (alive or dead agents offered, everything else still refused in code) whose two open concerns were already decided by the user as intended behaviour.

Testing

I drove a real bin/fm-watch.sh process six times in an isolated firstmate home, with a real tmux pane whose agent had exited, the real bin/fm-pr-state.sh reading the real jeweltrek2627-slim pull requests 228 and 230, and the real Jev model. On the base commit the merge-word recheck for pull request 228 was delivered with no triage line, reproducing the report; on the target commit it was absorbed (routine, confidence 0.95), nothing was queued, and the watcher kept supervising. The four adversarial runs on the target all delivered the wake: conflicting pull request 230 without asking Jev, a "waiting to be told which" wait (needs_firstmate 1.0), a CI wait of an exited worker (routine at 0.24, below the 0.6 floor), and no key. The focused suite tests/fm-jev-wake-triage.test.sh also passed. Not driven live: the herdr backend and a running-agent pane. No UI surface, so the evidence is a CLI transcript rather than screenshots.

  • Live validation: ✅ go - 6 of 8 scenarios driven live against the product
Scenario Result Live Evidence
Reproduce the report on the base commit: a watcher supervising a worker whose agent has exited, with pull request 228 open and waiting for the captain's merge word, wakes the supervisor with the stale… ✅ pass live live-transcript.txt, case=base-merge-word-exited: watcher exited with the stale: ... confirm the wait still holds wake queued; state/.watch-triage.log absent
On the target commit the same merge-word recheck of open, no-checks pull request 228 with an exited agent is closed without a message: Jev answers routine, nothing is queued, the watcher keeps supervi… ✅ pass live live-transcript.txt, case=target-merge-word-exited: absorbed jev-routine declared-pause-recheck (confidence=0.95, routine=0.98 needs_firstmate=0.02, 354 ms), empty stdout and wake queue, watcher ali…
Adversarial: a conflicting pull request (230) waiting for the merge word is still delivered to the supervisor without asking Jev, as the user decided in review ✅ pass live live-transcript.txt, case=target-conflicting-pr230: fm-pr-state.sh prints MERGEABILITY: conflicting; stale wake queued; no triage log line
Adversarial: an exited worker with an open pull request whose newest line waits on a person ('two ways to fix the schema, waiting to be told which') is delivered ✅ pass live live-transcript.txt, case=target-told-which-exited: jev triage delivered declared-pause-recheck (choice=needs_firstmate confidence=1.0 floor=0.6); stale wake queued
Adversarial: an exited worker declaring a non-merge automatic wait (CI running, 'resuming on my own') is delivered, because a dead worker cannot resume ✅ pass live live-transcript.txt, case=target-ci-wait-exited: jev triage delivered declared-pause-recheck (choice=routine confidence=0.24 floor=0.6); stale wake queued. Only the confidence floor delivered it, th…
Without the Typesafe key the merge-word recheck is delivered exactly as before and Jev is never called ✅ pass live live-transcript.txt, case=target-no-key: stale wake queued; no triage log line
A running (alive) worker with an open pull request is still offered and Jev is told worker_agent: running; missing, ambiguous, unreadable and unverified endpoints are never offered ⏸️ untested no The prior payload did not establish a live result: this was covered only by bash tests/fm-jev-wake-triage.test.sh, which stubs Jev at the library boundary and stubs the agent state. The six live wat…
The same merge-word recheck is closed for a worker on the herdr backend, which is what the ten JewelTrek tasks actually run on (backend=herdr in their metadata) ⏸️ untested no Driving herdr live needs a disposable herdr session with a dead-agent pane; the only herdr server on this host is the live fleet's, which this phase must not touch. Live runs used the tmux backend; bo…
Evidence: Live transcript: six real watcher runs (base reproduction, target absorb, four adversarial deliveries)

Source: Live transcript: six real watcher runs (base reproduction, target absorb, four adversarial deliveries)

\### case=base-merge-word-exited bin=? key=yes
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/228
\### status:
done: [2026-09-28T05:17:14Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/228
paused: [2026-09-28T05:48:14Z] pull request https://github.com/talktejas/jeweltrek2627-slim/pull/228 open, waiting for the captain's merge word
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    CHECKS: none reported yet
\### outcome: watcher exited (a wake was delivered)
\### watcher stdout (what the supervisor is woken with):
    stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### wake queue:
    1791231335	1	stale	jevlive:fm-jt-live	stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### state/.watch-triage.log:
    (none)
\### key not present in any home file

\### case=target-merge-word-exited bin=1efd16a key=yes
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/228
\### status:
done: [2026-09-28T05:17:14Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/228 (into integration/diamond-module; return-by uses house day-count until item 11 lands)
paused: [2026-09-28T05:48:14Z] pull request https://github.com/talktejas/jeweltrek2627-slim/pull/228 open, waiting for the captain's merge word
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    CHECKS: none reported yet
\### outcome: watcher still supervising 8s after the absorb (no wake delivered)
\### watcher stdout (what the supervisor is woken with):
    (empty)
\### wake queue:
    (empty)
\### state/.watch-triage.log:
    [2026-10-06T03:15:10+0700] absorbed jev-routine declared-pause-recheck (confidence=0.95, routine=0.98 needs_firstmate=0.02, 354 ms): stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
    [2026-10-06T03:15:10+0700] absorbed stale (paused, awaiting external, age 14523s): jevlive:fm-jt-live
    [2026-10-06T03:15:13+0700] absorbed stale (paused, awaiting external, age 14529s): jevlive:fm-jt-live
    [2026-10-06T03:15:15+0700] absorbed stale (paused, awaiting external, age 14531s): jevlive:fm-jt-live
    [2026-10-06T03:15:17+0700] absorbed stale (paused, awaiting external, age 14533s): jevlive:fm-jt-live
\### key not present in any home file

\### case=target-conflicting-pr230 bin=1efd16a key=yes
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/230
\### status:
done: [2026-09-28T18:59:09Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/230
paused: [2026-09-28T19:04:12Z] pull request 230 open, waiting for the captain's merge word
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    MERGEABILITY: conflicting
    CHECKS: none reported yet
\### outcome: watcher exited (a wake was delivered)
\### watcher stdout (what the supervisor is woken with):
    stale: jevlive:fm-jt-live (paused 14524s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### wake queue:
    1791231342	1	stale	jevlive:fm-jt-live	stale: jevlive:fm-jt-live (paused 14524s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### state/.watch-triage.log:
    (none)
\### key not present in any home file

\### case=target-told-which-exited bin=1efd16a key=yes
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/228
\### status:
done: [2026-09-28T05:17:14Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/228
paused: [2026-09-28T05:48:14Z] two ways to fix the schema, waiting to be told which
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    CHECKS: none reported yet
\### outcome: watcher exited (a wake was delivered)
\### watcher stdout (what the supervisor is woken with):
    stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### wake queue:
    1791231350	1	stale	jevlive:fm-jt-live	stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### state/.watch-triage.log:
    [2026-10-06T03:15:50+0700] jev triage delivered declared-pause-recheck (choice=needs_firstmate confidence=1.0 floor=0.6): stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### key not present in any home file

\### case=target-ci-wait-exited bin=1efd16a key=yes
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/228
\### status:
done: [2026-09-28T05:17:14Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/228
paused: [2026-09-28T05:48:14Z] CI is running on the pull request, about 25 minutes, resuming on my own when it finishes
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    CHECKS: none reported yet
\### outcome: watcher exited (a wake was delivered)
\### watcher stdout (what the supervisor is woken with):
    stale: jevlive:fm-jt-live (paused 14524s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### wake queue:
    1791231358	1	stale	jevlive:fm-jt-live	stale: jevlive:fm-jt-live (paused 14524s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### state/.watch-triage.log:
    [2026-10-06T03:15:58+0700] jev triage delivered declared-pause-recheck (choice=routine confidence=0.24 floor=0.6): stale: jevlive:fm-jt-live (paused 14524s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### key not present in any home file

\### case=target-no-key bin=1efd16a key=no
\### meta:
window=jevlive:fm-jt-live
kind=ship
pr=https://github.com/talktejas/jeweltrek2627-slim/pull/228
\### status:
done: [2026-09-28T05:17:14Z] PR https://github.com/talktejas/jeweltrek2627-slim/pull/228
paused: [2026-09-28T05:48:14Z] pull request https://github.com/talktejas/jeweltrek2627-slim/pull/228 open, waiting for the captain's merge word
\### agent state read by the product: dead
\### real pull-request read (fm-pr-state.sh):
    CHECKS: none reported yet
\### outcome: watcher exited (a wake was delivered)
\### watcher stdout (what the supervisor is woken with):
    stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### wake queue:
    1791231363	1	stale	jevlive:fm-jt-live	stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
\### state/.watch-triage.log:
    (none)
\### key not present in any home file
Evidence: Live driver script used for every run

Source: Live driver script used for every run

#!/usr/bin/env bash
# Live drive of the routine-wake triage: a real fm-watch.sh process, a real tmux
# pane whose agent has exited (an idle shell), the real bin/fm-pr-state.sh
# reading a real GitHub pull request, and the real Jev model. Only the firstmate
# home is isolated (a temp dir) and the tmux server is private (TMUX_TMPDIR).
# Usage: drive-live.sh <bin-dir> <case> <pr-url> <key:yes|no> <status-line>...
set -u
BIN=$1 CASE=$2 PR=$3 USEKEY=$4; shift 4
REPO=$(cd "$BIN/.." && pwd)
REAL_HOME_ENV=~/p/firstmate/.env
D=$(mktemp -d "/tmp/jev-live-$CASE.XXXXXX")
mkdir -p "$D/state" "$D/config" "$D/tmux" "$D/root"
export TMUX_TMPDIR="$D/tmux"; unset TMUX TMUX_PANE
task=jt-live
tmux new-session -d -s jevlive -n "fm-$task" -x 120 -y 30 'env PS1="exited$ " bash --norc --noprofile'
sleep 1
printf 'window=jevlive:fm-%s\nkind=ship\npr=%s\n' "$task" "$PR" > "$D/state/$task.meta"
printf '%s\n' "$@" > "$D/state/$task.status"
FM_STATE_OVERRIDE="$D/state" bash -c '. "$1/fm-wake-lib.sh"; fm_wake_status_mark_current "$2" "$3"' _ "$BIN" "$D/state" "$D/state/$task.status"
touch -d '@'$(( $(date +%s) - 14520 )) "$D/state/$task.status"
key=
if [ "$USEKEY" = yes ]; then key=$(sed -n 's/^TYPESAFE_API_KEY=//p' "$REAL_HOME_ENV" | head -1 | tr -d "\"'"); fi
echo "### case=$CASE bin=$(git -C "$REPO" rev-parse --short HEAD 2>/dev/null || echo '?') key=$USEKEY"
echo "### meta:"; cat "$D/state/$task.meta"
echo "### status:"; cat "$D/state/$task.status"
echo "### agent state read by the product: $(bash -c '. "$1/fm-backend.sh"; fm_backend_agent_state tmux "$2"' _ "$BIN" "jevlive:fm-$task" 2>&1)"
echo "### real pull-request read (fm-pr-state.sh):"; "$BIN/fm-pr-state.sh" "$PR" | sed 's/^/    /'
env ${key:+TYPESAFE_API_KEY="$key"} FM_HOME="$D" FM_ROOT_OVERRIDE="$D/root" FM_STATE_OVERRIDE="$D/state" FM_CONFIG_OVERRIDE="$D/config" \
  FM_WEDGE_ALARM_EXEC=/bin/true FM_POLL=1 FM_SIGNAL_GRACE=1 FM_CHECK_INTERVAL=999999 FM_HEARTBEAT=999999 \
  FM_PAUSE_RESURFACE_SECS=600 FM_WATCH_HANDLING_SUCCESSOR=1 "$BIN/fm-watch.sh" > "$D/watch.out" 2> "$D/watch.err" &
pid=$!
i=0; outcome='still running after 45s'
while [ $i -lt 45 ]; do
  if ! kill -0 $pid 2>/dev/null; then outcome='watcher exited (a wake was delivered)'; break; fi
  if grep -q 'absorbed jev-routine' "$D/state/.watch-triage.log" 2>/dev/null; then
    sleep 8
    if kill -0 $pid 2>/dev/null; then outcome='watcher still supervising 8s after the absorb (no wake delivered)'; else outcome='watcher exited after an absorb'; fi
    break
  fi
  sleep 1; i=$((i+1))
done
kill $pid 2>/dev/null; wait $pid 2>/dev/null
echo "### outcome: $outcome"
echo "### watcher stdout (what the supervisor is woken with):"; sed 's/^/    /' "$D/watch.out"; [ -s "$D/watch.out" ] || echo "    (empty)"
echo "### wake queue:"; if [ -s "$D/state/.wake-queue" ]; then sed 's/^/    /' "$D/state/.wake-queue"; else echo "    (empty)"; fi
echo "### state/.watch-triage.log:"; sed 's/^/    /' "$D/state/.watch-triage.log" 2>/dev/null || echo "    (none)"
[ -s "$D/watch.err" ] && { echo "### stderr:"; sed 's/^/    /' "$D/watch.err"; }
if [ -n "$key" ] && grep -rqF "$key" "$D" 2>/dev/null; then echo "### KEY LEAKED INTO HOME"; else echo "### key not present in any home file"; fi
tmux kill-server 2>/dev/null
rm -rf "$D"
Evidence: Before and after for pull request 228, merge-word wait, exited agent
BASE d0dd8b5 - outcome: watcher exited (a wake was delivered)
stdout: stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
state/.watch-triage.log: (none)

TARGET 1efd16a - outcome: watcher still supervising 8s after the absorb (no wake delivered)
stdout: (empty) wake queue: (empty)
state/.watch-triage.log: absorbed jev-routine declared-pause-recheck (confidence=0.95, routine=0.98 needs_firstmate=0.02, 354 ms): stale: jevlive:fm-jt-live (paused 14523s, awaiting external - declared pause, rechecked on a long cadence not a wedge; confirm the wait still holds)
Evidence: Adversarial deliveries on the target commit
conflicting PR 230: delivered, no triage line (Jev never asked)
told-which, exited: jev triage delivered declared-pause-recheck (choice=needs_firstmate confidence=1.0 floor=0.6)
CI wait, exited: jev triage delivered declared-pause-recheck (choice=routine confidence=0.24 floor=0.6)
no key: delivered, no triage line

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 3 issues found → auto-fixed ✅
  • ⚠️ bin/fm-watch.sh:1728 - The intent says the recheck must be closed for "the ten JewelTrek pull requests that are open and waiting for a merge word (jeweltrek2627-slim pull requests 222 to 231; examples ... jt-diamond-cert-mismatch-flag". Traced read-only against the live firstmate home: all ten tasks now pass every gate up to the pull-request read (last line paused:, no open keyed decision, pr= recorded, agent state dead), and nine of them read CHECKS: none reported yet and are offered. But bin/fm-pr-state.sh on pull request 230 (jt-diamond-cert-mismatch-flag, one of the two named examples) prints MERGEABILITY: conflicting plus CHECKS: none reported yet, and the unchanged gate grep -Eqv &#39;^(CHECKS: |MERGEABILITY: unknown$)&#39; returns 1 for it, so that task's recheck is still delivered unasked every FM_PAUSE_RESURFACE_SECS. The change keeps this deliberately (docs/configuration.md: "a conflict ... each are" blockers; tests/fm-jev-wake-triage.test.sh:380 asserts it). Whether a conflicting pull request awaiting the merge word should keep waking the supervisor on every cadence, or be absorbed/delivered once, is a product decision: confirm that leaving 230 delivered is acceptable, since the intent names it as a recheck that should be closed.
  • ℹ️ bin/fm-watch.sh:1724 - Offering dead agents makes the model the only guard between a merge wait and any other wait of a worker that can no longer resume. The change's own live evidence (docs/verification/jev-wake-triage.md, row ci/exited) shows the model still chooses routine there with routine probability 0.56, delivered only because of the 0.6 floor. A dead worker whose last line is a non-merge automatic wait, in a repository with no required checks so the deterministic read does not catch it, is therefore one small model shift from being absorbed for up to six cadences before the streak bound delivers it. Bounded and documented; noted as an accepted tradeoff.
  • ℹ️ docs/verification/jev-wake-triage.md:12 - The live-evidence paragraph cites bin/fm-watch.sh at commit 1f534a99, which is not an ancestor of this branch: it is a pre-rebase copy of 3ac9b3d (identical fm-watch.sh content, same subject). The SHA will not resolve from the merged history; cite 3ac9b3d instead.

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

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 6 of 8 scenarios driven live against the product
Scenario Result Live Evidence
Reproduce the report on the base commit: a watcher supervising a worker whose agent has exited, with pull request 228 open and waiting for the captain's merge word, wakes the supervisor with the stale… ✅ pass live live-transcript.txt, case=base-merge-word-exited: watcher exited with the stale: ... confirm the wait still holds wake queued; state/.watch-triage.log absent
On the target commit the same merge-word recheck of open, no-checks pull request 228 with an exited agent is closed without a message: Jev answers routine, nothing is queued, the watcher keeps supervi… ✅ pass live live-transcript.txt, case=target-merge-word-exited: absorbed jev-routine declared-pause-recheck (confidence=0.95, routine=0.98 needs_firstmate=0.02, 354 ms), empty stdout and wake queue, watcher ali…
Adversarial: a conflicting pull request (230) waiting for the merge word is still delivered to the supervisor without asking Jev, as the user decided in review ✅ pass live live-transcript.txt, case=target-conflicting-pr230: fm-pr-state.sh prints MERGEABILITY: conflicting; stale wake queued; no triage log line
Adversarial: an exited worker with an open pull request whose newest line waits on a person ('two ways to fix the schema, waiting to be told which') is delivered ✅ pass live live-transcript.txt, case=target-told-which-exited: jev triage delivered declared-pause-recheck (choice=needs_firstmate confidence=1.0 floor=0.6); stale wake queued
Adversarial: an exited worker declaring a non-merge automatic wait (CI running, 'resuming on my own') is delivered, because a dead worker cannot resume ✅ pass live live-transcript.txt, case=target-ci-wait-exited: jev triage delivered declared-pause-recheck (choice=routine confidence=0.24 floor=0.6); stale wake queued. Only the confidence floor delivered it, th…
Without the Typesafe key the merge-word recheck is delivered exactly as before and Jev is never called ✅ pass live live-transcript.txt, case=target-no-key: stale wake queued; no triage log line
A running (alive) worker with an open pull request is still offered and Jev is told worker_agent: running; missing, ambiguous, unreadable and unverified endpoints are never offered ⏸️ untested no The prior payload did not establish a live result: this was covered only by bash tests/fm-jev-wake-triage.test.sh, which stubs Jev at the library boundary and stubs the agent state. The six live wat…
The same merge-word recheck is closed for a worker on the herdr backend, which is what the ten JewelTrek tasks actually run on (backend=herdr in their metadata) ⏸️ untested no Driving herdr live needs a disposable herdr session with a dead-agent pane; the only herdr server on this host is the live fleet's, which this phase must not touch. Live runs used the tmux backend; bo…
  • drive-live.sh &lt;base d0dd8b5&gt;/bin base-merge-word-exited https://github.com/talktejas/jeweltrek2627-slim/pull/228 yes ... - real watcher on the base commit: stale recheck delivered, no triage log line
  • drive-live.sh bin target-merge-word-exited .../pull/228 yes ... - real watcher on 1efd16a: absorbed jev-routine declared-pause-recheck (confidence=0.95 ...), empty wake queue, watcher still supervising
  • drive-live.sh bin target-conflicting-pr230 .../pull/230 yes ... - delivered, Jev never asked
  • drive-live.sh bin target-told-which-exited .../pull/228 yes ... - jev triage delivered ... choice=needs_firstmate confidence=1.0
  • drive-live.sh bin target-ci-wait-exited .../pull/228 yes ... - jev triage delivered ... choice=routine confidence=0.24 floor=0.6
  • drive-live.sh bin target-no-key .../pull/228 no ... - delivered, no triage log line
  • bin/fm-pr-state.sh on pull requests 228 (CHECKS: none reported yet) and 230 (MERGEABILITY: conflicting plus CHECKS: none reported yet)
  • bash tests/fm-jev-wake-triage.test.sh - all passed
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…to routine-wake triage

The pause recheck is reached for an ordinary crew only once its agent is
confidently dead, and the triage refused every agent that was not alive, so the
recheck it was wired to could never be offered. A worker whose agent has exited
beside an open pull request is now offered, the model is told which, and the
question reads a wait for the merge word of that pull request as the already
reported merge whoever gives it.
@talktejas

Copy link
Copy Markdown
Owner Author

Superseded by #50, which carries this change's final content together with the other three Jev items on one branch.

@talktejas talktejas closed this Oct 5, 2026
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