opencode-skills-collection 4.0.45 → 4.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +25 -1
  2. package/bundled-skills/agy-delegate/SKILL.md +168 -0
  3. package/bundled-skills/agy-delegate/references/dispatch-and-poll.md +140 -0
  4. package/bundled-skills/agy-delegate/references/multi-task-queues.md +59 -0
  5. package/bundled-skills/agy-delegate/references/review-and-land.md +103 -0
  6. package/bundled-skills/agy-delegate/references/writing-the-brief.md +124 -0
  7. package/bundled-skills/aider-delegate/SKILL.md +227 -0
  8. package/bundled-skills/aider-delegate/references/dispatch-and-poll.md +154 -0
  9. package/bundled-skills/aider-delegate/references/multi-task-queues.md +68 -0
  10. package/bundled-skills/aider-delegate/references/review-and-land.md +101 -0
  11. package/bundled-skills/aider-delegate/references/writing-the-brief.md +142 -0
  12. package/bundled-skills/babysit-pr/SKILL.md +343 -0
  13. package/bundled-skills/claude-delegate/SKILL.md +182 -0
  14. package/bundled-skills/claude-delegate/references/dispatch-and-poll.md +220 -0
  15. package/bundled-skills/claude-delegate/references/multi-task-queues.md +66 -0
  16. package/bundled-skills/claude-delegate/references/review-and-land.md +117 -0
  17. package/bundled-skills/claude-delegate/references/writing-the-brief.md +158 -0
  18. package/bundled-skills/cline-delegate/SKILL.md +140 -0
  19. package/bundled-skills/cline-delegate/references/dispatch-and-poll.md +142 -0
  20. package/bundled-skills/cline-delegate/references/multi-task-queues.md +58 -0
  21. package/bundled-skills/cline-delegate/references/review-and-land.md +80 -0
  22. package/bundled-skills/cline-delegate/references/writing-the-brief.md +129 -0
  23. package/bundled-skills/codex-delegate/SKILL.md +177 -0
  24. package/bundled-skills/codex-delegate/references/dispatch-and-poll.md +161 -0
  25. package/bundled-skills/codex-delegate/references/multi-task-queues.md +66 -0
  26. package/bundled-skills/codex-delegate/references/review-and-land.md +126 -0
  27. package/bundled-skills/codex-delegate/references/writing-the-brief.md +125 -0
  28. package/bundled-skills/commandcode-delegate/SKILL.md +188 -0
  29. package/bundled-skills/commandcode-delegate/references/dispatch-and-poll.md +222 -0
  30. package/bundled-skills/commandcode-delegate/references/multi-task-queues.md +81 -0
  31. package/bundled-skills/commandcode-delegate/references/review-and-land.md +144 -0
  32. package/bundled-skills/commandcode-delegate/references/writing-the-brief.md +147 -0
  33. package/bundled-skills/copilot-delegate/SKILL.md +159 -0
  34. package/bundled-skills/copilot-delegate/references/dispatch-and-poll.md +143 -0
  35. package/bundled-skills/copilot-delegate/references/multi-task-queues.md +58 -0
  36. package/bundled-skills/copilot-delegate/references/review-and-land.md +80 -0
  37. package/bundled-skills/copilot-delegate/references/writing-the-brief.md +140 -0
  38. package/bundled-skills/cursor-delegate/SKILL.md +170 -0
  39. package/bundled-skills/cursor-delegate/references/dispatch-and-poll.md +162 -0
  40. package/bundled-skills/cursor-delegate/references/multi-task-queues.md +59 -0
  41. package/bundled-skills/cursor-delegate/references/review-and-land.md +93 -0
  42. package/bundled-skills/cursor-delegate/references/writing-the-brief.md +126 -0
  43. package/bundled-skills/debate-review/SKILL.md +85 -0
  44. package/bundled-skills/debate-review/assets/prompts/review-debate.md +51 -0
  45. package/bundled-skills/debate-review/assets/prompts/review-main.md +64 -0
  46. package/bundled-skills/debate-review/assets/prompts/review-rebuttal.md +42 -0
  47. package/bundled-skills/debate-review/references/comment-format.md +63 -0
  48. package/bundled-skills/debate-review/references/schema.md +95 -0
  49. package/bundled-skills/delegate-setup/SKILL.md +215 -0
  50. package/bundled-skills/delegate-setup/references/schema.md +100 -0
  51. package/bundled-skills/delegate-setup/references/setup-dialogue.md +101 -0
  52. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  53. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  54. package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
  55. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  56. package/bundled-skills/docs/users/aas-core.md +1 -1
  57. package/bundled-skills/docs/users/bundles.md +1 -1
  58. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  59. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  60. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  61. package/bundled-skills/docs/users/usage.md +3 -3
  62. package/bundled-skills/docs/users/visual-guide.md +4 -4
  63. package/bundled-skills/falsify/SKILL.md +263 -0
  64. package/bundled-skills/falsify/references/bias-catalog.md +42 -0
  65. package/bundled-skills/falsify/references/mental-models.md +135 -0
  66. package/bundled-skills/falsify/templates/thinking-ledger.md +104 -0
  67. package/bundled-skills/graceful-shutdown/SKILL.md +379 -0
  68. package/bundled-skills/grok-delegate/SKILL.md +179 -0
  69. package/bundled-skills/grok-delegate/references/dispatch-and-poll.md +171 -0
  70. package/bundled-skills/grok-delegate/references/multi-task-queues.md +67 -0
  71. package/bundled-skills/grok-delegate/references/review-and-land.md +130 -0
  72. package/bundled-skills/grok-delegate/references/writing-the-brief.md +119 -0
  73. package/bundled-skills/kimi-delegate/SKILL.md +137 -0
  74. package/bundled-skills/kimi-delegate/references/dispatch-and-poll.md +134 -0
  75. package/bundled-skills/kimi-delegate/references/multi-task-queues.md +58 -0
  76. package/bundled-skills/kimi-delegate/references/review-and-land.md +92 -0
  77. package/bundled-skills/kimi-delegate/references/writing-the-brief.md +132 -0
  78. package/bundled-skills/omp-delegate/SKILL.md +186 -0
  79. package/bundled-skills/omp-delegate/references/dispatch-and-poll.md +155 -0
  80. package/bundled-skills/omp-delegate/references/multi-task-queues.md +59 -0
  81. package/bundled-skills/omp-delegate/references/review-and-land.md +95 -0
  82. package/bundled-skills/omp-delegate/references/writing-the-brief.md +149 -0
  83. package/bundled-skills/opencode-delegate/SKILL.md +189 -0
  84. package/bundled-skills/opencode-delegate/references/dispatch-and-poll.md +156 -0
  85. package/bundled-skills/opencode-delegate/references/multi-task-queues.md +68 -0
  86. package/bundled-skills/opencode-delegate/references/review-and-land.md +125 -0
  87. package/bundled-skills/opencode-delegate/references/writing-the-brief.md +142 -0
  88. package/bundled-skills/pi-delegate/SKILL.md +148 -0
  89. package/bundled-skills/pi-delegate/references/dispatch-and-poll.md +146 -0
  90. package/bundled-skills/pi-delegate/references/multi-task-queues.md +59 -0
  91. package/bundled-skills/pi-delegate/references/review-and-land.md +95 -0
  92. package/bundled-skills/pi-delegate/references/writing-the-brief.md +132 -0
  93. package/bundled-skills/qoder-delegate/SKILL.md +151 -0
  94. package/bundled-skills/qoder-delegate/references/dispatch-and-poll.md +119 -0
  95. package/bundled-skills/qoder-delegate/references/multi-task-queues.md +43 -0
  96. package/bundled-skills/qoder-delegate/references/review-and-land.md +66 -0
  97. package/bundled-skills/qoder-delegate/references/writing-the-brief.md +85 -0
  98. package/bundled-skills/sandbase-mcp/SKILL.md +194 -0
  99. package/bundled-skills/ui-slop-score/SKILL.md +2 -2
  100. package/bundled-skills/unsloth-finetuning/SKILL.md +352 -0
  101. package/bundled-skills/vibe-delegate/SKILL.md +147 -0
  102. package/bundled-skills/vibe-delegate/references/dispatch-and-poll.md +144 -0
  103. package/bundled-skills/vibe-delegate/references/multi-task-queues.md +59 -0
  104. package/bundled-skills/vibe-delegate/references/review-and-land.md +87 -0
  105. package/bundled-skills/vibe-delegate/references/writing-the-brief.md +131 -0
  106. package/bundled-skills/warp-delegate/SKILL.md +192 -0
  107. package/bundled-skills/warp-delegate/references/dispatch-and-poll.md +163 -0
  108. package/bundled-skills/warp-delegate/references/multi-task-queues.md +80 -0
  109. package/bundled-skills/warp-delegate/references/review-and-land.md +123 -0
  110. package/bundled-skills/warp-delegate/references/writing-the-brief.md +105 -0
  111. package/bundled-skills/zcode-delegate/SKILL.md +202 -0
  112. package/bundled-skills/zcode-delegate/references/dispatch-and-poll.md +113 -0
  113. package/bundled-skills/zcode-delegate/references/multi-task-queues.md +87 -0
  114. package/bundled-skills/zcode-delegate/references/review-and-land.md +81 -0
  115. package/bundled-skills/zcode-delegate/references/writing-the-brief.md +120 -0
  116. package/package.json +1 -1
  117. package/skills_index.json +660 -0
@@ -0,0 +1,101 @@
1
+ # Review and land
2
+
3
+ Aider's report is a claim. Your review is the verification. The relay hands you a working tree and a
4
+ report; deciding whether that work is correct, and committing it, is the part you do not delegate.
5
+
6
+ ## Check tests before trusting gates
7
+
8
+ Before believing "all tests pass", confirm the suite actually ran something. A pytest run that
9
+ collected zero items, a jest run that matched no files, and a green suite are three different things
10
+ that can look alike in a summary. Check the counts.
11
+
12
+ The same applies to a gate Aider chose for itself. If the brief named `python -m pytest tests/` and the
13
+ report shows `pytest tests/test_window.py`, that is a narrower gate than you asked for.
14
+
15
+ ## Aider's lint is not your gates
16
+
17
+ Aider's `--auto-lint` is on by default: after editing, it runs a linter and may fix its own
18
+ complaints, which produces edits that no brief asked for. That is Aider's lint, not your gates. Run
19
+ yours, and read the lint-driven edits as part of the diff.
20
+
21
+ ## Re-run the gates yourself
22
+
23
+ Run the project's real commands in the working tree, yourself, and read the output. Not because the
24
+ implementer lies, but because "I ran the tests" and "the tests pass in this tree right now" are
25
+ different statements, and only the second one is what you are about to commit.
26
+
27
+ If a gate fails, that is a rework loop (below), not a reason to commit and fix forward.
28
+
29
+ ## Read the diff against the brief
30
+
31
+ Start with `touchedFiles` in `result.json`, then read the actual diff:
32
+
33
+ - Every changed file should map to something the brief asked for.
34
+ - Anything in the `DO NOT TOUCH` list that moved is a stop.
35
+ - A file you did not expect is worth understanding before it lands - Aider builds a repo map and can
36
+ pull in files you did not scope.
37
+ - Aider's own bookkeeping appears in the tree - `.aider.chat.history.md`, `.aider.input.history`, and
38
+ a `.aider.tags.cache.v*/` directory. Because the relay passes `--no-gitignore`, these show up as
39
+ untracked entries in `touchedFiles` rather than being hidden by a `.gitignore` Aider wrote itself.
40
+ They are not part of the change; do not commit them. Aider writes them under `--dry-run` too, so the
41
+ relay excludes them when deciding whether a read-only run misbehaved.
42
+
43
+ ## The implementer sweep
44
+
45
+ Things worth checking specifically after a delegated run:
46
+
47
+ - **Dangling references.** After a rename or removal, grep for the old name across the repo,
48
+ including docs, config, and generated code.
49
+ - **Round-trip migrations.** A migration that applies is half-verified; roll it back too.
50
+ - **Silent scope creep.** Refactors "while I was in there" are defensible and still need surfacing.
51
+ - **Tests that assert the implementation.** A test written against the code just written can pass
52
+ while the behavior is wrong. Read new tests as carefully as new code.
53
+ - **Swallowed errors.** A `try`/`except` added around the thing the brief asked to fail loudly.
54
+
55
+ ## The commit boundary
56
+
57
+ **Aider edits the working tree; you commit.** The relay disables Aider's auto-commit and dirty-commit
58
+ defaults precisely so this boundary exists, and it never runs `git commit` itself.
59
+
60
+ Commit only when:
61
+
62
+ 1. The gates pass in the tree you are looking at.
63
+ 2. The diff matches the brief.
64
+ 3. Anything unasked-for has been surfaced to the human or reverted.
65
+
66
+ Write the commit message yourself, describing the change as it landed. Aider's report describes what
67
+ it believed it did.
68
+
69
+ If the working tree was dirty before the run, separate your commit from the pre-existing changes -
70
+ `git add -p` or explicit paths, never `git add -A` on a tree you did not start clean.
71
+
72
+ ## Rework: send the delta
73
+
74
+ When the gates fail or the diff misses the brief, do not hand-patch the result and call it delegated -
75
+ you lose the record of what the implementer actually produced. Re-dispatch:
76
+
77
+ ```bash
78
+ node "<skill-dir>/scripts/relay.mjs" --brief delta.txt --cd /path/to/repo --resume-last
79
+ ```
80
+
81
+ `--resume-last` restores Aider's chat history for the repository, so the delta brief should say only
82
+ what to change now - the failing gate output, the specific correction. Do not resend the original
83
+ brief.
84
+
85
+ Because that history lives in the repo (`.aider.chat.history.md`), resume is per-worktree. A fresh
86
+ clone, or a different checkout of the same project, has nothing to resume; send a full brief there.
87
+
88
+ Review the rework the same way. A second run is not more trustworthy than the first.
89
+
90
+ ## Surface, do not absorb
91
+
92
+ Once the human has opted into delegation, committing verified, gate-passing work is the agreed
93
+ contract - you do not need to ask again for each task. Two things still go back to them:
94
+
95
+ - **Design decisions the brief did not specify.** Aider chose a name, a structure, an approach. Say
96
+ so, briefly, in your report.
97
+ - **Defensible-but-unasked turns.** The extra refactor, the added helper, the reformatted file.
98
+
99
+ And one thing stops the loop entirely: **a scope change**. If completing the task correctly requires
100
+ going beyond the brief - touching a `DO NOT TOUCH` file, changing a public interface, adding a
101
+ dependency - ask. Do not expand the mandate on the implementer's behalf.
@@ -0,0 +1,142 @@
1
+ # Writing the brief
2
+
3
+ The brief is the whole contract. Aider sees the text you send plus the files in its editing scope -
4
+ nothing else. No chat history, no shared context, none of the reasoning that led you here. Anything
5
+ you leave implicit, Aider will decide for itself.
6
+
7
+ Write it as if for a competent contractor who has never seen the project.
8
+
9
+ ## Model choice and resumed runs
10
+
11
+ Aider uses its own configured model unless you pass `--model <name>`. For an OpenAI-compatible
12
+ endpoint, pair it with `--api-base <url>`; a local server usually still needs a placeholder
13
+ `OPENAI_API_KEY` in the environment because the client requires the header.
14
+
15
+ On a resumed run (`--resume-last`), Aider restores its chat history for the repository, so send only
16
+ the **delta** - what to change now, not the original brief again. That history lives in the repo
17
+ (`.aider.chat.history.md`), so it is per-worktree: a fresh clone resumes nothing.
18
+
19
+ ## The shape that works
20
+
21
+ ```
22
+ GOAL
23
+ One sentence. What is true when this is done.
24
+
25
+ CONTEXT
26
+ Where the code lives, what currently happens, why it is wrong.
27
+ Point at the files that matter. Name the ones you already ruled out.
28
+
29
+ CHANGE
30
+ The specific edits you want, in order. Be concrete about names and
31
+ signatures you have already decided; say "your call" where you have not.
32
+
33
+ DO NOT TOUCH
34
+ Files, modules, behaviors, and public interfaces that must not move.
35
+ Migrations, generated files, and vendored code belong here by default.
36
+
37
+ GATES
38
+ The project's real commands. Aider should run these and report results.
39
+
40
+ REPORT
41
+ What to tell me when done (see below).
42
+ ```
43
+
44
+ ## Scope the files explicitly
45
+
46
+ Aider builds a repo map and pulls in files it thinks are relevant, which is useful for discovery and
47
+ risky for a bounded task. Two relay flags aim the run:
48
+
49
+ - `--file <path>` puts a file in Aider's **editing** scope. Repeatable.
50
+ - `--read <path>` supplies a file as **read-only context**. Repeatable.
51
+
52
+ Use `--read` for the interface, schema, or example the change must conform to, and `--file` for what
53
+ should actually change. `--subtree-only` restricts Aider to the current subtree of the repository.
54
+
55
+ **These are chat-context controls, not a security boundary.** They decide what Aider starts with, and
56
+ what you pay for in tokens - they do not confine what the run can reach. Aider has no sandbox, the
57
+ relay dispatches it with `--yes-always`, and a run that decides it needs another file is not stopped
58
+ by their absence. Treat them as aim, not as a fence. When a change genuinely must not be able to touch
59
+ something, the boundary has to come from outside Aider: a container, a VM, or a throwaway
60
+ `git worktree` holding only what the task may see.
61
+
62
+ Scoping the dispatch also does not replace a `DO NOT TOUCH` section - state the boundary in the brief
63
+ too, because the brief is what Aider reasons about, and then verify it in the diff rather than
64
+ assuming it held.
65
+
66
+ ## Always ask for the report explicitly
67
+
68
+ Aider will not volunteer a structured summary. Ask for one:
69
+
70
+ ```
71
+ REPORT
72
+ - What you changed, file by file, and why.
73
+ - Which gates you ran and their exact output.
74
+ - Anything you decided that I did not specify.
75
+ - Anything you could not do, and what blocked you.
76
+ ```
77
+
78
+ ## Discover the real gates
79
+
80
+ Read the project's config before writing the brief - `package.json` scripts, `Makefile`, `noxfile.py`,
81
+ `pyproject.toml`, the CI workflow. Name the actual commands. A brief that says "run the tests" against
82
+ a project whose suite needs a service container produces a confident report and no verification.
83
+
84
+ Aider's own `--auto-lint` runs a linter after edits by default; that is Aider's lint, not your gates.
85
+ State your gates anyway.
86
+
87
+ ## Honor repo conventions
88
+
89
+ If the project has a `CONVENTIONS.md`, a style guide, or a `CLAUDE.md`/`AGENTS.md`, pass it with
90
+ `--read` and say in the brief that it is binding. Aider follows conventions it can see.
91
+
92
+ ## One task per brief
93
+
94
+ One goal per dispatch. Bundled tasks produce a diff you cannot review cleanly, and a failure in one
95
+ half strands the other. Queue them instead - see
96
+ [multi-task-queues.md](multi-task-queues.md).
97
+
98
+ ## Premises freeze at dispatch
99
+
100
+ Everything you assert in the brief is frozen the moment you dispatch. If you learn something that
101
+ changes the premises while the run is in flight - a gate command was wrong, an interface moved - do
102
+ not let the run land on a false basis. Stop it, or discard the result and re-dispatch with the
103
+ corrected brief.
104
+
105
+ ## A worked example
106
+
107
+ ```
108
+ GOAL
109
+ `parse_window()` should reject a negative duration instead of silently
110
+ clamping it to zero.
111
+
112
+ CONTEXT
113
+ src/chronal/window.py, parse_window() around line 40. It currently does
114
+ max(0, seconds), which turns "-5m" into a zero-length window and makes the
115
+ scheduler fire immediately. Callers in src/chronal/schedule.py assume a
116
+ positive window.
117
+
118
+ CHANGE
119
+ - Raise ValueError("window must be positive") for a non-positive duration.
120
+ - Leave the parsing of the h/m/s string itself alone.
121
+ - Update the two call sites in schedule.py to let the error propagate;
122
+ do not add a try/except that swallows it.
123
+
124
+ DO NOT TOUCH
125
+ - The duration grammar or its regex.
126
+ - Anything under migrations/ or tests/fixtures/.
127
+
128
+ GATES
129
+ - python -m pytest tests/test_window.py tests/test_schedule.py
130
+ - python -m ruff check src/
131
+
132
+ REPORT
133
+ File-by-file summary, exact gate output, decisions I did not specify,
134
+ and anything you could not do.
135
+ ```
136
+
137
+ ## Brief delivery
138
+
139
+ The relay writes your brief to `brief.txt` in the run directory and passes it to Aider with
140
+ `--message-file`. It never rides argv, so there is no process-list exposure and no OS argument size
141
+ cap to work around: a long brief is fine. Large *context* still belongs in files Aider reads, not
142
+ inlined into the brief.
@@ -0,0 +1,343 @@
1
+ ---
2
+ name: babysit-pr
3
+ description: 'Babysit a pull request through its bot review rounds: verify, fix, reply,
4
+ resolve. Use for any babysit or watch-the-PR ask.'
5
+ risk: safe
6
+ category: code-quality
7
+ source: https://github.com/amElnagdy/review-skills
8
+ source_repo: amElnagdy/review-skills
9
+ source_type: community
10
+ date_added: '2026-08-26'
11
+ license: MIT
12
+ license_source: https://github.com/amElnagdy/review-skills/blob/master/LICENSE
13
+ compatibility: Requires `gh` (GitHub) or `glab` (GitLab) authenticated, plus `jq`
14
+ and bash for the thread harvester.
15
+ metadata:
16
+ version: 0.1.0
17
+ ---
18
+ # Babysit a PR
19
+
20
+ ## When to Use
21
+
22
+ - A PR/MR has accumulated bot review threads that need verification, fixes, replies, and resolution.
23
+ - You want to drive a PR from 'just opened' to 'nothing left unanswered' across multiple review rounds.
24
+
25
+ Goal: carry a pull request (GitHub) or merge request (GitLab) from "just opened" to "nothing left
26
+ unanswered," without the human having to sit and refresh the page. "PR" below means either.
27
+
28
+ Review bots are diff-anchored samplers. Every push mints a fresh round, and a fix in one place can
29
+ light up commentary somewhere adjacent. Left alone, a PR accumulates half-answered threads that
30
+ nobody resolves, and the real bug in round three gets buried under nitpicks from rounds one and two.
31
+ Your job is to be the person who reads every finding, decides what is actually true, fixes what
32
+ blocks, and closes every loop in writing.
33
+
34
+ You know how to drive `gh` (GitHub), `glab` (GitLab), and git. What follows is only the judgment this
35
+ loop needs and the few API calls that are easy to get wrong. The harvest script picks the forge from
36
+ the cwd's git origin; everything it returns has the same shape on both, with a `capabilities` block
37
+ naming what that forge cannot tell you.
38
+
39
+ ## The three rules that matter most
40
+
41
+ Verify before you believe. A bot's severity badge is a guess made without running anything. Treat
42
+ every finding, including the P1s, as a claim to check against the code. Bots are frequently right
43
+ (that is why this loop is worth running), and they are also confidently wrong often enough that
44
+ shipping their suggestions unexamined will introduce bugs. Read the actual code path before you
45
+ agree or disagree.
46
+
47
+ Every thread gets an answer. A finding you fixed, rejected, or deferred is only closed once you have
48
+ said so in that thread and resolved it. Silence reads as "ignored" to the next human who opens the
49
+ PR, and it is how a real bug gets lost.
50
+
51
+ Publish before you answer. A "fixed" reply is only true once the remote branch carries the fix.
52
+ Never post a confirmed reply, or resolve its thread, while the fix exists only locally. Rejections
53
+ need no push. Reply with evidence and resolve immediately.
54
+
55
+ ## Harvest the round
56
+
57
+ Findings arrive on two different surfaces, and a round that reads only one silently misses half of
58
+ them. This is the single most common way a babysit loop goes wrong:
59
+
60
+ - Inline review threads. This is where debate-review and Codex post their findings (Codex attaches
61
+ P1/P2-badged inline comments to an otherwise boilerplate review body; an empty-looking body proves
62
+ nothing). Each thread carries a `thread_id` (to resolve) and a `reply_to` (to reply inside the
63
+ thread). On GitHub these are GraphQL review threads; on GitLab they are discussions.
64
+ - Top-level review bodies. This is where Greptile summarizes, Codex sometimes posts a numbered list,
65
+ and debate-review posts its round summary. These have no thread to resolve; answer them with one PR
66
+ comment per round. On GitHub they are review objects; on GitLab they are plain notes.
67
+
68
+ The bundled script returns both in one call, already correlated (`<skill-dir>` is the folder that
69
+ holds this SKILL.md):
70
+
71
+ ```bash
72
+ "<skill-dir>/scripts/threads.sh" <N> > /tmp/pr-<N>-round-<k>.json
73
+ ```
74
+
75
+ Never trust a filtered count without its unfiltered twin. Before applying any jq filter to the
76
+ harvest, print the raw totals (`jq '{threads: (.threads|length), reviews: (.reviews|length)}'`) and
77
+ compare. A filter that eliminates 100% of items is presumed broken until the field names are
78
+ verified against the actual schema (`jq '.threads[0] | keys'`). jq selects on a misspelled field
79
+ fail silently-empty, and a "clean round" built on one is how a P1 gets a merge-gate mention posted
80
+ over it. That has happened. GitHub tooling fails by returning less data, not by erroring; pair this with the
81
+ pagination rule.
82
+
83
+ Never describe an object you did not fetch. If a query for a specific id returns empty, that is a
84
+ stop signal. Say "I can't see it" and fetch it another way (`gh api .../reviews/<id>`), never narrate
85
+ its presumed content. Related trap: every inline thread reply arrives wrapped in a zero-byte
86
+ `COMMENTED` review object, so a watcher's "new review" event may be just a reply wrapper, not a new
87
+ round. threads.sh's `.reviews` does not include these wrappers, so a review id from an event that is
88
+ missing from the harvest means "wrapper", not "gone".
89
+
90
+ Diff it against the previous round's file to see what is genuinely new. `outdated: true` on a thread
91
+ means the line moved underneath it. The finding may already be fixed, so check it against current
92
+ code before spending the round on it. A `comment_count` bump on a thread you already handled means a
93
+ bot followed up inside it.
94
+
95
+ Has this reviewer seen the current push? Only trust a field that names a sha. On GitHub each review
96
+ carries `commit_id`; compare it to `head`. For debate-review on either forge, the round body's
97
+ `debate_head` is the sha it reviewed. On GitLab other reviewers' notes carry no sha (`capabilities.
98
+ review_commit_id: false`); a note's timestamp being later than your push does not prove it reviewed
99
+ that push, so say "coverage unknown" rather than guessing.
100
+
101
+ Two kinds of author count as a reviewer. First, a bot: `author_bot: true` in the harvest. On GitHub
102
+ that comes from the API's own author type and is reliable (`chatgpt-codex-connector` and
103
+ `greptile-apps` are the usual ones; don't hardcode a whitelist). On GitLab the API only sometimes
104
+ says, so `author_bot` can be `null`; treat `null` as unknown, look at the thread, and say in your
105
+ report that you could not confirm it. Second, any thread whose first comment carries a
106
+ `<!-- debate-review:... -->` marker. debate-review posts from the user's own account, so the author
107
+ is the PR author (`author_is_pr_author: true`), but the thread is a reviewer thread. The harvest
108
+ flags these as `debate_review: true` with `debate_id`, `debate_status`, and `debate_severity` parsed
109
+ from the marker; its round body shows up in `.reviews` with `debate_head` (the sha it reviewed) and
110
+ `debate_agreed` / `debate_contested`. Treat them like any other bot thread. Anything else from the PR
111
+ author, and any human's comment without that marker, is never in scope for autonomous fixing.
112
+ Surface it to the user instead.
113
+
114
+ Bots post 5 to 10 minutes after a push, longer on a big diff. Don't poll tightly; background the wait
115
+ and review the diff yourself meanwhile. A round is "in" once every reviewer you expect has either
116
+ posted against the current head SHA or been marked unavailable after its own wait budget. An
117
+ unavailable reviewer never blocks harvesting or acting on the ones that did post. Disclose the gap
118
+ instead of reporting the PR clean.
119
+
120
+ ## Classify by real impact, not by badge
121
+
122
+ After verifying a finding, sort it by consequence rather than by the label the bot attached.
123
+
124
+ Blocking, meaning it would ship a defect or stop the merge:
125
+ - a real bug, wrong behavior, or broken edge case in the changed code
126
+ - security, authorization, data-integrity, or data-loss exposure
127
+ - a violation of the change's own stated contract, acceptance criteria, or spec
128
+ - a migration or schema hazard
129
+ - a failing or newly-flaky check
130
+
131
+ Non-blocking, meaning real but ships nothing broken: naming, structure, docs, test nitpicks, micro
132
+ performance, "consider extracting this", style preference.
133
+
134
+ When a finding is genuinely ambiguous, hold it as blocking until you have read enough code to demote
135
+ it. The asymmetry is deliberate. An over-cautious fix costs minutes, a missed P1 costs a production
136
+ bug.
137
+
138
+ A debate-review thread with `debate_status: contested` means two models looked and disagreed. The
139
+ main reviewer held the finding against a refutation, and the italic last line of the comment says
140
+ what the challenge was. That is a claim with a known counter-argument, not a weaker claim. Verify it
141
+ the same way, and say in your reply which side the code supports and why.
142
+
143
+ ## Fix the blockers, autonomously
144
+
145
+ Don't stop to ask about blockers. Verify, fix, push, keep watching, report what you did.
146
+
147
+ - Reproduce first where you can. A probe that fails before the fix and passes after is what separates
148
+ a real fix from a plausible edit. This matters most on findings you initially disagreed with. Those
149
+ are the ones where being wrong is expensive.
150
+ - One push per round, not one per finding. Every push mints a new bot round, so per-finding pushes
151
+ multiply the rounds you have to sit through.
152
+ - Run the repo's own gate before pushing. A fix that breaks the suite costs a whole extra round.
153
+ - If a matching guard skill is installed (clean-code-guard, test-guard, wp-guard, woo-guard from
154
+ guard-skills), run it on your fix before pushing. The guards catch the failure modes a quick fix
155
+ under review pressure tends to produce.
156
+ - When you disagree, prove it. Rejecting a finding is legitimate and common, but the reply has to
157
+ carry the evidence: the code path, the guard that already handles it, or the test that pins the
158
+ behavior. "This is fine" is not a rejection.
159
+
160
+ ## Publish, then reply, then resolve
161
+
162
+ Work the round in one pass, not per finding: verify everything, reproduce confirmed blockers where
163
+ practical, fix them all, run the gate, then commit and push once and confirm the remote SHA. Only
164
+ then close the loops:
165
+
166
+ - Confirmed: reply naming the fix commit, then resolve.
167
+ - Rejected: reply with concrete evidence, then resolve. No push needed; these can close anytime.
168
+ - Deferred: create the agreed issue, reply with its link, then resolve.
169
+
170
+ Non-blocker fixes the user approves ride the next consolidated push, never a dedicated push of their
171
+ own. There is no re-review-exempt push: every push, including a final docs-only or nit-only one, must
172
+ be covered by a clean round from the merge-gate reviewer before merge (see "Before merge"). If
173
+ publication or verification fails, leave the thread open and report the blocker.
174
+
175
+ Answer inside the thread the finding came from. A fresh top-level comment leaves the original thread
176
+ open and forces the reader to correlate by hand. Use the harvest's `reply_to` to reply and `thread_id`
177
+ to resolve. On GitHub those are two different identifiers (REST comment id, GraphQL thread id); on
178
+ GitLab both are the discussion id.
179
+
180
+ GitHub:
181
+
182
+ ```bash
183
+ gh api --method POST "repos/<owner>/<repo>/pulls/<N>/comments/<reply_to>/replies" \
184
+ -f body="$(cat /tmp/reply.md)"
185
+
186
+ gh api graphql -f query='mutation($t:ID!){
187
+ resolveReviewThread(input:{threadId:$t}){ thread{ isResolved } } }' -F t="<thread_id>"
188
+ ```
189
+
190
+ GitLab (`<project>` is the URL-encoded `group/path`, `--hostname` your instance):
191
+
192
+ ```bash
193
+ glab api --hostname <host> --method POST "projects/<project>/merge_requests/<N>/discussions/<reply_to>/notes" \
194
+ --raw-field "body=$(cat /tmp/reply.md)"
195
+
196
+ glab api --hostname <host> --method PUT "projects/<project>/merge_requests/<N>/discussions/<thread_id>" \
197
+ -F resolved=true
198
+ ```
199
+
200
+ The GitLab reply and resolve calls are taken from the GitLab API docs and have not yet been exercised
201
+ against a live instance from this skill. The first time you use them, check the response, and if
202
+ either fails, stop and report rather than retrying variations.
203
+
204
+ Attribution. Open every reply by naming the model writing it and the person it writes for, so a
205
+ reader never has to guess whether a human weighed in. Sign your own model name; this skill is
206
+ model-neutral. The person is whoever owns the account the reply posts from. Get the name once per
207
+ session, `gh api user -q '.name // .login'` on GitHub or `glab api user --hostname <host> | jq -r
208
+ '.name // .username'` on GitLab, and reuse it:
209
+
210
+ > I am \<model-slug\> writing on behalf of \<user\>.
211
+
212
+ Then the verdict, then the evidence, briefly:
213
+
214
+ ```
215
+ I am <model-slug> writing on behalf of <user>.
216
+
217
+ Confirmed and fixed in `a1b2c3d`. You were right that `occurrence_time` was never
218
+ compared against `evidence.event_time`, so a mapping could bind proof from a
219
+ different occurrence. Reproduced with a failing test first
220
+ (`test_binds_proof_to_mapped_occurrence`), then fixed the composition check.
221
+ ```
222
+
223
+ ```
224
+ I am <model-slug> writing on behalf of <user>.
225
+
226
+ Declining this one. The nil case you describe is already unreachable. `resolve()`
227
+ returns early at `handlers.py:88` whenever the session is unset, which is the only
228
+ path that reaches this line. Leaving the behavior as-is.
229
+ ```
230
+
231
+ Resolve only what is actually closed: fixed and pushed, rejected with evidence, or deferred with an
232
+ issue filed. Never resolve a thread whose question you have not answered. Resolution claims the loop
233
+ is closed, and a false claim is worse than an open thread.
234
+
235
+ ## Non-blockers: one batched ask per round
236
+
237
+ Don't interrupt per finding, and don't silently decide. Once per round, after the blockers are
238
+ handled, bring the non-blocking findings as one list with a recommendation each (fix now, open an
239
+ issue, or reject) and let the user choose:
240
+
241
+ > Round 2 on PR #123. 1 blocker fixed and pushed (`a1b2c3d`). Three non-blocking findings left:
242
+ > 1. debate-review: extract the duplicated fixture in `test_foo.py`. Recommend issue, touches
243
+ > files outside this change
244
+ > 2. Codex: `Counter` comparison could use `==` directly. Recommend fix now, one line
245
+ > 3. Greptile: docstring missing on the new helper. Recommend fix now, trivial
246
+ > Fix 2 and 3 in the next push, issue for 1?
247
+
248
+ Whatever they decide, close each thread the same way as any other finding. Anything deferred gets a
249
+ real issue with enough context to act on months later: a link back to the thread, the file, and why
250
+ it was deferred. Not just a title.
251
+
252
+ ## Re-trigger within a fixed budget
253
+
254
+ One invocation gets the initial harvest plus at most two consolidated repair pushes and two
255
+ re-review cycles unless the user explicitly asks to continue. After each push you start the next
256
+ round yourself. How depends on the reviewer, because they are triggered in three different ways:
257
+
258
+ - debate-review is a local script, not a bot, and it works on both forges. You run it, it does the
259
+ whole review while you wait, and it exits once the review is posted. Nothing to mention, nothing
260
+ to poll:
261
+
262
+ ```bash
263
+ node "<debate-review skill-dir>/scripts/review-pr.mjs" <pr-url>
264
+ ```
265
+
266
+ (`<debate-review skill-dir>` is wherever that skill is installed, `~/.agents/skills/debate-review`
267
+ on a standard install.) Run it in the background, keep working, and harvest the moment the command
268
+ exits. It prints the review URL; exit code 3 means this head was already reviewed. It reviews
269
+ exactly one head sha per run, so a run after a push always produces a fresh round. A run takes
270
+ 10 to 20 minutes.
271
+ - Codex is a GitHub app (there is no GitLab equivalent). Mention `@codex review` in a PR comment,
272
+ then wait. It answers 8 to 15 minutes later, against whatever head was current when it ran. Check
273
+ `commit_id` on its review before believing it covers your push.
274
+ - Greptile and similar bots re-review every push on their own. Don't summon them; handle their
275
+ findings when they show up.
276
+
277
+ For a bot you are waiting on, wait at most 10 minutes past its usual window. If it is silent or
278
+ rate-limited, mark that reviewer unavailable; do not wait out a cooldown. The one exception is the
279
+ merge-gate reviewer at the merge gate, which has no timeout (see "Before merge"). Even a final
280
+ test-only, documentation-only, or nit-only push gets a round. The merge gate below is meaningless if
281
+ the last push went unreviewed.
282
+
283
+ Run the repository's required gate once per consolidated repair push; never rerun an already-passing
284
+ gate for the same SHA. If the user says "stop", "enough", or "push whatever you have", cancel active
285
+ polls and long gates, run the smallest relevant check that can finish promptly, publish the safe
286
+ work, disclose any incomplete gate, and do not trigger another review round.
287
+
288
+ Rounds should shrink. If round three is as large as round one, something systematic is wrong. Say
289
+ so rather than grinding. Findings that recur in the same shape usually mean the fix addressed a
290
+ symptom instead of the cause, which is worth surfacing.
291
+
292
+ At the budget boundary, stop and hand off the exact remaining findings, unresolved threads, last
293
+ reviewed SHA, and unavailable reviewers. Never describe an unreviewed head as clean.
294
+
295
+ ## Before merge
296
+
297
+ The merge gate is an explicit clean round from the repo's primary reviewer on the exact merge
298
+ candidate, the final head sha. Which reviewer that is depends on the repo.
299
+
300
+ Where Codex is installed, mention `@codex review` after the final push and wait for its reply. A
301
+ clean round is Codex saying so in plain words ("no findings", "good job") against the final head. No
302
+ reply yet is not a pass. Codex answers 8 to 15 minutes after a push, and merging inside that window
303
+ is how a real finding lands minutes after the merge.
304
+
305
+ Where debate-review is the reviewer (on GitLab it is usually the only one), run it on the final head.
306
+ A clean round is all three of: its round body present in `.reviews` with `debate_head` equal to the
307
+ final head sha, `debate_agreed` and `debate_contested` both zero, and no unresolved reviewer threads.
308
+ If the body is missing (a run can fail after posting inline comments), the gate has not been met;
309
+ re-run it, don't infer.
310
+
311
+ Either way, a finding is a new round, not a merge. Silence well past the usual window is something
312
+ to report to the user, not approval.
313
+
314
+ Re-harvest and re-read the PR's most recent comments before proposing a merge. A watcher settled
315
+ into a quiet interval can miss a late round, and a comment posted after your last check is exactly
316
+ the one that gets merged over.
317
+
318
+ Then ask the user whether to merge. Never merge on your own initiative. Report: rounds run,
319
+ blockers fixed with their SHAs, findings rejected and why, issues filed, unresolved threads
320
+ remaining (ideally zero), and CI state. The merge decision is theirs; everything leading to it was
321
+ yours.
322
+
323
+ ## When to stop and speak up
324
+
325
+ Some situations are not yours to grind through:
326
+
327
+ - A bot finding that is right but demands a change well beyond this PR's scope.
328
+ - Two bots contradicting each other on the same line, when code, tests, and the stated contract
329
+ cannot settle it.
330
+ - The same finding recurring after a retry. The first recurrence gets a re-verified root cause and
331
+ one more attempt inside the repair budget; a second means your model of the bug is wrong.
332
+ - A human reviewer's comment, always.
333
+ - CI failing for infrastructure reasons rather than code.
334
+ - The two-repair-cycle budget is exhausted.
335
+ - The user asks to stop, push the current work, or end the babysit loop.
336
+
337
+
338
+ ## Limitations
339
+
340
+ - Requires authenticated `gh`/`glab`, `jq` and bash; harvests threads and reviews.
341
+ - Docs-only import — executable helper (`scripts/threads.sh`) not included; see upstream for full runtime. Fixes are to PR branch only, never merges.
342
+
343
+ > Adapted from [amElnagdy/review-skills](https://github.com/amElnagdy/review-skills) (MIT) — docs-only, runtime not bundled.