Skip to content

Commit fe2510d

Browse files
committed
feat(agents): pm-dispatch backlog sweep duty + stale-premise triage checks + PID-only process discipline
- Step 0: classifying the unlabeled backlog is a standing PM duty — auto-queue concrete/no-risk work, flag design cards and programs for the maintainer, request repair for sanitizer-truncated bodies. - Fetch step now requires reading issue comments and running a stale-premise check against recent main history before dispatch (three same-day cases: #4525, #4379, #4075 step 1). - os-dev resource discipline: never kill by process name; PID-scoped operations only (from the #3182 agent's pkill disclosure). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
1 parent b9b7310 commit fe2510d

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Internal agent tooling only (`.claude/` pm-dispatch backlog-sweep duty + stale-premise checks + process discipline) — releases nothing.

.claude/agents/os-dev.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ build/test runs OOM it.** Binding rules:
4949
4. **Clean up when done**: after the PR is up, remove your worktree
5050
(`git worktree remove <path> --force`) — leftover `node_modules` trees
5151
exhaust the container's disk, which fails as confusingly as OOM.
52+
5. **Never kill by process name.** `pkill -f vitest` (or any name-matched
53+
kill) can take down a parallel agent's run — AGENTS.md's server rule,
54+
applied to every process. Record the PID of what you start and operate
55+
on that PID only (`kill $PID`, liveness via `kill -0 $PID` — a
56+
`pgrep -f` pattern can match your own watcher and never terminate).
5257

5358
Definition of done, in order:
5459

.claude/skills/pm-dispatch/SKILL.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,43 @@ the loop resumable and the board honest.
126126

127127
## The round loop
128128

129+
### 0. Backlog sweep — classification is a standing duty, not a request
130+
131+
The maintainer does not pre-sort the backlog. On every round (and every
132+
idle check-in), sweep issues that carry no `pm:*` / `needs-user-decision`
133+
label and classify each:
134+
135+
- **Auto-queue (`pm:queue`)**: a concrete defect with a named location or
136+
repro; a scoped tooling/gate fix; a restore-invariant finding; a
137+
test-only pin. Nothing to ask — label it and it becomes dispatchable.
138+
- **Maintainer confirm (`needs-user-decision`)**: design cards, feature/
139+
contract-shape proposals, multi-week programs needing appetite and
140+
sequencing, anything touching stored-data migration shape or removing a
141+
shipped capability. The label alone is the inbox entry; the deep two-axis
142+
analysis is written when the card is actually taken up.
143+
- **Repair first**: a body truncated by GitHub's sanitizer (bare `<x>`
144+
swallows the rest at rest) cannot be dispatched — comment the repair
145+
instruction and move on.
146+
129147
### 1. Fetch candidates
130148

131149
List open issues matching the filter, excluding anything assigned or labeled
132150
`needs-user-decision`. **Open sub-issues of a matching parent are candidates
133151
too** — they inherit the parent's queue membership and need no label of their
134-
own. Read each candidate's full body — triage, batch selection (steps 2–3)
135-
and the dispatch prompt all need it.
152+
own. Read each candidate's full body **and its comments** — a comment may
153+
record that half the work already shipped (#4075's step 1 had been merged
154+
for three days; the claim went out without reading the comment that said
155+
so). Triage, batch selection (steps 2–3) and the dispatch prompt all need
156+
the full picture.
157+
158+
**Stale-premise check before every dispatch.** Issues describe the repo as
159+
of their filing date; main moves ~18 merges a day. Before dispatching,
160+
check the named files/subsystem against recent main history (`git log
161+
--oneline -20 -- <paths>`, or search merged PRs referencing the issue's
162+
keywords). Three same-day cases: #4525 (spec key landed 3 days before
163+
filing), #4379 (fix merged via #4459 with the exact proposed sketch),
164+
#4075 (step 1 shipped via objectui#3032). A dispatch that starts with "is
165+
this still true?" costs minutes; one that doesn't costs an agent-run.
136166

137167
### 2. Triage — routing is the PM's job, never the maintainer's
138168

0 commit comments

Comments
 (0)