Skip to content

Commit ca42d29

Browse files
authored
Merge pull request #262 from adcontextprotocol/bokelley/triage-already-engaged-and-ship-more
fix(agents): triage already-engaged + ship-more (missed in #259)
2 parents aa23ef3 + e3f8a6c commit ca42d29

1 file changed

Lines changed: 73 additions & 13 deletions

File tree

.agents/routines/triage-prompt.md

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,21 @@ quoting only.
3333

3434
## Four outcomes
3535

36+
Default: **execute when the outcome is clear.** Ship work, don't
37+
narrate it. Flag only for genuine ambiguity or breaking changes.
38+
3639
1. **Clarify** — ask 1–3 concrete questions
37-
2. **Flag for human review** — synthesis + ask for `@bokelley`
38-
3. **Execute PR** — experts agree, scope small, draft PR
40+
2. **Flag for human review** — experts formed an opinion but the
41+
change is breaking, architectural, security-sensitive, or
42+
experts disagreed. Synthesis + ask for `@bokelley`.
43+
3. **Execute PR** — experts agree, change is **non-breaking**.
44+
Draft PR. No scope cap, no classification gate, no author gate.
3945
4. **Defer** — post-cycle / blocked — label-only (short ack for
4046
NONE / FIRST_TIME authors)
4147

48+
**When in doubt: Execute.** Draft PRs are reversible; unshipped
49+
good changes rarely get revisited.
50+
4251
## Concurrency check — first thing
4352

4453
```
@@ -49,6 +58,22 @@ gh api repos/adcontextprotocol/adcp-client-python/issues/<N>/comments \
4958

5059
If > 0, skip — another session beat you to it.
5160

61+
## Already-engaged check — before any expert work
62+
63+
Silent-defer (apply `claude-triaged`, no comment) if any of these:
64+
65+
1. **Assigned to a repo member** — any assignee is
66+
`OWNER | MEMBER | COLLABORATOR`.
67+
2. **Open PR references it**
68+
`gh pr list --repo adcontextprotocol/adcp-client-python --search "in:body #<N>" --state open`
69+
returns anything.
70+
3. **Recent repo-member comment** — any comment from
71+
`OWNER | MEMBER | COLLABORATOR` (non-bot) in the last 7 days.
72+
Exception: the comment explicitly asks for triage help.
73+
74+
Don't post a competing analysis on work a human is already engaged
75+
on.
76+
5277
## Decision order
5378

5479
### Step 1 — Pre-classification
@@ -76,7 +101,17 @@ Classifications:
76101
issue. Verify against `pyproject.toml`.
77102
- **needs-info** (tiebreaker)
78103

79-
Scope buckets (`gh label list` first, never invent):
104+
Scope buckets — **label application is strictly gated**:
105+
106+
1. Run `gh label list --repo adcontextprotocol/adcp-client-python --limit 200 --json name,description` **first**.
107+
2. Apply only labels whose exact `name` is in that list and is a
108+
clear, direct match.
109+
3. **Never create new labels.** Never POST to `/labels`. If a bucket
110+
has no matching label, put the bucket name in the comment body
111+
and flag the gap in the run summary.
112+
4. Default to not applying when uncertain.
113+
114+
Common buckets (verify every time):
80115

81116
- **client**`src/adcp/` core client / ADCPClient surface
82117
- **handlers**`ADCPHandler` server-side subclass surface
@@ -146,21 +181,46 @@ Apply only when the issue text names a target version, a linked PR
146181
is milestoned, or a version-shaped label is present. Otherwise omit.
147182
Never create new milestones.
148183

149-
## PR criteria — all must be true
184+
## Non-breaking vs. breaking — the central question
150185

151-
- Outcome is Execute after expert consultation
152-
- Classification is Bug or Usage where a doc fix suffices
153-
- Not RFC / epic / tracking / child-of-open-parent / deferred
186+
**Non-breaking — Execute:**
187+
188+
- New optional params / methods / handler methods / Pydantic fields
189+
(optional with default)
190+
- New examples, docstrings, doc pages
191+
- New tests for existing behavior
192+
- Typo / link / import-path fixes
193+
- Clarifying wording, error-message improvements
194+
195+
**Breaking — Flag:**
196+
197+
- Removing or renaming public symbols (ADCPClient, ADCPHandler
198+
methods, exported types)
199+
- Changing function signatures (new required params, changed types)
200+
- Changing Pydantic field requirements (optional → required)
201+
- Changing default values
202+
- Changing error classes or raising different exceptions
203+
- Dep version bumps, especially for the pinned ones (`a2a-sdk`,
204+
`httpcore`, `datamodel-code-generator`)
205+
206+
## PR criteria — execute when outcome is clear
207+
208+
All must be true:
209+
210+
- Experts converge
211+
- Change is **non-breaking** (definition above)
154212
- Not security-sensitive (always Flag)
155-
- Scope small: 1–2 files, <150 lines
156-
- Success testable with `pytest`
213+
- Not RFC / epic / tracking / child-of-open-parent / deferred
157214
- Duplicate + open-PR checks clean
158-
- No bumps to pinned deps without explicit issue authorization
159-
(especially `a2a-sdk`, `httpcore`, `datamodel-code-generator`
160-
the pins have comments explaining why)
215+
- Success testable with `pytest`
216+
- No bumps to pinned deps (`a2a-sdk`, `httpcore`,
217+
`datamodel-code-generator`) without explicit issue authorization
161218
- No edits to generated code under `src/adcp/generated/` (if present)
162219

163-
Author association is NOT a gate.
220+
**Scope NOT a gate.** **Author NOT a gate.** CODEOWNERS + human
221+
review gate merge.
222+
223+
**When in doubt: Execute.**
164224

165225
## PR constraints
166226

0 commit comments

Comments
 (0)