claude-dev-env 1.93.1 → 1.95.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/_shared/advisor/CLAUDE.md +2 -2
- package/_shared/advisor/advisor-protocol.md +35 -27
- package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +3 -2
- package/_shared/advisor/scripts/model_tier_run_validator.py +23 -15
- package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +81 -17
- package/_shared/pr-loop/CLAUDE.md +1 -0
- package/_shared/pr-loop/audit-contract.md +1 -1
- package/_shared/pr-loop/gh-payloads.md +3 -3
- package/_shared/pr-loop/post-audit-thread-contract.md +51 -0
- package/_shared/pr-loop/scripts/README.md +2 -2
- package/_shared/pr-loop/scripts/fix_hookspath.py +47 -12
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +0 -69
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -374
- package/_shared/pr-loop/state-schema.md +3 -22
- package/bin/CLAUDE.md +11 -2
- package/bin/ever-shipped-skills.mjs +70 -0
- package/bin/install.mjs +138 -13
- package/bin/install.prune.test.mjs +457 -0
- package/bin/install.test.mjs +10 -4
- package/docs/CODE_RULES.md +1 -1
- package/hooks/blocking/CLAUDE.md +2 -0
- package/hooks/blocking/code_rules_enforcer.py +4 -0
- package/hooks/blocking/code_rules_shared.py +82 -0
- package/hooks/blocking/code_rules_test_layout.py +9 -3
- package/hooks/blocking/pii_commit_command.py +398 -0
- package/hooks/blocking/pii_payload_scan.py +133 -0
- package/hooks/blocking/pii_prevention_blocker.py +151 -449
- package/hooks/blocking/plain_language_blocker.py +138 -4
- package/hooks/blocking/sensitive_file_protector.py +114 -48
- package/hooks/blocking/tdd_enforcer.py +9 -2
- package/hooks/blocking/test_code_rules_enforcer_scratchpad.py +105 -0
- package/hooks/blocking/test_code_rules_shared.py +181 -0
- package/hooks/blocking/test_pii_prevention_blocker.py +299 -0
- package/hooks/blocking/test_plain_language_blocker_allowlist.py +184 -0
- package/hooks/blocking/test_sensitive_file_protector.py +185 -0
- package/hooks/blocking/test_tdd_enforcer_scratchpad.py +105 -0
- package/hooks/blocking/test_verdict_directory_write_blocker.py +42 -7
- package/hooks/hooks_constants/CLAUDE.md +4 -2
- package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -2
- package/hooks/hooks_constants/harness_scratchpad_constants.py +17 -0
- package/hooks/hooks_constants/local_identity.py +65 -15
- package/hooks/hooks_constants/pii_prevention_constants.py +16 -0
- package/hooks/hooks_constants/plain_language_blocker_constants.py +5 -0
- package/hooks/hooks_constants/pr_description_enforcer_constants.py +1 -1
- package/hooks/hooks_constants/sensitive_file_protector_constants.py +42 -0
- package/hooks/hooks_constants/test_local_identity.py +68 -0
- package/hooks/pyproject.toml +75 -4
- package/hooks/validators/CLAUDE.md +1 -1
- package/hooks/validators/README.md +2 -0
- package/hooks/validators/python_style_checks.py +114 -136
- package/hooks/validators/python_style_helpers.py +95 -0
- package/hooks/validators/test_python_style_checks.py +0 -164
- package/hooks/validators/test_python_style_checks_decorator_gap.py +119 -0
- package/hooks/validators/test_python_style_fixes.py +251 -0
- package/hooks/validators/test_python_style_helpers.py +125 -0
- package/package.json +1 -1
- package/rules/CLAUDE.md +1 -0
- package/rules/anti-corollary-tests.md +69 -0
- package/rules/bdd.md +1 -3
- package/rules/code-reviews.md +1 -1
- package/rules/gh-paginate.md +1 -1
- package/rules/plain-language.md +2 -0
- package/scripts/CLAUDE.md +10 -1
- package/scripts/Get-SessionAccount.ps1 +210 -0
- package/scripts/tests/CLAUDE.md +15 -1
- package/scripts/tests/Get-SessionAccount.Tests.ps1 +350 -0
- package/skills/CLAUDE.md +6 -27
- package/skills/anthropic-plan/SKILL.md +1 -13
- package/skills/autoconverge/CLAUDE.md +5 -2
- package/skills/autoconverge/SKILL.md +112 -387
- package/skills/autoconverge/reference/CLAUDE.md +4 -1
- package/skills/autoconverge/reference/closing-report.md +9 -2
- package/skills/autoconverge/reference/convergence.md +26 -22
- package/skills/autoconverge/reference/headless-safety.md +44 -0
- package/skills/autoconverge/reference/multi-pr.md +88 -0
- package/skills/autoconverge/reference/self-closing-loop.md +84 -0
- package/skills/autoconverge/reference/stop-conditions.md +21 -13
- package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +87 -27
- package/skills/autoconverge/workflow/converge.contract.test.mjs +40 -10
- package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +179 -47
- package/skills/autoconverge/workflow/converge.fix-progress.test.mjs +1 -1
- package/skills/autoconverge/workflow/converge.mjs +286 -96
- package/skills/bugteam/CLAUDE.md +1 -1
- package/skills/bugteam/CONSTRAINTS.md +3 -3
- package/skills/bugteam/PROMPTS.md +8 -19
- package/skills/bugteam/SKILL.md +13 -14
- package/skills/bugteam/reference/CLAUDE.md +1 -1
- package/skills/bugteam/reference/README.md +2 -3
- package/skills/bugteam/reference/audit-and-teammates.md +2 -2
- package/skills/bugteam/reference/copilot-gap-analysis.md +2 -0
- package/skills/bugteam/reference/github-pr-reviews.md +56 -38
- package/skills/bugteam/reference/team-setup.md +11 -11
- package/skills/bugteam/scripts/CLAUDE.md +6 -6
- package/skills/bugteam/scripts/README.md +20 -8
- package/skills/bugteam/scripts/bugteam_code_rules_gate.py +13 -1463
- package/skills/bugteam/scripts/bugteam_fix_hookspath.py +23 -358
- package/skills/bugteam/scripts/bugteam_preflight.py +13 -315
- package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +2 -3
- package/skills/bugteam/scripts/test_bugteam_code_rules_gate.py +34 -1053
- package/skills/bugteam/scripts/test_bugteam_fix_hookspath.py +30 -347
- package/skills/bugteam/scripts/test_bugteam_preflight.py +30 -305
- package/skills/closeout/SKILL.md +153 -0
- package/skills/closeout/reference/handoff-prompt-template.md +72 -0
- package/skills/closeout/reference/issue-body-templates.md +108 -0
- package/skills/closeout/reference/pii-redaction-checklist.md +36 -0
- package/skills/copilot-finding-triage/SKILL.md +80 -28
- package/skills/copilot-finding-triage/reference/tier-rubric.md +70 -11
- package/skills/copilot-finding-triage/templates/notification.md +8 -3
- package/skills/everything-search/SKILL.md +1 -2
- package/skills/grokify/SKILL.md +58 -0
- package/skills/grokify/templates/handoff-template.md +92 -0
- package/skills/orchestrator/SKILL.md +35 -25
- package/skills/orchestrator-refresh/SKILL.md +15 -11
- package/skills/pr-converge/CLAUDE.md +1 -1
- package/skills/pr-converge/SKILL.md +132 -233
- package/skills/pr-converge/reference/convergence-gates.md +102 -66
- package/skills/pr-converge/reference/examples.md +37 -25
- package/skills/pr-converge/reference/fix-protocol.md +7 -7
- package/skills/pr-converge/reference/multi-pr-orchestration.md +10 -4
- package/skills/pr-converge/reference/per-tick.md +64 -41
- package/skills/pr-converge/reference/state-schema.md +27 -2
- package/skills/pr-converge/scripts/CLAUDE.md +8 -0
- package/skills/pr-converge/scripts/README.md +4 -3
- package/skills/pr-converge/scripts/_pr_converge_path_setup.py +23 -0
- package/skills/pr-converge/scripts/check_convergence.py +189 -645
- package/skills/pr-converge/scripts/check_convergence_gates.py +235 -0
- package/skills/pr-converge/scripts/check_convergence_thread_gates.py +219 -0
- package/skills/pr-converge/scripts/conftest.py +8 -0
- package/skills/pr-converge/scripts/pr_converge_scripts_constants/CLAUDE.md +1 -0
- package/skills/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +36 -0
- package/skills/pr-converge/scripts/test__pr_converge_path_setup.py +26 -0
- package/skills/pr-converge/scripts/test_check_convergence.py +73 -228
- package/skills/pr-converge/scripts/test_check_convergence_contract.py +321 -0
- package/skills/pr-converge/scripts/test_check_convergence_gates.py +68 -0
- package/skills/pr-converge/scripts/test_check_convergence_thread_gates.py +75 -0
- package/skills/pr-fix-protocol/SKILL.md +20 -20
- package/skills/privacy-hygiene/SKILL.md +4 -3
- package/skills/reviewer-gates/SKILL.md +26 -8
- package/skills/session-log/SKILL.md +11 -12
- package/skills/session-tidy/SKILL.md +40 -30
- package/skills/skill-builder/CLAUDE.md +13 -10
- package/skills/skill-builder/SKILL.md +31 -31
- package/skills/skill-builder/references/CLAUDE.md +10 -6
- package/skills/skill-builder/references/delegation-map.md +13 -4
- package/skills/skill-builder/references/description-field.md +113 -0
- package/skills/skill-builder/references/self-audit-checklist.md +21 -4
- package/skills/skill-builder/references/skill-modularity.md +113 -0
- package/skills/skill-builder/references/skill-types.md +4 -0
- package/skills/skill-builder/templates/CLAUDE.md +4 -4
- package/skills/skill-builder/templates/gap-analysis.md +25 -1
- package/skills/skill-builder/workflows/CLAUDE.md +6 -4
- package/skills/skill-builder/workflows/improve-skill.md +17 -16
- package/skills/skill-builder/workflows/new-skill.md +34 -10
- package/skills/skill-builder/workflows/polish-skill.md +59 -43
- package/skills/team-advisor/SKILL.md +15 -11
- package/skills/usage-pause/SKILL.md +10 -14
- package/system-prompts/software-engineer.xml +7 -6
- package/hooks/validators/test_verify_paths.py +0 -32
- package/hooks/validators/verify_paths.py +0 -57
- package/skills/bdd-protocol/CLAUDE.md +0 -26
- package/skills/bdd-protocol/SKILL.md +0 -30
- package/skills/bdd-protocol/references/CLAUDE.md +0 -10
- package/skills/bdd-protocol/references/anti-patterns.md +0 -26
- package/skills/bdd-protocol/references/example-mapping.md +0 -23
- package/skills/bg-agent/CLAUDE.md +0 -17
- package/skills/bg-agent/SKILL.md +0 -69
- package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_code_rules_gate_constants.py +0 -55
- package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_fix_hookspath_constants.py +0 -26
- package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_preflight_constants.py +0 -35
- package/skills/caveman/CLAUDE.md +0 -15
- package/skills/caveman/SKILL.md +0 -38
- package/skills/code/CLAUDE.md +0 -17
- package/skills/code/SKILL.md +0 -178
- package/skills/deep-research/CLAUDE.md +0 -17
- package/skills/deep-research/SKILL.md +0 -80
- package/skills/findbugs/CLAUDE.md +0 -20
- package/skills/findbugs/SKILL.md +0 -241
- package/skills/fixbugs/CLAUDE.md +0 -19
- package/skills/fixbugs/SKILL.md +0 -142
- package/skills/gh-paginate/CLAUDE.md +0 -18
- package/skills/gh-paginate/SKILL.md +0 -84
- package/skills/gotcha/CLAUDE.md +0 -33
- package/skills/gotcha/SKILL.md +0 -73
- package/skills/implement/CLAUDE.md +0 -27
- package/skills/implement/SKILL.md +0 -66
- package/skills/implement/scripts/CLAUDE.md +0 -22
- package/skills/implement/scripts/append_note.py +0 -133
- package/skills/implement/scripts/implement_scripts_constants/CLAUDE.md +0 -22
- package/skills/implement/scripts/implement_scripts_constants/__init__.py +0 -0
- package/skills/implement/scripts/implement_scripts_constants/notes_constants.py +0 -12
- package/skills/implement/scripts/test_append_note.py +0 -191
- package/skills/log-audit/CLAUDE.md +0 -20
- package/skills/log-audit/SKILL.md +0 -66
- package/skills/log-audit/reference/CLAUDE.md +0 -9
- package/skills/log-audit/reference/charter.md +0 -52
- package/skills/log-audit/scripts/CLAUDE.md +0 -27
- package/skills/log-audit/scripts/cluster_recurrences.py +0 -261
- package/skills/log-audit/scripts/collect_log_window.py +0 -199
- package/skills/log-audit/scripts/log_audit_constants/CLAUDE.md +0 -12
- package/skills/log-audit/scripts/log_audit_constants/__init__.py +0 -0
- package/skills/log-audit/scripts/log_audit_constants/cluster_recurrences_constants.py +0 -23
- package/skills/log-audit/scripts/log_audit_constants/collect_log_window_constants.py +0 -24
- package/skills/log-audit/scripts/log_audit_constants/mine_copilot_findings_constants.py +0 -49
- package/skills/log-audit/scripts/mine_copilot_findings.py +0 -302
- package/skills/log-audit/scripts/test_cluster_recurrences.py +0 -160
- package/skills/log-audit/scripts/test_collect_log_window.py +0 -111
- package/skills/log-audit/scripts/test_mine_copilot_findings.py +0 -126
- package/skills/logifix/CLAUDE.md +0 -36
- package/skills/logifix/SKILL.md +0 -69
- package/skills/logifix/scripts/CLAUDE.md +0 -16
- package/skills/logifix/scripts/logifix.ps1 +0 -205
- package/skills/monitor-open-prs/CLAUDE.md +0 -34
- package/skills/monitor-open-prs/SKILL.md +0 -88
- package/skills/monitor-open-prs/scripts/CLAUDE.md +0 -17
- package/skills/monitor-open-prs/scripts/discover_open_prs.py +0 -69
- package/skills/monitor-open-prs/scripts/test_discover_open_prs.py +0 -149
- package/skills/monitor-open-prs/test_skill_contract.py +0 -27
- package/skills/post-audit-findings/SKILL.md +0 -80
- package/skills/pr-consistency-audit/CLAUDE.md +0 -34
- package/skills/pr-consistency-audit/SKILL.md +0 -116
- package/skills/pr-consistency-audit/reference/CLAUDE.md +0 -16
- package/skills/pr-consistency-audit/reference/detection-rules.md +0 -96
- package/skills/pr-consistency-audit/reference/illustrations.md +0 -78
- package/skills/pr-review-responder/CLAUDE.md +0 -35
- package/skills/pr-review-responder/EXAMPLES.md +0 -590
- package/skills/pr-review-responder/PRINCIPLES.md +0 -533
- package/skills/pr-review-responder/README.md +0 -168
- package/skills/pr-review-responder/SKILL.md +0 -203
- package/skills/pr-review-responder/TESTING.md +0 -350
- package/skills/pr-scope-resolve/SKILL.md +0 -45
- package/skills/pre-compact/CLAUDE.md +0 -24
- package/skills/pre-compact/SKILL.md +0 -134
- package/skills/qbug/CLAUDE.md +0 -40
- package/skills/qbug/SKILL.md +0 -387
- package/skills/qbug/test_qbug_skill_audit_schema.py +0 -152
- package/skills/qbug/test_qbug_skill_post_fix_audit.py +0 -103
- package/skills/refine/CLAUDE.md +0 -44
- package/skills/refine/SKILL.md +0 -262
- package/skills/refine/templates/CLAUDE.md +0 -17
- package/skills/refine/templates/implementation-notes-template.html +0 -56
- package/skills/refine/templates/plan-template.md +0 -60
- package/skills/research-mode/CLAUDE.md +0 -35
- package/skills/research-mode/SKILL.md +0 -53
- package/skills/structure-prompt/CLAUDE.md +0 -42
- package/skills/structure-prompt/SKILL.md +0 -44
- package/skills/structure-prompt/reference/CLAUDE.md +0 -28
- package/skills/structure-prompt/reference/adversarial-tuning.md +0 -62
- package/skills/structure-prompt/reference/block-classification.md +0 -27
- package/skills/structure-prompt/reference/canonical-case.md +0 -48
- package/skills/structure-prompt/reference/citation-depth.md +0 -70
- package/skills/structure-prompt/reference/cleanup.md +0 -33
- package/skills/structure-prompt/reference/constraints.md +0 -33
- package/skills/structure-prompt/reference/directives.md +0 -37
- package/skills/structure-prompt/reference/examples.md +0 -72
- package/skills/structure-prompt/reference/instantiation.md +0 -51
- package/skills/structure-prompt/reference/output-contract.md +0 -72
- package/skills/structure-prompt/reference/per-category.md +0 -23
- package/skills/structure-prompt/reference/persona.md +0 -38
- package/skills/structure-prompt/reference/research.md +0 -33
- package/skills/structure-prompt/reference/structure.md +0 -28
- package/skills/verified-build/CLAUDE.md +0 -33
- package/skills/verified-build/SKILL.md +0 -33
|
@@ -30,23 +30,13 @@ string is absent after scanning, report `pr-converge requires
|
|
|
30
30
|
ScheduleWakeup; aborting` and stop.
|
|
31
31
|
|
|
32
32
|
Call `EnterWorktree` with no arguments before any API call, file read, or
|
|
33
|
-
edit. Agent-view sessions start in the shared checkout
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
`EnterWorktree` isolates the session's **own** repo. When the PR under
|
|
41
|
-
convergence shares that repo, its worktree is where the CODE_REVIEW phase
|
|
42
|
-
runs. When the PR lives in a different repo, `EnterWorktree` cannot
|
|
43
|
-
re-root into it; Step 1.5 resolves a **PR worktree** — a checkout of the
|
|
44
|
-
PR's repo on its head branch — and routes the working directory into it.
|
|
45
|
-
Routing the working directory into the PR's repo is routine and
|
|
46
|
-
automatic, never a fork to pause on. The Pre-flight `.claude/worktrees/`
|
|
47
|
-
gate covers the session repo's own isolation; for a cross-repo PR the
|
|
48
|
-
working directory routes into the PR's repo for local work and returns to
|
|
49
|
-
the session worktree before teardown. See
|
|
33
|
+
edit. Agent-view sessions start in the shared checkout; Bash (`gh`, `git`)
|
|
34
|
+
does not auto-isolate. Do not proceed until the working directory contains
|
|
35
|
+
`.claude/worktrees/`. If `EnterWorktree` fails, report the failure and stop.
|
|
36
|
+
|
|
37
|
+
`EnterWorktree` isolates the session repo. When the PR lives in a different
|
|
38
|
+
repo, Step 1.5 routes the working directory into a **PR worktree** of that
|
|
39
|
+
repo on its head branch (routine, never a pause). See
|
|
50
40
|
[`reference/per-tick.md` § Step 1.5](reference/per-tick.md).
|
|
51
41
|
|
|
52
42
|
## Resume from a prior run
|
|
@@ -70,28 +60,25 @@ no request, no poll, no agent — and exports
|
|
|
70
60
|
pending-requested-reviews gate and the run still marks ready on the remaining
|
|
71
61
|
signals.
|
|
72
62
|
|
|
73
|
-
## Copilot findings —
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
the
|
|
92
|
-
deadline in the run's persisted state so each tick reads it on entry. Act on the
|
|
93
|
-
user's direction when it arrives inside the window; when the deadline passes
|
|
94
|
-
with no response, run teardown and report the code-concern findings un-reviewed.
|
|
63
|
+
## Copilot findings — tier, verify, then route
|
|
64
|
+
|
|
65
|
+
Tier, verify, and route each Copilot finding via
|
|
66
|
+
[`copilot-finding-triage`](../copilot-finding-triage/SKILL.md) (self-healing
|
|
67
|
+
auto-fix; code-concern verify then confirmed / refuted / inconclusive).
|
|
68
|
+
|
|
69
|
+
**pr-converge phase routing after triage:**
|
|
70
|
+
|
|
71
|
+
- Self-healing and **confirmed** findings join the fix tick on `current_head`;
|
|
72
|
+
after push, reset clean-at SHAs, set `phase = CODE_REVIEW`, return to Step 5.
|
|
73
|
+
- **Refuted** findings resolve clean on the thread; no phase change.
|
|
74
|
+
- One or more **inconclusive** findings: do not mark ready. Run the triage
|
|
75
|
+
skill's user gate (ntfy + 45-minute hold across ticks; persist the deadline so
|
|
76
|
+
each tick reads it on entry). Act on the user's direction inside the window;
|
|
77
|
+
on timeout, teardown and report the findings un-reviewed.
|
|
78
|
+
- Enter `COPILOT_WAIT` only from gate (d) after requesting a Copilot review
|
|
79
|
+
(Step 7 → 7a). Stay on `COPILOT_WAIT` until a review surfaces at
|
|
80
|
+
`current_head`, `copilot_wait_count >= 3` hard-blocks, or `copilot_down`
|
|
81
|
+
skips the Copilot path entirely.
|
|
95
82
|
|
|
96
83
|
## Budget-aware tick boundaries
|
|
97
84
|
|
|
@@ -139,7 +126,7 @@ truth for a resumed tick; the handoff copy is the pointer a fresh session reads
|
|
|
139
126
|
when `$CLAUDE_JOB_DIR` is gone.
|
|
140
127
|
|
|
141
128
|
Fields: `phase`, `tick_count`, `bugbot_clean_at`, `code_review_clean_at`,
|
|
142
|
-
`bugteam_clean_at`, `copilot_clean_at`, `current_head`,
|
|
129
|
+
`bugteam_clean_at`, `copilot_clean_at`, `merge_state_status`, `current_head`,
|
|
143
130
|
`bugbot_acknowledged_at`, `bugbot_down`, `copilot_down`,
|
|
144
131
|
`bugteam_skill_invoked_at_head`, `bugteam_skill_invoked_at_tick`,
|
|
145
132
|
`agents_session_id`, `persistent_agents`.
|
|
@@ -198,14 +185,17 @@ post a fresh PR in a fresh branch based on origin main to the user.
|
|
|
198
185
|
(string, not an object). Always check the correct fields and use
|
|
199
186
|
case-insensitive substring matching on login values, never strict
|
|
200
187
|
equality.
|
|
201
|
-
- **`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
fix-
|
|
208
|
-
|
|
188
|
+
- **`isOutdated` has dual scope** — GitHub marks a thread `isOutdated=true`
|
|
189
|
+
when the line it anchors to has changed since the comment was posted. The
|
|
190
|
+
machine gate (`check_convergence.py` / [convergence-gates.md](reference/convergence-gates.md)
|
|
191
|
+
gate (e)) excludes `isOutdated == true` bot threads from the fail count —
|
|
192
|
+
only non-outdated unresolved bot threads fail the gate. The agent-side
|
|
193
|
+
unresolved-thread sweep in the shared fix protocol
|
|
194
|
+
([`../../_shared/pr-loop/fix-protocol.md`](../../_shared/pr-loop/fix-protocol.md)
|
|
195
|
+
step 12; skill deltas in [`reference/fix-protocol.md`](reference/fix-protocol.md))
|
|
196
|
+
still verifies outdated unresolved threads against HEAD before resolve when
|
|
197
|
+
the protocol requires it (the original concern can still apply when the fix
|
|
198
|
+
moved rather than landed).
|
|
209
199
|
- **Tilde paths fail on Windows Git Bash** — `~/.claude/skills/...`
|
|
210
200
|
resolves to the wrong home directory in Bash-tool contexts. Use
|
|
211
201
|
`$HOME/.claude/skills/...` in shell invocations or `Path.home() /
|
|
@@ -229,7 +219,7 @@ post a fresh PR in a fresh branch based on origin main to the user.
|
|
|
229
219
|
## Progress checklist
|
|
230
220
|
|
|
231
221
|
State variables (`phase`, `bugbot_clean_at`, `code_review_clean_at`,
|
|
232
|
-
`copilot_clean_at`, counters) are
|
|
222
|
+
`bugteam_clean_at`, `copilot_clean_at`, `merge_state_status`, counters) are
|
|
233
223
|
defined in [`reference/state-schema.md`](reference/state-schema.md). Ground rules
|
|
234
224
|
in [`reference/ground-rules.md`](reference/ground-rules.md).
|
|
235
225
|
|
|
@@ -238,9 +228,10 @@ script invocations, decision criteria. Every "return to Step N" means the next
|
|
|
238
228
|
tick starts fresh from that step.
|
|
239
229
|
|
|
240
230
|
**Hard gate: do not advance from any step while ANY unresolved review
|
|
241
|
-
thread exists on the PR.**
|
|
242
|
-
|
|
243
|
-
(
|
|
231
|
+
thread exists on the PR.** Sweep semantics and per-thread handling live in
|
|
232
|
+
the shared fix protocol
|
|
233
|
+
([`../../_shared/pr-loop/fix-protocol.md`](../../_shared/pr-loop/fix-protocol.md)
|
|
234
|
+
step 12; skill deltas in [`reference/fix-protocol.md`](reference/fix-protocol.md)).
|
|
244
235
|
|
|
245
236
|
**Full-PR-diff rule: every CODE-REVIEW round (Step 5) and every BUGTEAM
|
|
246
237
|
round (Step 6) covers the FULL `origin/main...HEAD` diff — every file
|
|
@@ -256,8 +247,8 @@ round as converged. This rule holds every tick, every loop, every PR.
|
|
|
256
247
|
(`../pr-loop-lifecycle/SKILL.md`): permission grant + worktree preflight.
|
|
257
248
|
|
|
258
249
|
- [ ] **Step 1: Resolve PR scope + PR worktree**
|
|
259
|
-
Apply
|
|
260
|
-
|
|
250
|
+
Apply Step 1.5 scope resolution in
|
|
251
|
+
[`reference/per-tick.md`](reference/per-tick.md). Resolve the **PR
|
|
261
252
|
worktree** — the local checkout every local step this tick targets:
|
|
262
253
|
the `EnterWorktree` checkout when the PR shares the session's repo,
|
|
263
254
|
else a checkout of the PR's repo that the working directory routes
|
|
@@ -279,194 +270,77 @@ round as converged. This rule holds every tick, every loop, every PR.
|
|
|
279
270
|
- [ ] not mergeable → rebase → force-push → return to Step 1
|
|
280
271
|
|
|
281
272
|
- [ ] **Step 4: BUGBOT — terminal Bugbot confirmation gate**
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
See: [`reference/per-tick.md` § BUGBOT terminal gate + Step 3](reference/per-tick.md)
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
- [ ] **
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
- [ ] **
|
|
310
|
-
|
|
311
|
-
`phase = CODE_REVIEW`), re-entered after any fix push.
|
|
312
|
-
See: [`reference/per-tick.md` § CODE_REVIEW entry](reference/per-tick.md)
|
|
313
|
-
|
|
314
|
-
Pre-condition: the working directory is the Step 1.5 PR worktree on
|
|
315
|
-
`current_head` (`git rev-parse --show-toplevel` is that checkout).
|
|
316
|
-
When the session is rooted in a different repo than the PR, `cd`
|
|
317
|
-
into the PR worktree first — `/code-review` audits the repo of the
|
|
318
|
-
current working directory, so this routing targets the real PR
|
|
319
|
-
diff. This `cd` is routine and automatic.
|
|
320
|
-
|
|
321
|
-
- [ ] **Static sweep — runs first, before `/code-review`.** Run the
|
|
322
|
-
deterministic gates over the full `origin/main...HEAD` changed files:
|
|
323
|
-
`python "$HOME/.claude/_shared/pr-loop/scripts/code_rules_gate.py" --base origin/main`,
|
|
324
|
-
`ruff`, `mypy`, and stem-matched `pytest`.
|
|
325
|
-
- [ ] Any failure → apply the `pr-fix-protocol` skill
|
|
326
|
-
(`../pr-fix-protocol/SKILL.md`), commit/push, reset
|
|
327
|
-
`bugbot_clean_at = null` and `code_review_clean_at = null`, stay
|
|
328
|
-
`phase = CODE_REVIEW`, and re-run (return to Step 5).
|
|
329
|
-
- [ ] Clean → run `/code-review` below.
|
|
330
|
-
|
|
331
|
-
Run Claude Code's built-in `/code-review high --fix` on the full
|
|
332
|
-
`origin/main...HEAD` diff —
|
|
333
|
-
the [local diff review](https://code.claude.com/docs/en/code-review#review-a-diff-locally)
|
|
334
|
-
— so it reviews the diff and applies its findings to the working
|
|
335
|
-
tree. Invoke `/code-review high --fix` so the pre-catch pass gets broad
|
|
336
|
-
coverage regardless of the session's current effort.
|
|
337
|
-
|
|
338
|
-
**Scope: the FULL `origin/main...HEAD` diff every tick** — every file
|
|
339
|
-
the PR touches. Do not delta-scope to commits added since the prior
|
|
340
|
-
clean SHA, do not scope to a single file, do not scope to bugbot's
|
|
341
|
-
flagged paths. Before running, confirm the working tree is on the
|
|
342
|
-
PR's HEAD with no uncommitted edits, then invoke `/code-review high --fix`
|
|
343
|
-
with no path arguments so it audits the whole branch diff against
|
|
344
|
-
`origin/main`. A partial-scope round does not count and cannot set
|
|
345
|
-
`code_review_clean_at`.
|
|
346
|
-
|
|
347
|
-
- [ ] **fixes applied** (working tree changed) →
|
|
348
|
-
- [ ] Commit the applied fixes (one commit) → push
|
|
349
|
-
- [ ] reset `bugbot_clean_at = null`, `code_review_clean_at = null`
|
|
350
|
-
- [ ] stay `phase = CODE_REVIEW` → return to Step 5 (internal-first)
|
|
351
|
-
- [ ] **clean** (no changes applied) →
|
|
352
|
-
- [ ] Zero unresolved threads per the `pr-fix-protocol` sweep (`../pr-fix-protocol/SKILL.md`) → advance; else fix + resolve first (same skill)
|
|
353
|
-
- [ ] `code_review_clean_at = current_head`
|
|
354
|
-
- [ ] `phase = BUGTEAM` → advance to Step 6
|
|
273
|
+
Step 6 routes here after BUGTEAM converges. Bugbot confirms code the
|
|
274
|
+
internal passes already drove to clean.
|
|
275
|
+
See: [`reference/per-tick.md` § BUGBOT terminal gate + Step 3](reference/per-tick.md);
|
|
276
|
+
availability and trigger via `reviewer-gates`
|
|
277
|
+
(`../reviewer-gates/SKILL.md` § Gate 1 / Gate 3).
|
|
278
|
+
|
|
279
|
+
- [ ] **disabled / down** → `bugbot_down = true` → Step 7
|
|
280
|
+
- [ ] **dirty on `current_head`** → apply shared fix protocol
|
|
281
|
+
([`../../_shared/pr-loop/fix-protocol.md`](../../_shared/pr-loop/fix-protocol.md);
|
|
282
|
+
skill deltas in [`reference/fix-protocol.md`](reference/fix-protocol.md))
|
|
283
|
+
→ push → reset push-invalidated markers → `phase = CODE_REVIEW` → Step 5
|
|
284
|
+
- [ ] **clean on `current_head`** → zero unresolved threads (else fix + resolve first)
|
|
285
|
+
→ `bugbot_clean_at = current_head` → Step 7
|
|
286
|
+
- [ ] **no review / commit_id mismatch** → `reviewer-gates` Bugbot flow (Gate 3):
|
|
287
|
+
silent pass → stamp + Step 7; queued/triggered → 360s wakeup → Step 4;
|
|
288
|
+
down → `bugbot_down = true` → Step 7
|
|
289
|
+
|
|
290
|
+
- [ ] **Step 5: CODE-REVIEW — static sweep, review, fix, advance**
|
|
291
|
+
Entry phase every tick; re-entered after any fix push.
|
|
292
|
+
See: [`reference/per-tick.md` § CODE_REVIEW entry](reference/per-tick.md).
|
|
293
|
+
Pre-condition: cwd is the Step 1.5 PR worktree on `current_head`.
|
|
294
|
+
Scope: FULL `origin/main...HEAD` diff every tick (no path args, no delta cut).
|
|
295
|
+
|
|
296
|
+
- [ ] **Static sweep fails** → apply shared fix protocol → push → reset markers
|
|
297
|
+
→ stay CODE_REVIEW → Step 5
|
|
298
|
+
- [ ] **`/code-review high --fix` applies fixes** → commit + push → reset markers
|
|
299
|
+
→ stay CODE_REVIEW → Step 5
|
|
300
|
+
- [ ] **clean** → zero unresolved threads (else fix + resolve) →
|
|
301
|
+
`code_review_clean_at = current_head` → `phase = BUGTEAM` → Step 6
|
|
355
302
|
|
|
356
303
|
- [ ] **Step 6: BUGTEAM — run, decide, fix, reply, resolve**
|
|
357
304
|
See: [`reference/per-tick.md` § Step 2 BUGTEAM](reference/per-tick.md);
|
|
358
|
-
[`../bugteam/SKILL.md`](../bugteam/SKILL.md)
|
|
359
|
-
|
|
305
|
+
[`../bugteam/SKILL.md`](../bugteam/SKILL.md).
|
|
360
306
|
Pre-condition: `code_review_clean_at == current_head`.
|
|
307
|
+
Mandatory: `Skill({skill: "bugteam", args: "<PR URL>"})` this tick
|
|
308
|
+
(enforcer-blocked otherwise; `qbug` is not a substitute). Scope: FULL
|
|
309
|
+
`origin/main...HEAD` diff. Re-resolve HEAD after bugteam.
|
|
361
310
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
**Scope: the FULL `origin/main...HEAD` diff every tick** — every file
|
|
369
|
-
the PR touches. Pass the PR URL as the sole argument so bugteam audits
|
|
370
|
-
the whole branch diff against `origin/main`. Do not pass a file list,
|
|
371
|
-
a path filter, a commit range, or any "just the new commits since
|
|
372
|
-
last clean" cut — bugteam owns its own discovery on the full PR diff.
|
|
373
|
-
A partial-scope round does not count and cannot satisfy the
|
|
374
|
-
converged-on-current-HEAD condition below.
|
|
375
|
-
|
|
376
|
-
After bugteam completes, re-resolve HEAD.
|
|
377
|
-
|
|
378
|
-
- [ ] **bugteam pushed new commits** →
|
|
379
|
-
- [ ] Verify all bugteam review threads replied + resolved
|
|
380
|
-
- [ ] reset `bugbot_clean_at = null`, `code_review_clean_at = null`
|
|
381
|
-
- [ ] `phase = CODE_REVIEW` → schedule 360s wakeup → return to Step 5
|
|
382
|
-
- [ ] **converged (zero findings), no push** →
|
|
383
|
-
- [ ] Count ALL unresolved threads on PR (`is_resolved == false`) → zero? advance; >0? fix + resolve first
|
|
384
|
-
- [ ] `phase = BUGBOT` → advance to Step 4 (terminal Bugbot gate)
|
|
385
|
-
- [ ] **findings without committed fixes** →
|
|
386
|
-
- [ ] Apply the `pr-fix-protocol` skill (`../pr-fix-protocol/SKILL.md`) to the findings
|
|
387
|
-
- [ ] Push → reset `bugbot_clean_at = null`, `code_review_clean_at = null` → `phase = CODE_REVIEW` → return to Step 5
|
|
311
|
+
- [ ] **bugteam pushed** → verify threads replied + resolved → reset markers
|
|
312
|
+
→ `phase = CODE_REVIEW` → 360s wakeup → Step 5
|
|
313
|
+
- [ ] **converged, no push** → zero unresolved threads →
|
|
314
|
+
`bugteam_clean_at = current_head` → `phase = BUGBOT` → Step 4
|
|
315
|
+
- [ ] **findings without committed fixes** → apply shared fix protocol → push →
|
|
316
|
+
reset markers → `phase = CODE_REVIEW` → Step 5
|
|
388
317
|
|
|
389
318
|
- [ ] **Step 7: Convergence gates**
|
|
390
|
-
|
|
319
|
+
Full procedure: [`reference/convergence-gates.md`](reference/convergence-gates.md).
|
|
391
320
|
|
|
392
321
|
Pre-condition: Step 6 converged AND (`bugbot_clean_at == current_head` OR
|
|
393
322
|
`bugbot_down`). The terminal Bugbot gate (Step 4) sets that state just
|
|
394
|
-
before these gates run.
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
**(a) Universal unresolved-thread sweep**
|
|
398
|
-
- [ ] Fetch ALL unresolved threads on the PR:
|
|
399
|
-
```
|
|
400
|
-
pull_request_read(method="get_review_comments")
|
|
401
|
-
→ filter threads where is_resolved == false
|
|
402
|
-
```
|
|
403
|
-
- [ ] Any unresolved? → apply the `pr-fix-protocol` skill's unresolved-thread sweep (`../pr-fix-protocol/SKILL.md`). Push if any code changed → reset markers → `phase = CODE_REVIEW` → return to Step 5
|
|
404
|
-
- [ ] When `copilot_down == true` (start-of-run quota pre-check), skip the Copilot fetch below — no request, no poll, no agent — and continue to gate (b); the Copilot gate is bypassed for the whole run.
|
|
405
|
-
- [ ] Fetch Copilot review on `current_head` (top-level review state — uses get_reviews, identifies by reviewer):
|
|
406
|
-
```
|
|
407
|
-
python ~/.claude/skills/pr-converge/scripts/fetch_copilot_reviews.py --owner <O> --repo <R> --pr-number <N>
|
|
408
|
-
```
|
|
409
|
-
- [ ] dirty → apply the `pr-fix-protocol` skill (`../pr-fix-protocol/SKILL.md`) → push → reset markers → `phase = CODE_REVIEW` → return to Step 5
|
|
410
|
-
- [ ] clean (no findings) → `copilot_clean_at = current_head` → gate (b)
|
|
411
|
-
- [ ] no review yet → gate (b)
|
|
412
|
-
|
|
413
|
-
**(b) Mergeability re-check**
|
|
414
|
-
```
|
|
415
|
-
pull_request_read(method="get") → .mergeable_state, .mergeable
|
|
416
|
-
```
|
|
417
|
-
- [ ] mergeable → gate (c)
|
|
418
|
-
- [ ] not mergeable → rebase → push → return to Step 1
|
|
419
|
-
|
|
420
|
-
**(c) Request Copilot review**
|
|
421
|
-
- [ ] When `copilot_down == true`, skip the request and do not enter COPILOT_WAIT — continue to gate (d); the run marks ready on the remaining signals.
|
|
422
|
-
- [ ] Check for pending Copilot review:
|
|
423
|
-
```
|
|
424
|
-
python ~/.claude/skills/pr-converge/scripts/check_pending_reviews.py --owner <O> --repo <R> --pr-number <N>
|
|
425
|
-
→ filter by copilot user
|
|
426
|
-
```
|
|
427
|
-
- [ ] Pending review already exists → skip request → gate (d)
|
|
428
|
-
- [ ] No pending review → request:
|
|
429
|
-
```
|
|
430
|
-
gh api --method POST repos/<O>/<R>/pulls/<N>/requested_reviewers \
|
|
431
|
-
-f 'reviewers[]=copilot-pull-request-reviewer[bot]'
|
|
432
|
-
```
|
|
433
|
-
- [ ] `phase = COPILOT_WAIT` → schedule 360s wakeup → return to Step 7a next tick
|
|
434
|
-
|
|
435
|
-
**(d) Thread resolution — author-agnostic, outdated-agnostic**
|
|
436
|
-
```
|
|
437
|
-
pull_request_read(method="get_review_comments")
|
|
438
|
-
→ count threads where is_resolved == false
|
|
439
|
-
```
|
|
440
|
-
- [ ] zero unresolved → gate (e)
|
|
441
|
-
- [ ] unresolved → apply the `pr-fix-protocol` skill's unresolved-thread sweep (`../pr-fix-protocol/SKILL.md`). Push if code changed → reset markers → `phase = CODE_REVIEW` → return to Step 5
|
|
442
|
-
|
|
443
|
-
**(e) Mark ready**
|
|
444
|
-
- [ ] When `copilot_down == true`, export `CLAUDE_REVIEWS_DISABLED="copilot"` in this tick's shell before the check below, so it bypasses the Copilot review gate and the pending-requested-reviews gate.
|
|
445
|
-
- [ ] Run automated convergence check:
|
|
446
|
-
```
|
|
447
|
-
python $HOME/.claude/skills/pr-converge/scripts/check_convergence.py \
|
|
448
|
-
--owner <O> --repo <R> --pr-number <N>
|
|
449
|
-
```
|
|
450
|
-
- [ ] Exit 0 (all pass) → `update_pull_request(draft=false)` → advance to Step 8
|
|
451
|
-
- [ ] Exit 1 (FAIL lines) → address each failure → reset markers → `phase = CODE_REVIEW` → return to Step 5
|
|
452
|
-
- [ ] Exit 2 (gh error) → retry once; persistent → stop
|
|
453
|
-
|
|
454
|
-
- [ ] **Step 7a: COPILOT_WAIT — fetch Copilot, decide**
|
|
455
|
-
See: [`reference/per-tick.md` § Step 2 COPILOT_WAIT](reference/per-tick.md)
|
|
323
|
+
before these gates run. Count unresolved threads before each gate.
|
|
324
|
+
Every gate records evidence; gate (f) cites evidence from (a)–(e).
|
|
456
325
|
|
|
457
|
-
|
|
458
|
-
|
|
326
|
+
- [ ] **(a) Copilot findings** — fetch Copilot on `current_head`; dirty → fix + return to Step 5; clean → stamp `copilot_clean_at`; absent → continue; when `copilot_down`, skip
|
|
327
|
+
- [ ] **(b) Claude reviewer** — fetch Claude on `current_head`; dirty → fix + return to Step 5; clean or absent → continue
|
|
328
|
+
- [ ] **(c) Mergeability** — `mergeable_state == "clean"` and `mergeable == true`; dirty → rebase + return to Step 1; blocked/behind/unknown/unstable → hard blocker
|
|
329
|
+
- [ ] **(d) Post-convergence Copilot request** — request Copilot when not pending and not `copilot_down`; enter `COPILOT_WAIT` (Step 7a); when `copilot_down`, skip to (e)
|
|
330
|
+
- [ ] **(e) Thread-resolution** — zero unresolved threads across the PR; else sweep + fix/resolve
|
|
331
|
+
- [ ] **(f) Mark ready** — run `check_convergence.py`; exit 0 → `update_pull_request(draft=false)` → Step 8; exit 1 → fix path; exit 2 → retry/stop
|
|
459
332
|
|
|
460
|
-
|
|
333
|
+
- [ ] **Step 7a: COPILOT_WAIT — fetch Copilot, decide**
|
|
334
|
+
See: [`reference/per-tick.md` § Step 2 COPILOT_WAIT](reference/per-tick.md).
|
|
335
|
+
Skipped entirely when `copilot_down` (gate (d) never enters this phase).
|
|
461
336
|
|
|
462
|
-
- [ ] **clean (
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
- [ ] **no review yet** →
|
|
468
|
-
|
|
469
|
-
schedule 360s wakeup → return to Step 7a next tick
|
|
337
|
+
- [ ] **clean** → `copilot_clean_at = current_head` → Step 7 (re-validate (b), (c), (e), (f))
|
|
338
|
+
- [ ] **dirty** → apply shared fix protocol
|
|
339
|
+
([`../../_shared/pr-loop/fix-protocol.md`](../../_shared/pr-loop/fix-protocol.md);
|
|
340
|
+
skill deltas in [`reference/fix-protocol.md`](reference/fix-protocol.md))
|
|
341
|
+
→ push → reset markers → `phase = CODE_REVIEW` → Step 5
|
|
342
|
+
- [ ] **no review yet** → increment `copilot_wait_count` → ≥ 3 hard-blocks;
|
|
343
|
+
else 360s wakeup → Step 7a next tick
|
|
470
344
|
|
|
471
345
|
- [ ] **Step 8: Clean working tree**
|
|
472
346
|
`pr-loop-lifecycle` Close (`../pr-loop-lifecycle/SKILL.md`).
|
|
@@ -495,8 +369,33 @@ round as converged. This rule holds every tick, every loop, every PR.
|
|
|
495
369
|
| Hard blocker or user stops loop | [`reference/stop-conditions.md`](reference/stop-conditions.md) |
|
|
496
370
|
| Tick is ambiguous against the steps above | [`reference/examples.md`](reference/examples.md) |
|
|
497
371
|
|
|
498
|
-
##
|
|
372
|
+
## Depends on / invokes
|
|
499
373
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
374
|
+
| Skill / path | Role |
|
|
375
|
+
|---|---|
|
|
376
|
+
| `pr-loop-lifecycle` | Open (permission grant + worktree preflight) and Close (cleanup, PR description, revoke) |
|
|
377
|
+
| `reviewer-gates` | Copilot quota gate, Bugbot availability, Bugbot trigger flow |
|
|
378
|
+
| `copilot-finding-triage` | Tier, verify, and route each Copilot finding |
|
|
379
|
+
| `bugteam` | Full-diff bug audit in Step 6 (Skill invocation mandatory) |
|
|
380
|
+
| `pr-loop-cloud-transport` | When `gh` is unavailable or unauthenticated |
|
|
381
|
+
| [`../../_shared/pr-loop/fix-protocol.md`](../../_shared/pr-loop/fix-protocol.md) | Shared 13-step fix sequence (TDD, commit, push, reply, resolve) |
|
|
382
|
+
| [`reference/fix-protocol.md`](reference/fix-protocol.md) | pr-converge deltas on the shared fix protocol |
|
|
383
|
+
|
|
384
|
+
## Package file index
|
|
385
|
+
|
|
386
|
+
| Path | Purpose |
|
|
387
|
+
|---|---|
|
|
388
|
+
| `SKILL.md` | Hub: pre-flight, state, progress checklist, gotchas |
|
|
389
|
+
| `CLAUDE.md` | Package map for agents working in this skill |
|
|
390
|
+
| `pr_converge_skill_constants/` | Importable constants for skill scripts |
|
|
391
|
+
| `reference/per-tick.md` | Full per-tick procedure (phases, cwd routing, pacing) |
|
|
392
|
+
| `reference/convergence-gates.md` | Six gates before mark-ready |
|
|
393
|
+
| `reference/fix-protocol.md` | pr-converge fix-protocol deltas |
|
|
394
|
+
| `reference/ground-rules.md` | Non-negotiable loop constraints |
|
|
395
|
+
| `reference/state-schema.md` | `pr-converge-state.json` fields |
|
|
396
|
+
| `reference/stop-conditions.md` | Hard stops without convergence |
|
|
397
|
+
| `reference/multi-pr-orchestration.md` | Multi-PR session orchestration |
|
|
398
|
+
| `reference/examples.md` | Worked tick sequences |
|
|
399
|
+
| `reference/obstacles/` | Per-obstacle fix runbooks |
|
|
400
|
+
| `scripts/` | Convergence helpers, Copilot fetch, fix-reply poster, tests |
|
|
401
|
+
| `workflows/schedule-wakeup-loop.md` | ScheduleWakeup pacing |
|