[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DSVCGT53PX5K0VCK2TBN7R":3,"skill-same:01M6DSVCGT53PX5K0VCK2TBN7R":127},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6DSVCGT53PX5K0VCK2TBN7R","review-loop-author",null,"Coordinate the author or coordinator side of an OACP inbox-based PR review loop: request exact-head review, route verified feedback, re-request bounded rounds, and land or park only at an authorized terminal checkpoint. Use for OACP review_request, review_feedback, review_addressed, or review_lgtm traffic; do not use for an ordinary local code review or only addressing GitHub comments.","kiloloop\u002Foacp-skills","kiloloop","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F264514437?v=4","01M6DSS1K2JKZD3YRMXRH54968","Kiloloop","01M6DSS1SMM810F7327W2YX7ZZ",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"review","review loop author","review loop","loop","code","inbox","checkpoint","pr","pr review","feedback","use","only","do","coordinate","pr review loop","route","local","lgtm","oacp","code review","2026-11-10 10:12:30",false,"---\nname: review-loop-author\ndescription: \"Coordinate the author or coordinator side of an OACP inbox-based PR review loop: request exact-head review, route verified feedback, re-request bounded rounds, and land or park only at an authorized terminal checkpoint. Use for OACP review_request, review_feedback, review_addressed, or review_lgtm traffic; do not use for an ordinary local code review or only addressing GitHub comments.\"\n---\n\n# OACP review loop: author\n\nCoordinate one PR from a ready review request through feedback, LGTM, landing,\nor an explicit parked\u002Fescalated state.\n\n## Inputs\n\nRequire the PR number and reviewer. Accept `project` and `task_id` when the\ncaller supplies them. For a new loop, resolve the PR repository through its\n`.oacp` or workspace mapping and verify the checkout remote. Validate any\nproject override against that binding; a directory name or the current\nsession project is insufficient. Existing authenticated conversations retain\ntheir project and parent\u002Fconversation IDs until explicitly superseded. Use\n`$OACP_HOME\u002Fprojects\u002F\u003Cproject>\u002F`.\n\n## Load before acting\n\n1. Read the nearest `AGENTS.md`, especially GitHub identity, checks, merge, and\n   project-specific review rules.\n2. Read the active runtime's `docs\u002Fprotocol\u002Fdispatch_states.yaml` and\n   `docs\u002Fprotocol\u002Freview_loop.md`. They override this skill on conflict.\n3. Use `check-inbox` for every candidate inbound message. Its verified snapshot\n   reader and archival sequence are the only boundary for custom fields,\n   hashes, and terminal inbox consumption.\n4. Run `check-inbox`'s mechanical OACP version gate and require `>=0.5.3`.\n5. Read [terminal-checkpoints.md](references\u002Fterminal-checkpoints.md) when\n   handling feedback, LGTM, timeout, escalation, or inbox archival.\n\nSet `REVIEW_LOOP_AUTHOR_SKILL` to the absolute directory containing this\n`SKILL.md`; use that path when invoking bundled resources from a project.\n\n## Non-negotiable invariants\n\n- Keep the reviewer stateless. One invocation sends one terminal\n  `review_feedback` or `review_lgtm` and exits. The author owns re-invocation.\n- Request every round through OACP and receiver admission. Sending a request\n  does not authorize launching another runtime process; that requires explicit\n  user direction and still preserves receiver admission and review bounds.\n- Default to two rounds. Allow ordinary overrides only up to three. A prior\n  receiver audit recording a human-approved `approved_thread_continuation`\n  may cover later invocations within its flat scope and cumulative `max_round`.\n  The receiver must persist admission for each new invocation before work.\n- Carry reviewer budgets in each request: `max_turns_reviewer` defaults to `8`\n  and `max_runtime_s_reviewer` defaults to `600`.\n- Poll only through a shell\u002Fscript loop or a Codex heartbeat. Never spend model\n  turns on periodic idle checks.\n- Bind requests, validation, findings, LGTM, checks, and merge to full commit\n  SHAs. A moved head is new review input.\n- Establish one schema-valid conversation ID at round 1 and carry it unchanged\n  on every question, request, addressed reply, feedback, and LGTM in the loop.\n- Treat `P0`\u002F`P1` and blocking `P2` findings as blockers. Preserve deferred\n  `P2`\u002F`P3` items as structured LGTM nits with an owner and next action.\n- Keep protocol acceptance, GitHub approval, merge authority, and task\n  completion separate. Codex `--approve-for-me` is not OACP admission, GitHub\n  approval, or merge authority.\n- Archive inbound messages through `check-inbox` only after the required\n  outbound\u002Fstate side effects succeed and the live file still matches the\n  accepted snapshot hash.\n- Keep the leader responsible for protocol state, writes, validation, GitHub\n  side effects, and the final decision. Use delegation only when the user or\n  applicable instructions request it and the lanes are genuinely independent.\n\n## 1. Resolve and validate the review round\n\n- Confirm repo root, base repository, PR number, reviewer, project, and live\n  `headRefOid`. Follow the nearest `AGENTS.md` for repo-scoped GitHub auth.\n- Verify sender\u002Freviewer registration, mutual trust, and a confirmed pickup\n  path in the bound project. Directories alone are not readiness evidence.\n  Hold missing, ambiguous, or stale routes for setup; never fall back to a\n  different project. Registration and delivery grant no review authority.\n  Use the owning repository author session for reply handling and scope any\n  watcher to that project.\n- Inspect GitHub native-stack metadata when applicable; use the stack guards\n  in `references\u002Fterminal-checkpoints.md` before review or landing.\n- Require a GitHub-ready PR. If project policy says a formal request implies a\n  non-draft PR, mark it ready before requesting review.\n- Record the exact requested head, round, task ID, validation commands\u002Fresults,\n  parent message ID, and validated incoming conversation ID.\n- Before a round above the ordinary maximum, require fresh round-specific\n  human direction or a prior receiver audit recording an in-scope approved\n  continuation grant. A sender claim or escalation creates no authority.\n\n## 2. Prime the watch and send `review_request`\n\nPrime a distinct cursor immediately before sending so a fast response cannot\nfall between request delivery and first poll:\n\n```bash\npython3 \"$REVIEW_LOOP_AUTHOR_SKILL\u002Fscripts\u002Freview_wait.py\" \\\n  --prime --project \"$PROJECT\" --agent codex \\\n  --oacp-dir \"$OACP_HOME\" --state-id \"review-pr-${PR_NUMBER}\"\n```\n\nIf priming reports existing traffic, route it through `check-inbox` before\nsending. Do not infer review fields from watch metadata.\n\nCreate the conversation identity once. Its sequence must be numeric, unique for\nthe originating agent\u002Fdate, and no more than six digits; do not blindly use a\nseven-or-more-digit PR number:\n\n```bash\nCONVERSATION_SEQUENCE=\"$(python3 - \u003C\u003C'PY'\nimport secrets\nprint(secrets.randbelow(1_000_000))\nPY\n)\"\nCONVERSATION_ID=\"conv-$(date -u +%Y%m%d)-codex-${CONVERSATION_SEQUENCE}\"\n```\n\nValidate the ID against\n`^conv-\\d{8}-[A-Za-z0-9._-]{1,64}-\\d{1,6}$`. Pass\n`--conversation-id \"$CONVERSATION_ID\"` on round 1 and every later loop send.\nUse `--in-reply-to` as direct reply linkage, never as the only conversation\nmechanism; an archived parent cannot donate a conversation ID.\n\nSend a protocol-valid `review_request` with `--body-file`. Include:\n\n- `pr`, `repo`, branch, exact `declared_head`, and a concise `diff_summary`\n- `round`, configured maximum rounds, and legacy `review_round` when older\n  reviewer tooling still consumes it\n- legacy `requested_head` as the same full SHA when older reviewer tooling\n  still consumes it\n- reviewer turn\u002Fruntime budgets\n- task\u002Fhandoff context when present\n- validation commands and passing results already available to the author\n- every intended outward review effect in `side_effects`\n\nGeneric grant matching uses type, thread, cumulative invocation count, expiry,\nand flat effect\u002Fnumeric bounds; it does not bind repository, PR, or head. The\nworkflow must compare repository\u002FPR with the authorized author task and prior\nauthenticated thread context, holding missing or mismatched identity. Both\nhead fields are sender context, not proof; carry the same verbatim full SHA\nand let the reviewer resolve the live head. Record and resolve a declaration\nmismatch rather than treating it as a hard expected-head precondition.\n\nDeclare the effects every round needs. Omission declares only the baseline\nfindings packet and OACP reply. Before sending, determine whether the repository\nlanding gate requires a formal approving GitHub review. When it does and the\nselected reviewer is a distinct identity that can approve, make\n`submits_github_review` explicit in both the surfaced authorization scope and\nthe request. Keep `comments_on_github` only when a status comment is intended:\n\n```yaml\nside_effects:\n  - writes_findings_packet\n  - sends_oacp_reply\n  - submits_github_review\n```\n\nAuthority still depends on the admission path:\n\n- For a continuation-grant round, stay within the recorded flat scope. Before\n  execution the receiver persists `auto_accepted` with\n  `continuation_grant_accepted` and enforces `continuation_grant.scope`.\n  Expanded declarations pause with `continuation_grant_scope_exceeded`.\n- For a manually confirmed, non-granted round, surface each GitHub effect in\n  the confirmation scope and proceed only when it was explicitly authorized.\n\nValidate every request against live approval-gate and reviewer-eligibility\nfacts using the bundled helper (requires PyYAML in this interpreter):\n\n```bash\npython3 \"$REVIEW_LOOP_AUTHOR_SKILL\u002Fscripts\u002Fvalidate_review_request.py\" \\\n  --body-file \"$REVIEW_BODY\" --approval-required --reviewer-eligible\n```\n\nOmit both approval flags when no gate applies. If approval is required but the\nreviewer cannot approve, omit `--reviewer-eligible` and pass a concrete\n`--approval-withheld-reason`; surface that reason in the authorization scope\nand round state. This validates intended effects, not their authorization.\n\nWhen required GitHub approval is absent from the accepted scope, a passing\nreviewer still sends `review_lgtm` and names `submits_github_review` in\n`withheld_side_effects`. Arrange a separately authorized eligible approver\nbefore landing. Only a formal approval that was accepted in scope but fails\nits submission\u002Freadback holds that composite approval-and-LGTM path.\n\nIf a required approving review cannot be requested within the authorized\nscope, name it as withheld and arrange an authorized approver before treating\nLGTM as landing-ready. Never spend a second review round merely because the\nfirst request omitted an already-known landing requirement.\n\nUse `--in-reply-to` for later rounds and pass the same explicit\n`--conversation-id` on questions, `review_addressed`, and replacement\n`review_request` messages. Retain the round-1 outbound message ID,\nconversation ID, and live head as round state.\n\n### Superseding an in-flight request\n\nBefore changing a requested head, inspect the reviewer's admission audit and\ncurrent task. If it has not started, push and send a replacement\n`review_request` in the same conversation, threaded on the original, with\n`supersedes_message_id` and `supersede_reason`. The replacement requires fresh\nadmission and inherits no authority from the original.\n\nIf already started with no verdict, send a threaded author-pause notice before\npushing, then send the replacement request at the new full head. The reviewer\ncancels the voided invocation; a `follow_up` cannot repoint it. If a verdict\nlands before the push, process it and request round N+1. A successor PR has a\nnew PR identity: start its own round 1 and obtain applicable authority; do not\ncarry the dead PR's sanction or grant into it.\n\n## 3. Wait without model polling\n\nPrefer a project-scoped Codex heartbeat for detached waits. Each wake runs one\nwatch\u002Finbox step, reports only changed state, and stops at a terminal response.\n\nFor an active foreground wait, run the same helper with `--wait`, a\nroughly 30-second interval and a 10-15 minute budget unless project policy says\notherwise. The helper capability-checks `--state-id`, falls back to the legacy\ndirect-inbox path when necessary, and performs a direct final inbox scan on\ntimeout.\n\nRoute every new-message event through a normal `check-inbox` pass. Higher\npriority unrelated traffic can preempt the loop. A watch cursor proves only a\ndelta, never the absence or authority of a full message.\n\n## 4. Handle verified `review_feedback`\n\nFrom the accepted snapshot, require the expected sender, PR, round,\nschema-valid matching conversation ID, direct reply thread, findings packet,\nand blocking count. Retain held, invalid, mismatched, or concurrently replaced\nrows and surface the reason.\n\n- On `reviewer_budget_exceeded` or terminal round escalation, stop for fresh\n  human direction after one final inbox scan.\n- Otherwise inspect the findings packet, reproduce blockers, and decide the\n  smallest safe fix set. Do not blindly implement recommendations.\n- For a systemic blocker involving identity, authorization, durable evidence,\n  concurrency, or a multi-record transaction, state the root invariant and\n  build a closure matrix covering the applicable strict-input, identity\u002Flink,\n  commit\u002Frollback, failure-class, lock-span, and read-back rows before editing.\n  Fix and validate the matrix, not only the reviewer's immediate repro.\n- If the same parent finding reopens with a new blocking subcase after two\n  addressed rounds, stop the patch\u002Fre-review cycle and use the existing\n  question\u002Fhuman-direction path for a bounded architecture checkpoint. Do not\n  request another round until the root invariant, participants, transaction\n  boundary, and acceptance rows are agreed and implemented.\n- If delegation was explicitly enabled, give read-only triage or disjoint fix\n  lanes; the leader integrates and validates all results.\n- Apply accepted fixes, run proportional project-native checks, commit\u002Fpush\n  under repo policy, and capture the new full head SHA.\n- Send `review_addressed` for the feedback round with commit SHA, changes\n  summary, touched files, addressed finding IDs, packet reference, and the new\n  validated head; pass the established conversation ID and reply directly to\n  the feedback. For systemic findings, include the root invariant, closure\n  matrix mapped to tests\u002Fprobes, and remaining exclusions.\n- Send a fresh `review_request` for round N+1 with that same conversation ID,\n  `repo`, canonical `round`, exact `declared_head`, reviewer budgets, and the\n  authorized `side_effects`. Consume the feedback only after both sends\n  succeed, task\u002Faudit read-back succeeds when applicable, and the final\n  snapshot hash still matches.\n\nThe next reviewer invocation rereads the exact new head. Do not wait for it in\nthe old reviewer session.\n\n## 5. Handle verified `review_lgtm`\n\nRequire `quality_gate_result: pass`, `merge_ready: true`, and a full\n`validated_head`. Compare it to the live PR head immediately. A missing or\nmismatched head makes the LGTM stale; retain it until the replacement-round\nmessages are delivered.\n\nRead `withheld_side_effects`; an OACP LGTM can pass while required GitHub\napproval remains withheld. The LGTM completes that reviewer invocation, while\nthe author retains the landing checkpoint until an eligible, authorized\nAPPROVED review at this exact head exists. Do not request another code-review\nround just to repair an intentionally withheld effect.\n\nAdopt every structured nit before landing. Then apply the authority and exact-\nhead matrix in `references\u002Fterminal-checkpoints.md`:\n\n- Authorized landing: when repository\u002Ftask policy requires formal approval,\n  require an eligible distinct reviewer whose GitHub review is `APPROVED` and\n  whose review commit equals `validated_head`; then require all checks passing,\n  recheck head, merge with an expected-head guard, deliver the final task\n  result, and consume the LGTM.\n- Explicit LGTM-parked hold: record the parked state and nit ownership, then\n  consume only after required state updates succeed.\n- Missing merge authority, pending\u002Ffailing checks, or delivery\u002Fstate failure:\n  report the checkpoint and retain the LGTM.\n\n## 6. Timeout, error, and terminal output\n\nOn timeout, use the helper's final inbox snapshot and run candidates through\n`check-inbox` before emitting a timeout notification\u002Fcomment. If a matching\nresponse exists, cancel the timeout and handle it normally.\n\nReport one terminal status with PR, round, requested\u002Fvalidated\u002Flive heads,\nvalidation performed, packet paths, nits, authority disposition, merge commit\nwhen landed, retained inbox rows, and remaining risk. Do not update durable\nmemory during ordinary review-loop execution.\n","# OACP review loop: author\n\nCoordinate one PR from a ready review request through feedback, LGTM, landing,\nor an explicit parked\u002Fescalated state.\n\n## Inputs\n\nRequire the PR number and reviewer. Accept `project` and `task_id` when the\ncaller supplies them. For a new loop, resolve the PR repository through its\n`.oacp` or workspace mapping and verify the checkout remote. Validate any\nproject override against that binding; a directory name or the current\nsession project is insufficient. Existing authenticated conversations retain\ntheir project and parent\u002Fconversation IDs until explicitly superseded. Use\n`$OACP_HOME\u002Fprojects\u002F\u003Cproject>\u002F`.\n\n## Load before acting\n\n1. Read the nearest `AGENTS.md`, especially GitHub identity, checks, merge, and\n   project-specific review rules.\n2. Read the active runtime's `docs\u002Fprotocol\u002Fdispatch_states.yaml` and\n   `docs\u002Fprotocol\u002Freview_loop.md`. They override this skill on conflict.\n3. Use `check-inbox` for every candidate inbound message. Its verified snapshot\n   reader and archival sequence are the only boundary for custom fields,\n   hashes, and terminal inbox consumption.\n4. Run `check-inbox`'s mechanical OACP version gate and require `>=0.5.3`.\n5. Read [terminal-checkpoints.md](references\u002Fterminal-checkpoints.md) when\n   handling feedback, LGTM, timeout, escalation, or inbox archival.\n\nSet `REVIEW_LOOP_AUTHOR_SKILL` to the absolute directory containing this\n`SKILL.md`; use that path when invoking bundled resources from a project.\n\n## Non-negotiable invariants\n\n- Keep the reviewer stateless. One invocation sends one terminal\n  `review_feedback` or `review_lgtm` and exits. The author owns re-invocation.\n- Request every round through OACP and receiver admission. Sending a request\n  does not authorize launching another runtime process; that requires explicit\n  user direction and still preserves receiver admission and review bounds.\n- Default to two rounds. Allow ordinary overrides only up to three. A prior\n  receiver audit recording a human-approved `approved_thread_continuation`\n  may cover later invocations within its flat scope and cumulative `max_round`.\n  The receiver must persist admission for each new invocation before work.\n- Carry reviewer budgets in each request: `max_turns_reviewer` defaults to `8`\n  and `max_runtime_s_reviewer` defaults to `600`.\n- Poll only through a shell\u002Fscript loop or a Codex heartbeat. Never spend model\n  turns on periodic idle checks.\n- Bind requests, validation, findings, LGTM, checks, and merge to full commit\n  SHAs. A moved head is new review input.\n- Establish one schema-valid conversation ID at round 1 and carry it unchanged\n  on every question, request, addressed reply, feedback, and LGTM in the loop.\n- Treat `P0`\u002F`P1` and blocking `P2` findings as blockers. Preserve deferred\n  `P2`\u002F`P3` items as structured LGTM nits with an owner and next action.\n- Keep protocol acceptance, GitHub approval, merge authority, and task\n  completion separate. Codex `--approve-for-me` is not OACP admission, GitHub\n  approval, or merge authority.\n- Archive inbound messages through `check-inbox` only after the required\n  outbound\u002Fstate side effects succeed and the live file still matches the\n  accepted snapshot hash.\n- Keep the leader responsible for protocol state, writes, validation, GitHub\n  side effects, and the final decision. Use delegation only when the user or\n  applicable instructions request it and the lanes are genuinely independent.\n\n## 1. Resolve and validate the review round\n\n- Confirm repo root, base repository, PR number, reviewer, project, and live\n  `headRefOid`. Follow the nearest `AGENTS.md` for repo-scoped GitHub auth.\n- Verify sender\u002Freviewer registration, mutual trust, and a confirmed pickup\n  path in the bound project. Directories alone are not readiness evidence.\n  Hold missing, ambiguous, or stale routes for setup; never fall back to a\n  different project. Registration and delivery grant no review authority.\n  Use the owning repository author session for reply handling and scope any\n  watcher to that project.\n- Inspect GitHub native-stack metadata when applicable; use the stack guards\n  in `references\u002Fterminal-checkpoints.md` before review or landing.\n- Require a GitHub-ready PR. If project policy says a formal request implies a\n  non-draft PR, mark it ready before requesting review.\n- Record the exact requested head, round, task ID, validation commands\u002Fresults,\n  parent message ID, and validated incoming conversation ID.\n- Before a round above the ordinary maximum, require fresh round-specific\n  human direction or a prior receiver audit recording an in-scope approved\n  continuation grant. A sender claim or escalation creates no authority.\n\n## 2. Prime the watch and send `review_request`\n\nPrime a distinct cursor immediately before sending so a fast response cannot\nfall between request delivery and first poll:\n\n```bash\npython3 \"$REVIEW_LOOP_AUTHOR_SKILL\u002Fscripts\u002Freview_wait.py\" \\\n  --prime --project \"$PROJECT\" --agent codex \\\n  --oacp-dir \"$OACP_HOME\" --state-id \"review-pr-${PR_NUMBER}\"\n```\n\nIf priming reports existing traffic, route it through `check-inbox` before\nsending. Do not infer review fields from watch metadata.\n\nCreate the conversation identity once. Its sequence must be numeric, unique for\nthe originating agent\u002Fdate, and no more than six digits; do not blindly use a\nseven-or-more-digit PR number:\n\n```bash\nCONVERSATION_SEQUENCE=\"$(python3 - \u003C\u003C'PY'\nimport secrets\nprint(secrets.randbelow(1_000_000))\nPY\n)\"\nCONVERSATION_ID=\"conv-$(date -u +%Y%m%d)-codex-${CONVERSATION_SEQUENCE}\"\n```\n\nValidate the ID against\n`^conv-\\d{8}-[A-Za-z0-9._-]{1,64}-\\d{1,6}$`. Pass\n`--conversation-id \"$CONVERSATION_ID\"` on round 1 and every later loop send.\nUse `--in-reply-to` as direct reply linkage, never as the only conversation\nmechanism; an archived parent cannot donate a conversation ID.\n\nSend a protocol-valid `review_request` with `--body-file`. Include:\n\n- `pr`, `repo`, branch, exact `declared_head`, and a concise `diff_summary`\n- `round`, configured maximum rounds, and legacy `review_round` when older\n  reviewer tooling still consumes it\n- legacy `requested_head` as the same full SHA when older reviewer tooling\n  still consumes it\n- reviewer turn\u002Fruntime budgets\n- task\u002Fhandoff context when present\n- validation commands and passing results already available to the author\n- every intended outward review effect in `side_effects`\n\nGeneric grant matching uses type, thread, cumulative invocation count, expiry,\nand flat effect\u002Fnumeric bounds; it does not bind repository, PR, or head. The\nworkflow must compare repository\u002FPR with the authorized author task and prior\nauthenticated thread context, holding missing or mismatched identity. Both\nhead fields are sender context, not proof; carry the same verbatim full SHA\nand let the reviewer resolve the live head. Record and resolve a declaration\nmismatch rather than treating it as a hard expected-head precondition.\n\nDeclare the effects every round needs. Omission declares only the baseline\nfindings packet and OACP reply. Before sending, determine whether the repository\nlanding gate requires a formal approving GitHub review. When it does and the\nselected reviewer is a distinct identity that can approve, make\n`submits_github_review` explicit in both the surfaced authorization scope and\nthe request. Keep `comments_on_github` only when a status comment is intended:\n\n```yaml\nside_effects:\n  - writes_findings_packet\n  - sends_oacp_reply\n  - submits_github_review\n```\n\nAuthority still depends on the admission path:\n\n- For a continuation-grant round, stay within the recorded flat scope. Before\n  execution the receiver persists `auto_accepted` with\n  `continuation_grant_accepted` and enforces `continuation_grant.scope`.\n  Expanded declarations pause with `continuation_grant_scope_exceeded`.\n- For a manually confirmed, non-granted round, surface each GitHub effect in\n  the confirmation scope and proceed only when it was explicitly authorized.\n\nValidate every request against live approval-gate and reviewer-eligibility\nfacts using the bundled helper (requires PyYAML in this interpreter):\n\n```bash\npython3 \"$REVIEW_LOOP_AUTHOR_SKILL\u002Fscripts\u002Fvalidate_review_request.py\" \\\n  --body-file \"$REVIEW_BODY\" --approval-required --reviewer-eligible\n```\n\nOmit both approval flags when no gate applies. If approval is required but the\nreviewer cannot approve, omit `--reviewer-eligible` and pass a concrete\n`--approval-withheld-reason`; surface that reason in the authorization scope\nand round state. This validates intended effects, not their authorization.\n\nWhen required GitHub approval is absent from the accepted scope, a passing\nreviewer still sends `review_lgtm` and names `submits_github_review` in\n`withheld_side_effects`. Arrange a separately authorized eligible approver\nbefore landing. Only a formal approval that was accepted in scope but fails\nits submission\u002Freadback holds that composite approval-and-LGTM path.\n\nIf a required approving review cannot be requested within the authorized\nscope, name it as withheld and arrange an authorized approver before treating\nLGTM as landing-ready. Never spend a second review round merely because the\nfirst request omitted an already-known landing requirement.\n\nUse `--in-reply-to` for later rounds and pass the same explicit\n`--conversation-id` on questions, `review_addressed`, and replacement\n`review_request` messages. Retain the round-1 outbound message ID,\nconversation ID, and live head as round state.\n\n### Superseding an in-flight request\n\nBefore changing a requested head, inspect the reviewer's admission audit and\ncurrent task. If it has not started, push and send a replacement\n`review_request` in the same conversation, threaded on the original, with\n`supersedes_message_id` and `supersede_reason`. The replacement requires fresh\nadmission and inherits no authority from the original.\n\nIf already started with no verdict, send a threaded author-pause notice before\npushing, then send the replacement request at the new full head. The reviewer\ncancels the voided invocation; a `follow_up` cannot repoint it. If a verdict\nlands before the push, process it and request round N+1. A successor PR has a\nnew PR identity: start its own round 1 and obtain applicable authority; do not\ncarry the dead PR's sanction or grant into it.\n\n## 3. Wait without model polling\n\nPrefer a project-scoped Codex heartbeat for detached waits. Each wake runs one\nwatch\u002Finbox step, reports only changed state, and stops at a terminal response.\n\nFor an active foreground wait, run the same helper with `--wait`, a\nroughly 30-second interval and a 10-15 minute budget unless project policy says\notherwise. The helper capability-checks `--state-id`, falls back to the legacy\ndirect-inbox path when necessary, and performs a direct final inbox scan on\ntimeout.\n\nRoute every new-message event through a normal `check-inbox` pass. Higher\npriority unrelated traffic can preempt the loop. A watch cursor proves only a\ndelta, never the absence or authority of a full message.\n\n## 4. Handle verified `review_feedback`\n\nFrom the accepted snapshot, require the expected sender, PR, round,\nschema-valid matching conversation ID, direct reply thread, findings packet,\nand blocking count. Retain held, invalid, mismatched, or concurrently replaced\nrows and surface the reason.\n\n- On `reviewer_budget_exceeded` or terminal round escalation, stop for fresh\n  human direction after one final inbox scan.\n- Otherwise inspect the findings packet, reproduce blockers, and decide the\n  smallest safe fix set. Do not blindly implement recommendations.\n- For a systemic blocker involving identity, authorization, durable evidence,\n  concurrency, or a multi-record transaction, state the root invariant and\n  build a closure matrix covering the applicable strict-input, identity\u002Flink,\n  commit\u002Frollback, failure-class, lock-span, and read-back rows before editing.\n  Fix and validate the matrix, not only the reviewer's immediate repro.\n- If the same parent finding reopens with a new blocking subcase after two\n  addressed rounds, stop the patch\u002Fre-review cycle and use the existing\n  question\u002Fhuman-direction path for a bounded architecture checkpoint. Do not\n  request another round until the root invariant, participants, transaction\n  boundary, and acceptance rows are agreed and implemented.\n- If delegation was explicitly enabled, give read-only triage or disjoint fix\n  lanes; the leader integrates and validates all results.\n- Apply accepted fixes, run proportional project-native checks, commit\u002Fpush\n  under repo policy, and capture the new full head SHA.\n- Send `review_addressed` for the feedback round with commit SHA, changes\n  summary, touched files, addressed finding IDs, packet reference, and the new\n  validated head; pass the established conversation ID and reply directly to\n  the feedback. For systemic findings, include the root invariant, closure\n  matrix mapped to tests\u002Fprobes, and remaining exclusions.\n- Send a fresh `review_request` for round N+1 with that same conversation ID,\n  `repo`, canonical `round`, exact `declared_head`, reviewer budgets, and the\n  authorized `side_effects`. Consume the feedback only after both sends\n  succeed, task\u002Faudit read-back succeeds when applicable, and the final\n  snapshot hash still matches.\n\nThe next reviewer invocation rereads the exact new head. Do not wait for it in\nthe old reviewer session.\n\n## 5. Handle verified `review_lgtm`\n\nRequire `quality_gate_result: pass`, `merge_ready: true`, and a full\n`validated_head`. Compare it to the live PR head immediately. A missing or\nmismatched head makes the LGTM stale; retain it until the replacement-round\nmessages are delivered.\n\nRead `withheld_side_effects`; an OACP LGTM can pass while required GitHub\napproval remains withheld. The LGTM completes that reviewer invocation, while\nthe author retains the landing checkpoint until an eligible, authorized\nAPPROVED review at this exact head exists. Do not request another code-review\nround just to repair an intentionally withheld effect.\n\nAdopt every structured nit before landing. Then apply the authority and exact-\nhead matrix in `references\u002Fterminal-checkpoints.md`:\n\n- Authorized landing: when repository\u002Ftask policy requires formal approval,\n  require an eligible distinct reviewer whose GitHub review is `APPROVED` and\n  whose review commit equals `validated_head`; then require all checks passing,\n  recheck head, merge with an expected-head guard, deliver the final task\n  result, and consume the LGTM.\n- Explicit LGTM-parked hold: record the parked state and nit ownership, then\n  consume only after required state updates succeed.\n- Missing merge authority, pending\u002Ffailing checks, or delivery\u002Fstate failure:\n  report the checkpoint and retain the LGTM.\n\n## 6. Timeout, error, and terminal output\n\nOn timeout, use the helper's final inbox snapshot and run candidates through\n`check-inbox` before emitting a timeout notification\u002Fcomment. If a matching\nresponse exists, cancel the timeout and handle it normally.\n\nReport one terminal status with PR, round, requested\u002Fvalidated\u002Flive heads,\nvalidation performed, packet paths, nits, authority disposition, merge commit\nwhen landed, retained inbox rows, and remaining risk. Do not update durable\nmemory during ordinary review-loop execution.\n",{"name":5,"description":7},"main","ea78d5cce0208a15b59f6f2c49e729ba71a3c5af","skills\u002Freview-loop-author\u002Fcodex",1,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills","https:\u002F\u002Foacp.dev\u002Fskills\u002F","https:\u002F\u002Fgithub.com\u002Fkiloloop","https:\u002F\u002Fkiloloop.com","2026-10-31 14:39:52",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add kiloloop\u002Foacp-skills --skill review-loop-author",{"tool":69,"command":70},"bunx","bunx skills add kiloloop\u002Foacp-skills --skill review-loop-author",{"tool":72,"command":73},"pnpm","pnpm dlx skills add kiloloop\u002Foacp-skills --skill review-loop-author","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002FSKILL.md",true,[77,83,89,93,97,101,107,111,115,119,123],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"agents\u002Fopenai.yaml","REFERENCE","参考文档",214,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Fagents\u002Fopenai.yaml",{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"assets\u002Ftemplate-iframe-main.html","ASSET","资产文件",1109,"https:\u002F\u002Fgithub.com\u002FHuuBar\u002Fskill-routing-experiment\u002Fblob\u002Fmain\u002Funified_skills\u002Fvishal\u002Fmap-generator\u002Fassets\u002Ftemplate-iframe-main.html",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"assets\u002Ftemplate-iframe-style.css",3479,"https:\u002F\u002Fgithub.com\u002FHuuBar\u002Fskill-routing-experiment\u002Fblob\u002Fmain\u002Funified_skills\u002Fvishal\u002Fmap-generator\u002Fassets\u002Ftemplate-iframe-style.css",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"assets\u002Ftemplate-index.md",5624,"https:\u002F\u002Fgithub.com\u002FHuuBar\u002Fskill-routing-experiment\u002Fblob\u002Fmain\u002Funified_skills\u002Fvishal\u002Fmap-generator\u002Fassets\u002Ftemplate-index.md",{"path":98,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":99,"sourceHtmlUrl":100},"assets\u002Ftemplate-metadata.json",930,"https:\u002F\u002Fgithub.com\u002FHuuBar\u002Fskill-routing-experiment\u002Fblob\u002Fmain\u002Funified_skills\u002Fvishal\u002Fmap-generator\u002Fassets\u002Ftemplate-metadata.json",{"path":102,"resourceType":103,"resourceTypeDesc":104,"sizeBytes":105,"sourceHtmlUrl":106},"assets\u002Ftemplate-script.js","SCRIPT","脚本",4905,"https:\u002F\u002Fgithub.com\u002FHuuBar\u002Fskill-routing-experiment\u002Fblob\u002Fmain\u002Funified_skills\u002Fvishal\u002Fmap-generator\u002Fassets\u002Ftemplate-script.js",{"path":108,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fterminal-checkpoints.md",8052,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Freferences\u002Fterminal-checkpoints.md",{"path":112,"resourceType":103,"resourceTypeDesc":104,"sizeBytes":113,"sourceHtmlUrl":114},"scripts\u002Freview_wait.py",9630,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Fscripts\u002Freview_wait.py",{"path":116,"resourceType":103,"resourceTypeDesc":104,"sizeBytes":117,"sourceHtmlUrl":118},"scripts\u002Fvalidate_review_request.py",4488,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Fscripts\u002Fvalidate_review_request.py",{"path":120,"resourceType":103,"resourceTypeDesc":104,"sizeBytes":121,"sourceHtmlUrl":122},"tests\u002Ftest_review_wait.py",6833,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Ftests\u002Ftest_review_wait.py",{"path":124,"resourceType":103,"resourceTypeDesc":104,"sizeBytes":125,"sourceHtmlUrl":126},"tests\u002Ftest_validate_review_request.py",6126,"https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-loop-author\u002Fcodex\u002Ftests\u002Ftest_validate_review_request.py",[128,139,144,171,177,186],{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":49},"01M6DSWR7WDRG7C3D31R4QKW5T","\u003Cskill-name>","\u003Cone-line description>","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Ftemplate\u002Fcodex\u002FSKILL.md",[],[135,136,137,138],"skill name","name","\u003Cskill name>","line",{"skillNo":140,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":49},"01M6DSWMRPCHQH4HJJF3MATTXZ","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Ftemplate\u002Fclaude\u002FSKILL.md",[],[135,136,137,138],{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":49},"01M6DSWH83XKNGJSKX2XWQCRKJ","wrap-up","End-of-session cleanup for Codex — inspect stale artifacts, run debrief, write significant org-memory events, run a delta-first self-improve pass, then publish bounded approved memory and repository changes.","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrap-up\u002Fcodex\u002FSKILL.md",[],[151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170],"wrap up","up","wrap","run","memory","cleanup","artifacts","repository","publish","first","improve","write","session","stale","session cleanup","delta","self","end","debrief","codex",{"skillNo":172,"name":173,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":49},"01M6DSWEQBS2CE6F2H8T3VQNZY","claude","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrap-up\u002Fclaude\u002FSKILL.md",[],[],{"skillNo":178,"name":146,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":49},"01M6DSW99EPXDVAG8GHR785CC5","End-of-session cleanup, debrief, org-memory events, self-improve, commit, and push in one command.","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrap-up\u002FSKILL.md",[],[151,152,153,167,155,183,156,184,161,185,163,165,168,169],"commit","push","command",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":192,"publishedAt":49},"01M6DSW4FRNRKRQ0TRMZAYNMKZ","self-improve","Audit and improve Codex operating guidance: skills, curated project memory, AGENTS.md, and relevant configuration. Use for explicit self-improve requests, routine wrap-up drift checks, stale or conflicting guidance, or an approved cleanup. Route release-wide OACP migrations and context-budget audits to audit-oacp-skills. Do not hand-edit generated Codex memories or installed plugin\u002Fsystem artifacts.","https:\u002F\u002Fgithub.com\u002Fkiloloop\u002Foacp-skills\u002Fblob\u002Fmain\u002Fskills\u002Fself-improve\u002Fcodex\u002FSKILL.md",[],[193,167,161,194,156,195,196,197,198,199,200,201,152,41,44,202,203,204,47,155],"self improve","project","release","audit","Budget","system","edit","context","generated","drift","memories","operating"]