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.
- package/CLAUDE.md +53 -49
- package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
- package/_shared/pr-loop/scripts/code_rules_gate.py +4 -2
- package/_shared/pr-loop/scripts/grant_project_claude_permissions.py +306 -306
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/claude_permissions_constants.py +44 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/copilot_quota_constants.py +24 -24
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/stale_worktree_rule_sweep_constants.py +107 -107
- package/_shared/pr-loop/scripts/revoke_project_claude_permissions.py +290 -48
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +42 -2
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_constants.py +36 -0
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +100 -1
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -497
- package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +311 -2
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep.py +301 -301
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep_constants.py +85 -85
- package/_shared/pr-loop/worker-spawn.md +1 -1
- package/agents/CLAUDE.md +2 -1
- package/agents/caveman.md +0 -1
- package/agents/clasp-deployment-orchestrator.md +0 -1
- package/agents/clean-coder.md +0 -1
- package/agents/code-advisor.md +0 -1
- package/agents/code-quality-agent.md +1 -2
- package/agents/code-verifier.md +0 -1
- package/agents/deep-research.md +0 -1
- package/agents/docs-agent.md +0 -1
- package/agents/git-commit-crafter.md +0 -1
- package/agents/issue-tracker.md +42 -0
- package/agents/plan-packet-validator.md +0 -1
- package/agents/pr-description-writer.md +0 -1
- package/agents/test_agent_frontmatter.py +67 -18
- package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +143 -141
- package/bin/CLAUDE.md +68 -5
- package/bin/ever-shipped-skills.mjs +1 -0
- package/bin/install-constants.mjs +88 -0
- package/bin/install.mjs +1138 -114
- package/bin/install.prune.test.mjs +869 -19
- package/bin/install.test.mjs +906 -2
- package/commands/implement.md +1 -1
- package/commands/right-size.md +1 -1
- package/docs/CLAUDE.md +1 -0
- package/docs/host-pool-health-monitor.md +102 -0
- package/docs/references/CLAUDE.md +4 -2
- package/docs/references/advisor-tool.md +13 -0
- package/docs/references/code-review-enforcement.md +10 -0
- package/docs/references/team-advisor-skill.md +14 -0
- package/hooks/blocking/CLAUDE.md +1 -0
- package/hooks/blocking/code_review_pr_create_gate.py +7 -3
- package/hooks/blocking/code_review_push_gate.py +9 -4
- package/hooks/blocking/code_review_stamp_directory_write_blocker.py +8 -0
- package/hooks/blocking/config/__init__.py +5 -5
- package/hooks/blocking/config/code_review_enforcement_constants.py +4 -1
- package/hooks/blocking/config/test_code_review_enforcement_constants.py +5 -0
- package/hooks/blocking/config/verified_commit_constants.py +160 -159
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
- package/hooks/blocking/test_code_review_pr_create_gate.py +14 -0
- package/hooks/blocking/test_code_review_push_gate.py +16 -0
- package/hooks/blocking/test_code_review_stamp_directory_write_blocker.py +19 -0
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +231 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
- package/hooks/blocking/test_verdict_directory_write_blocker.py +808 -808
- package/hooks/blocking/test_verification_verdict_store.py +54 -0
- package/hooks/blocking/test_verified_commit_gate.py +581 -581
- package/hooks/blocking/test_verified_commit_message_accuracy_blocker.py +131 -131
- package/hooks/blocking/verdict_directory_write_blocker.py +687 -687
- package/hooks/blocking/verification_verdict_store.py +1039 -1036
- package/hooks/blocking/verified_commit_message_accuracy_blocker.py +167 -167
- package/hooks/blocking/verifier_verdict_minter.py +280 -280
- package/hooks/git-hooks/test_pre_push.py +25 -0
- package/hooks/hooks.json +10 -0
- package/hooks/hooks_constants/CLAUDE.md +2 -1
- package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
- package/hooks/hooks_constants/ruff_integration_constants.py +16 -0
- package/hooks/lifecycle/enter_worktree_origin_prefetch.py +163 -146
- package/hooks/lifecycle/test_enter_worktree_origin_prefetch.py +185 -178
- package/hooks/pyproject.toml +1 -0
- package/hooks/validators/CLAUDE.md +1 -0
- package/hooks/validators/config/__init__.py +0 -0
- package/hooks/validators/config/directory_exemption_constants.py +183 -0
- package/hooks/validators/config/test_directory_exemption_constants.py +21 -0
- package/hooks/validators/conftest.py +4 -0
- package/hooks/validators/ruff_integration.py +49 -5
- package/hooks/validators/run_all_validators.py +206 -9
- package/hooks/validators/test_directory_exemption_constants.py +185 -0
- package/hooks/validators/test_python_antipattern_checks.py +110 -5
- package/hooks/validators/test_ruff_integration.py +92 -1
- package/hooks/validators/test_run_all_validators.py +115 -68
- package/hooks/validators/test_run_all_validators_pretooluse.py +159 -1
- package/package.json +10 -2
- package/rules/CLAUDE.md +1 -0
- package/rules/docstring-prose-matches-implementation.md +45 -44
- package/rules/state-what-is.md +25 -0
- package/rules/verified-commit-gate-skip.md +1 -1
- package/scripts/CLAUDE.md +1 -0
- package/scripts/Capture-PoolHealth.ps1 +410 -0
- package/scripts/_code_review_test_support.py +404 -0
- package/scripts/claude_chain_runner.py +141 -1
- package/scripts/conftest.py +16 -1
- package/scripts/dev_env_scripts_constants/CLAUDE.md +1 -1
- package/scripts/dev_env_scripts_constants/claude_chain_constants.py +9 -0
- package/scripts/resolve_worker_spawn.py +626 -626
- package/scripts/spawn_grok_batch.py +672 -672
- package/scripts/test_claude_chain_runner.py +131 -0
- package/scripts/test_invoke_code_review_chain.py +70 -0
- package/scripts/test_invoke_code_review_cli.py +192 -0
- package/scripts/test_invoke_code_review_contract.py +256 -0
- package/scripts/test_invoke_code_review_git.py +123 -0
- package/scripts/test_invoke_code_review_mode.py +99 -0
- package/scripts/test_resolve_worker_spawn.py +1014 -1014
- package/skills/CLAUDE.md +2 -0
- package/skills/auditing-claude-config/SKILL.md +114 -114
- package/skills/autoconverge/SKILL.md +427 -427
- package/skills/autoconverge/reference/convergence.md +24 -3
- package/skills/autoconverge/workflow/CLAUDE.md +1 -0
- package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +3 -3
- package/skills/autoconverge/workflow/converge.contract.test.mjs +1263 -1263
- package/skills/autoconverge/workflow/converge.mjs +167 -0
- package/skills/autoconverge/workflow/converge.p2-advance.test.mjs +202 -0
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +265 -265
- package/skills/closeout/SKILL.md +33 -50
- package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +8 -0
- package/skills/codex-review/scripts/run_codex_review.py +233 -1
- package/skills/codex-review/scripts/test_run_codex_review.py +189 -0
- package/skills/condensing-instructions/SKILL.md +81 -0
- package/skills/copilot-review/SKILL.md +119 -119
- package/skills/e-code-review/SKILL.md +52 -0
- package/skills/e-code-review/reference/fix.md +54 -0
- package/skills/e-code-review/reference/loop.md +43 -0
- package/skills/e-code-review/reference/low.md +57 -0
- package/skills/e-code-review/reference/medium.md +153 -0
- package/skills/e-code-review/reference/xhigh.md +182 -0
- package/skills/e-simplify/SKILL.md +97 -0
- package/skills/issue-tracker/SKILL.md +92 -0
- package/skills/issue-tracker/reference/epic-and-sub-issue-model.md +55 -0
- package/skills/issue-tracker/reference/handoff-schema.md +64 -0
- package/skills/issue-tracker/reference/operation-matrix.md +41 -0
- package/skills/orchestrator/SKILL.md +162 -21
- package/skills/orchestrator/scripts/status_gate.py +625 -0
- package/skills/orchestrator/scripts/status_gate_constants/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/constants.py +47 -0
- package/skills/orchestrator/scripts/test_status_gate.py +439 -0
- package/skills/orchestrator-refresh/SKILL.md +110 -35
- package/skills/plan-to-pr/SKILL.md +155 -0
- package/skills/plan-to-pr/reference/final-validation-tasks.md +15 -0
- package/skills/plan-to-pr/reference/model-routing.md +36 -0
- package/skills/plan-to-pr/reference/packet-contract.md +43 -0
- package/skills/plan-to-pr/reference/packet-schema.json +57 -0
- package/skills/plan-to-pr/reference/process-inventory.md +22 -0
- package/skills/plan-to-pr/reference/review-loop.md +33 -0
- package/skills/plan-to-pr/reference/run-record.schema.json +27 -0
- package/skills/plan-to-pr/reference/self-audit-tasks.md +15 -0
- package/skills/plan-to-pr/reference/task-seeds.md +14 -0
- package/skills/plan-to-pr/reference/task-ticket.md +38 -0
- package/skills/plan-to-pr/scripts/config/__init__.py +1 -0
- package/skills/plan-to-pr/scripts/config/constants.py +193 -0
- package/skills/plan-to-pr/scripts/create_packet.py +173 -0
- package/skills/plan-to-pr/scripts/test_create_packet.py +102 -0
- package/skills/plan-to-pr/scripts/test_validate_packet.py +256 -0
- package/skills/plan-to-pr/scripts/test_validate_protocol.py +135 -0
- package/skills/plan-to-pr/scripts/test_validate_run.py +158 -0
- package/skills/plan-to-pr/scripts/validate_packet.py +655 -0
- package/skills/plan-to-pr/scripts/validate_protocol.py +622 -0
- package/skills/plan-to-pr/scripts/validate_run.py +173 -0
- package/skills/plan-to-pr/test_skill_contract.py +207 -0
- package/skills/plan-to-pr/test_task_ticket_contract.py +151 -0
- package/skills/pr-converge/SKILL.md +472 -469
- package/skills/pr-converge/reference/examples.md +3 -3
- package/skills/pr-converge/reference/fix-protocol.md +1 -1
- package/skills/pr-converge/reference/ground-rules.md +7 -4
- package/skills/pr-converge/reference/multi-pr-orchestration.md +4 -1
- package/skills/pr-converge/reference/per-tick.md +5 -5
- package/skills/pr-converge/reference/progress-checklist.md +1 -1
- package/skills/pr-converge/scripts/check_convergence_gates.py +279 -279
- package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -507
- package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -84
- package/skills/pr-converge/test_step5_host_branch.py +1 -1
- package/skills/pr-fix-protocol/SKILL.md +1 -1
- package/skills/privacy-hygiene/SKILL.md +68 -68
- package/skills/prototype/workflows/promotion.md +1 -1
- package/skills/release-notes-html/SKILL.md +164 -0
- package/skills/task-build/CLAUDE.md +8 -7
- package/skills/task-build/SKILL.md +16 -8
- package/skills/task-build/reference/tool-routing.md +19 -0
- package/scripts/test_invoke_code_review.py +0 -966
- 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).
|