From 95a6c6662a0b69eb7fb960e6680292b2f0a5d328 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 6 Sep 2026 00:23:46 +0000 Subject: [PATCH 1/5] docs: require resolved PR review threads --- .agents/playbook.md | 57 +++++++++++++++++++++++++++++++++++++++++---- CLAUDE.md | 9 +++++++ 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/.agents/playbook.md b/.agents/playbook.md index eec082749b..b083cf11a6 100644 --- a/.agents/playbook.md +++ b/.agents/playbook.md @@ -791,11 +791,58 @@ Apply this pattern when restructuring protocol sections. Before creating or updating a PR, always: -1. **Check CodeQL comments on the PR** — run `gh api repos/adcontextprotocol/adcp/pulls/{PR_NUMBER}/comments` and look for CodeQL findings. These are the most common CI blockers and must be resolved before merge. -2. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. -3. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. -4. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. -5. **Run `gh pr checks {PR_NUMBER}`** to verify all CI passes before requesting review. +1. **Enumerate and clear every review thread.** Before declaring a PR done, ready, mergeable, or complete—or enabling or expecting its merge—enumerate every review thread, including inline threads from every bot and human reviewer. Fix or otherwise substantively address every actionable comment, then resolve every thread. Passing CI and receiving an approval are insufficient while any thread remains unresolved. Verify outdated threads before resolving them; never blanket-resolve feedback that has not been addressed. +2. **Use GitHub GraphQL as the authoritative thread inventory.** Replace `PR_NUMBER` and run: + + ```bash + gh api graphql \ + -F owner=adcontextprotocol \ + -F repo=adcp \ + -F number="$PR_NUMBER" \ + -f query=' + query($owner: String!, $repo: String!, $number: Int!, $cursor: String) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $number) { + reviewThreads(first: 100, after: $cursor) { + nodes { + id + isResolved + isOutdated + path + line + comments(first: 100) { + nodes { + author { login } + body + url + } + } + } + pageInfo { hasNextPage endCursor } + } + } + } + }' + ``` + + Inspect each page. If `pageInfo.hasNextPage` is `true`, repeat the query with + `-f cursor=''` from that page, continuing until it is `false`. + Include resolved and outdated threads in the review; an outdated thread still + requires verification and explicit resolution when its feedback is addressed. +3. **Inspect feedback outside resolvable threads.** Also inspect the top-level + PR conversation and submitted review bodies for actionable feedback, which + are not all represented as resolvable threads: + + ```bash + gh api "repos/adcontextprotocol/adcp/issues/$PR_NUMBER/comments" + gh api "repos/adcontextprotocol/adcp/pulls/$PR_NUMBER/reviews" + ``` + +4. **Check CodeQL comments on the PR** — run `gh api repos/adcontextprotocol/adcp/pulls/{PR_NUMBER}/comments` and look for CodeQL findings. These are the most common CI blockers and must be resolved before merge. +5. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. +6. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. +7. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. +8. **Run `gh pr checks {PR_NUMBER}`** to verify all CI passes before requesting review. ## Triage Routine — Manual Nudge diff --git a/CLAUDE.md b/CLAUDE.md index 88e47acb11..31dc21f616 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,3 +10,12 @@ lives in `.agents/playbook.md`. 3. Prompt shortcuts: `.agents/shortcuts/`. 4. Treat this file as a pointer only. Shared behavior changes belong in `.agents/playbook.md`. + +## PR Completion Gate + +Follow the canonical **PR Preparation Checklist** in `.agents/playbook.md`. +No Claude session may declare a PR or task done, ready, mergeable, or complete, +or enable or expect merge, while any PR review thread remains unresolved. +Every bot and human thread—including outdated threads—must be verified, +substantively addressed when actionable, and explicitly resolved first. CI +passing and an approval do not waive this gate. From c9b9767259ba3d3001b3e52fbd7a2c3c3e87d3f5 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 6 Sep 2026 04:27:34 +0000 Subject: [PATCH 2/5] docs: require resolved PR review threads --- .agents/playbook.md | 88 ++++++++++++++++++++++++++++++++++++++------- CLAUDE.md | 5 --- 2 files changed, 76 insertions(+), 17 deletions(-) diff --git a/.agents/playbook.md b/.agents/playbook.md index b083cf11a6..2ab252a6a5 100644 --- a/.agents/playbook.md +++ b/.agents/playbook.md @@ -791,10 +791,32 @@ Apply this pattern when restructuring protocol sections. Before creating or updating a PR, always: -1. **Enumerate and clear every review thread.** Before declaring a PR done, ready, mergeable, or complete—or enabling or expecting its merge—enumerate every review thread, including inline threads from every bot and human reviewer. Fix or otherwise substantively address every actionable comment, then resolve every thread. Passing CI and receiving an approval are insufficient while any thread remains unresolved. Verify outdated threads before resolving them; never blanket-resolve feedback that has not been addressed. -2. **Use GitHub GraphQL as the authoritative thread inventory.** Replace `PR_NUMBER` and run: +1. **Clear all actionable review feedback.** Before declaring a PR done, ready, + mergeable, or complete—or enabling or expecting its merge—enumerate every + review thread (including inline bot and human threads), top-level PR + conversation comment, submitted review body, and inline review comment. Give + every actionable item a specific, evidence-backed fix or disposition. Record + the feedback URL or ID and evidence for each item: a commit and file/line or + focused check for a fix; or the concrete repository, policy, or reproduction + evidence that makes it already fixed or inapplicable. For each thread, + individually record whether it was fixed, verified already fixed, or + documented inapplicable before resolving it. Only review threads can be + GitHub-resolved; top-level feedback still requires a disposition. + Passing CI, approval, dismissal, bot authorship, or outdated status never + justifies blanket or automatic resolution. +2. **Initialize and validate `PR_NUMBER`, then use GitHub GraphQL as the + authoritative thread inventory.** Set it to the PR number, require a + positive integer, and verify it names the intended pull request before + querying feedback: ```bash + PR_NUMBER=7310 + case "$PR_NUMBER" in + ''|*[!0-9]*|0) echo 'PR_NUMBER must be a positive integer' >&2; exit 1 ;; + esac + test "$(gh pr view "$PR_NUMBER" --repo adcontextprotocol/adcp --json number --jq .number)" = "$PR_NUMBER" \ + || { echo "PR #$PR_NUMBER was not found" >&2; exit 1; } + gh api graphql \ -F owner=adcontextprotocol \ -F repo=adcp \ @@ -811,11 +833,17 @@ Before creating or updating a PR, always: path line comments(first: 100) { + totalCount nodes { + id + createdAt + updatedAt + replyTo { id } author { login } body url } + pageInfo { hasNextPage endCursor } } } pageInfo { hasNextPage endCursor } @@ -825,24 +853,60 @@ Before creating or updating a PR, always: }' ``` - Inspect each page. If `pageInfo.hasNextPage` is `true`, repeat the query with - `-f cursor=''` from that page, continuing until it is `false`. + Inspect each page. If `reviewThreads.pageInfo.hasNextPage` is `true`, repeat + the query with `-f cursor=''` from that page, continuing until it + is `false`. For every thread whose `comments.pageInfo.hasNextPage` is `true` + (or whose `comments.totalCount` exceeds the returned nodes), fetch every + remaining comment with this query. Start with that thread's initial + `comments.pageInfo.endCursor`, then repeat with each response's + `comments.pageInfo.endCursor` until `hasNextPage` is `false`: + + ```bash + gh api graphql \ + -F threadId='' \ + -f commentCursor='' \ + -f query=' + query($threadId: ID!, $commentCursor: String) { + node(id: $threadId) { + ... on PullRequestReviewThread { + comments(first: 100, after: $commentCursor) { + totalCount + nodes { + id + createdAt + updatedAt + replyTo { id } + author { login } + body + url + } + pageInfo { hasNextPage endCursor } + } + } + } + }' + ``` + Include resolved and outdated threads in the review; an outdated thread still - requires verification and explicit resolution when its feedback is addressed. -3. **Inspect feedback outside resolvable threads.** Also inspect the top-level - PR conversation and submitted review bodies for actionable feedback, which - are not all represented as resolvable threads: + requires verification and an individual disposition before resolution. +3. **Inventory feedback outside resolvable threads.** Inspect the top-level PR + conversation, submitted review bodies, and inline review comments for + actionable feedback, which is not all represented as resolvable threads: ```bash - gh api "repos/adcontextprotocol/adcp/issues/$PR_NUMBER/comments" - gh api "repos/adcontextprotocol/adcp/pulls/$PR_NUMBER/reviews" + gh api --paginate "repos/adcontextprotocol/adcp/issues/$PR_NUMBER/comments?per_page=100" + gh api --paginate "repos/adcontextprotocol/adcp/pulls/$PR_NUMBER/reviews?per_page=100" + gh api --paginate "repos/adcontextprotocol/adcp/pulls/$PR_NUMBER/comments?per_page=100" ``` -4. **Check CodeQL comments on the PR** — run `gh api repos/adcontextprotocol/adcp/pulls/{PR_NUMBER}/comments` and look for CodeQL findings. These are the most common CI blockers and must be resolved before merge. +4. **Check CodeQL feedback in the inline inventory** — look for CodeQL findings + in the paginated inline review comments above. These are common CI blockers + and must receive a substantive fix or specific justified disposition before + merge. 5. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. 6. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. 7. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. -8. **Run `gh pr checks {PR_NUMBER}`** to verify all CI passes before requesting review. +8. **Run `gh pr checks "$PR_NUMBER"`** to verify all CI passes before requesting review. ## Triage Routine — Manual Nudge diff --git a/CLAUDE.md b/CLAUDE.md index 31dc21f616..c3210475b3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,8 +14,3 @@ lives in `.agents/playbook.md`. ## PR Completion Gate Follow the canonical **PR Preparation Checklist** in `.agents/playbook.md`. -No Claude session may declare a PR or task done, ready, mergeable, or complete, -or enable or expect merge, while any PR review thread remains unresolved. -Every bot and human thread—including outdated threads—must be verified, -substantively addressed when actionable, and explicitly resolved first. CI -passing and an approval do not waive this gate. From f23d000410c4cfa7a3d3b2b90c6ebc63c7ae8718 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 6 Sep 2026 04:40:16 +0000 Subject: [PATCH 3/5] docs: require explicit PR feedback targets --- .agents/playbook.md | 55 +++++++++++++++++++++++++++++---------------- CLAUDE.md | 2 ++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/.agents/playbook.md b/.agents/playbook.md index 2ab252a6a5..47daeee4cb 100644 --- a/.agents/playbook.md +++ b/.agents/playbook.md @@ -791,31 +791,48 @@ Apply this pattern when restructuring protocol sections. Before creating or updating a PR, always: -1. **Clear all actionable review feedback.** Before declaring a PR done, ready, - mergeable, or complete—or enabling or expecting its merge—enumerate every - review thread (including inline bot and human threads), top-level PR - conversation comment, submitted review body, and inline review comment. Give - every actionable item a specific, evidence-backed fix or disposition. Record - the feedback URL or ID and evidence for each item: a commit and file/line or - focused check for a fix; or the concrete repository, policy, or reproduction - evidence that makes it already fixed or inapplicable. For each thread, - individually record whether it was fixed, verified already fixed, or - documented inapplicable before resolving it. Only review threads can be - GitHub-resolved; top-level feedback still requires a disposition. - Passing CI, approval, dismissal, bot authorship, or outdated status never - justifies blanket or automatic resolution. -2. **Initialize and validate `PR_NUMBER`, then use GitHub GraphQL as the - authoritative thread inventory.** Set it to the PR number, require a - positive integer, and verify it names the intended pull request before - querying feedback: +1. **Clear all actionable review feedback.** Completion is forbidden until + every review thread is GitHub-resolved after its fix or specific, + evidence-backed disposition has been recorded; enumeration and recording + state alone are insufficient. Before declaring a PR done, ready, mergeable, + or complete—or enabling or expecting its merge—enumerate every review thread + (including inline bot and human threads), top-level PR conversation comment, + submitted review body, and inline review comment. Give every actionable item + a specific, evidence-backed fix or disposition. Record the feedback URL or + ID and evidence for each item: a commit and file/line or focused check for a + fix; or the concrete repository, policy, or reproduction evidence that makes + it already fixed or inapplicable. For each thread, individually record + whether it was fixed, verified already fixed, or documented inapplicable + before resolving it. Only review threads can be GitHub-resolved; top-level + feedback still requires a disposition. Passing CI, approval, dismissal, bot + authorship, or outdated status never justifies blanket or automatic + resolution. +2. **Require caller-supplied `PR_NUMBER` and `EXPECTED_PR_HEAD`, then use + GitHub GraphQL as the authoritative thread inventory.** Do not default + either value. Require a positive PR number and verify that it identifies the + intended pull request's exact head OID before querying feedback: ```bash - PR_NUMBER=7310 + set -euo pipefail + : "${PR_NUMBER:?Set PR_NUMBER to the intended pull-request number}" + : "${EXPECTED_PR_HEAD:?Set EXPECTED_PR_HEAD to the intended pull request head OID}" case "$PR_NUMBER" in ''|*[!0-9]*|0) echo 'PR_NUMBER must be a positive integer' >&2; exit 1 ;; esac - test "$(gh pr view "$PR_NUMBER" --repo adcontextprotocol/adcp --json number --jq .number)" = "$PR_NUMBER" \ + case "$EXPECTED_PR_HEAD" in + *[!0-9a-f]*) echo 'EXPECTED_PR_HEAD must be a lowercase hexadecimal OID' >&2; exit 1 ;; + esac + test "${#EXPECTED_PR_HEAD}" -eq 40 \ + || { echo 'EXPECTED_PR_HEAD must be a 40-character OID' >&2; exit 1; } + actual_pr="$(gh pr view "$PR_NUMBER" --repo adcontextprotocol/adcp \ + --json number,headRefOid --jq '[.number, .headRefOid] | @tsv')" \ || { echo "PR #$PR_NUMBER was not found" >&2; exit 1; } + actual_number="${actual_pr%%$'\t'*}" + actual_head="${actual_pr#*$'\t'}" + test "$actual_number" != "$actual_pr" \ + && test "$actual_number" = "$PR_NUMBER" \ + && test "$actual_head" = "$EXPECTED_PR_HEAD" \ + || { echo "PR_NUMBER=$PR_NUMBER does not identify the intended PR head $EXPECTED_PR_HEAD" >&2; exit 1; } gh api graphql \ -F owner=adcontextprotocol \ diff --git a/CLAUDE.md b/CLAUDE.md index c3210475b3..5eab63a996 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,3 +14,5 @@ lives in `.agents/playbook.md`. ## PR Completion Gate Follow the canonical **PR Preparation Checklist** in `.agents/playbook.md`. +Completion is forbidden until every review thread is resolved after its fix or +specific evidence-backed disposition; enumeration alone is insufficient. From 252682aad8c78f834334b9e0b74004b27464a2a8 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 6 Sep 2026 04:47:47 +0000 Subject: [PATCH 4/5] docs: require independent PR approvals --- .agents/playbook.md | 21 ++++++++++++++------- CLAUDE.md | 3 +++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.agents/playbook.md b/.agents/playbook.md index 47daeee4cb..7948a2490d 100644 --- a/.agents/playbook.md +++ b/.agents/playbook.md @@ -807,7 +807,14 @@ Before creating or updating a PR, always: feedback still requires a disposition. Passing CI, approval, dismissal, bot authorship, or outdated status never justifies blanket or automatic resolution. -2. **Require caller-supplied `PR_NUMBER` and `EXPECTED_PR_HEAD`, then use +2. **Satisfy every applicable independent approval gate.** Completion is + forbidden until every required approval applies to the PR's current immutable + head. The PR author cannot satisfy any required independent, human, or + CODEOWNER approval themselves. For a gated path—including `.agents/**`—the + designated human/CODEOWNER must approve that current head. Bot, automated, + and AI/Sol reviews can provide findings but never replace a required + human/CODEOWNER approval. +3. **Require caller-supplied `PR_NUMBER` and `EXPECTED_PR_HEAD`, then use GitHub GraphQL as the authoritative thread inventory.** Do not default either value. Require a positive PR number and verify that it identifies the intended pull request's exact head OID before querying feedback: @@ -906,7 +913,7 @@ Before creating or updating a PR, always: Include resolved and outdated threads in the review; an outdated thread still requires verification and an individual disposition before resolution. -3. **Inventory feedback outside resolvable threads.** Inspect the top-level PR +4. **Inventory feedback outside resolvable threads.** Inspect the top-level PR conversation, submitted review bodies, and inline review comments for actionable feedback, which is not all represented as resolvable threads: @@ -916,14 +923,14 @@ Before creating or updating a PR, always: gh api --paginate "repos/adcontextprotocol/adcp/pulls/$PR_NUMBER/comments?per_page=100" ``` -4. **Check CodeQL feedback in the inline inventory** — look for CodeQL findings +5. **Check CodeQL feedback in the inline inventory** — look for CodeQL findings in the paginated inline review comments above. These are common CI blockers and must receive a substantive fix or specific justified disposition before merge. -5. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. -6. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. -7. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. -8. **Run `gh pr checks "$PR_NUMBER"`** to verify all CI passes before requesting review. +6. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. +7. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. +8. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. +9. **Run `gh pr checks "$PR_NUMBER"`** to verify all CI passes before requesting review. ## Triage Routine — Manual Nudge diff --git a/CLAUDE.md b/CLAUDE.md index 5eab63a996..af7c0c2652 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,3 +16,6 @@ lives in `.agents/playbook.md`. Follow the canonical **PR Preparation Checklist** in `.agents/playbook.md`. Completion is forbidden until every review thread is resolved after its fix or specific evidence-backed disposition; enumeration alone is insufficient. +Required approval must apply to the current immutable head; the author cannot +self-satisfy an independent, human, or CODEOWNER approval, and bots/Sol never +replace designated human/CODEOWNER approval for gated paths. From 9d89b0e4a33b371ed8f434dfa9b2b975c8484617 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 6 Sep 2026 07:42:33 +0000 Subject: [PATCH 5/5] docs: clarify PR feedback dispositions --- .agents/playbook.md | 55 +++++++++++++++++++++++++-------------------- CLAUDE.md | 9 +++----- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/.agents/playbook.md b/.agents/playbook.md index 7948a2490d..c343e59e26 100644 --- a/.agents/playbook.md +++ b/.agents/playbook.md @@ -791,22 +791,26 @@ Apply this pattern when restructuring protocol sections. Before creating or updating a PR, always: -1. **Clear all actionable review feedback.** Completion is forbidden until - every review thread is GitHub-resolved after its fix or specific, - evidence-backed disposition has been recorded; enumeration and recording - state alone are insufficient. Before declaring a PR done, ready, mergeable, - or complete—or enabling or expecting its merge—enumerate every review thread - (including inline bot and human threads), top-level PR conversation comment, - submitted review body, and inline review comment. Give every actionable item - a specific, evidence-backed fix or disposition. Record the feedback URL or - ID and evidence for each item: a commit and file/line or focused check for a - fix; or the concrete repository, policy, or reproduction evidence that makes - it already fixed or inapplicable. For each thread, individually record - whether it was fixed, verified already fixed, or documented inapplicable - before resolving it. Only review threads can be GitHub-resolved; top-level - feedback still requires a disposition. Passing CI, approval, dismissal, bot - authorship, or outdated status never justifies blanket or automatic - resolution. +1. **Clear all PR feedback.** Before declaring a PR done, ready, mergeable, or + complete—or enabling or expecting its merge—enumerate and classify every + GraphQL review thread (including inline bot and human threads), REST + issue/conversation comment, REST standalone/inline review comment, and REST + submitted review body as actionable or non-actionable. Every actionable item + **MUST** be fixed and revalidated. Only a non-actionable item may receive a + specific, evidence-backed disposition. For every non-actionable item across + all four surfaces, record its URL or ID and that specific, evidence-backed + disposition. Record every actionable item's URL or ID plus the commit and + file/line or focused revalidation that proves its fix. + + Completion is forbidden until every review thread is GitHub-resolved only + after its actionable fix and revalidation, or its non-actionable + disposition, has been recorded; enumeration and recording state alone are + insufficient. + For each thread, individually record whether it was fixed and revalidated or + documented non-actionable before resolving it. Only review threads can be + GitHub-resolved; non-thread feedback still requires classification and the + corresponding record above. Passing CI, approval, dismissal, bot authorship, + or outdated status never justifies blanket or automatic resolution. 2. **Satisfy every applicable independent approval gate.** Completion is forbidden until every required approval applies to the PR's current immutable head. The PR author cannot satisfy any required independent, human, or @@ -911,11 +915,13 @@ Before creating or updating a PR, always: }' ``` - Include resolved and outdated threads in the review; an outdated thread still - requires verification and an individual disposition before resolution. -4. **Inventory feedback outside resolvable threads.** Inspect the top-level PR - conversation, submitted review bodies, and inline review comments for - actionable feedback, which is not all represented as resolvable threads: + Include resolved and outdated threads in the review; classify each one under + step 1 before resolving it. +4. **Inventory feedback outside resolvable threads.** Inspect and classify the + top-level PR conversation, submitted review bodies, and inline review + comments. Record the URL or ID and specific evidence-backed disposition for + every non-actionable item; these surfaces are not all represented as + resolvable threads: ```bash gh api --paginate "repos/adcontextprotocol/adcp/issues/$PR_NUMBER/comments?per_page=100" @@ -924,9 +930,10 @@ Before creating or updating a PR, always: ``` 5. **Check CodeQL feedback in the inline inventory** — look for CodeQL findings - in the paginated inline review comments above. These are common CI blockers - and must receive a substantive fix or specific justified disposition before - merge. + in the paginated inline review comments above. Classify every finding. Every + actionable CodeQL finding **MUST** be fixed and revalidated; only a + non-actionable finding may receive a specific, evidence-backed disposition + with its URL or ID before merge. 6. **Fix unused imports/variables** — CodeQL flags these. Remove them, don't ignore them. 7. **Check for XSS patterns** — any `innerHTML`, `contenteditable`, or template string interpolation of user data gets flagged. Use `textContent` or escape functions. 8. **Avoid polynomial regexes on user input** — simple string checks (`.includes()`, `.startsWith()`) are safer and faster than regex for validation. diff --git a/CLAUDE.md b/CLAUDE.md index af7c0c2652..0a994cd1ea 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,9 +13,6 @@ lives in `.agents/playbook.md`. ## PR Completion Gate -Follow the canonical **PR Preparation Checklist** in `.agents/playbook.md`. -Completion is forbidden until every review thread is resolved after its fix or -specific evidence-backed disposition; enumeration alone is insufficient. -Required approval must apply to the current immutable head; the author cannot -self-satisfy an independent, human, or CODEOWNER approval, and bots/Sol never -replace designated human/CODEOWNER approval for gated paths. +Do not declare a PR done until all comments and feedback are cleared. Follow +the canonical **PR Preparation Checklist** in `.agents/playbook.md` for the +complete policy.