/dev:technical-plan 2.4 has no protocol for a reviewer that goes idle without reporting — twice it nearly wrote 'panel could not be run' into an immutable record #453
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#453
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?
Observation
/dev:technical-plan§2.4 tells the lead how to spawn an expert panel and how to synthesize it, butsays nothing about the case where a reviewer goes idle without delivering its report. The step's
only failure-handling is for an unavailable model:
and its synthesis instruction assumes delivery:
There is no branch for responded-to-nobody. A lead that hits it has to invent a protocol on the
spot — and the sanctioned protocol already exists, three files away, in
_shared/procedures/wait-discipline.md§1a ("An idle signal is not a completion signal — check thetree, then ask"), which §2.4 never references. §1a is written for
/dev:developand the QAplaybook; its Consumers list does not name
/dev:technical-plan.The consequence is not a slow panel. It is a false statement written into an immutable durable
record: the lead concludes the panel could not be run, and posts that as a finding.
Evidence
Instance 1 — feature-230,
/dev:technical-plan(recorded in #45's PREQ, from the #37 time study).Five reviewers returned nothing. Between 12:21 and 12:34 the lead spawned seven agents across two
models, ran two control probes, used sentinel-file wait loops, then concluded the subagent transport
was broken. It wrote the SREQ solo and posted the Phase Outcome at 12:37:13 carrying the finding
"panel could not be run".
The panel's results arrived at 12:37:47 — 34 seconds later, carrying two blocking concerns the
solo plan had missed. Cost: the SREQ rewritten and re-posted, a correction comment filed, ~25 minutes
of rework, and a durable record that was false. #45 exists because of this incident.
Instance 2 — issue #45,
/dev:technical-plan, 2026-08-26 (this run). A five-lens Tier 3 panel wasspawned on
fable. Four of the five went idle without delivering a report; onlyrev-securityreturned one through the normal path.
Following §1a — read the tree before drawing any conclusion — the four transcripts showed each had
written a complete review; the reports were dropped, not the work. All four were recovered from
the transcripts and used. They carried 8 of the 12 blocking concerns the panel produced,
including three that changed the design:
evidence (contradicting the feature's own AC-6),
ref-substring hazard (F-PO-45-3-2prefixesF-PO-45-3-21) — a bug class this suite hasalready shipped once.
Had this run followed instance 1's path, it would have written "panel could not be run" into the
Phase Outcome of the feature whose entire purpose is recovering from that exact false record.
Recovery in both instances was cheap: instance 1 needed 34 more seconds of patience; instance 2
needed one transcript read. The recorded cost came entirely from concluding too early.
Recurrence
2 independent instances, in the same skill and the same step, ~3 weeks apart, on different
models. Structural as well: §2.4 is the only place in the suite that spawns a panel without
pointing at §1a, and it is a step whose output feeds an immutable record.
Hypothesis
A reference, not a new mechanism. In §2.4, after the probe-and-fan-out paragraph, state that an
unreported idle is not a completion signal and route to
wait-discipline.md§1a's existingordered step — read the tree (the agent's transcript / its declared output), then ask it directly
with one round-trip, then reconcile and say which happened. Add
/dev:technical-planto §1a'sConsumers list so the pointer is bidirectional.
Two specifics worth writing down because both instances turned on them:
were recoverable by reading the last assistant message of each transcript. §1a's "read the tree"
is phrased for code (
git log,git status, commits) and does not obviously cover a review panel,whose tree is the transcript.
sentence is the failure mode, and it is what makes the record false.
Relationship to #45 (partial overlap — do not close as duplicate)
#45's roll-call removes the escape hatch: a terminal Phase Outcome must account for every agent the
phase spawned as
reportedorterminated, and there is deliberately nounrecoverabledisposition, so "I judged the transport broken" stops being something the record can say.
That is prevention, not instruction. It forces the lead to terminate or wait; it does not tell it
that the report is probably recoverable, or how. This ticket is the remaining half — the lead needs
to know the recovery step exists before it decides which disposition to write. Both instances
show the recovery is the cheap part; the expensive part is not knowing to try.
Sequence after #45: this amendment should land after #45's roll-call, so §2.4's new text can name
the roll-call as the thing the recovery feeds.
Suggested lane
Meta lane /
/meta-amend, sequenced after #45. Bounded text edits to/dev:technical-plan§2.4and
wait-discipline.md's Consumers list; verifiable at HEAD; desk-check against both instancesabove.