[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M720PHKEH8JCRZ6QR7AXEWSS":3,"skill-same:01M720PHKEH8JCRZ6QR7AXEWSS":45},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M720PHKEH8JCRZ6QR7AXEWSS","review-preflight",null,"Runs the pre-PR review passes — adversarial and docs-drift on every change, plus chat UX whenever chat output changes — each in a context that did not write the change, and merges what they return into one disposition list.","gke-labs\u002Fkube-agents","gke-labs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F197140281?v=4","01M720MEZR8K6WD2WTHNQE346Q","01M720MF0BRA9RGH1QVT4J0M0E",126,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-preflight\u002FSKILL.md",[],[],"2026-11-10 18:39:20",false,"---\nname: review-preflight\ndescription: Runs the pre-PR review passes — adversarial and docs-drift on every change, plus chat UX whenever chat output changes — each in a context that did not write the change, and merges what they return into one disposition list.\n---\n\n# Task\n\nGet every pre-PR review pass into a context that did not write the change, then merge what comes\nback into the list that becomes the pull request's **Self-Review** section.\n\nThis skill is plumbing. It holds no review method — [`review-adversarial`](..\u002Freview-adversarial\u002FSKILL.md),\n[`review-docs-drift`](..\u002Freview-docs-drift\u002FSKILL.md) and [`review-chat-ux`](..\u002Freview-chat-ux\u002FSKILL.md)\nown that — and it does not state the requirement: \"Pull Request Hygiene\" in\n[`AGENTS.md`](..\u002F..\u002F..\u002FAGENTS.md) does, and that list wins if this file disagrees with it.\n\n[`.claude\u002Fcommands\u002Fpr-preflight.md`](..\u002F..\u002F..\u002F.claude\u002Fcommands\u002Fpr-preflight.md) is the Claude Code\nwrapper. Any harness can follow this file directly.\n\n# Procedure\n\n## 1. Fix the diff range\n\nOne range, shared by every pass. Fetch the base first — a base you have not refreshed silently\nwidens the range with commits that already merged, and the passes then review other people's work\nas though it were yours:\n\n```bash\n# The remote pointing at gke-labs\u002Fkube-agents is not reliably called `upstream`, and\n# on a clone of the upstream repository rather than a fork it is `origin`. Find it.\nBASE_BRANCH=main                                  # or the branch you will target\nBASE_REMOTE=$(git remote | while read -r r; do\n  case \"$(git remote get-url \"$r\")\" in *gke-labs\u002Fkube-agents*) echo \"$r\"; break;; esac\ndone)\n# HTTPS, not SSH. The fallback fires when no remote matches — a plain clone of a fork,\n# which every open pull request here comes from — and that is where a sandbox or a CI\n# runner has no key. The repository is public, so HTTPS needs no credential at all.\n: \"${BASE_REMOTE:=https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents.git}\"\n\ngit fetch \"$BASE_REMOTE\" \"+refs\u002Fheads\u002F$BASE_BRANCH:refs\u002Fkube-agents-base\u002F$BASE_BRANCH\" || {\n  echo \"base fetch failed — stop here rather than reviewing against a stale base\" >&2\n  exit 1\n}\nBASE=refs\u002Fkube-agents-base\u002F$BASE_BRANCH\n\ngit diff --stat \"$BASE\"...HEAD     # three-dot: against the merge base, not the base tip\n```\n\nThree-dot keeps base-branch drift out of everyone's scope. If the fetch fails, stop and say so:\nthere is no safe fallback, because the wrong base fails in the direction that hides findings.\n\n`BASE_BRANCH` is the branch name as the remote has it, so reduce whatever you were handed to that\nfirst. `origin\u002Fmain`, `refs\u002Fheads\u002Fmain`, and the `refs\u002Fkube-agents-base\u002Fmain` a previous run wrote\nall go into the refspec verbatim, ask for a branch no remote has, and trip the guard above over a\nbase that was fine.\n\nSkip the fetch only for a base that cannot go stale — a commit SHA, or a tag. That a name resolves\nis not that test: a local `main` forty commits behind resolves, and so does a remote-tracking ref\nlast fetched a week ago, which is the ordinary state of a checkout here — \"Branch from a `main` you\nhave just fetched\" in `AGENTS.md` is there because of it. Fetching a base you already fetched costs\na round trip; the other way costs the passes reviewing commits that merged last week as though this\nbranch wrote them.\n\n## 2. Which passes run\n\n- `review-adversarial` — always.\n- `review-docs-drift` — always.\n- `review-chat-ux` — required when the range touches chat output, as that skill's Scope defines it.\n\nThe first two are required on every change and have no trigger to evaluate. The third is required\nwhenever chat output changes: read the range's file list and hunks against its Scope, and run it\nwhen in doubt. Say which passes ran, and\nsay it when one did not. A pass nobody ran is a gap in the section, not an absence of findings.\n\n## 3. Run the mechanical gate first, in the main loop\n\n```bash\nmake docs-check\n```\n\nEvery time, whatever the range touches: CI runs it unfiltered on every pull request. It is cheap, it\nis deterministic, and its output is a fact the passes would otherwise re-derive, so hand the result\non. It does not substitute for its pass — it covers generated regions, links and section anchors,\nreachability, terminology, maintainer identifiers and PR\u002Fissue citations on site pages, site prose\nceilings, and the always-loaded instruction files' context budget, but not whether the prose is\nstill true, which is the whole of what `review-docs-drift` asks.\n\nIt is here because the passes want its output, not because it is the local check you owe.\n`AGENTS.md` \"Local Validation Checks\" is that list — prettier on changed Markdown and YAML,\nthe Docker build, the image-layer budget, `go build` in `k8s-operator\u002F` — and a clean preflight\ndischarges none of it.\n\n## 4. Get each pass a context that did not write the change\n\nOne subagent per applicable pass, spawned together so they run concurrently. The main loop fixes the\nrange, runs the gates, fans out, and relays — it reviews nothing itself. `review-adversarial` §1 has\nthe argument for why; the short form is that a context holding the reasoning behind a diff re-derives\nthat reasoning instead of testing it.\n\n**The delegation has to be requested, and that is the problem this skill exists to solve.** Coding\nagents are instructed not to spawn subagents on their own initiative — Claude Code ships a standing\ninstruction to that effect, and other harnesses carry their own version of it — so an agent reading\nonly the requirement finds the one route it is told not to take, and quietly runs the pass inline\ninstead. In order of preference:\n\n- **The user invoked `\u002Fpr-preflight`, or asked for the review in words.** That is the request. Spawn\n  the passes and do not ask again.\n- **You got here on your own.** Ask once, before the pass, and wait: say you need a context that did\n  not write the change, how many subagents that is, and that the alternative is a review by the\n  context that already believes the change is correct. Ask when you hit it, not after.\n- **The harness has no subagents.** Start a fresh session, or a headless run, handed the same\n  material and nothing else — one per applicable pass, not just the adversarial one:\n\n  ```bash\n  claude -p \"In $PWD, follow .agents\u002Fskills\u002Freview-adversarial\u002FSKILL.md against\n  refs\u002Fkube-agents-base\u002Fmain...HEAD. Derive the change's intent from the diff. Do not read the\n  branch's commit message bodies, plan files, or scratch notes. Report every finding and edit\n  nothing; its step 6 is mine.\"\n  ```\n\n  Write the range out, substituting the ref §1 resolved, rather than `$BASE`. Most harnesses run\n  each command in its own shell — Claude Code is one — so a variable §1 assigned is gone by the\n  time you compose this one, while `$PWD` above is set afresh by every shell and survives. An\n  empty `$BASE` is not an error either: `git diff ...HEAD` defaults the omitted left side to\n  `HEAD`, so the pass reviews `HEAD...HEAD`, exits 0, and reports no findings on no diff. That is\n  the silent wrong-range failure §1 exists to stop, arriving through the handoff instead.\n\n  Neither of those trailing instructions is padding — step 5 explains what each one carries.\n\nIf none of those is available to you, **you are blocked, and the pull request waits**. Say what you\nare blocked on. [`.agents\u002Frules\u002Fpre_pr_review.md`](..\u002F..\u002Frules\u002Fpre_pr_review.md) is explicit that\nan approval you could not get blocks this step rather\nthan waiving it, so the authoring context is not the fallback — running the pass there and\ndisclosing it is what you do when a human, told the above, tells you to proceed anyway. Then\n**Self-Review** says which context ran the pass, in those words.\n\n## 5. What to hand each pass, and what to withhold\n\nHand it: the repository, the diff range, the path to its skill, and the gate output from step 3.\n\n**Say that the report is the deliverable and the pass writes nothing.** `review-docs-drift` already\nrefuses to fix silently, but `review-adversarial` §6 tells whoever runs it to edit on CONFIRMED, and\nits Angle I asks for a test run against the pre-change behaviour — both of which mutate the tree. The\npasses run concurrently in your checkout rather than one worktree each, so a pass that reverts a file\nto watch a test fail is a file its sibling is reading at the same time.\n`.claude\u002Fcommands\u002Fpr-review-batch.md` carries the sentence for the reviewer side and this is its\nauthor-side equivalent:\n\n> The skill's step 6 does not apply to you: report every finding, edit nothing, and leave the tree as\n> you found it. Dispositions are the caller's.\n\nStep 6 below is where those edits happen, once, after the relay.\n\nWithhold everything you know that it does not: your plan, your reasoning, the commit messages you\ndrafted, the summary you were about to write, which hunks you think are the risky ones, and which\nfindings you expect. Each of those tells the pass what to conclude.\n\nWithhold your intent sentence in particular. `review-adversarial` §3 derives one from the change\nitself, and the gap between what you meant and what the diff says is a finding you cannot get any\nother way — supply the sentence and you have closed the gap by hand.\n\n**Some of it you cannot withhold, so tell the pass not to read it.** A diff range is made of commits,\nso every commit message you wrote travels with it, and the pass works in your checkout rather than a\nclean worktree, so your plan and scratch files are in front of it too. Both usually state the intent\nverbatim. Put the instruction in the handoff:\n\n> Derive the change's intent from the diff. Do not read the branch's commit message bodies, plan\n> files, or scratch notes.\n\nWithout that line the gap closes itself and neither of you notices.\n\n## 6. Merge what comes back, and act on it\n\nDedupe across passes before reading them as a list. The passes overlap by design: angle H of\n`review-adversarial` reaches into docs, angle D into security and operational blast radius. The same\ndefect found twice is one finding, kept in whichever form names the failure concretely.\n\nWhere two passes disagree, go and read the source. Do not average them and do not take the more\nalarming one on the grounds that it is safer.\n\nThe passes do not grade alike, and the merged list keeps each one's own severity rather than\ntranslating it. `review-adversarial` returns a verdict per finding, so `review-adversarial` §6\ngoverns its half: edit on CONFIRMED, report on PLAUSIBLE. `review-docs-drift` returns a\nBlocking\u002FAdvisory triage instead and never emits a verdict — Blocking is addressed before the pull\nrequest opens, Advisory gets the same disposition treatment as PLAUSIBLE. Do not restate a Blocking\nfinding as CONFIRMED to make one column of it; the pass did not do the verification that word\nclaims. `review-chat-ux` returns violations of a named rule, each tied to a line; each gets a\ndisposition like any other finding.\n\nEvery survivor gets a disposition either way, to the bar\n[`.agents\u002Frules\u002Fpre_pr_review.md`](..\u002F..\u002Frules\u002Fpre_pr_review.md) sets: fixed, or deliberately\nnot, with a reason that argues about this change.\n\nReport what a pass only suspects rather than acting on it. A finding it could not pin down is an\nopen question for the pull request's **Self-Review** section, not a licence to rewrite working code\n— chasing an uncertain finding on your own change is how a self-review makes it worse than it\nstarted.\n\n## 7. Re-runs\n\nA fix changes the shared range, so re-run whatever the fix invalidated — not whichever pass raised\nthe finding. They are rarely the same set: rewriting a paragraph to answer an adversarial finding is\nexactly how the prose starts contradicting another document, which is docs-drift's question and not\none `make docs-check` can answer. Work that still holds stays, and is not re-run just to have been\nrun against the new head; `AGENTS.md` states that rule and this restates it. Look where you fixed:\na line changed to answer a finding — a pass's or a reviewer's — is where adjacent defects cluster,\nso the re-run's range covers those lines and what they touch, handed as a range and never as the\nfinding.\n\nNew context, same handoff. Feeding the previous round's findings into the re-run defeats the point\nof the fresh one.\n\n# Output\n\nOne severity-ordered disposition list covering every pass that ran. Severity and confidence are two\naxes, and a finding carries both: its pass's severity (`BLOCKER`\u002F`HIGH`\u002F`MEDIUM`\u002F`LOW` from\n`review-adversarial`, Blocking or Advisory from `review-docs-drift`, a violation from\n`review-chat-ux`) orders the list, and its CONFIRMED\u002FPLAUSIBLE verdict or triage says how sure the\npass was. Name which pass each came from, so\na reader can tell what kind of check stands behind it. Above the list, three lines the reviewer\ncannot reconstruct from the findings:\n\n- which passes ran, and which were skipped and why. A pass that found nothing reports what it\n  looked for — its angles are the vocabulary for that, and a clean result naming none of them is\n  indistinguishable from no pass having run;\n- for each, what kind of context it ran in — subagent, fresh session, or the one that wrote the code;\n- what the passes could not cover: suites not run, infrastructure absent, angles refused.\n\nThat list is the pull request's **Self-Review** section. \"No findings\" is an ordinary result, and a\ncomplete one only alongside what was looked for.\n","# Task\n\nGet every pre-PR review pass into a context that did not write the change, then merge what comes\nback into the list that becomes the pull request's **Self-Review** section.\n\nThis skill is plumbing. It holds no review method — [`review-adversarial`](..\u002Freview-adversarial\u002FSKILL.md),\n[`review-docs-drift`](..\u002Freview-docs-drift\u002FSKILL.md) and [`review-chat-ux`](..\u002Freview-chat-ux\u002FSKILL.md)\nown that — and it does not state the requirement: \"Pull Request Hygiene\" in\n[`AGENTS.md`](..\u002F..\u002F..\u002FAGENTS.md) does, and that list wins if this file disagrees with it.\n\n[`.claude\u002Fcommands\u002Fpr-preflight.md`](..\u002F..\u002F..\u002F.claude\u002Fcommands\u002Fpr-preflight.md) is the Claude Code\nwrapper. Any harness can follow this file directly.\n\n# Procedure\n\n## 1. Fix the diff range\n\nOne range, shared by every pass. Fetch the base first — a base you have not refreshed silently\nwidens the range with commits that already merged, and the passes then review other people's work\nas though it were yours:\n\n```bash\n# The remote pointing at gke-labs\u002Fkube-agents is not reliably called `upstream`, and\n# on a clone of the upstream repository rather than a fork it is `origin`. Find it.\nBASE_BRANCH=main                                  # or the branch you will target\nBASE_REMOTE=$(git remote | while read -r r; do\n  case \"$(git remote get-url \"$r\")\" in *gke-labs\u002Fkube-agents*) echo \"$r\"; break;; esac\ndone)\n# HTTPS, not SSH. The fallback fires when no remote matches — a plain clone of a fork,\n# which every open pull request here comes from — and that is where a sandbox or a CI\n# runner has no key. The repository is public, so HTTPS needs no credential at all.\n: \"${BASE_REMOTE:=https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents.git}\"\n\ngit fetch \"$BASE_REMOTE\" \"+refs\u002Fheads\u002F$BASE_BRANCH:refs\u002Fkube-agents-base\u002F$BASE_BRANCH\" || {\n  echo \"base fetch failed — stop here rather than reviewing against a stale base\" >&2\n  exit 1\n}\nBASE=refs\u002Fkube-agents-base\u002F$BASE_BRANCH\n\ngit diff --stat \"$BASE\"...HEAD     # three-dot: against the merge base, not the base tip\n```\n\nThree-dot keeps base-branch drift out of everyone's scope. If the fetch fails, stop and say so:\nthere is no safe fallback, because the wrong base fails in the direction that hides findings.\n\n`BASE_BRANCH` is the branch name as the remote has it, so reduce whatever you were handed to that\nfirst. `origin\u002Fmain`, `refs\u002Fheads\u002Fmain`, and the `refs\u002Fkube-agents-base\u002Fmain` a previous run wrote\nall go into the refspec verbatim, ask for a branch no remote has, and trip the guard above over a\nbase that was fine.\n\nSkip the fetch only for a base that cannot go stale — a commit SHA, or a tag. That a name resolves\nis not that test: a local `main` forty commits behind resolves, and so does a remote-tracking ref\nlast fetched a week ago, which is the ordinary state of a checkout here — \"Branch from a `main` you\nhave just fetched\" in `AGENTS.md` is there because of it. Fetching a base you already fetched costs\na round trip; the other way costs the passes reviewing commits that merged last week as though this\nbranch wrote them.\n\n## 2. Which passes run\n\n- `review-adversarial` — always.\n- `review-docs-drift` — always.\n- `review-chat-ux` — required when the range touches chat output, as that skill's Scope defines it.\n\nThe first two are required on every change and have no trigger to evaluate. The third is required\nwhenever chat output changes: read the range's file list and hunks against its Scope, and run it\nwhen in doubt. Say which passes ran, and\nsay it when one did not. A pass nobody ran is a gap in the section, not an absence of findings.\n\n## 3. Run the mechanical gate first, in the main loop\n\n```bash\nmake docs-check\n```\n\nEvery time, whatever the range touches: CI runs it unfiltered on every pull request. It is cheap, it\nis deterministic, and its output is a fact the passes would otherwise re-derive, so hand the result\non. It does not substitute for its pass — it covers generated regions, links and section anchors,\nreachability, terminology, maintainer identifiers and PR\u002Fissue citations on site pages, site prose\nceilings, and the always-loaded instruction files' context budget, but not whether the prose is\nstill true, which is the whole of what `review-docs-drift` asks.\n\nIt is here because the passes want its output, not because it is the local check you owe.\n`AGENTS.md` \"Local Validation Checks\" is that list — prettier on changed Markdown and YAML,\nthe Docker build, the image-layer budget, `go build` in `k8s-operator\u002F` — and a clean preflight\ndischarges none of it.\n\n## 4. Get each pass a context that did not write the change\n\nOne subagent per applicable pass, spawned together so they run concurrently. The main loop fixes the\nrange, runs the gates, fans out, and relays — it reviews nothing itself. `review-adversarial` §1 has\nthe argument for why; the short form is that a context holding the reasoning behind a diff re-derives\nthat reasoning instead of testing it.\n\n**The delegation has to be requested, and that is the problem this skill exists to solve.** Coding\nagents are instructed not to spawn subagents on their own initiative — Claude Code ships a standing\ninstruction to that effect, and other harnesses carry their own version of it — so an agent reading\nonly the requirement finds the one route it is told not to take, and quietly runs the pass inline\ninstead. In order of preference:\n\n- **The user invoked `\u002Fpr-preflight`, or asked for the review in words.** That is the request. Spawn\n  the passes and do not ask again.\n- **You got here on your own.** Ask once, before the pass, and wait: say you need a context that did\n  not write the change, how many subagents that is, and that the alternative is a review by the\n  context that already believes the change is correct. Ask when you hit it, not after.\n- **The harness has no subagents.** Start a fresh session, or a headless run, handed the same\n  material and nothing else — one per applicable pass, not just the adversarial one:\n\n  ```bash\n  claude -p \"In $PWD, follow .agents\u002Fskills\u002Freview-adversarial\u002FSKILL.md against\n  refs\u002Fkube-agents-base\u002Fmain...HEAD. Derive the change's intent from the diff. Do not read the\n  branch's commit message bodies, plan files, or scratch notes. Report every finding and edit\n  nothing; its step 6 is mine.\"\n  ```\n\n  Write the range out, substituting the ref §1 resolved, rather than `$BASE`. Most harnesses run\n  each command in its own shell — Claude Code is one — so a variable §1 assigned is gone by the\n  time you compose this one, while `$PWD` above is set afresh by every shell and survives. An\n  empty `$BASE` is not an error either: `git diff ...HEAD` defaults the omitted left side to\n  `HEAD`, so the pass reviews `HEAD...HEAD`, exits 0, and reports no findings on no diff. That is\n  the silent wrong-range failure §1 exists to stop, arriving through the handoff instead.\n\n  Neither of those trailing instructions is padding — step 5 explains what each one carries.\n\nIf none of those is available to you, **you are blocked, and the pull request waits**. Say what you\nare blocked on. [`.agents\u002Frules\u002Fpre_pr_review.md`](..\u002F..\u002Frules\u002Fpre_pr_review.md) is explicit that\nan approval you could not get blocks this step rather\nthan waiving it, so the authoring context is not the fallback — running the pass there and\ndisclosing it is what you do when a human, told the above, tells you to proceed anyway. Then\n**Self-Review** says which context ran the pass, in those words.\n\n## 5. What to hand each pass, and what to withhold\n\nHand it: the repository, the diff range, the path to its skill, and the gate output from step 3.\n\n**Say that the report is the deliverable and the pass writes nothing.** `review-docs-drift` already\nrefuses to fix silently, but `review-adversarial` §6 tells whoever runs it to edit on CONFIRMED, and\nits Angle I asks for a test run against the pre-change behaviour — both of which mutate the tree. The\npasses run concurrently in your checkout rather than one worktree each, so a pass that reverts a file\nto watch a test fail is a file its sibling is reading at the same time.\n`.claude\u002Fcommands\u002Fpr-review-batch.md` carries the sentence for the reviewer side and this is its\nauthor-side equivalent:\n\n> The skill's step 6 does not apply to you: report every finding, edit nothing, and leave the tree as\n> you found it. Dispositions are the caller's.\n\nStep 6 below is where those edits happen, once, after the relay.\n\nWithhold everything you know that it does not: your plan, your reasoning, the commit messages you\ndrafted, the summary you were about to write, which hunks you think are the risky ones, and which\nfindings you expect. Each of those tells the pass what to conclude.\n\nWithhold your intent sentence in particular. `review-adversarial` §3 derives one from the change\nitself, and the gap between what you meant and what the diff says is a finding you cannot get any\nother way — supply the sentence and you have closed the gap by hand.\n\n**Some of it you cannot withhold, so tell the pass not to read it.** A diff range is made of commits,\nso every commit message you wrote travels with it, and the pass works in your checkout rather than a\nclean worktree, so your plan and scratch files are in front of it too. Both usually state the intent\nverbatim. Put the instruction in the handoff:\n\n> Derive the change's intent from the diff. Do not read the branch's commit message bodies, plan\n> files, or scratch notes.\n\nWithout that line the gap closes itself and neither of you notices.\n\n## 6. Merge what comes back, and act on it\n\nDedupe across passes before reading them as a list. The passes overlap by design: angle H of\n`review-adversarial` reaches into docs, angle D into security and operational blast radius. The same\ndefect found twice is one finding, kept in whichever form names the failure concretely.\n\nWhere two passes disagree, go and read the source. Do not average them and do not take the more\nalarming one on the grounds that it is safer.\n\nThe passes do not grade alike, and the merged list keeps each one's own severity rather than\ntranslating it. `review-adversarial` returns a verdict per finding, so `review-adversarial` §6\ngoverns its half: edit on CONFIRMED, report on PLAUSIBLE. `review-docs-drift` returns a\nBlocking\u002FAdvisory triage instead and never emits a verdict — Blocking is addressed before the pull\nrequest opens, Advisory gets the same disposition treatment as PLAUSIBLE. Do not restate a Blocking\nfinding as CONFIRMED to make one column of it; the pass did not do the verification that word\nclaims. `review-chat-ux` returns violations of a named rule, each tied to a line; each gets a\ndisposition like any other finding.\n\nEvery survivor gets a disposition either way, to the bar\n[`.agents\u002Frules\u002Fpre_pr_review.md`](..\u002F..\u002Frules\u002Fpre_pr_review.md) sets: fixed, or deliberately\nnot, with a reason that argues about this change.\n\nReport what a pass only suspects rather than acting on it. A finding it could not pin down is an\nopen question for the pull request's **Self-Review** section, not a licence to rewrite working code\n— chasing an uncertain finding on your own change is how a self-review makes it worse than it\nstarted.\n\n## 7. Re-runs\n\nA fix changes the shared range, so re-run whatever the fix invalidated — not whichever pass raised\nthe finding. They are rarely the same set: rewriting a paragraph to answer an adversarial finding is\nexactly how the prose starts contradicting another document, which is docs-drift's question and not\none `make docs-check` can answer. Work that still holds stays, and is not re-run just to have been\nrun against the new head; `AGENTS.md` states that rule and this restates it. Look where you fixed:\na line changed to answer a finding — a pass's or a reviewer's — is where adjacent defects cluster,\nso the re-run's range covers those lines and what they touch, handed as a range and never as the\nfinding.\n\nNew context, same handoff. Feeding the previous round's findings into the re-run defeats the point\nof the fresh one.\n\n# Output\n\nOne severity-ordered disposition list covering every pass that ran. Severity and confidence are two\naxes, and a finding carries both: its pass's severity (`BLOCKER`\u002F`HIGH`\u002F`MEDIUM`\u002F`LOW` from\n`review-adversarial`, Blocking or Advisory from `review-docs-drift`, a violation from\n`review-chat-ux`) orders the list, and its CONFIRMED\u002FPLAUSIBLE verdict or triage says how sure the\npass was. Name which pass each came from, so\na reader can tell what kind of check stands behind it. Above the list, three lines the reviewer\ncannot reconstruct from the findings:\n\n- which passes ran, and which were skipped and why. A pass that found nothing reports what it\n  looked for — its angles are the vocabulary for that, and a clean result naming none of them is\n  indistinguishable from no pass having run;\n- for each, what kind of context it ran in — subagent, fresh session, or the one that wrote the code;\n- what the passes could not cover: suites not run, infrastructure absent, angles refused.\n\nThat list is the pull request's **Self-Review** section. \"No findings\" is an ordinary result, and a\ncomplete one only alongside what was looked for.\n",{"name":5,"description":7},"main","3c8aa35c15aca68529abe86e9996103cb72e4bdc",".agents\u002Fskills\u002Freview-preflight",44,"https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents","https:\u002F\u002Fgke-labs.github.io\u002Fkube-agents\u002F","https:\u002F\u002Fgithub.com\u002Fgke-labs","2026-11-13 04:37:57",{"source":8,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add gke-labs\u002Fkube-agents --skill review-preflight",{"tool":37,"command":38},"bunx","bunx skills add gke-labs\u002Fkube-agents --skill review-preflight",{"tool":40,"command":41},"pnpm","pnpm dlx skills add gke-labs\u002Fkube-agents --skill review-preflight","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-preflight\u002FSKILL.md",true,[],[46,53,60,66,73,80],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":18},"01M72127MJP46SAFJP07BY692E","workload-rebalancing","Orchestrate cross-cluster workload rebalancing using the kanban board with the validation-then-declare pattern. Use when fleet utilization shows one cluster overutilized and another with headroom and a workload should move.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fworkload-rebalancing\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":18},"01M72119CQFA9TC5TH6TKAFSFP","kube-agents-feedback","File a bug report, feature request, or question about kube-agents itself on the user's behalf, through the project's public feedback form, exactly once, after the user has confirmed the exact text in chat, and render the install's audited usage summary for a card that asks only for that, filing nothing. A submission becomes a public GitHub issue on gke-labs\u002Fkube-agents. Not for telling a user where to report — the persona bullet owns that answer without a skill.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":18},"01M720VF2R142ZCD6QCKYNXAS9","cluster-agent-lifecycle","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fcluster-agent-lifecycle\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":18},"01M720VZZQNT2JQVK1JJCXX977","gce-compute-fleet-audit","Audits standalone GCE virtual machines, Managed Instance Groups (MIGs), serial console boot failures, sole-tenant node group headroom, and orphaned disk snapshots.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fgce-compute-fleet-audit\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":18},"01M720VKEW26G8QGT9NY4XQDR5","fleet-audit","Publish the findings of an autonomous fleet audit as one continuously-rewritten issue per audit stream per install on the GitOps repository's forge, and propose fixes as narrow remediation pull requests (merge requests on GitLab).","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Ffleet-audit\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":18},"01M720SYHF3JZYBM8CW52MCXS8","gke-rightsizing-checks","Five required checks, and the arithmetic, before any proposal to lower a workload's CPU or memory requests or limits, or to change a node pool's machine type or size, and before any claim of capacity freed. Read-only. For \"lower the requests of X\", \"right-size this deployment\", \"can this pool use a smaller machine type\", and any answer that claims nodes, CPU, memory or a percentage freed.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fcluster\u002Fskills\u002Fgke-rightsizing-checks\u002FSKILL.md",[],[]]