[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XDCGPAGRDSWBDPPMZWAMNX":3,"skill-same:01M6XDCGPAGRDSWBDPPMZWAMNX":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":14,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6XDCGPAGRDSWBDPPMZWAMNX","post-pr-review",null,"Post AI-generated review findings on a GitHub PR as inline review comments via the gh CLI — the bot-style review-comment workflow GitHub Copilot used to provide before it got rate-limited. Idempotent (hidden marker dedup), rate-limit conscious (respects GitHub's 80\u002Fmin secondary limit), and dry-run by default in interactive mode. Pairs with `review-pr`, which consumes the comments this skill produces and applies fixes. Triggers on: \"post PR review\", \"leave inline comments on PR\", \"AI review and comment on PR\", \"Copilot-style PR review\".","kaiohenricunha\u002Fdotbabel","kaiohenricunha","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F69804490?v=4","01M6XCZD37W0KPCDGEA40Y610V","Kaio Cunha","01M6XCZD7SX714D114H3ZPNW09",0,"MIT","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fplugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"review","pr review","pr","post","post pr review","idempotent","bot","inline","mode","which","review findings","dry","default","only","auto","generated","copilot","github copilot","workflow","cli","2026-11-10 10:12:30",false,"---\n# dotbabel:generated projection=sha256:2c984b30ad5e2c34b2ef16ce0730e1eb08c5e4631dff94b70adf481f0a904abe source=skills\u002Fpost-pr-review\u002FSKILL.md — do not edit directly\nargument-hint: \"[PR#] [--dry-run] [--auto --confirm-post] [--mode review|inline] [--max-comments N] [--summary-only] [--event COMMENT|REQUEST_CHANGES|APPROVE] [--agents \u003Ccsv>]\"\ndescription: |\n  Post AI-generated review findings on a GitHub PR as inline review comments via the gh CLI — the bot-style review-comment workflow GitHub Copilot used to provide before it got rate-limited. Idempotent (hidden marker dedup), rate-limit conscious (respects GitHub's 80\u002Fmin secondary limit), and dry-run by default in interactive mode. Pairs with `review-pr`, which consumes the comments this skill produces and applies fixes. Triggers on: \"post PR review\", \"leave inline comments on PR\", \"AI review and comment on PR\", \"Copilot-style PR review\".\nname: post-pr-review\n---\n\nPost AI review findings on a GitHub PR as inline comments. The producer side\nof a producer\u002Fconsumer pair — `review-pr` is the consumer.\n\n## Argument grammar\n\n| Flag                | Default                                                      | Notes                                                  |\n| ------------------- | ------------------------------------------------------------ | ------------------------------------------------------ |\n| `\u003CPR#>` positional  | autodetect from current branch                               | optional                                               |\n| `--repo OWNER\u002FREPO` | autodetect                                                   | needed for fork PRs                                    |\n| `--agents \u003Ccsv>`    | profile-based (see step 5)                                   | dotbabel agents to dispatch (see step 5)               |\n| `--max-comments N`  | `25`                                                         | hard cap; >25 requires explicit override               |\n| `--event`           | `COMMENT`                                                    | `COMMENT` \u002F `REQUEST_CHANGES` \u002F `APPROVE`              |\n| `--mode`            | `review`                                                     | `review` (atomic batch) or `inline` (per-comment loop) |\n| `--summary-only`    | off                                                          | skip inline comments, post one top-level body          |\n| `--auto`            | off                                                          | skip confirmation prompt                               |\n| `--dry-run`         | **on** in interactive; off only with `--auto --confirm-post` | prints what would be posted                            |\n| `--confirm-post`    | off                                                          | required alongside `--auto` to actually POST           |\n\n## Workflow\n\nBefore any step, bind args:\n\n```bash\nNUMBER=\"$ARGUMENTS\"           # may be empty if autodetecting from branch\nSCRIPTS=\"${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel)}\u002Fplugins\u002Fdotbabel\u002Fscripts\"\nSCRATCH=\"${TMPDIR:-\u002Ftmp}\"     # honors sandboxes that block \u002Ftmp; private to orchestrator\n```\n\n### 1. Resolve PR\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-resolve.sh\" \"$NUMBER\"\n```\n\nOutput: JSON `{number, headRefOid, state, isDraft, headRepository, baseRepository, isCrossRepository, url}`.\n\nBind from the resolve output and **thread `--repo` through every subsequent script** so they don't each pay the `gh repo view` lookup cost (~100ms per script):\n\n```bash\nPR=$(... | jq -r .number)\nHEAD_SHA=$(... | jq -r .headRefOid)\nREPO=$(... | jq -r '\"\\(.baseRepository.owner.login)\u002F\\(.baseRepository.name)\"')\nGH_REPO_ARGS=(--repo \"$REPO\")    # pass to every downstream script\n```\n\nIf autodetection fails, abort with: `No PR found. Pass PR# explicitly: \u002Fpost-pr-review 123`.\n\n### 2. Preflight gates\n\n- `gh auth status` — fail at preflight if missing.\n- `state == OPEN` — refuse closed\u002Fmerged. No `--force`.\n- `isDraft` — warn + prompt; `--auto` proceeds.\n- `isCrossRepository == true` — warn the user that posting may 403 if they\n  lack write access to the base repo.\n\n### 3. Fetch context\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-fetch-context.sh\" \"$PR\" \"${GH_REPO_ARGS[@]}\" \\\n  > \"$SCRATCH\u002Fpost-pr-review-${PR}.ctx.json\"\n```\n\nReads PR diff (`gh pr diff`) into `$SCRATCH\u002Fpost-pr-review-${PR}.diff` (where\n`$SCRATCH=${TMPDIR:-\u002Ftmp}`) and emits JSON with `headSHA`, `diffPath`,\n`files`, `title`, `body`. The exact paths are private to the orchestrator;\ndownstream scripts read them by absolute path passed in as args.\n\n### 4. Build postable line set\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-build-postable-lines.sh\" \\\n  \"$SCRATCH\u002Fpost-pr-review-${PR}.diff\" \\\n  > \"$SCRATCH\u002Fpost-pr-review-${PR}.lines.json\"\n```\n\nOutput: `{path: [line, line, ...]}` — NEW-side line numbers per file that\nappear in any hunk. This is the gate for step 6 — any agent finding outside\nthis set is rejected pre-POST to prevent 422s from GitHub.\n\n### 5. Dispatch review agents in parallel\n\nResolve `--agents`. An explicit `--agents` value wins verbatim — the profile\nbelow applies only when the caller passed none.\n\n**Diff-profile default.** Three of the four agents in the full set run on\n`opus`, so dispatching all four at every diff size is the single most\nexpensive thing this skill does. Size the fleet to the diff instead. Take the\nchanged files from step 3's context and the changed-line count from\n`gh pr view \"$PR\" --json additions,deletions` (additions + deletions), then\napply the **first** rule that matches:\n\n1. Any changed file matches a protected path in `docs\u002Frepo-facts.json` (when\n   that file exists) → **full set**. Protected paths are behavior-governing\n   even when they are markdown, so this rule is evaluated before the\n   docs-only rule.\n2. Every changed file is documentation (`*.md`, or under `docs\u002F`) →\n   `documentation-writer` + `security-auditor`.\n3. Fewer than 150 changed lines → `security-auditor` + `architect-reviewer`.\n4. Otherwise → **full set**.\n\n`security-auditor` appears in every profile on purpose. Callers may have\nnarrowed their own security step on the assumption that this skill runs one —\n`commands\u002Fpre-pr.md` step 3 does exactly that under `--conductor` — so\ndropping it here would leave a pipeline with no security review at any stage.\nMarkdown is not a safe exemption either: in this repo a `SKILL.md` body is\nexecutable agent instruction, and in a consumer repo `CLAUDE.md` is the rule\nfloor for every session.\n\nThe full set (chosen for high signal-to-noise on dotbabel PRs):\n\n- `architect-reviewer` — design\u002Fcoupling\u002Fscalability concerns\n- `security-auditor` — secrets, injection vectors, OWASP top 10\n- `compliance-auditor` — gate coverage, declared-vs-enforced invariants\n- `documentation-writer` — comment accuracy, missing docstrings, drift\n\nAfter selecting the profile (or honoring explicit `--agents`), write the input\n`{profile, changed_files, changed_lines, candidates}` to a private temporary JSON\nfile. `profile` and `candidates` are arrays of reviewer IDs. The profile contains\nthe selected reviewers; candidates contain only installed reviewers not already\nselected. Run:\n\n```bash\ndotbabel decide --step dispatch \u003C \"$DECISION_INPUT\" > \"$DECISION_OUTPUT\"\n```\n\nUnion the returned `answer` with the selected profile; never remove reviewers.\nAlways retain `security-auditor`. On exit 2 or 64, keep the selected profile and\nreport that the decider is unavailable. The built-in rule adds no reviewer when\nsecurity is already present. Do not follow `shadow`: no model step is adopted.\nAppend the decision to the phase's private JSON array and include\n`--decisions \"$DECISIONS_FILE\"` in the phase's `pr-stack record` call. Outside\nconductor mode, record `post-pr-review` once with the observed outcome. A dry\nrun records no attempt and makes no decision call.\n\nReport which profile fired in step 9 — a wrong profile is otherwise invisible,\nand the failure mode (a logic-heavy diff reviewed by the docs agent alone) is\nsilent. Pass `--agents` to override whenever the heuristic misjudges a diff.\n\n`--agents inline` skips agent dispatch and uses heuristics in this skill body\nonly (see Inline-review heuristics below).\n\nIn a SINGLE message, invoke `Task` once per requested agent. Each invocation\nreceives:\n\n- The diff path.\n- The list of changed files.\n- The head SHA.\n- The exact JSON contract from\n  [`references\u002Fagent-contract.md`](references\u002Fagent-contract.md) — verbatim,\n  no paraphrasing. Each agent MUST return ONE fenced JSON block per the\n  documented schema.\n\n### 6. Aggregate, validate, dedup, sort, truncate\n\n1. Parse each agent's JSON. On parse failure, retry once with a stricter\n   prompt; on second failure, log and skip that agent (don't abort the run).\n2. Drop findings whose `(path, line)` is not in the postable line set.\n3. Drop findings with `confidence \u003C 80`.\n4. Compute the marker for each finding (see Idempotency below).\n5. Fetch existing markers via\n   `\"$SCRIPTS\u002Fpost-pr-review-list-markers.sh\" \"$PR\" \"${GH_REPO_ARGS[@]}\"` and\n   drop any finding whose marker is already present.\n6. Within this run, dedup by marker (different agents can converge on the\n   same line).\n7. Sort: severity DESC (critical → important → suggestion), path ASC, line ASC.\n8. Apply `--max-comments`. **Severity-aware:** if truncating would drop one\n   or more `critical` findings, refuse silently. In interactive mode offer\n   `[r]aise cap \u002F [s]ummary-only \u002F [a]bort`; in `--auto` exit 1 with:\n   `N critical findings exceed --max-comments=M.` Re-run with a higher cap\n   or `--summary-only`.\n\n### 7. Confirmation (skipped under `--auto`)\n\nRender a table:\n\n```\n#  severity     agent                  path:line                  title\n1  critical     security-auditor       src\u002Fapi.ts:142             Hard-coded API key in commit\n2  important    architect-reviewer     src\u002Ftypes\u002Fuser.ts:18       Discriminated union would clarify intent\n3  suggestion   documentation-writer   src\u002Futils\u002Fformat.ts:9      Public function lacks docstring\n[y]es \u002F [e]dit \u002F [n]o\n```\n\n`edit` opens `$EDITOR` on a temp JSON the user can re-curate (the user's\neditor does the write; the skill reads the result back).\n\n### 8. Post\n\n- `--summary-only`: one POST to `\u002Freviews` with `body` (markdown checklist\n  of findings) + `event`. No `comments[]`. The `--max-comments` cap applies\n  to body lines; tail collapses to \"…and N more (run without --summary-only\n  to see all inline)\".\n- `--mode review` (default), count > 1: one atomic POST `\u002Freviews` with\n  `event`, optional `body` (general notes from agents), and `comments[]`.\n  Counts as one rate-limit event regardless of comment count. Use:\n  ```bash\n  \"$SCRIPTS\u002Fpost-pr-review-post-batch.sh\" \"$PR\" \\\n    --comments-json \"$SCRATCH\u002Fpost-pr-review-${PR}.comments.json\" \\\n    --event \"$EVENT\" \\\n    --body-file \"$SCRATCH\u002Fpost-pr-review-${PR}.body.md\" \\\n    \"${GH_REPO_ARGS[@]}\"\n  ```\n- `--mode inline` or count == 1: loop `POST \u002Fpulls\u002F{n}\u002Fcomments`, sleeping\n  750ms between calls. Use `post-pr-review-post-single.sh` with\n  `\"${GH_REPO_ARGS[@]}\"`.\n\nAfter each POST, parse rate-limit headers:\n\n```bash\nREMAINING=$(\"$SCRIPTS\u002Fpost-pr-review-ratelimit.sh\" \\\n  \"$SCRATCH\u002Fpost-pr-review-batch-${PR}.headers\" | jq -r .remaining)\n```\n\nIf `REMAINING \u003C 50` → bump sleep to 1s. If `REMAINING \u003C 10` → stop, report\ndeferred count, exit 0 with hint at `x-ratelimit-reset`.\n\n### 8b. Leave the receipt\n\nEvery run ends here, **including a run that found nothing** and including `--summary-only` and `--mode inline`. A run with no findings posts no comment, so without this a pull request whose review ran clean is indistinguishable from one that was never reviewed, and `\u002Fpr-conductor` could not tell the difference on re-entry.\n\nSkip it only under `--dry-run`, or when step 8 failed and the findings never reached the pull request. Pin it to the head SHA bound in step 1:\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-post-receipt.sh\" \"$PR\" \\\n  --sha \"$HEAD_SHA\" --posted \"$POSTED\" --skipped \"$SKIPPED\" \\\n  --agents \"$AGENTS_CSV\" --profile \"$PROFILE\" \\\n  \"${GH_REPO_ARGS[@]}\"\n```\n\nIt posts one body-only review whose `commit_id` GitHub records. `$POSTED` is the number of findings step 8 posted and `$SKIPPED` the number dropped as duplicates. Never write the receipt marker by hand: the guard hook blocks it, and the script is the only sanctioned writer.\n\n### 9. Final report\n\n```\npost-pr-review summary for PR #123 (owner\u002Frepo)\n  agents dispatched   \u003Ccsv>  (profile: docs-only | small-code | full | --agents override)\n  receipt             posted | skipped (dry-run)\n  posted              N\n  skipped (dedup)     M\n  skipped (out-diff)  K\n  deferred (rate)     R\n  errors              E\nPR: https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fpull\u002F123\n```\n\n## Inline-review heuristics (when `--agents inline`)\n\nUse these only when no agents are requested:\n\n- **Silent failures**: scan added lines for `catch.*{}`, `catch.*{\\s*\u002F\u002F`,\n  `except.*pass`, `panic\\(\\) \u002F\u002Fignore`. Severity: `critical`.\n- **Missing tests**: any new file under `src\u002F` (or language equivalent) with\n  no matching test file in the diff. Severity: `important`.\n- **Comment drift**: existing comments above changed code. Severity:\n  `suggestion`.\n- **Hard-coded secrets**: `API_KEY = \"...\"`, `password.*=.*\"...\"`, regex\n  matches against added lines. Severity: `critical`.\n\n## Idempotency\n\nEvery comment body has a hidden HTML marker appended:\n\n```\n\u003C!-- post-pr-review:v1:\u003Csha256-hex-truncated-to-16> -->\n```\n\nThe hash input (the \"finding key\") is the literal pipe-joined string:\n\n```\n{path}|{line}|{side}|{agent}|{first_120_chars_of_body_normalized}\n```\n\n`normalized` = lowercase + collapse whitespace runs to single space + strip\ntrailing punctuation.\n\nOn re-run, `post-pr-review-list-markers.sh` paginates all existing comments,\nextracts every `post-pr-review:v1:[0-9a-f]{16}` marker, and drops any new\nfinding whose marker is in the set. The `v1` prefix lets us bump the schema\nlater without false-positive dedup against old markers.\n\n## Rate-limit guard\n\nGitHub's secondary limit on content-creating endpoints is **80 requests\u002Fmin,\n500\u002Fhour**. Source:\n\u003Chttps:\u002F\u002Fdocs.github.com\u002Fen\u002Frest\u002Fusing-the-rest-api\u002Frate-limits-for-the-rest-api#about-secondary-rate-limits>.\nSee [`references\u002Frate-limits.md`](references\u002Frate-limits.md).\n\nThe atomic `POST \u002Freviews` endpoint counts as ONE content-creation regardless\nof how many inline comments it bundles — this is why `--mode review` is the\ndefault. `--mode inline` should only be used when posting a single comment\nor when the user wants per-comment posting for some reason.\n\n## Concurrency\n\nThe dedup story (step 6.5: list existing markers → filter findings → POST)\nis **not safe under concurrent invocations**. Between `list-markers.sh`\nreturning and `post-batch.sh` posting, another `\u002Fpost-pr-review` run (or a\nhuman reviewer adding bot-style markers) could insert markers we never saw,\nproducing duplicate posts on the next run.\n\nRun the skill serially per PR. If you need automation, gate it behind a\nGitHub Actions concurrency group or a repo-level lock — the skill itself\nintentionally does not implement locking (out of scope for v0.1).\n\n## Failure modes\n\n| Mode                         | Detection                                                                   | Behavior                                                                                                                             |\n| ---------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |\n| No PR for branch             | `gh pr view` exits non-zero                                                 | Fail with: \"No PR found. Pass PR# explicitly: `\u002Fpost-pr-review 123`.\"                                                                |\n| PR closed\u002Fmerged             | `state != OPEN`                                                             | Refuse. No `--force` for merged.                                                                                                     |\n| PR is draft                  | `isDraft == true`                                                           | Warn + prompt; `--auto` proceeds.                                                                                                    |\n| Fork PR                      | `isCrossRepository == true`                                                 | Warn that posting may 403.                                                                                                           |\n| Agent returns no findings    | empty `findings[]`                                                          | Note in report, continue.                                                                                                            |\n| Agent returns malformed JSON | parse fails                                                                 | Retry once with stricter prompt; on second fail, skip that agent.                                                                    |\n| `gh auth missing`            | `gh auth status` non-zero                                                   | Fail at preflight with remediation.                                                                                                  |\n| Secondary rate limit hit     | 403 with `secondary rate limit` in body                                     | Stop batch, report deferred, hint at `x-ratelimit-reset`.                                                                            |\n| Line not in diff             | pre-validated against postable line set; if it slips and GitHub returns 422 | Skip that comment, log, continue.                                                                                                    |\n| Network\u002Ftransient            | non-2xx, non-422, non-403                                                   | Retry up to 2x with backoff (1s, 3s).                                                                                                |\n| Receipt POST fails           | `post-pr-review-post-receipt.sh` exits 1                                    | Report it. The findings are already posted; the missing receipt only means a later `\u002Fpr-conductor` run cannot skip the review stage. |\n\n## See also\n\n- `.claude\u002Fskills\u002Freview-pr\u002FSKILL.md` — the CONSUMER. Run after\n  `\u002Fpost-pr-review` to fetch and apply fixes from the comments this skill\n  posted.\n- [`references\u002Fagent-contract.md`](references\u002Fagent-contract.md) — JSON\n  schema each dispatched agent returns.\n- [`references\u002Fgithub-api-gotchas.md`](references\u002Fgithub-api-gotchas.md) —\n  NEW vs OLD line coords, atomic vs loop trade-offs.\n- [`references\u002Frate-limits.md`](references\u002Frate-limits.md) — GitHub's\n  content-creation limits.\n","Post AI review findings on a GitHub PR as inline comments. The producer side\nof a producer\u002Fconsumer pair — `review-pr` is the consumer.\n\n## Argument grammar\n\n| Flag                | Default                                                      | Notes                                                  |\n| ------------------- | ------------------------------------------------------------ | ------------------------------------------------------ |\n| `\u003CPR#>` positional  | autodetect from current branch                               | optional                                               |\n| `--repo OWNER\u002FREPO` | autodetect                                                   | needed for fork PRs                                    |\n| `--agents \u003Ccsv>`    | profile-based (see step 5)                                   | dotbabel agents to dispatch (see step 5)               |\n| `--max-comments N`  | `25`                                                         | hard cap; >25 requires explicit override               |\n| `--event`           | `COMMENT`                                                    | `COMMENT` \u002F `REQUEST_CHANGES` \u002F `APPROVE`              |\n| `--mode`            | `review`                                                     | `review` (atomic batch) or `inline` (per-comment loop) |\n| `--summary-only`    | off                                                          | skip inline comments, post one top-level body          |\n| `--auto`            | off                                                          | skip confirmation prompt                               |\n| `--dry-run`         | **on** in interactive; off only with `--auto --confirm-post` | prints what would be posted                            |\n| `--confirm-post`    | off                                                          | required alongside `--auto` to actually POST           |\n\n## Workflow\n\nBefore any step, bind args:\n\n```bash\nNUMBER=\"$ARGUMENTS\"           # may be empty if autodetecting from branch\nSCRIPTS=\"${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel)}\u002Fplugins\u002Fdotbabel\u002Fscripts\"\nSCRATCH=\"${TMPDIR:-\u002Ftmp}\"     # honors sandboxes that block \u002Ftmp; private to orchestrator\n```\n\n### 1. Resolve PR\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-resolve.sh\" \"$NUMBER\"\n```\n\nOutput: JSON `{number, headRefOid, state, isDraft, headRepository, baseRepository, isCrossRepository, url}`.\n\nBind from the resolve output and **thread `--repo` through every subsequent script** so they don't each pay the `gh repo view` lookup cost (~100ms per script):\n\n```bash\nPR=$(... | jq -r .number)\nHEAD_SHA=$(... | jq -r .headRefOid)\nREPO=$(... | jq -r '\"\\(.baseRepository.owner.login)\u002F\\(.baseRepository.name)\"')\nGH_REPO_ARGS=(--repo \"$REPO\")    # pass to every downstream script\n```\n\nIf autodetection fails, abort with: `No PR found. Pass PR# explicitly: \u002Fpost-pr-review 123`.\n\n### 2. Preflight gates\n\n- `gh auth status` — fail at preflight if missing.\n- `state == OPEN` — refuse closed\u002Fmerged. No `--force`.\n- `isDraft` — warn + prompt; `--auto` proceeds.\n- `isCrossRepository == true` — warn the user that posting may 403 if they\n  lack write access to the base repo.\n\n### 3. Fetch context\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-fetch-context.sh\" \"$PR\" \"${GH_REPO_ARGS[@]}\" \\\n  > \"$SCRATCH\u002Fpost-pr-review-${PR}.ctx.json\"\n```\n\nReads PR diff (`gh pr diff`) into `$SCRATCH\u002Fpost-pr-review-${PR}.diff` (where\n`$SCRATCH=${TMPDIR:-\u002Ftmp}`) and emits JSON with `headSHA`, `diffPath`,\n`files`, `title`, `body`. The exact paths are private to the orchestrator;\ndownstream scripts read them by absolute path passed in as args.\n\n### 4. Build postable line set\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-build-postable-lines.sh\" \\\n  \"$SCRATCH\u002Fpost-pr-review-${PR}.diff\" \\\n  > \"$SCRATCH\u002Fpost-pr-review-${PR}.lines.json\"\n```\n\nOutput: `{path: [line, line, ...]}` — NEW-side line numbers per file that\nappear in any hunk. This is the gate for step 6 — any agent finding outside\nthis set is rejected pre-POST to prevent 422s from GitHub.\n\n### 5. Dispatch review agents in parallel\n\nResolve `--agents`. An explicit `--agents` value wins verbatim — the profile\nbelow applies only when the caller passed none.\n\n**Diff-profile default.** Three of the four agents in the full set run on\n`opus`, so dispatching all four at every diff size is the single most\nexpensive thing this skill does. Size the fleet to the diff instead. Take the\nchanged files from step 3's context and the changed-line count from\n`gh pr view \"$PR\" --json additions,deletions` (additions + deletions), then\napply the **first** rule that matches:\n\n1. Any changed file matches a protected path in `docs\u002Frepo-facts.json` (when\n   that file exists) → **full set**. Protected paths are behavior-governing\n   even when they are markdown, so this rule is evaluated before the\n   docs-only rule.\n2. Every changed file is documentation (`*.md`, or under `docs\u002F`) →\n   `documentation-writer` + `security-auditor`.\n3. Fewer than 150 changed lines → `security-auditor` + `architect-reviewer`.\n4. Otherwise → **full set**.\n\n`security-auditor` appears in every profile on purpose. Callers may have\nnarrowed their own security step on the assumption that this skill runs one —\n`commands\u002Fpre-pr.md` step 3 does exactly that under `--conductor` — so\ndropping it here would leave a pipeline with no security review at any stage.\nMarkdown is not a safe exemption either: in this repo a `SKILL.md` body is\nexecutable agent instruction, and in a consumer repo `CLAUDE.md` is the rule\nfloor for every session.\n\nThe full set (chosen for high signal-to-noise on dotbabel PRs):\n\n- `architect-reviewer` — design\u002Fcoupling\u002Fscalability concerns\n- `security-auditor` — secrets, injection vectors, OWASP top 10\n- `compliance-auditor` — gate coverage, declared-vs-enforced invariants\n- `documentation-writer` — comment accuracy, missing docstrings, drift\n\nAfter selecting the profile (or honoring explicit `--agents`), write the input\n`{profile, changed_files, changed_lines, candidates}` to a private temporary JSON\nfile. `profile` and `candidates` are arrays of reviewer IDs. The profile contains\nthe selected reviewers; candidates contain only installed reviewers not already\nselected. Run:\n\n```bash\ndotbabel decide --step dispatch \u003C \"$DECISION_INPUT\" > \"$DECISION_OUTPUT\"\n```\n\nUnion the returned `answer` with the selected profile; never remove reviewers.\nAlways retain `security-auditor`. On exit 2 or 64, keep the selected profile and\nreport that the decider is unavailable. The built-in rule adds no reviewer when\nsecurity is already present. Do not follow `shadow`: no model step is adopted.\nAppend the decision to the phase's private JSON array and include\n`--decisions \"$DECISIONS_FILE\"` in the phase's `pr-stack record` call. Outside\nconductor mode, record `post-pr-review` once with the observed outcome. A dry\nrun records no attempt and makes no decision call.\n\nReport which profile fired in step 9 — a wrong profile is otherwise invisible,\nand the failure mode (a logic-heavy diff reviewed by the docs agent alone) is\nsilent. Pass `--agents` to override whenever the heuristic misjudges a diff.\n\n`--agents inline` skips agent dispatch and uses heuristics in this skill body\nonly (see Inline-review heuristics below).\n\nIn a SINGLE message, invoke `Task` once per requested agent. Each invocation\nreceives:\n\n- The diff path.\n- The list of changed files.\n- The head SHA.\n- The exact JSON contract from\n  [`references\u002Fagent-contract.md`](references\u002Fagent-contract.md) — verbatim,\n  no paraphrasing. Each agent MUST return ONE fenced JSON block per the\n  documented schema.\n\n### 6. Aggregate, validate, dedup, sort, truncate\n\n1. Parse each agent's JSON. On parse failure, retry once with a stricter\n   prompt; on second failure, log and skip that agent (don't abort the run).\n2. Drop findings whose `(path, line)` is not in the postable line set.\n3. Drop findings with `confidence \u003C 80`.\n4. Compute the marker for each finding (see Idempotency below).\n5. Fetch existing markers via\n   `\"$SCRIPTS\u002Fpost-pr-review-list-markers.sh\" \"$PR\" \"${GH_REPO_ARGS[@]}\"` and\n   drop any finding whose marker is already present.\n6. Within this run, dedup by marker (different agents can converge on the\n   same line).\n7. Sort: severity DESC (critical → important → suggestion), path ASC, line ASC.\n8. Apply `--max-comments`. **Severity-aware:** if truncating would drop one\n   or more `critical` findings, refuse silently. In interactive mode offer\n   `[r]aise cap \u002F [s]ummary-only \u002F [a]bort`; in `--auto` exit 1 with:\n   `N critical findings exceed --max-comments=M.` Re-run with a higher cap\n   or `--summary-only`.\n\n### 7. Confirmation (skipped under `--auto`)\n\nRender a table:\n\n```\n#  severity     agent                  path:line                  title\n1  critical     security-auditor       src\u002Fapi.ts:142             Hard-coded API key in commit\n2  important    architect-reviewer     src\u002Ftypes\u002Fuser.ts:18       Discriminated union would clarify intent\n3  suggestion   documentation-writer   src\u002Futils\u002Fformat.ts:9      Public function lacks docstring\n[y]es \u002F [e]dit \u002F [n]o\n```\n\n`edit` opens `$EDITOR` on a temp JSON the user can re-curate (the user's\neditor does the write; the skill reads the result back).\n\n### 8. Post\n\n- `--summary-only`: one POST to `\u002Freviews` with `body` (markdown checklist\n  of findings) + `event`. No `comments[]`. The `--max-comments` cap applies\n  to body lines; tail collapses to \"…and N more (run without --summary-only\n  to see all inline)\".\n- `--mode review` (default), count > 1: one atomic POST `\u002Freviews` with\n  `event`, optional `body` (general notes from agents), and `comments[]`.\n  Counts as one rate-limit event regardless of comment count. Use:\n  ```bash\n  \"$SCRIPTS\u002Fpost-pr-review-post-batch.sh\" \"$PR\" \\\n    --comments-json \"$SCRATCH\u002Fpost-pr-review-${PR}.comments.json\" \\\n    --event \"$EVENT\" \\\n    --body-file \"$SCRATCH\u002Fpost-pr-review-${PR}.body.md\" \\\n    \"${GH_REPO_ARGS[@]}\"\n  ```\n- `--mode inline` or count == 1: loop `POST \u002Fpulls\u002F{n}\u002Fcomments`, sleeping\n  750ms between calls. Use `post-pr-review-post-single.sh` with\n  `\"${GH_REPO_ARGS[@]}\"`.\n\nAfter each POST, parse rate-limit headers:\n\n```bash\nREMAINING=$(\"$SCRIPTS\u002Fpost-pr-review-ratelimit.sh\" \\\n  \"$SCRATCH\u002Fpost-pr-review-batch-${PR}.headers\" | jq -r .remaining)\n```\n\nIf `REMAINING \u003C 50` → bump sleep to 1s. If `REMAINING \u003C 10` → stop, report\ndeferred count, exit 0 with hint at `x-ratelimit-reset`.\n\n### 8b. Leave the receipt\n\nEvery run ends here, **including a run that found nothing** and including `--summary-only` and `--mode inline`. A run with no findings posts no comment, so without this a pull request whose review ran clean is indistinguishable from one that was never reviewed, and `\u002Fpr-conductor` could not tell the difference on re-entry.\n\nSkip it only under `--dry-run`, or when step 8 failed and the findings never reached the pull request. Pin it to the head SHA bound in step 1:\n\n```bash\n\"$SCRIPTS\u002Fpost-pr-review-post-receipt.sh\" \"$PR\" \\\n  --sha \"$HEAD_SHA\" --posted \"$POSTED\" --skipped \"$SKIPPED\" \\\n  --agents \"$AGENTS_CSV\" --profile \"$PROFILE\" \\\n  \"${GH_REPO_ARGS[@]}\"\n```\n\nIt posts one body-only review whose `commit_id` GitHub records. `$POSTED` is the number of findings step 8 posted and `$SKIPPED` the number dropped as duplicates. Never write the receipt marker by hand: the guard hook blocks it, and the script is the only sanctioned writer.\n\n### 9. Final report\n\n```\npost-pr-review summary for PR #123 (owner\u002Frepo)\n  agents dispatched   \u003Ccsv>  (profile: docs-only | small-code | full | --agents override)\n  receipt             posted | skipped (dry-run)\n  posted              N\n  skipped (dedup)     M\n  skipped (out-diff)  K\n  deferred (rate)     R\n  errors              E\nPR: https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fpull\u002F123\n```\n\n## Inline-review heuristics (when `--agents inline`)\n\nUse these only when no agents are requested:\n\n- **Silent failures**: scan added lines for `catch.*{}`, `catch.*{\\s*\u002F\u002F`,\n  `except.*pass`, `panic\\(\\) \u002F\u002Fignore`. Severity: `critical`.\n- **Missing tests**: any new file under `src\u002F` (or language equivalent) with\n  no matching test file in the diff. Severity: `important`.\n- **Comment drift**: existing comments above changed code. Severity:\n  `suggestion`.\n- **Hard-coded secrets**: `API_KEY = \"...\"`, `password.*=.*\"...\"`, regex\n  matches against added lines. Severity: `critical`.\n\n## Idempotency\n\nEvery comment body has a hidden HTML marker appended:\n\n```\n\u003C!-- post-pr-review:v1:\u003Csha256-hex-truncated-to-16> -->\n```\n\nThe hash input (the \"finding key\") is the literal pipe-joined string:\n\n```\n{path}|{line}|{side}|{agent}|{first_120_chars_of_body_normalized}\n```\n\n`normalized` = lowercase + collapse whitespace runs to single space + strip\ntrailing punctuation.\n\nOn re-run, `post-pr-review-list-markers.sh` paginates all existing comments,\nextracts every `post-pr-review:v1:[0-9a-f]{16}` marker, and drops any new\nfinding whose marker is in the set. The `v1` prefix lets us bump the schema\nlater without false-positive dedup against old markers.\n\n## Rate-limit guard\n\nGitHub's secondary limit on content-creating endpoints is **80 requests\u002Fmin,\n500\u002Fhour**. Source:\n\u003Chttps:\u002F\u002Fdocs.github.com\u002Fen\u002Frest\u002Fusing-the-rest-api\u002Frate-limits-for-the-rest-api#about-secondary-rate-limits>.\nSee [`references\u002Frate-limits.md`](references\u002Frate-limits.md).\n\nThe atomic `POST \u002Freviews` endpoint counts as ONE content-creation regardless\nof how many inline comments it bundles — this is why `--mode review` is the\ndefault. `--mode inline` should only be used when posting a single comment\nor when the user wants per-comment posting for some reason.\n\n## Concurrency\n\nThe dedup story (step 6.5: list existing markers → filter findings → POST)\nis **not safe under concurrent invocations**. Between `list-markers.sh`\nreturning and `post-batch.sh` posting, another `\u002Fpost-pr-review` run (or a\nhuman reviewer adding bot-style markers) could insert markers we never saw,\nproducing duplicate posts on the next run.\n\nRun the skill serially per PR. If you need automation, gate it behind a\nGitHub Actions concurrency group or a repo-level lock — the skill itself\nintentionally does not implement locking (out of scope for v0.1).\n\n## Failure modes\n\n| Mode                         | Detection                                                                   | Behavior                                                                                                                             |\n| ---------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |\n| No PR for branch             | `gh pr view` exits non-zero                                                 | Fail with: \"No PR found. Pass PR# explicitly: `\u002Fpost-pr-review 123`.\"                                                                |\n| PR closed\u002Fmerged             | `state != OPEN`                                                             | Refuse. No `--force` for merged.                                                                                                     |\n| PR is draft                  | `isDraft == true`                                                           | Warn + prompt; `--auto` proceeds.                                                                                                    |\n| Fork PR                      | `isCrossRepository == true`                                                 | Warn that posting may 403.                                                                                                           |\n| Agent returns no findings    | empty `findings[]`                                                          | Note in report, continue.                                                                                                            |\n| Agent returns malformed JSON | parse fails                                                                 | Retry once with stricter prompt; on second fail, skip that agent.                                                                    |\n| `gh auth missing`            | `gh auth status` non-zero                                                   | Fail at preflight with remediation.                                                                                                  |\n| Secondary rate limit hit     | 403 with `secondary rate limit` in body                                     | Stop batch, report deferred, hint at `x-ratelimit-reset`.                                                                            |\n| Line not in diff             | pre-validated against postable line set; if it slips and GitHub returns 422 | Skip that comment, log, continue.                                                                                                    |\n| Network\u002Ftransient            | non-2xx, non-422, non-403                                                   | Retry up to 2x with backoff (1s, 3s).                                                                                                |\n| Receipt POST fails           | `post-pr-review-post-receipt.sh` exits 1                                    | Report it. The findings are already posted; the missing receipt only means a later `\u002Fpr-conductor` run cannot skip the review stage. |\n\n## See also\n\n- `.claude\u002Fskills\u002Freview-pr\u002FSKILL.md` — the CONSUMER. Run after\n  `\u002Fpost-pr-review` to fetch and apply fixes from the comments this skill\n  posted.\n- [`references\u002Fagent-contract.md`](references\u002Fagent-contract.md) — JSON\n  schema each dispatched agent returns.\n- [`references\u002Fgithub-api-gotchas.md`](references\u002Fgithub-api-gotchas.md) —\n  NEW vs OLD line coords, atomic vs loop trade-offs.\n- [`references\u002Frate-limits.md`](references\u002Frate-limits.md) — GitHub's\n  content-creation limits.\n",{"name":5,"description":49,"argument-hint":50},"Post AI-generated review findings on a GitHub PR as inline review comments via the gh CLI — the bot-style review-comment workflow GitHub Copilot used to provide before it got rate-limited. Idempotent (hidden marker dedup), rate-limit conscious (respects GitHub's 80\u002Fmin secondary limit), and dry-run by default in interactive mode. Pairs with `review-pr`, which consumes the comments this skill produces and applies fixes. Triggers on: \"post PR review\", \"leave inline comments on PR\", \"AI review and comment on PR\", \"Copilot-style PR review\".\n","[PR#] [--dry-run] [--auto --confirm-post] [--mode review|inline] [--max-comments N] [--summary-only] [--event COMMENT|REQUEST_CHANGES|APPROVE] [--agents \u003Ccsv>]","main","91c337164997b99943fbcc64e8e362577b67bc81","plugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha","I'm a Platform\u002FInfra engineer who happens to work in cybersec and write Go code.","2026-10-26 14:12:51",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add kaiohenricunha\u002Fdotbabel --skill post-pr-review",{"tool":64,"command":65},"bunx","bunx skills add kaiohenricunha\u002Fdotbabel --skill post-pr-review",{"tool":67,"command":68},"pnpm","pnpm dlx skills add kaiohenricunha\u002Fdotbabel --skill post-pr-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fplugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review\u002FSKILL.md",true,[72,78,82],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fagent-contract.md","REFERENCE","参考文档",4491,"https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fplugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review\u002Freferences\u002Fagent-contract.md",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Fgithub-api-gotchas.md",3154,"https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fplugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review\u002Freferences\u002Fgithub-api-gotchas.md",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Frate-limits.md",2551,"https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fplugins\u002Fdotbabel\u002Ftemplates\u002Fclaude\u002Fskills\u002Fpost-pr-review\u002Freferences\u002Frate-limits.md",[87,118,146,168,189,212],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":98,"publishedAt":44},"01M6XDQ7QMASPFZ355MYKCD06T","yolo","Start temporary autonomy for the current task or an explicit scope with a required --for expiry. Codex permits scoped pushes, merges, deploys, and releases after strict testing and validation; Full access is a separate runtime setting. Claude Code uses a session permission hook with a protected-action denylist.","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fyolo\u002FSKILL.md",[93],{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[89,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117],"testing","merge","code","start","access","session","ops","autonomy","releases","permission","full","runtime","scope","devex","hook","true","action","for","scoped",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":128,"publishedAt":44},"01M6XDQ1N21VE4KH98JWGZ7GN9","veracity-audit","Audit a data pipeline for Veracity and Value. Dispatches data-scientist, compliance-auditor, and data-engineer agents with project context injected at dispatch time. All source paths are supplied via flags — no defaults, no project assumptions. Subcommands: audit (full pipeline walk), score-check (scoring math only), gate-check (gate coverage only), source-trace \u003Clabel> (single source end-to-end). Invoke when: \"audit pipeline\", \"veracity check\", \"scoring math correct?\", \"check gates\", \"trace source\", \"verify quality gates\", \"formula correct?\".","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fveracity-audit\u002FSKILL.md",[124,125],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":126,"categoryName":127,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000037","律师与法务",[129,130,99,24,131,132,133,134,135,37,136,137,138,139,140,141,142,143,144,145],"audit","veracity audit","data pipeline","pipeline","Bash","math","coverage","engineer","formula","scoring","time","project","worker","end","at","invoke","when",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":44},"01M6XDPVDKBR376C06CEK9BC5S","validate-spec","Audit an already-implemented spec against the codebase. Walks each constraint (ARCH-N, PERF-N, KD-N, etc.) and acceptance criterion, grounds findings in file:line evidence, runs the spec.json acceptance_commands, and writes a single audit doc to docs\u002Faudits\u002F. Use whenever the user asks to \"validate a spec\", \"audit a spec\", \"check if spec is implemented\", \"verify the spec is done\", \"is this spec really done\", or otherwise wants closure on spec-driven work. Read-only against the spec — produces an audit, never modifies the spec itself.","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fvalidate-spec\u002FSKILL.md",[],[153,154,155,99,24,156,157,129,133,158,159,160,37,161,162,163,164,165,166,167],"spec","validate","validate spec","run","acceptance","work","read","never","max","done","arch","line","2025","spec-driven","closure",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":44},"01M6XDPMMECH82RAW553Y94HDS","terragrunt-specialist","Deep-dive Terragrunt hierarchy review, DRY pattern audits, and run-all orchestration analysis. Use for structured investigations of multi-environment Terragrunt layouts, dependency graphs, remote state config, and hook correctness. Triggers on: \"Terragrunt audit\", \"run-all review\", \"dependency block\", \"DRY pattern review\", \"env hierarchy audit\", \"mock_outputs\", \"terragrunt hooks\".","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fterragrunt-specialist\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[178,179,180,24,181,182,156,129,183,133,159,184,185,161,186,35,165,187,143,188],"terragrunt","specialist","terragrunt specialist","orchestration","debugging","analysis","dependency","hooks","deep","remote","hierarchy",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":202,"publishedAt":44},"01M6XDPFJS2HGSE13RXF1HV8S7","terraform-specialist","Deep-dive Terraform architecture review, module design, state management, and migration. Use for structured investigations of Terraform workspaces, provider configuration, module coupling, import workflows, and test coverage. Triggers on: \"Terraform audit\", \"module review\", \"state management\", \"Terraform import\", \"workspace design\", \"provider config review\", \"Terraform testing\".","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-specialist\u002FSKILL.md",[195,198,199],{"categoryNo":196,"categoryName":197,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":200,"categoryName":201,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[203,204,179,99,205,24,206,207,208,182,129,133,159,135,209,210,186,211,165,143],"terraform","terraform specialist","design","workflows","architecture","architecture review","test coverage","workspaces","problem",{"skillNo":213,"name":153,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":221,"publishedAt":44},"01M6XDP7V6H8WYPSXVEKYE6HJ6","Create structured engineering specs through interactive pairing. Use when the user wants to create a spec, design doc, technical specification, architecture document, RFC, or engineering plan. Triggers on \"let's spec this out\", \"create a spec\", \"design doc\", \"write a technical plan\", \"plan the architecture\". Works for greenfield and brownfield projects. Outputs to docs\u002Fspecs\u002F.","https:\u002F\u002Fgithub.com\u002Fkaiohenricunha\u002Fdotbabel\u002Fblob\u002Fmain\u002Fskills\u002Fspec\u002FSKILL.md",[217,218],{"categoryNo":200,"categoryName":201,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":219,"categoryName":220,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000032","设计师",[153,205,222,207,223,224,225,226,227,228,229,230,231,232,233,116,234,235,236,237],"component","create","plan","projects","write","interactive","use","document","specification","triggers","opus","technical specification","trade-offs","technical plan","outputs","frontier"]