wait-discipline: no dead-man coverage — arm a watchdog per teammate, verify DONE as a claim #58
Labels
No labels
component:adapters
component:lifecycle
component:qa
component:setup
component:shared
component:worktrees
phase/accepted
phase/backlog
phase/deployed
phase/developing
phase/integrating
phase/planning
phase/qa
phase/requirements
phase/uat
priority:critical
priority:critical
priority:high
priority:high
priority:low
priority:low
priority:medium
priority:medium
type:bug
type:chore
type:docs
type:feature
type:infra
type:tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jbr870/devwork-skills#58
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Finding
wait-discipline.mdtells the orchestrating lead to wait for teammate completion/idlenotifications instead of polling — but provides no dead-man coverage for the case where the
notification never arrives (teammate dies silently, notification lost, or the registry/UI
misrepresents state). The observed cost is an idle lead and an operator who returns after 30
minutes to find nothing happened.
Evidence (recurrence)
wait-discipline.mditself already records: "~an hour lost to unsent subagent reports and twodead stalls to improvised polling" (pre-existing).
/dev:developrun, three fresh specimens:working — background in-process teammates are invisible to the task registry the UI reads
(
TaskOutputcannot resolve them by name orname@team), and the idle main loop reads as"nothing running". Ground truth (teammate transcript mtime, files landing on disk) showed it
healthy.
transcript for the completion promise, which matched the prompt echo (the spawn prompt quotes
"Output WU_N_COMPLETE" and is the transcript's first entry). It fired ~30s
after arming and exited — which also silently removed the stall coverage it existed to provide.
a fact.
Proposed amendment (for /meta-amend to scope)
Amend
_shared/procedures/wait-discipline.md(and, if the amender judges it load-bearing, the"Waiting on the team" pointer in
/dev:develop) with the watchdog discipline as principles,harness mechanics as illustrative example only:
minutes. It must cover BOTH terminal states: the real completion signal, and a stall alarm
(no observable progress for N minutes). Silence is never success.
quoted in the teammate's own briefing (prompt echo); prefer out-of-band ground truth (the WU's
commit marker in
git log, deliverable files appearing) or role-filtered transcript output.landed, suites green) before recording the outcome or advancing the wave.
not the task registry or the terminal display — both can misrepresent background teammates in
either direction.
is not mistaken for a dead run.
Portability note for the amender: any watchdog glue the skill emits falls under the CLAUDE.md
portability baseline (POSIX, no bashisms); the harness watch mechanism itself (e.g. the Monitor
tool, transcript paths under the session directory) is harness-specific and must stay an
illustrative example, not a required value.
Lane
Meta lane (
/meta-amend) — evidence-driven amendment of existing skill text, no new capability./meta-amend outcome — amended
Commit
3b82a77onmain.Verified at HEAD (
cda2366)The gap held, and it is genuinely distinct from the two neighbouring rules already in the file:
8440c90) covers an idle signal that arrives without a report.None of the three covers the notification that never arrives at all. That is this issue.
The amendment
New §1b — "Arm a watchdog when you spawn — silence is never success", principles first, harness mechanics as illustration only per the issue's portability note:
git log, the deliverable appearing) or role-filtered output.Closing note keeps the harness out of the rule: "The mechanism is the harness's; the discipline is yours" — a monitor/watch tool, a backgrounded command, a growing file are implementation details that vary by harness and session; none is a required value. Emitted watchdog glue is skill-authored shell and obeys the portability baseline.
develop/SKILL.md§3.2 gains the two points that bite hardest there, judged load-bearing per the issue's invitation: never watch forWU_N_COMPLETEin a raw transcript (the spawn prompt directly above it quotes that promise — the trap is built into this skill's own text), andwu-status.mdis the roster to read back to the operator, since a dispatched phase-runner has noListAgents.Not amended: the QA playbook. §2 already routes waiting to this file as canonical, and it gained a driver rule in the #44 pass; a third pointer would be bloat, not coverage.
Gate
scripts/lint-conventions.sh— clean.Desk-check against the originating scenario (#57
/dev:develop, 2026-08-24)develop/SKILL.mdnamesWU_N_COMPLETEspecifically, because that skill's own prompt is where the echo comes fromAll four specimens land on a numbered point, and the one that produced a false green — the prompt echo — is the one written up in the most detail, because a watchdog that lies is worse than none.
What validates it next
The next multi-teammate
/dev:developrun. The honest bar is narrow: a stall alarm that actually fires on a teammate that stops progressing. Point 2 is the one to watch — the tempting implementation is always the cheapest grep, and the cheapest grep is the prompt echo.