@@ -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+
36391 . ** 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.
39454 . ** 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
5059If > 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
146181is milestoned, or a version-shaped label is present. Otherwise omit.
147182Never 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