claude-dev-env 2.4.0 → 2.5.0

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 (195) hide show
  1. package/CLAUDE.md +53 -49
  2. package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
  3. package/_shared/pr-loop/scripts/code_rules_gate.py +4 -2
  4. package/_shared/pr-loop/scripts/grant_project_claude_permissions.py +306 -306
  5. package/_shared/pr-loop/scripts/pr_loop_shared_constants/claude_permissions_constants.py +44 -0
  6. package/_shared/pr-loop/scripts/pr_loop_shared_constants/copilot_quota_constants.py +24 -24
  7. package/_shared/pr-loop/scripts/pr_loop_shared_constants/stale_worktree_rule_sweep_constants.py +107 -107
  8. package/_shared/pr-loop/scripts/revoke_project_claude_permissions.py +290 -48
  9. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +42 -2
  10. package/_shared/pr-loop/scripts/tests/test_claude_permissions_constants.py +36 -0
  11. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +100 -1
  12. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -497
  13. package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +311 -2
  14. package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep.py +301 -301
  15. package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep_constants.py +85 -85
  16. package/_shared/pr-loop/worker-spawn.md +1 -1
  17. package/agents/CLAUDE.md +2 -1
  18. package/agents/caveman.md +0 -1
  19. package/agents/clasp-deployment-orchestrator.md +0 -1
  20. package/agents/clean-coder.md +0 -1
  21. package/agents/code-advisor.md +0 -1
  22. package/agents/code-quality-agent.md +1 -2
  23. package/agents/code-verifier.md +0 -1
  24. package/agents/deep-research.md +0 -1
  25. package/agents/docs-agent.md +0 -1
  26. package/agents/git-commit-crafter.md +0 -1
  27. package/agents/issue-tracker.md +42 -0
  28. package/agents/plan-packet-validator.md +0 -1
  29. package/agents/pr-description-writer.md +0 -1
  30. package/agents/test_agent_frontmatter.py +67 -18
  31. package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +143 -141
  32. package/bin/CLAUDE.md +68 -5
  33. package/bin/ever-shipped-skills.mjs +1 -0
  34. package/bin/install-constants.mjs +88 -0
  35. package/bin/install.mjs +1138 -114
  36. package/bin/install.prune.test.mjs +869 -19
  37. package/bin/install.test.mjs +906 -2
  38. package/commands/implement.md +1 -1
  39. package/commands/right-size.md +1 -1
  40. package/docs/CLAUDE.md +1 -0
  41. package/docs/host-pool-health-monitor.md +102 -0
  42. package/docs/references/CLAUDE.md +4 -2
  43. package/docs/references/advisor-tool.md +13 -0
  44. package/docs/references/code-review-enforcement.md +10 -0
  45. package/docs/references/team-advisor-skill.md +14 -0
  46. package/hooks/blocking/CLAUDE.md +1 -0
  47. package/hooks/blocking/code_review_pr_create_gate.py +7 -3
  48. package/hooks/blocking/code_review_push_gate.py +9 -4
  49. package/hooks/blocking/code_review_stamp_directory_write_blocker.py +8 -0
  50. package/hooks/blocking/config/__init__.py +5 -5
  51. package/hooks/blocking/config/code_review_enforcement_constants.py +4 -1
  52. package/hooks/blocking/config/test_code_review_enforcement_constants.py +5 -0
  53. package/hooks/blocking/config/verified_commit_constants.py +160 -159
  54. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
  55. package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
  56. package/hooks/blocking/test_code_review_pr_create_gate.py +14 -0
  57. package/hooks/blocking/test_code_review_push_gate.py +16 -0
  58. package/hooks/blocking/test_code_review_stamp_directory_write_blocker.py +19 -0
  59. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +231 -0
  60. package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
  61. package/hooks/blocking/test_verdict_directory_write_blocker.py +808 -808
  62. package/hooks/blocking/test_verification_verdict_store.py +54 -0
  63. package/hooks/blocking/test_verified_commit_gate.py +581 -581
  64. package/hooks/blocking/test_verified_commit_message_accuracy_blocker.py +131 -131
  65. package/hooks/blocking/verdict_directory_write_blocker.py +687 -687
  66. package/hooks/blocking/verification_verdict_store.py +1039 -1036
  67. package/hooks/blocking/verified_commit_message_accuracy_blocker.py +167 -167
  68. package/hooks/blocking/verifier_verdict_minter.py +280 -280
  69. package/hooks/git-hooks/test_pre_push.py +25 -0
  70. package/hooks/hooks.json +10 -0
  71. package/hooks/hooks_constants/CLAUDE.md +2 -1
  72. package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
  73. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
  74. package/hooks/hooks_constants/ruff_integration_constants.py +16 -0
  75. package/hooks/lifecycle/enter_worktree_origin_prefetch.py +163 -146
  76. package/hooks/lifecycle/test_enter_worktree_origin_prefetch.py +185 -178
  77. package/hooks/pyproject.toml +1 -0
  78. package/hooks/validators/CLAUDE.md +1 -0
  79. package/hooks/validators/config/__init__.py +0 -0
  80. package/hooks/validators/config/directory_exemption_constants.py +183 -0
  81. package/hooks/validators/config/test_directory_exemption_constants.py +21 -0
  82. package/hooks/validators/conftest.py +4 -0
  83. package/hooks/validators/ruff_integration.py +49 -5
  84. package/hooks/validators/run_all_validators.py +206 -9
  85. package/hooks/validators/test_directory_exemption_constants.py +185 -0
  86. package/hooks/validators/test_python_antipattern_checks.py +110 -5
  87. package/hooks/validators/test_ruff_integration.py +92 -1
  88. package/hooks/validators/test_run_all_validators.py +115 -68
  89. package/hooks/validators/test_run_all_validators_pretooluse.py +159 -1
  90. package/package.json +10 -2
  91. package/rules/CLAUDE.md +1 -0
  92. package/rules/docstring-prose-matches-implementation.md +45 -44
  93. package/rules/state-what-is.md +25 -0
  94. package/rules/verified-commit-gate-skip.md +1 -1
  95. package/scripts/CLAUDE.md +1 -0
  96. package/scripts/Capture-PoolHealth.ps1 +410 -0
  97. package/scripts/_code_review_test_support.py +404 -0
  98. package/scripts/claude_chain_runner.py +141 -1
  99. package/scripts/conftest.py +16 -1
  100. package/scripts/dev_env_scripts_constants/CLAUDE.md +1 -1
  101. package/scripts/dev_env_scripts_constants/claude_chain_constants.py +9 -0
  102. package/scripts/resolve_worker_spawn.py +626 -626
  103. package/scripts/spawn_grok_batch.py +672 -672
  104. package/scripts/test_claude_chain_runner.py +131 -0
  105. package/scripts/test_invoke_code_review_chain.py +70 -0
  106. package/scripts/test_invoke_code_review_cli.py +192 -0
  107. package/scripts/test_invoke_code_review_contract.py +256 -0
  108. package/scripts/test_invoke_code_review_git.py +123 -0
  109. package/scripts/test_invoke_code_review_mode.py +99 -0
  110. package/scripts/test_resolve_worker_spawn.py +1014 -1014
  111. package/skills/CLAUDE.md +2 -0
  112. package/skills/auditing-claude-config/SKILL.md +114 -114
  113. package/skills/autoconverge/SKILL.md +427 -427
  114. package/skills/autoconverge/reference/convergence.md +24 -3
  115. package/skills/autoconverge/workflow/CLAUDE.md +1 -0
  116. package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +3 -3
  117. package/skills/autoconverge/workflow/converge.contract.test.mjs +1263 -1263
  118. package/skills/autoconverge/workflow/converge.mjs +167 -0
  119. package/skills/autoconverge/workflow/converge.p2-advance.test.mjs +202 -0
  120. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +2 -2
  121. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +2 -2
  122. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +2 -2
  123. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +2 -2
  124. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +2 -2
  125. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +2 -2
  126. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +2 -2
  127. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +2 -2
  128. package/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +265 -265
  129. package/skills/closeout/SKILL.md +33 -50
  130. package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +8 -0
  131. package/skills/codex-review/scripts/run_codex_review.py +233 -1
  132. package/skills/codex-review/scripts/test_run_codex_review.py +189 -0
  133. package/skills/condensing-instructions/SKILL.md +81 -0
  134. package/skills/copilot-review/SKILL.md +119 -119
  135. package/skills/e-code-review/SKILL.md +52 -0
  136. package/skills/e-code-review/reference/fix.md +54 -0
  137. package/skills/e-code-review/reference/loop.md +43 -0
  138. package/skills/e-code-review/reference/low.md +57 -0
  139. package/skills/e-code-review/reference/medium.md +153 -0
  140. package/skills/e-code-review/reference/xhigh.md +182 -0
  141. package/skills/e-simplify/SKILL.md +97 -0
  142. package/skills/issue-tracker/SKILL.md +92 -0
  143. package/skills/issue-tracker/reference/epic-and-sub-issue-model.md +55 -0
  144. package/skills/issue-tracker/reference/handoff-schema.md +64 -0
  145. package/skills/issue-tracker/reference/operation-matrix.md +41 -0
  146. package/skills/orchestrator/SKILL.md +162 -21
  147. package/skills/orchestrator/scripts/status_gate.py +625 -0
  148. package/skills/orchestrator/scripts/status_gate_constants/__init__.py +1 -0
  149. package/skills/orchestrator/scripts/status_gate_constants/config/__init__.py +1 -0
  150. package/skills/orchestrator/scripts/status_gate_constants/config/constants.py +47 -0
  151. package/skills/orchestrator/scripts/test_status_gate.py +439 -0
  152. package/skills/orchestrator-refresh/SKILL.md +110 -35
  153. package/skills/plan-to-pr/SKILL.md +155 -0
  154. package/skills/plan-to-pr/reference/final-validation-tasks.md +15 -0
  155. package/skills/plan-to-pr/reference/model-routing.md +36 -0
  156. package/skills/plan-to-pr/reference/packet-contract.md +43 -0
  157. package/skills/plan-to-pr/reference/packet-schema.json +57 -0
  158. package/skills/plan-to-pr/reference/process-inventory.md +22 -0
  159. package/skills/plan-to-pr/reference/review-loop.md +33 -0
  160. package/skills/plan-to-pr/reference/run-record.schema.json +27 -0
  161. package/skills/plan-to-pr/reference/self-audit-tasks.md +15 -0
  162. package/skills/plan-to-pr/reference/task-seeds.md +14 -0
  163. package/skills/plan-to-pr/reference/task-ticket.md +38 -0
  164. package/skills/plan-to-pr/scripts/config/__init__.py +1 -0
  165. package/skills/plan-to-pr/scripts/config/constants.py +193 -0
  166. package/skills/plan-to-pr/scripts/create_packet.py +173 -0
  167. package/skills/plan-to-pr/scripts/test_create_packet.py +102 -0
  168. package/skills/plan-to-pr/scripts/test_validate_packet.py +256 -0
  169. package/skills/plan-to-pr/scripts/test_validate_protocol.py +135 -0
  170. package/skills/plan-to-pr/scripts/test_validate_run.py +158 -0
  171. package/skills/plan-to-pr/scripts/validate_packet.py +655 -0
  172. package/skills/plan-to-pr/scripts/validate_protocol.py +622 -0
  173. package/skills/plan-to-pr/scripts/validate_run.py +173 -0
  174. package/skills/plan-to-pr/test_skill_contract.py +207 -0
  175. package/skills/plan-to-pr/test_task_ticket_contract.py +151 -0
  176. package/skills/pr-converge/SKILL.md +472 -469
  177. package/skills/pr-converge/reference/examples.md +3 -3
  178. package/skills/pr-converge/reference/fix-protocol.md +1 -1
  179. package/skills/pr-converge/reference/ground-rules.md +7 -4
  180. package/skills/pr-converge/reference/multi-pr-orchestration.md +4 -1
  181. package/skills/pr-converge/reference/per-tick.md +5 -5
  182. package/skills/pr-converge/reference/progress-checklist.md +1 -1
  183. package/skills/pr-converge/scripts/check_convergence_gates.py +279 -279
  184. package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -507
  185. package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -84
  186. package/skills/pr-converge/test_step5_host_branch.py +1 -1
  187. package/skills/pr-fix-protocol/SKILL.md +1 -1
  188. package/skills/privacy-hygiene/SKILL.md +68 -68
  189. package/skills/prototype/workflows/promotion.md +1 -1
  190. package/skills/release-notes-html/SKILL.md +164 -0
  191. package/skills/task-build/CLAUDE.md +8 -7
  192. package/skills/task-build/SKILL.md +16 -8
  193. package/skills/task-build/reference/tool-routing.md +19 -0
  194. package/scripts/test_invoke_code_review.py +0 -966
  195. package/skills/closeout/reference/issue-body-templates.md +0 -108
@@ -0,0 +1,153 @@
1
+ `medium effort → 3+5 angles → 1-vote verify`
2
+
3
+ You are reviewing for **precision** at medium effort: every finding you surface
4
+ should be one a maintainer would act on.
5
+
6
+ ## Phase 0 — Gather the diff
7
+
8
+ Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
9
+ if there's no upstream) to get the unified diff under review. If there are
10
+ uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
11
+ include the working-tree changes in scope — the review often runs before the
12
+ commit. If a PR number, branch name, or file path was passed as an argument,
13
+ review that target instead. Treat this diff as the review scope.
14
+
15
+ ## Phase 1 — Find candidates (3 correctness angles + 3 cleanup angles + 1 altitude angle + 1 conventions angle)
16
+
17
+ Run **8 independent finder angles** via the Agent tool. Each surfaces
18
+ candidate findings with `file`, `line`, a one-line `summary`, and a concrete
19
+ `failure_scenario`. If the Agent tool is not available in your current tool
20
+ set, do not error — perform each angle (and each verification) yourself,
21
+ sequentially, in this context.
22
+
23
+ ### Angle A — line-by-line diff scan
24
+
25
+ Read every hunk in the diff, line by line. Then Read the enclosing function for
26
+ each hunk — bugs in unchanged lines of a touched function are in scope (the PR
27
+ re-exposes or fails to fix them). For every line ask: what input, state, timing,
28
+ or platform makes this line wrong? Look for inverted/wrong conditions,
29
+ off-by-one, null/undefined deref, missing `await`, falsy-zero checks,
30
+ wrong-variable copy-paste, error swallowed in catch, unescaped regex metachars.
31
+
32
+ ### Angle B — removed-behavior auditor
33
+
34
+ For every line the diff DELETES or replaces, name the invariant or behavior it
35
+ enforced, then search the new code for where that invariant is re-established.
36
+ If you can't find it, that's a candidate: a removed guard, a dropped error
37
+ path, a narrowed validation, a deleted test that was covering a real case.
38
+
39
+ ### Angle C — cross-file tracer
40
+
41
+ For each function the diff changes, find its callers (Grep for the symbol) and
42
+ check whether the change breaks any call site: a new precondition, a changed
43
+ return shape, a new exception, a timing/ordering dependency. Also check callees:
44
+ does a parallel change in the same PR make a call unsafe?
45
+
46
+ ### Reuse
47
+
48
+ The angles above hunt for bugs; this one and the next two hunt for cleanup in
49
+ the changed code. Flag new code that re-implements something the codebase
50
+ already has — Grep shared/utility modules and files adjacent to the change,
51
+ and name the existing helper to call instead.
52
+
53
+ ### Simplification
54
+
55
+ Flag unnecessary complexity the diff adds: redundant or derivable state,
56
+ copy-paste with slight variation, deep nesting, dead code left behind. Name
57
+ the simpler form that does the same job.
58
+
59
+ ### Efficiency
60
+
61
+ Flag wasted work the diff introduces: redundant computation or repeated I/O,
62
+ independent operations run sequentially, blocking work added to startup or
63
+ hot paths. Also flag long-lived objects built from closures or captured
64
+ environments — they keep the entire enclosing scope alive for the object's
65
+ lifetime (a memory leak when that scope holds large values); prefer a
66
+ class/struct that copies only the fields it needs. Name the cheaper
67
+ alternative.
68
+
69
+ ### Altitude
70
+
71
+ Check that each change is implemented at the right depth, not as a fragile
72
+ bandaid. Special cases layered on shared infrastructure are a sign the fix
73
+ isn't deep enough — prefer generalizing the underlying mechanism over adding
74
+ special cases.
75
+
76
+ ### Conventions (CLAUDE.md)
77
+
78
+ Find the CLAUDE.md files that govern the changed code: the user-level
79
+ ~/.claude/CLAUDE.md, the repo-root CLAUDE.md, plus any CLAUDE.md or
80
+ CLAUDE.local.md in a directory that is an ancestor of a changed file (a
81
+ directory's CLAUDE.md only applies to files at or below it). Read each one
82
+ that exists, then check the diff for clear violations of the rules they state.
83
+
84
+ Only flag a violation when you can quote the exact rule and the exact line
85
+ that breaks it — no style preferences, no vague "spirit of the doc"
86
+ inferences. In the finding, name the CLAUDE.md path and quote the rule so the
87
+ report can cite it. If no CLAUDE.md applies, return nothing for this angle.
88
+
89
+ Cleanup, altitude, and conventions candidates use the same
90
+ `file`/`line`/`summary` shape; in `failure_scenario`, state the concrete
91
+ cost (what is duplicated, wasted, harder to maintain, or which CLAUDE.md rule
92
+ is broken) instead of a crash. Correctness bugs always outrank cleanup,
93
+ altitude, and conventions findings.
94
+
95
+ Pass every candidate with a nameable failure scenario through — finders that
96
+ silently drop half-believed candidates bypass the verify step and are the
97
+ dominant cause of misses.
98
+
99
+ ## Phase 2 — Verify (1-vote, 3-state)
100
+
101
+ Dedup candidates that point at the same line/mechanism, keeping the one with
102
+ the most concrete failure scenario. For each remaining candidate, run **one
103
+ verifier** via the Agent tool: give it the diff, the relevant
104
+ file(s), and the candidate, and have it return exactly one of:
105
+
106
+ - **CONFIRMED** — can name the inputs/state that trigger it and the wrong
107
+ output or crash. Quote the line.
108
+ - **PLAUSIBLE** — mechanism is real, trigger is uncertain (timing, env,
109
+ config). State what would confirm it.
110
+ - **REFUTED** — factually wrong (code doesn't say that) or guarded elsewhere.
111
+ Quote the line that proves it.
112
+
113
+ Keep candidates where the vote is CONFIRMED or PLAUSIBLE.
114
+
115
+ ## Output
116
+
117
+ Report this review's results — `{level, findings}` — through the structured
118
+ findings-report call: the mechanism that renders a review's results as a typed
119
+ list in the host UI, ranked most-severe first. Each entry has `file`, `line`,
120
+ `summary`, `short_summary` — the claim compressed to ≤60 characters, no
121
+ rationale or consequence clause — `failure_scenario`, and `category` — a short
122
+ kebab-case slug for the angle that produced it (`correctness`,
123
+ `simplification`, `efficiency`, `reuse`, `altitude`, `conventions`, or a more
124
+ specific slug like `test-coverage` when one fits better) — plus `verdict` when
125
+ a verify pass produced one. If nothing survives verification, make that call
126
+ with an empty array. Do not also print the findings as text, and do not create
127
+ or publish an artifact of the review — the structured call is the report.
128
+
129
+ ## Applying fixes (--fix)
130
+
131
+ The `--fix` flag was passed. Follow `reference\fix.md` (relative to this
132
+ skill's folder) for the exact fix, commit-gate, and skip-handling behavior —
133
+ it governs which agent applies each fix, how a fix gets committed, how a skip
134
+ is logged, and how outcomes get reported. Do not repeat the findings as text;
135
+ follow that document's reporting rules once fixes land.
136
+
137
+ ## If findings are fixed later
138
+
139
+ Whenever a reported finding is fixed later in this session — the user asks you
140
+ to fix it, or later work fixes it incidentally — follow `reference\fix.md`'s
141
+ reporting rules again: report the same findings through the structured
142
+ findings-report call, each carrying an `outcome`. Do not repeat the findings
143
+ as text. Make that call immediately after the fixes land, before any prose
144
+ summary; the host UI's per-finding status updates only from that call.
145
+
146
+ ## Looping (`loop`)
147
+
148
+ The `loop` arg was passed. Follow `reference\loop.md` (relative to this
149
+ skill's folder) for how to re-run Phases 0–2, Output, and (if `--fix` is also
150
+ present) `reference\fix.md`'s fix pass, repeatedly — including its exit
151
+ condition, iteration cap, and re-invocation rules. Do not treat a single pass
152
+ through this document as complete while `loop` is active; hand control to that
153
+ document instead of stopping at Output.
@@ -0,0 +1,182 @@
1
+ `xhigh effort → 5+5 angles → 1-vote verify → sweep`
2
+
3
+ You are reviewing for **recall** at extra-high effort: catch every real bug. At
4
+ this level, catching real bugs matters more than avoiding false positives — a
5
+ missed bug ships. Err on the side of surfacing.
6
+
7
+ ## Phase 0 — Gather the diff
8
+
9
+ Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
10
+ if there's no upstream) to get the unified diff under review. If there are
11
+ uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
12
+ include the working-tree changes in scope — the review often runs before the
13
+ commit. If a PR number, branch name, or file path was passed as an argument,
14
+ review that target instead. Treat this diff as the review scope.
15
+
16
+ ## Phase 1 — Find candidates (5 correctness angles + 3 cleanup angles + 1 altitude angle + 1 conventions angle)
17
+
18
+ Run **10 independent finder angles** via the Agent tool. Each surfaces
19
+ candidate findings. Do NOT let one angle's conclusions suppress another's — if
20
+ two angles flag the same line for different reasons, record both. If the Agent
21
+ tool is not available in your current tool set, do not error — perform each
22
+ angle (and each verification) yourself, sequentially, in this context.
23
+
24
+ ### Angle A — line-by-line diff scan
25
+
26
+ Read every hunk in the diff, line by line. Then Read the enclosing function for
27
+ each hunk — bugs in unchanged lines of a touched function are in scope (the PR
28
+ re-exposes or fails to fix them). For every line ask: what input, state, timing,
29
+ or platform makes this line wrong? Look for inverted/wrong conditions,
30
+ off-by-one, null/undefined deref, missing `await`, falsy-zero checks,
31
+ wrong-variable copy-paste, error swallowed in catch, unescaped regex metachars.
32
+
33
+ ### Angle B — removed-behavior auditor
34
+
35
+ For every line the diff DELETES or replaces, name the invariant or behavior it
36
+ enforced, then search the new code for where that invariant is re-established.
37
+ If you can't find it, that's a candidate: a removed guard, a dropped error
38
+ path, a narrowed validation, a deleted test that was covering a real case.
39
+
40
+ ### Angle C — cross-file tracer
41
+
42
+ For each function the diff changes, find its callers (Grep for the symbol) and
43
+ check whether the change breaks any call site: a new precondition, a changed
44
+ return shape, a new exception, a timing/ordering dependency. Also check callees:
45
+ does a parallel change in the same PR make a call unsafe?
46
+
47
+ ### Angle D — language-pitfall specialist
48
+
49
+ Scan for the classic pitfalls of the diff's language/framework — for example:
50
+ JS falsy-zero, `==` coercion, closure-captured loop var; Python mutable default
51
+ args, late-binding closures; Go nil-map write, range-var capture; SQL injection;
52
+ timezone/DST drift; float equality. Flag any instance the diff introduces.
53
+
54
+ ### Angle E — wrapper/proxy correctness
55
+
56
+ When the PR adds or modifies a type that wraps another (cache, proxy, decorator,
57
+ adapter): check that every method routes to the wrapped instance and not back
58
+ through a registry/session/global — e.g. a caching provider holding a
59
+ `delegate` field that resolves IDs via `session.get(...)` instead of
60
+ `delegate.get(...)` will re-enter the cache or recurse. Also check that the
61
+ wrapper forwards all the methods the callers actually use.
62
+
63
+ ### Reuse
64
+
65
+ The angles above hunt for bugs; this one and the next two hunt for cleanup in
66
+ the changed code. Flag new code that re-implements something the codebase
67
+ already has — Grep shared/utility modules and files adjacent to the change,
68
+ and name the existing helper to call instead.
69
+
70
+ ### Simplification
71
+
72
+ Flag unnecessary complexity the diff adds: redundant or derivable state,
73
+ copy-paste with slight variation, deep nesting, dead code left behind. Name
74
+ the simpler form that does the same job.
75
+
76
+ ### Efficiency
77
+
78
+ Flag wasted work the diff introduces: redundant computation or repeated I/O,
79
+ independent operations run sequentially, blocking work added to startup or
80
+ hot paths. Also flag long-lived objects built from closures or captured
81
+ environments — they keep the entire enclosing scope alive for the object's
82
+ lifetime (a memory leak when that scope holds large values); prefer a
83
+ class/struct that copies only the fields it needs. Name the cheaper
84
+ alternative.
85
+
86
+ ### Altitude
87
+
88
+ Check that each change is implemented at the right depth, not as a fragile
89
+ bandaid. Special cases layered on shared infrastructure are a sign the fix
90
+ isn't deep enough — prefer generalizing the underlying mechanism over adding
91
+ special cases.
92
+
93
+ ### Conventions (CLAUDE.md)
94
+
95
+ Find the CLAUDE.md files that govern the changed code: the user-level
96
+ ~/.claude/CLAUDE.md, the repo-root CLAUDE.md, plus any CLAUDE.md or
97
+ CLAUDE.local.md in a directory that is an ancestor of a changed file (a
98
+ directory's CLAUDE.md only applies to files at or below it). Read each one
99
+ that exists, then check the diff for clear violations of the rules they state.
100
+
101
+ Only flag a violation when you can quote the exact rule and the exact line
102
+ that breaks it — no style preferences, no vague "spirit of the doc"
103
+ inferences. In the finding, name the CLAUDE.md path and quote the rule so the
104
+ report can cite it. If no CLAUDE.md applies, return nothing for this angle.
105
+
106
+ Cleanup, altitude, and conventions candidates use the same
107
+ `file`/`line`/`summary` shape; in `failure_scenario`, state the concrete
108
+ cost (what is duplicated, wasted, harder to maintain, or which CLAUDE.md rule
109
+ is broken) instead of a crash. Correctness bugs always outrank cleanup,
110
+ altitude, and conventions findings.
111
+
112
+ ## Phase 2 — Verify (1-vote, 3-state)
113
+
114
+ Dedup candidates that point at the same line/mechanism, keeping the one with
115
+ the most concrete failure scenario. For each remaining candidate, run **one
116
+ verifier** via the Agent tool: give it the diff, the relevant
117
+ file(s), and the candidate, and have it return exactly one of:
118
+
119
+ - **CONFIRMED** — can name the inputs/state that trigger it and the wrong
120
+ output or crash. Quote the line.
121
+ - **PLAUSIBLE** — mechanism is real, trigger is uncertain (timing, env,
122
+ config). State what would confirm it.
123
+ - **REFUTED** — factually wrong (code doesn't say that) or guarded elsewhere.
124
+ Quote the line that proves it.
125
+
126
+ Keep candidates where the vote is CONFIRMED or PLAUSIBLE.
127
+
128
+ This is recall mode — a single non-REFUTED vote carries the finding. Do NOT
129
+ drop on uncertainty.
130
+
131
+ ## Phase 3 — Sweep for gaps
132
+
133
+ Run **one more finder** as a fresh reviewer who has the verified list. Re-read
134
+ the diff and enclosing functions looking ONLY for defects not already listed.
135
+ Do not re-derive or re-confirm anything already there — the job is gaps. Focus
136
+ on what the first pass tends to miss: moved/extracted code that dropped a guard
137
+ or anchor; second-tier footguns (dataclass default evaluated once, `hash()`
138
+ non-determinism, lock-scope shrink, predicate methods with side effects);
139
+ setup/teardown asymmetry in tests; config defaults flipped.
140
+
141
+ Surface additional candidates, each naming a defect not already on the list.
142
+ If nothing new, return an empty sweep — do not pad.
143
+
144
+ ## Output
145
+
146
+ Report this review's results — `{level, findings}` — through the structured
147
+ findings-report call: the mechanism that renders a review's results as a typed
148
+ list in the host UI, ranked most-severe first. Each entry has `file`, `line`,
149
+ `summary`, `short_summary` — the claim compressed to ≤60 characters, no
150
+ rationale or consequence clause — `failure_scenario`, and `category` — a short
151
+ kebab-case slug for the angle that produced it (`correctness`,
152
+ `simplification`, `efficiency`, `reuse`, `altitude`, `conventions`, or a more
153
+ specific slug like `test-coverage` when one fits better) — plus `verdict` when
154
+ a verify pass produced one. If nothing survives verification, make that call
155
+ with an empty array. Do not also print the findings as text, and do not create
156
+ or publish an artifact of the review — the structured call is the report.
157
+
158
+ ## Applying fixes (--fix)
159
+
160
+ The `--fix` flag was passed. Follow `reference\fix.md` (relative to this
161
+ skill's folder) for the exact fix, commit-gate, and skip-handling behavior —
162
+ it governs which agent applies each fix, how a fix gets committed, how a skip
163
+ is logged, and how outcomes get reported. Do not repeat the findings as text;
164
+ follow that document's reporting rules once fixes land.
165
+
166
+ ## If findings are fixed later
167
+
168
+ Whenever a reported finding is fixed later in this session — the user asks you
169
+ to fix it, or later work fixes it incidentally — follow `reference\fix.md`'s
170
+ reporting rules again: report the same findings through the structured
171
+ findings-report call, each carrying an `outcome`. Do not repeat the findings
172
+ as text. Make that call immediately after the fixes land, before any prose
173
+ summary; the host UI's per-finding status updates only from that call.
174
+
175
+ ## Looping (`loop`)
176
+
177
+ The `loop` arg was passed. Follow `reference\loop.md` (relative to this
178
+ skill's folder) for how to re-run Phases 0–3, Output, and (if `--fix` is also
179
+ present) `reference\fix.md`'s fix pass, repeatedly — including its exit
180
+ condition, iteration cap, and re-invocation rules. Do not treat a single pass
181
+ through this document as complete while `loop` is active; hand control to that
182
+ document instead of stopping at Output.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: e-simplify
3
+ description: >-
4
+ Cleanup-only pass on the current diff — reuse, simplification, efficiency,
5
+ altitude — that fixes what it finds directly; no correctness-bug hunting.
6
+ Triggers: /e-simplify.
7
+ ---
8
+
9
+ # e-simplify
10
+
11
+ **Core principle:** Four parallel cleanup angles (reuse, simplification, efficiency, altitude) over the current diff, applied directly — not a bug hunt, and not a report.
12
+
13
+ ## Gotchas
14
+
15
+ - This skill fixes code quality, not correctness. A request for bug-hunting belongs to `/e-code-review`, not here — see the refusal case below.
16
+ - Applying a fix that changes intended behavior, or that reaches well outside the reviewed diff, is worse than leaving a flagged item unfixed — skip and note it instead of stretching the fix to cover it.
17
+
18
+ ## When this skill applies
19
+
20
+ Triggers: `/e-simplify` on the current diff (or a PR/branch/path passed as an argument).
21
+
22
+ **Refusal cases — first match wins:**
23
+
24
+ - **Asked to find correctness bugs (crashes, wrong output, security issues) rather than cleanup.** Respond exactly: `That's a correctness review — use /e-code-review, not this skill.`
25
+
26
+ ## The process
27
+
28
+ `/simplify → 4 cleanup agents in parallel → apply the fixes`
29
+
30
+ You are improving the quality of the changed code, not hunting for bugs. Review
31
+ it for reuse, simplification, efficiency, and altitude issues, then fix what you
32
+ find. Do not look for correctness bugs — that is what `/code-review` is for.
33
+
34
+ ### Phase 0 — Gather the diff
35
+
36
+ Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
37
+ if there's no upstream) to get the unified diff under review. If there are
38
+ uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
39
+ include the working-tree changes in scope — the review often runs before the
40
+ commit. If a PR number, branch name, or file path was passed as an argument,
41
+ review that target instead. Treat this diff as the review scope.
42
+
43
+ ### Phase 1 — Review (4 cleanup agents in parallel)
44
+
45
+ Launch **4 independent review agents** via the Agent tool, all in a
46
+ single message so they run concurrently. Pass each agent the diff and one of
47
+ the four angles below. Each returns its findings with `file`, `line`, a
48
+ one-line `summary`, and the concrete cost (what is duplicated, wasted, or
49
+ harder to maintain).
50
+
51
+ #### Reuse
52
+
53
+ Flag new code that re-implements something the codebase
54
+ already has — Grep shared/utility modules and files adjacent to the change,
55
+ and name the existing helper to call instead.
56
+
57
+ #### Simplification
58
+
59
+ Flag unnecessary complexity the diff adds: redundant or derivable state,
60
+ copy-paste with slight variation, deep nesting, dead code left behind. Name
61
+ the simpler form that does the same job.
62
+
63
+ #### Efficiency
64
+
65
+ Flag wasted work the diff introduces: redundant computation or repeated I/O,
66
+ independent operations run sequentially, blocking work added to startup or
67
+ hot paths. Also flag long-lived objects built from closures or captured
68
+ environments — they keep the entire enclosing scope alive for the object's
69
+ lifetime (a memory leak when that scope holds large values); prefer a
70
+ class/struct that copies only the fields it needs. Name the cheaper
71
+ alternative.
72
+
73
+ #### Altitude
74
+
75
+ Check that each change is implemented at the right depth, not as a fragile
76
+ bandaid. Special cases layered on shared infrastructure are a sign the fix
77
+ isn't deep enough — prefer generalizing the underlying mechanism over adding
78
+ special cases.
79
+
80
+ ### Phase 2 — Apply the fixes
81
+
82
+ Wait for all four agents to complete, dedup findings that point at the same
83
+ line or mechanism, and fix each remaining one directly. Skip any finding whose
84
+ fix would change intended behavior, require changes well outside the reviewed
85
+ diff, or that you judge to be a false positive — note the skip rather than
86
+ arguing with it. Finish with a brief summary of what was fixed and what was
87
+ skipped (or confirm the code was already clean).
88
+
89
+ ## File index
90
+
91
+ | File | Purpose |
92
+ |---|---|
93
+ | `SKILL.md` | This hub — the full cleanup procedure, refusal case |
94
+
95
+ ## Folder map
96
+
97
+ - `SKILL.md` — hub: full procedure, refusal case.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: issue-tracker
3
+ description: >-
4
+ File, update, and close GitHub work as one epic with native sub-issues.
5
+ Dedup open and closed issues first. Edit status only inside marker sections.
6
+ Refresh the epic checklist so it matches its children. Triggers: issue tracker,
7
+ file an issue, track this issue, open an epic, update the epic, close the issue,
8
+ refresh the epic checklist, attach a sub-issue.
9
+ argument-hint: "[issue action - file | update | close | refresh-epic | full handoff]"
10
+ ---
11
+
12
+ # Issue tracker
13
+
14
+ **User wants an issue action done. Here is how those actions work.**
15
+
16
+ **dedup -> do the work -> markers only -> numbers + URLs**
17
+
18
+ Run every step the ask needs in one go (file, label, attach, refresh, and so on). The `issue-tracker` agent is the primary handler for one action per turn; this skill is the session path when the agent is unavailable or the ask spans several steps.
19
+
20
+ Prefer the **same warm** `issue-tracker` agent for follow-ups on the same issue or a related issue on the same epic. Spawn a new agent only for an unrelated work-stream or when the warm agent is gone.
21
+
22
+ ## Voice
23
+
24
+ Use the `plain-brief` output style (`output-styles/plain-brief.md`). End with the issue number(s) and URL(s) the caller must keep.
25
+
26
+ ## Gotchas
27
+
28
+ Append a bullet when an action fails in a new way.
29
+
30
+ - Use REST `.id`, not display `#N`, to attach a sub-issue - [operation-matrix](reference/operation-matrix.md).
31
+ - `gh` attach: `-F sub_issue_id=<n>` (typed int), never `-f`.
32
+ - Status goes in markers, not comments - comments are cross-links only.
33
+ - Dedup open **and** closed; closed twin -> reopen vs file new, never silent refile.
34
+ - Edit only between markers - free-form epic edits break the children checklist.
35
+ - Auto-close is PR-body-first: a related-only UI link does not close the issue on merge.
36
+
37
+ ## The model
38
+
39
+ One **epic** issue owns a work-stream. Each unit of work is a native GitHub **sub-issue** under it. The epic checklist and every status block live inside marker pairs. Skeletons and refresh steps: [reference/epic-and-sub-issue-model.md](reference/epic-and-sub-issue-model.md).
40
+
41
+ ## Labels
42
+
43
+ - Parent: `epic`.
44
+ - Sub-issue: `type: roadblock`, `type: task`, `type: bug`, or `type: enhancement`.
45
+
46
+ Create a missing label, then apply it. Label create is in the operation matrix.
47
+
48
+ ## Markers
49
+
50
+ - Status (any issue): `<!-- issue-tracker:status -->` … `<!-- /issue-tracker:status -->`
51
+ - Children checklist (epic only): `<!-- issue-tracker:children -->` … `<!-- /issue-tracker:children -->`
52
+
53
+ Update path: read body -> replace only the text between the target pair -> write the full body back.
54
+
55
+ ## Dedup
56
+
57
+ Search open and closed issues on the target repo before create. Open twin -> update in place. Closed twin -> ask reopen vs file new.
58
+
59
+ ## Tools
60
+
61
+ Prefer GitHub MCP. Fall back to `gh` on the same REST endpoints. Full map and `.id` rule: [reference/operation-matrix.md](reference/operation-matrix.md).
62
+
63
+ ## Handoff input
64
+
65
+ Optional issue-candidate JSON from orchestrator or closeout. Full schema and consume path: [reference/handoff-schema.md](reference/handoff-schema.md).
66
+
67
+ ## Close the sub-issue through the PR (required when a fix ships)
68
+
69
+ GitHub closes the sub-issue when someone **merges** a pull request into the **default branch** and that PR carries a closing keyword for the issue.
70
+
71
+ **Required on the PR that merges into the default branch:** put `Closes #N` in the PR body for each finished sub-issue. One keyword per issue: write `Closes #12` and `Closes #13`, not `Closes #12, #13` (only the first number closes in the comma form).
72
+
73
+ **Preferred on commits:** also put `Closes #N` in the first commit message when the fix starts. Commit alone is backup; the PR body is the contract.
74
+
75
+ **Stacked / intermediate PRs** that do not merge into the default branch: use a plain `#N` reference in the body so the issue links without a false close promise. Put `Closes #N` only on the PR that actually lands on the default branch.
76
+
77
+ **Not enough:** a Development "related" link with no closing keyword. **Not enough:** closing the PR without merging.
78
+
79
+ **Who owns `#N`:** the agent or session writing the PR must use the correct sub-issue number. Nothing in this package verifies the number matches the fix.
80
+
81
+ ## Return shape
82
+
83
+ Reply with every affected issue number and URL - no narration after that payload.
84
+
85
+ ## File index
86
+
87
+ | File | Purpose |
88
+ |------|---------|
89
+ | `SKILL.md` | Hub: how issue actions work, gotchas, model, markers, dedup, PR auto-close, return shape |
90
+ | `reference/operation-matrix.md` | MCP + `gh` per action; sub-issue `.id` rule |
91
+ | `reference/epic-and-sub-issue-model.md` | Epic model, markers, body skeleton, checklist refresh |
92
+ | `reference/handoff-schema.md` | Issue-candidate JSON and consume flow |
@@ -0,0 +1,55 @@
1
+ # Epic and sub-issue model
2
+
3
+ One **epic** issue holds a whole work-stream. Each unit of work under it is a native GitHub **sub-issue**. The epic carries the `epic` label; each sub-issue carries a `type:` label. The epic body mirrors its children as a checklist, and every issue — epic and sub-issue alike — carries a status section. Both sections live between marker comments so a body edit can replace one section and leave the rest untouched.
4
+
5
+ ## The two marker pairs
6
+
7
+ - `<!-- issue-tracker:status -->` … `<!-- /issue-tracker:status -->` — on every issue. Holds the current status line.
8
+ - `<!-- issue-tracker:children -->` … `<!-- /issue-tracker:children -->` — on the epic only. Holds the checklist of sub-issues.
9
+
10
+ An edit reads the whole body, swaps only the text between one marker pair, and writes the whole body back. Text outside the markers stays byte-for-byte the same.
11
+
12
+ ## Epic body skeleton
13
+
14
+ ```markdown
15
+ ## Epic — <work-stream label>
16
+
17
+ <One sentence naming the work-stream and its goal.>
18
+
19
+ <!-- issue-tracker:status -->
20
+ Status: in progress — 1 of 3 children closed.
21
+ <!-- /issue-tracker:status -->
22
+
23
+ <!-- issue-tracker:children -->
24
+ - [x] owner/repo#12 — parser rejects an empty path
25
+ - [ ] owner/repo#13 — attach reads the display number
26
+ - [ ] owner/repo#14 — label create skips an existing label
27
+ <!-- /issue-tracker:children -->
28
+ ```
29
+
30
+ ## Sub-issue body skeleton
31
+
32
+ ```markdown
33
+ ## <sub-issue title>
34
+
35
+ <One sentence: what the work is.>
36
+
37
+ <!-- issue-tracker:status -->
38
+ Status: open.
39
+ <!-- /issue-tracker:status -->
40
+
41
+ ## Detail
42
+
43
+ <The evidence, where, impact, and proposed fix — self-contained.>
44
+ ```
45
+
46
+ ## Refresh the epic checklist
47
+
48
+ After you create a sub-issue or close one, refresh the epic's `children` section so it matches the children:
49
+
50
+ 1. Read the epic body.
51
+ 2. Add a `- [ ] owner/repo#<N> — <title>` line for a newly created sub-issue, or flip a line to `- [x]` for a closed one.
52
+ 3. Update the epic's status line to name the closed count against the total.
53
+ 4. Write the whole body back with the issue-update op, replacing only the two marker sections you touched.
54
+
55
+ A created or closed sub-issue always triggers this refresh, so the epic checklist stays in step with the sub-issues at every step.
@@ -0,0 +1,64 @@
1
+ # Handoff schema
2
+
3
+ An orchestrator or the closeout skill hands the tracker one **issue-candidate** JSON record per obstacle. The tracker consumes each record through the full path and returns the issue number and URL.
4
+
5
+ ## The record
6
+
7
+ ```json
8
+ {
9
+ "kind": "roadblock | task | bug | enhancement",
10
+ "title": "<short imperative title>",
11
+ "epic": "<work-stream label the sub-issue belongs under>",
12
+ "summary": "<one sentence a reader with zero session context acts on>",
13
+ "evidence": "<verbatim line captured this session — error text, command, or log line>",
14
+ "where": "<file, hook, gate, or tool the evidence names — path relative to the repo root>",
15
+ "impact": "<what the obstacle cost: work blocked, count of times hit, workaround forced>",
16
+ "proposed_fix": "<the specific change — name the failure mode and the condition>",
17
+ "blocking": true
18
+ }
19
+ ```
20
+
21
+ ## Field meanings
22
+
23
+ | Field | Meaning |
24
+ |-------|---------|
25
+ | `kind` | The sub-issue's `type:` label stem. `roadblock`, `task`, `bug`, or `enhancement`. |
26
+ | `title` | The sub-issue title. Short and imperative. |
27
+ | `epic` | The work-stream the sub-issue belongs under. The tracker finds or creates the matching epic. |
28
+ | `summary` | The one-sentence body opener. Self-contained — a reader with no session context acts on it. |
29
+ | `evidence` | A verbatim line captured this session, placed in a fenced block in the body. |
30
+ | `where` | The file, hook, gate, or tool the evidence names. A repo-relative path, no volatile temp path. |
31
+ | `impact` | What the obstacle cost. |
32
+ | `proposed_fix` | The specific change. |
33
+ | `blocking` | `true` routes the sub-issue to `type: roadblock`, overriding `kind`. `false` keeps the `kind` label. |
34
+
35
+ `kind` maps to the `type:` label. `blocking: true` takes precedence and routes the sub-issue to `type: roadblock`.
36
+
37
+ ## Filled example
38
+
39
+ ```json
40
+ {
41
+ "kind": "bug",
42
+ "title": "Inline-collection gate fires in exempt test files",
43
+ "epic": "hook exemptions for test files",
44
+ "summary": "The code_rules_enforcer inline-collection check blocks a valid list literal in a test file, where test files are exempt from the magic-value gate.",
45
+ "evidence": "BLOCKED: [MAGIC_VALUE] Inline list literal [200, 404, 500] in a function body -- extract to a named constant in config/.",
46
+ "where": "packages/claude-dev-env/hooks/blocking/code_rules_enforcer.py",
47
+ "impact": "Hit 3 times in one session on three test files; each forced a workaround move to a module constant.",
48
+ "proposed_fix": "Extend the magic-value test-file exemption to cover the inline-collection check, so list and set literals in test bodies pass.",
49
+ "blocking": false
50
+ }
51
+ ```
52
+
53
+ ## Consume flow
54
+
55
+ For each record, in order:
56
+
57
+ 1. **Dedup** — search open and closed issues on the target repository for a twin.
58
+ 2. **Find or create the epic** — match the `epic` label; open a parent with the `epic` label when none matches.
59
+ 3. **Create the sub-issue** — body from `summary`, `evidence`, `where`, `impact`, `proposed_fix`.
60
+ 4. **Labels** — apply the `type:` label from `kind`, or `type: roadblock` when `blocking` is `true`. Create the label when the repository lacks it.
61
+ 5. **Attach the native sub-issue** — read the child's REST database `.id` and attach it under the epic.
62
+ 6. **Refresh the epic checklist** — add the child's `- [ ] owner/repo#<N>` line and update the epic status.
63
+
64
+ The return is the sub-issue number and URL (and the epic number and URL when the epic was created this call).