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.
Files changed (262) hide show
  1. package/_shared/advisor/CLAUDE.md +2 -2
  2. package/_shared/advisor/advisor-protocol.md +35 -27
  3. package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +3 -2
  4. package/_shared/advisor/scripts/model_tier_run_validator.py +23 -15
  5. package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +81 -17
  6. package/_shared/pr-loop/CLAUDE.md +1 -0
  7. package/_shared/pr-loop/audit-contract.md +1 -1
  8. package/_shared/pr-loop/gh-payloads.md +3 -3
  9. package/_shared/pr-loop/post-audit-thread-contract.md +51 -0
  10. package/_shared/pr-loop/scripts/README.md +2 -2
  11. package/_shared/pr-loop/scripts/fix_hookspath.py +47 -12
  12. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +0 -69
  13. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -374
  14. package/_shared/pr-loop/state-schema.md +3 -22
  15. package/bin/CLAUDE.md +11 -2
  16. package/bin/ever-shipped-skills.mjs +70 -0
  17. package/bin/install.mjs +138 -13
  18. package/bin/install.prune.test.mjs +457 -0
  19. package/bin/install.test.mjs +10 -4
  20. package/docs/CODE_RULES.md +1 -1
  21. package/hooks/blocking/CLAUDE.md +2 -0
  22. package/hooks/blocking/code_rules_enforcer.py +4 -0
  23. package/hooks/blocking/code_rules_shared.py +82 -0
  24. package/hooks/blocking/code_rules_test_layout.py +9 -3
  25. package/hooks/blocking/pii_commit_command.py +398 -0
  26. package/hooks/blocking/pii_payload_scan.py +133 -0
  27. package/hooks/blocking/pii_prevention_blocker.py +151 -449
  28. package/hooks/blocking/plain_language_blocker.py +138 -4
  29. package/hooks/blocking/sensitive_file_protector.py +114 -48
  30. package/hooks/blocking/tdd_enforcer.py +9 -2
  31. package/hooks/blocking/test_code_rules_enforcer_scratchpad.py +105 -0
  32. package/hooks/blocking/test_code_rules_shared.py +181 -0
  33. package/hooks/blocking/test_pii_prevention_blocker.py +299 -0
  34. package/hooks/blocking/test_plain_language_blocker_allowlist.py +184 -0
  35. package/hooks/blocking/test_sensitive_file_protector.py +185 -0
  36. package/hooks/blocking/test_tdd_enforcer_scratchpad.py +105 -0
  37. package/hooks/blocking/test_verdict_directory_write_blocker.py +42 -7
  38. package/hooks/hooks_constants/CLAUDE.md +4 -2
  39. package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -2
  40. package/hooks/hooks_constants/harness_scratchpad_constants.py +17 -0
  41. package/hooks/hooks_constants/local_identity.py +65 -15
  42. package/hooks/hooks_constants/pii_prevention_constants.py +16 -0
  43. package/hooks/hooks_constants/plain_language_blocker_constants.py +5 -0
  44. package/hooks/hooks_constants/pr_description_enforcer_constants.py +1 -1
  45. package/hooks/hooks_constants/sensitive_file_protector_constants.py +42 -0
  46. package/hooks/hooks_constants/test_local_identity.py +68 -0
  47. package/hooks/pyproject.toml +75 -4
  48. package/hooks/validators/CLAUDE.md +1 -1
  49. package/hooks/validators/README.md +2 -0
  50. package/hooks/validators/python_style_checks.py +114 -136
  51. package/hooks/validators/python_style_helpers.py +95 -0
  52. package/hooks/validators/test_python_style_checks.py +0 -164
  53. package/hooks/validators/test_python_style_checks_decorator_gap.py +119 -0
  54. package/hooks/validators/test_python_style_fixes.py +251 -0
  55. package/hooks/validators/test_python_style_helpers.py +125 -0
  56. package/package.json +1 -1
  57. package/rules/CLAUDE.md +1 -0
  58. package/rules/anti-corollary-tests.md +69 -0
  59. package/rules/bdd.md +1 -3
  60. package/rules/code-reviews.md +1 -1
  61. package/rules/gh-paginate.md +1 -1
  62. package/rules/plain-language.md +2 -0
  63. package/scripts/CLAUDE.md +10 -1
  64. package/scripts/Get-SessionAccount.ps1 +210 -0
  65. package/scripts/tests/CLAUDE.md +15 -1
  66. package/scripts/tests/Get-SessionAccount.Tests.ps1 +350 -0
  67. package/skills/CLAUDE.md +6 -27
  68. package/skills/anthropic-plan/SKILL.md +1 -13
  69. package/skills/autoconverge/CLAUDE.md +5 -2
  70. package/skills/autoconverge/SKILL.md +112 -387
  71. package/skills/autoconverge/reference/CLAUDE.md +4 -1
  72. package/skills/autoconverge/reference/closing-report.md +9 -2
  73. package/skills/autoconverge/reference/convergence.md +26 -22
  74. package/skills/autoconverge/reference/headless-safety.md +44 -0
  75. package/skills/autoconverge/reference/multi-pr.md +88 -0
  76. package/skills/autoconverge/reference/self-closing-loop.md +84 -0
  77. package/skills/autoconverge/reference/stop-conditions.md +21 -13
  78. package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +87 -27
  79. package/skills/autoconverge/workflow/converge.contract.test.mjs +40 -10
  80. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +179 -47
  81. package/skills/autoconverge/workflow/converge.fix-progress.test.mjs +1 -1
  82. package/skills/autoconverge/workflow/converge.mjs +286 -96
  83. package/skills/bugteam/CLAUDE.md +1 -1
  84. package/skills/bugteam/CONSTRAINTS.md +3 -3
  85. package/skills/bugteam/PROMPTS.md +8 -19
  86. package/skills/bugteam/SKILL.md +13 -14
  87. package/skills/bugteam/reference/CLAUDE.md +1 -1
  88. package/skills/bugteam/reference/README.md +2 -3
  89. package/skills/bugteam/reference/audit-and-teammates.md +2 -2
  90. package/skills/bugteam/reference/copilot-gap-analysis.md +2 -0
  91. package/skills/bugteam/reference/github-pr-reviews.md +56 -38
  92. package/skills/bugteam/reference/team-setup.md +11 -11
  93. package/skills/bugteam/scripts/CLAUDE.md +6 -6
  94. package/skills/bugteam/scripts/README.md +20 -8
  95. package/skills/bugteam/scripts/bugteam_code_rules_gate.py +13 -1463
  96. package/skills/bugteam/scripts/bugteam_fix_hookspath.py +23 -358
  97. package/skills/bugteam/scripts/bugteam_preflight.py +13 -315
  98. package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +2 -3
  99. package/skills/bugteam/scripts/test_bugteam_code_rules_gate.py +34 -1053
  100. package/skills/bugteam/scripts/test_bugteam_fix_hookspath.py +30 -347
  101. package/skills/bugteam/scripts/test_bugteam_preflight.py +30 -305
  102. package/skills/closeout/SKILL.md +153 -0
  103. package/skills/closeout/reference/handoff-prompt-template.md +72 -0
  104. package/skills/closeout/reference/issue-body-templates.md +108 -0
  105. package/skills/closeout/reference/pii-redaction-checklist.md +36 -0
  106. package/skills/copilot-finding-triage/SKILL.md +80 -28
  107. package/skills/copilot-finding-triage/reference/tier-rubric.md +70 -11
  108. package/skills/copilot-finding-triage/templates/notification.md +8 -3
  109. package/skills/everything-search/SKILL.md +1 -2
  110. package/skills/grokify/SKILL.md +58 -0
  111. package/skills/grokify/templates/handoff-template.md +92 -0
  112. package/skills/orchestrator/SKILL.md +35 -25
  113. package/skills/orchestrator-refresh/SKILL.md +15 -11
  114. package/skills/pr-converge/CLAUDE.md +1 -1
  115. package/skills/pr-converge/SKILL.md +132 -233
  116. package/skills/pr-converge/reference/convergence-gates.md +102 -66
  117. package/skills/pr-converge/reference/examples.md +37 -25
  118. package/skills/pr-converge/reference/fix-protocol.md +7 -7
  119. package/skills/pr-converge/reference/multi-pr-orchestration.md +10 -4
  120. package/skills/pr-converge/reference/per-tick.md +64 -41
  121. package/skills/pr-converge/reference/state-schema.md +27 -2
  122. package/skills/pr-converge/scripts/CLAUDE.md +8 -0
  123. package/skills/pr-converge/scripts/README.md +4 -3
  124. package/skills/pr-converge/scripts/_pr_converge_path_setup.py +23 -0
  125. package/skills/pr-converge/scripts/check_convergence.py +189 -645
  126. package/skills/pr-converge/scripts/check_convergence_gates.py +235 -0
  127. package/skills/pr-converge/scripts/check_convergence_thread_gates.py +219 -0
  128. package/skills/pr-converge/scripts/conftest.py +8 -0
  129. package/skills/pr-converge/scripts/pr_converge_scripts_constants/CLAUDE.md +1 -0
  130. package/skills/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +36 -0
  131. package/skills/pr-converge/scripts/test__pr_converge_path_setup.py +26 -0
  132. package/skills/pr-converge/scripts/test_check_convergence.py +73 -228
  133. package/skills/pr-converge/scripts/test_check_convergence_contract.py +321 -0
  134. package/skills/pr-converge/scripts/test_check_convergence_gates.py +68 -0
  135. package/skills/pr-converge/scripts/test_check_convergence_thread_gates.py +75 -0
  136. package/skills/pr-fix-protocol/SKILL.md +20 -20
  137. package/skills/privacy-hygiene/SKILL.md +4 -3
  138. package/skills/reviewer-gates/SKILL.md +26 -8
  139. package/skills/session-log/SKILL.md +11 -12
  140. package/skills/session-tidy/SKILL.md +40 -30
  141. package/skills/skill-builder/CLAUDE.md +13 -10
  142. package/skills/skill-builder/SKILL.md +31 -31
  143. package/skills/skill-builder/references/CLAUDE.md +10 -6
  144. package/skills/skill-builder/references/delegation-map.md +13 -4
  145. package/skills/skill-builder/references/description-field.md +113 -0
  146. package/skills/skill-builder/references/self-audit-checklist.md +21 -4
  147. package/skills/skill-builder/references/skill-modularity.md +113 -0
  148. package/skills/skill-builder/references/skill-types.md +4 -0
  149. package/skills/skill-builder/templates/CLAUDE.md +4 -4
  150. package/skills/skill-builder/templates/gap-analysis.md +25 -1
  151. package/skills/skill-builder/workflows/CLAUDE.md +6 -4
  152. package/skills/skill-builder/workflows/improve-skill.md +17 -16
  153. package/skills/skill-builder/workflows/new-skill.md +34 -10
  154. package/skills/skill-builder/workflows/polish-skill.md +59 -43
  155. package/skills/team-advisor/SKILL.md +15 -11
  156. package/skills/usage-pause/SKILL.md +10 -14
  157. package/system-prompts/software-engineer.xml +7 -6
  158. package/hooks/validators/test_verify_paths.py +0 -32
  159. package/hooks/validators/verify_paths.py +0 -57
  160. package/skills/bdd-protocol/CLAUDE.md +0 -26
  161. package/skills/bdd-protocol/SKILL.md +0 -30
  162. package/skills/bdd-protocol/references/CLAUDE.md +0 -10
  163. package/skills/bdd-protocol/references/anti-patterns.md +0 -26
  164. package/skills/bdd-protocol/references/example-mapping.md +0 -23
  165. package/skills/bg-agent/CLAUDE.md +0 -17
  166. package/skills/bg-agent/SKILL.md +0 -69
  167. package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_code_rules_gate_constants.py +0 -55
  168. package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_fix_hookspath_constants.py +0 -26
  169. package/skills/bugteam/scripts/bugteam_scripts_constants/bugteam_preflight_constants.py +0 -35
  170. package/skills/caveman/CLAUDE.md +0 -15
  171. package/skills/caveman/SKILL.md +0 -38
  172. package/skills/code/CLAUDE.md +0 -17
  173. package/skills/code/SKILL.md +0 -178
  174. package/skills/deep-research/CLAUDE.md +0 -17
  175. package/skills/deep-research/SKILL.md +0 -80
  176. package/skills/findbugs/CLAUDE.md +0 -20
  177. package/skills/findbugs/SKILL.md +0 -241
  178. package/skills/fixbugs/CLAUDE.md +0 -19
  179. package/skills/fixbugs/SKILL.md +0 -142
  180. package/skills/gh-paginate/CLAUDE.md +0 -18
  181. package/skills/gh-paginate/SKILL.md +0 -84
  182. package/skills/gotcha/CLAUDE.md +0 -33
  183. package/skills/gotcha/SKILL.md +0 -73
  184. package/skills/implement/CLAUDE.md +0 -27
  185. package/skills/implement/SKILL.md +0 -66
  186. package/skills/implement/scripts/CLAUDE.md +0 -22
  187. package/skills/implement/scripts/append_note.py +0 -133
  188. package/skills/implement/scripts/implement_scripts_constants/CLAUDE.md +0 -22
  189. package/skills/implement/scripts/implement_scripts_constants/__init__.py +0 -0
  190. package/skills/implement/scripts/implement_scripts_constants/notes_constants.py +0 -12
  191. package/skills/implement/scripts/test_append_note.py +0 -191
  192. package/skills/log-audit/CLAUDE.md +0 -20
  193. package/skills/log-audit/SKILL.md +0 -66
  194. package/skills/log-audit/reference/CLAUDE.md +0 -9
  195. package/skills/log-audit/reference/charter.md +0 -52
  196. package/skills/log-audit/scripts/CLAUDE.md +0 -27
  197. package/skills/log-audit/scripts/cluster_recurrences.py +0 -261
  198. package/skills/log-audit/scripts/collect_log_window.py +0 -199
  199. package/skills/log-audit/scripts/log_audit_constants/CLAUDE.md +0 -12
  200. package/skills/log-audit/scripts/log_audit_constants/__init__.py +0 -0
  201. package/skills/log-audit/scripts/log_audit_constants/cluster_recurrences_constants.py +0 -23
  202. package/skills/log-audit/scripts/log_audit_constants/collect_log_window_constants.py +0 -24
  203. package/skills/log-audit/scripts/log_audit_constants/mine_copilot_findings_constants.py +0 -49
  204. package/skills/log-audit/scripts/mine_copilot_findings.py +0 -302
  205. package/skills/log-audit/scripts/test_cluster_recurrences.py +0 -160
  206. package/skills/log-audit/scripts/test_collect_log_window.py +0 -111
  207. package/skills/log-audit/scripts/test_mine_copilot_findings.py +0 -126
  208. package/skills/logifix/CLAUDE.md +0 -36
  209. package/skills/logifix/SKILL.md +0 -69
  210. package/skills/logifix/scripts/CLAUDE.md +0 -16
  211. package/skills/logifix/scripts/logifix.ps1 +0 -205
  212. package/skills/monitor-open-prs/CLAUDE.md +0 -34
  213. package/skills/monitor-open-prs/SKILL.md +0 -88
  214. package/skills/monitor-open-prs/scripts/CLAUDE.md +0 -17
  215. package/skills/monitor-open-prs/scripts/discover_open_prs.py +0 -69
  216. package/skills/monitor-open-prs/scripts/test_discover_open_prs.py +0 -149
  217. package/skills/monitor-open-prs/test_skill_contract.py +0 -27
  218. package/skills/post-audit-findings/SKILL.md +0 -80
  219. package/skills/pr-consistency-audit/CLAUDE.md +0 -34
  220. package/skills/pr-consistency-audit/SKILL.md +0 -116
  221. package/skills/pr-consistency-audit/reference/CLAUDE.md +0 -16
  222. package/skills/pr-consistency-audit/reference/detection-rules.md +0 -96
  223. package/skills/pr-consistency-audit/reference/illustrations.md +0 -78
  224. package/skills/pr-review-responder/CLAUDE.md +0 -35
  225. package/skills/pr-review-responder/EXAMPLES.md +0 -590
  226. package/skills/pr-review-responder/PRINCIPLES.md +0 -533
  227. package/skills/pr-review-responder/README.md +0 -168
  228. package/skills/pr-review-responder/SKILL.md +0 -203
  229. package/skills/pr-review-responder/TESTING.md +0 -350
  230. package/skills/pr-scope-resolve/SKILL.md +0 -45
  231. package/skills/pre-compact/CLAUDE.md +0 -24
  232. package/skills/pre-compact/SKILL.md +0 -134
  233. package/skills/qbug/CLAUDE.md +0 -40
  234. package/skills/qbug/SKILL.md +0 -387
  235. package/skills/qbug/test_qbug_skill_audit_schema.py +0 -152
  236. package/skills/qbug/test_qbug_skill_post_fix_audit.py +0 -103
  237. package/skills/refine/CLAUDE.md +0 -44
  238. package/skills/refine/SKILL.md +0 -262
  239. package/skills/refine/templates/CLAUDE.md +0 -17
  240. package/skills/refine/templates/implementation-notes-template.html +0 -56
  241. package/skills/refine/templates/plan-template.md +0 -60
  242. package/skills/research-mode/CLAUDE.md +0 -35
  243. package/skills/research-mode/SKILL.md +0 -53
  244. package/skills/structure-prompt/CLAUDE.md +0 -42
  245. package/skills/structure-prompt/SKILL.md +0 -44
  246. package/skills/structure-prompt/reference/CLAUDE.md +0 -28
  247. package/skills/structure-prompt/reference/adversarial-tuning.md +0 -62
  248. package/skills/structure-prompt/reference/block-classification.md +0 -27
  249. package/skills/structure-prompt/reference/canonical-case.md +0 -48
  250. package/skills/structure-prompt/reference/citation-depth.md +0 -70
  251. package/skills/structure-prompt/reference/cleanup.md +0 -33
  252. package/skills/structure-prompt/reference/constraints.md +0 -33
  253. package/skills/structure-prompt/reference/directives.md +0 -37
  254. package/skills/structure-prompt/reference/examples.md +0 -72
  255. package/skills/structure-prompt/reference/instantiation.md +0 -51
  256. package/skills/structure-prompt/reference/output-contract.md +0 -72
  257. package/skills/structure-prompt/reference/per-category.md +0 -23
  258. package/skills/structure-prompt/reference/persona.md +0 -38
  259. package/skills/structure-prompt/reference/research.md +0 -33
  260. package/skills/structure-prompt/reference/structure.md +0 -28
  261. package/skills/verified-build/CLAUDE.md +0 -33
  262. 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. While Write/Edit
34
- tools auto-isolate on first use, Bash calls (`gh`, `git`) do not trigger
35
- isolation and will modify shared state. This step is mandatory — do not
36
- proceed to any state-modifying operation until the working directory
37
- contains `.claude/worktrees/`. If `EnterWorktree` fails, report the failure
38
- and stop; do not continue in place.
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 — two-tier triage
74
-
75
- The Copilot step tiers each finding it surfaces. A **self-healing** finding is
76
- pure style, type hints, misplaced or unused imports, formatting, magic-value
77
- extraction, a test-only change, a doc-or-description vs code mismatch, or code
78
- de-duplication — a fix that cannot change observable runtime behavior for
79
- production callers. Self-healing findings flow into the existing fix tick and
80
- count toward convergence, with no user alert. The tick-paced loop holds them
81
- naturally: the fix lands on `current_head`, the next tick re-checks, and the run
82
- converges when the Copilot step is clean.
83
-
84
- A **code-concern** finding is behavior-changing or needs a product decision:
85
- logic or correctness, security, data handling, error-handling semantics, or
86
- concurrency. Tier a finding as code-concern whenever the tier is in doubt. On
87
- one or more code-concern findings, do not auto-fix them and do not let the tick
88
- mark the PR ready. Run the
89
- [`copilot-finding-triage`](../copilot-finding-triage/SKILL.md) gate: send the
90
- ntfy alert with the finding summary and the Copilot review link, then hold for
91
- the user's response on a 45-minute deadline that spans ticks — carry 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
- - **`is_outdated` is informational, not a skip flag** — GitHub marks a
202
- thread `is_outdated=true` when the line it anchors to has changed since
203
- the comment was posted. The original concern can still apply to current
204
- code (the fix may have moved, not landed). The convergence gate counts
205
- every thread with `is_resolved == false` regardless of `is_outdated`.
206
- Outdated threads must be verified against current HEAD and either
207
- fix-and-resolved or just resolved (with an inline reply explaining why
208
- the concern no longer applies).
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.** The sweep semantics and per-thread handling live
242
- in the `pr-fix-protocol` skill's unresolved-thread sweep
243
- (`../pr-fix-protocol/SKILL.md`).
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 the `pr-scope-resolve` skill (`../pr-scope-resolve/SKILL.md`)
260
- with caller `pr-converge`. Resolve the **PR
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
- The terminal external gate. Step 6 routes here after BUGTEAM converges, so
283
- Bugbot confirms code the internal passes already drove to clean.
284
- See: [`reference/per-tick.md` § BUGBOT terminal gate + Step 3](reference/per-tick.md)
285
-
286
- - [ ] **Availability gate (runs first, every BUGBOT entry).**
287
- Gate semantics live in the `reviewer-gates` skill
288
- (`../reviewer-gates/SKILL.md` § Gate 1). Cursor Bugbot is off by default and runs only when `CLAUDE_REVIEWS_ENABLED` lists `bugbot`; a `bugbot` token in `CLAUDE_REVIEWS_DISABLED` keeps it off even then.
289
- `python "$HOME/.claude/_shared/pr-loop/scripts/reviews_disabled.py" --reviewer bugbot`
290
- - [ ] Exit 0 (Bugbot disabled for this run — the default) → set `bugbot_down = true`, advance to the Step 7 convergence gates (no trigger, no wait, no agent). Cursor Bugbot is skipped for the entire run.
291
- - [ ] Exit 1 → continue below.
292
-
293
- Fetch bugbot reviews + inline comments on `current_head`.
294
-
295
- - [ ] **dirty** (findings on `current_head`)
296
- - [ ] Apply the `pr-fix-protocol` skill (`../pr-fix-protocol/SKILL.md`) to this tick's findings
297
- - [ ] Push reset `bugbot_clean_at = null`, `code_review_clean_at = null` `phase = CODE_REVIEW` → return to Step 5
298
- - [ ] **clean** (no findings on `current_head`) →
299
- - [ ] Count ALL unresolved threads on PR (`is_resolved == false`) → zero? advance; >0? fix + resolve first
300
- - [ ] `bugbot_clean_at = current_head`
301
- - [ ] Advance to the Step 7 convergence gates
302
- - [ ] **no review yet / commit_id mismatch**
303
- Apply the `reviewer-gates` skill's Bugbot flow
304
- (`../reviewer-gates/SKILL.md` § Gate 3) against `current_head`,
305
- then map its outcomes:
306
- - [ ] Silent pass `bugbot_clean_at = current_head` advance to the Step 7 convergence gates
307
- - [ ] Already queued, or trigger acknowledgedschedule 360s wakeupreturn to Step 4 next tick
308
- - [ ] Bugbot down `bugbot_down = true` advance to the Step 7 convergence gates (bypass)
309
- - [ ] **Step 5: CODE-REVIEW entry phase: static sweep, review, fix, advance**
310
- The first internal step of every convergence tick (Step 2 seeds
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 + pushreset 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
- Step 6 advances ONLY after `Skill({skill: "bugteam", args: "<PR URL>"})`
363
- fires this tick. Substituting an `Agent({subagent_type: "clean-coder"})`
364
- audit call for the formal Skill invocation is a protocol violation — the
365
- `pr_converge_bugteam_enforcer` hook blocks it. `qbug` is NOT an accepted
366
- substitute; `bugteam` is the only allowed skill at this step.
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
- See: [`reference/convergence-gates.md`](reference/convergence-gates.md)
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
- Count unresolved threads before each gate.
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
- This step does not run when `copilot_down == true`: gate (c) skips the
458
- Copilot request, so the loop never enters COPILOT_WAIT.
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
- Fetch Copilot reviews + inline comments on `current_head`.
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 (no findings)**
463
- `copilot_clean_at = current_head`return to Step 7 (re-validate gates b, d, e)
464
- - [ ] **dirty (findings present)** →
465
- - [ ] Apply the `pr-fix-protocol` skill (`../pr-fix-protocol/SKILL.md`) to the findings
466
- - [ ] Push → reset markers → `phase = CODE_REVIEW` → return to Step 5
467
- - [ ] **no review yet** →
468
- increment `copilot_wait_count` 3 = hard blocker → stop
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
- ## Folder map
372
+ ## Depends on / invokes
499
373
 
500
- - `SKILL.md` this hub.
501
- - `reference/` — workflow detail per situation.
502
- - `workflows/` pacing implementations.
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 |