claude-dev-env 2.16.0 → 2.18.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 (557) hide show
  1. package/.agents/agents/AGENTS.md +6 -0
  2. package/.agents/skills/AGENTS.md +34 -35
  3. package/.agents/skills/_shared/pr-loop/AGENTS.md +22 -15
  4. package/.agents/skills/_shared/pr-loop/portable-driver.md +6 -7
  5. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +2 -2
  6. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +1 -1
  7. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +25 -16
  8. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +1 -5
  9. package/.agents/skills/autoconverge/reference/convergence-gates.md +31 -0
  10. package/.agents/skills/autoconverge/reference/convergence.md +8 -10
  11. package/.agents/skills/autoconverge/reference/gotchas.md +1 -1
  12. package/.agents/skills/autoconverge/reference/stop-conditions.md +1 -1
  13. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +1 -1
  14. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +1 -1
  15. package/.agents/skills/autoconverge/workflow/converge.mjs +3 -3
  16. package/.agents/skills/cert-classification-rule/SKILL.md +224 -0
  17. package/.agents/skills/cert-classification-rule/scripts/resort_cert_folders.py +158 -0
  18. package/.agents/skills/eli5/SKILL.md +128 -0
  19. package/.agents/skills/eli5/reference/task-seeds.md +11 -0
  20. package/.agents/skills/fresh-branch/scripts/test_create_fresh_branch.py +2 -3
  21. package/.agents/skills/name-by-capability-audit/SKILL.md +67 -0
  22. package/.agents/skills/name-by-capability-audit/reference/fetch-commands.md +29 -0
  23. package/.agents/skills/name-by-capability-audit/reference/offense-examples.md +32 -0
  24. package/.agents/skills/name-by-capability-audit/reference/report-template.md +29 -0
  25. package/.agents/skills/name-by-capability-audit/reference/rule-checklist.md +38 -0
  26. package/.agents/skills/name-by-capability-audit/reference/task-seeds.md +9 -0
  27. package/.agents/skills/orchestrator/SKILL.md +6 -4
  28. package/.agents/skills/orchestrator-refresh/SKILL.md +9 -5
  29. package/.agents/skills/pr-cleanup/SKILL.md +99 -0
  30. package/.agents/skills/prototype/reference/honest-limitations.md +1 -1
  31. package/.agents/skills/prototype/reference/promotion-tasks.md +1 -1
  32. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +2 -2
  33. package/.agents/skills/prototype/workflows/promotion.md +2 -2
  34. package/.agents/skills/review-router/SKILL.md +51 -0
  35. package/.agents/skills/review-router/reference/route-policy.json +7 -0
  36. package/.agents/skills/review-router/reference/task-seeds.md +1 -0
  37. package/.agents/skills/review-router/scripts/conftest.py +4 -0
  38. package/.agents/skills/review-router/scripts/review_router.py +50 -0
  39. package/.agents/skills/review-router/scripts/review_router_cli.py +211 -0
  40. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +1 -0
  41. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  42. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +13 -0
  43. package/.agents/skills/review-router/scripts/test_review_router.py +23 -0
  44. package/.agents/skills/review-router/scripts/test_review_router_cli.py +47 -0
  45. package/.agents/skills/review-tier/SKILL.md +56 -0
  46. package/.agents/skills/review-tier/reference/task-seeds.md +1 -0
  47. package/.agents/skills/review-tier/reference/tier-policy.json +9 -0
  48. package/.agents/skills/review-tier/scripts/conftest.py +4 -0
  49. package/.agents/skills/review-tier/scripts/review_tier.py +332 -0
  50. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +1 -0
  51. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  52. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +29 -0
  53. package/.agents/skills/review-tier/scripts/test_generation.py +171 -0
  54. package/.agents/skills/review-tier/scripts/test_review_tier.py +33 -0
  55. package/.agents/skills/session-log/SKILL.md +1 -1
  56. package/.agents/skills/shared-extraction-audit/SKILL.md +160 -0
  57. package/.agents/skills/shared-extraction-audit/reference/examples.md +46 -0
  58. package/.agents/skills/shared-extraction-audit/reference/offense-taxonomy.md +100 -0
  59. package/.agents/skills/source-command-logifix/SKILL.md +29 -0
  60. package/.agents/skills/source-command-sr-loop/SKILL.md +58 -0
  61. package/.agents/skills/team-advisor/SKILL.md +5 -5
  62. package/.agents/skills-archived/AGENTS.md +45 -0
  63. package/.agents/{skills → skills-archived}/anthropic-plan/AGENTS.md +1 -1
  64. package/.agents/{skills → skills-archived}/bugteam/scripts/reflow_skill_md.py +3 -3
  65. package/.agents/{skills → skills-archived}/codex-review/test_skill_scaffold.py +1 -1
  66. package/.agents/{skills → skills-archived}/copilot-finding-triage/SKILL.md +1 -1
  67. package/.agents/{skills → skills-archived}/pr-converge/SKILL.md +6 -6
  68. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
  69. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
  70. package/.agents/{skills → skills-archived}/pr-converge/reference/multi-pr-orchestration.md +1 -1
  71. package/.agents/{skills → skills-archived}/pr-converge/reference/per-tick.md +3 -3
  72. package/.agents/{skills → skills-archived}/pr-converge/scripts/reflow_skill_md.py +2 -2
  73. package/.agents/{skills → skills-archived}/pr-converge/test_portable_pacer_gate.py +6 -2
  74. package/.agents/{skills → skills-archived}/pr-converge/workflows/schedule-wakeup-loop.md +1 -1
  75. package/.agents/{skills → skills-archived}/split-pr/reference/proposal-format.md +1 -1
  76. package/AGENTS.md +34 -58
  77. package/_shared/AGENTS.md +2 -0
  78. package/_shared/advisor/AGENTS.md +5 -5
  79. package/_shared/advisor/advisor-protocol.md +54 -31
  80. package/_shared/advisor/reference/advisor-block.md +5 -1
  81. package/_shared/advisor/reference/consult-format.md +1 -1
  82. package/_shared/advisor/reference/identity.md +28 -0
  83. package/_shared/advisor/reference/lifecycle.md +8 -1
  84. package/_shared/advisor/reference/sol-rung.md +14 -9
  85. package/_shared/advisor/reference/spawn-walk-log.md +6 -5
  86. package/_shared/advisor/reference/third-party-bind.md +6 -7
  87. package/_shared/advisor/reference/warm-up.md +9 -2
  88. package/_shared/advisor/scripts/codex_sol_advisor.py +66 -11
  89. package/_shared/advisor/scripts/config/advisor_scripts_constants/advisor_route_constants.py +9 -0
  90. package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +16 -4
  91. package/_shared/advisor/scripts/config/advisor_scripts_constants/sol_advisor_constants.py +11 -10
  92. package/_shared/advisor/scripts/model_tier_run_validator.py +50 -23
  93. package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +108 -3
  94. package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +171 -82
  95. package/_shared/advisor/scripts/tests/test_tier_model_ids.py +43 -0
  96. package/_shared/advisor/scripts/tier_model_ids.py +75 -7
  97. package/_shared/pr-loop/audit-reply-template.md +4 -0
  98. package/_shared/pr-loop/fix-protocol.md +7 -6
  99. package/_shared/pr-loop/gh-payloads.md +8 -6
  100. package/_shared/pr-loop/precatch-rubric.md +6 -5
  101. package/_shared/pr-loop/scripts/AGENTS.md +15 -0
  102. package/_shared/pr-loop/scripts/_pr_converge_path_setup.py +38 -0
  103. package/_shared/pr-loop/scripts/check_bugbot_ci.py +279 -0
  104. package/_shared/pr-loop/scripts/check_convergence.py +923 -0
  105. package/_shared/pr-loop/scripts/check_convergence_availability.py +275 -0
  106. package/_shared/pr-loop/scripts/check_convergence_gates.py +279 -0
  107. package/_shared/pr-loop/scripts/check_convergence_thread_gates.py +219 -0
  108. package/_shared/pr-loop/scripts/check_pending_reviews.py +154 -0
  109. package/_shared/pr-loop/scripts/codex_down_classifier.py +98 -0
  110. package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
  111. package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +18 -0
  112. package/_shared/pr-loop/scripts/codex_review_scripts_constants/__init__.py +1 -0
  113. package/_shared/pr-loop/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
  114. package/_shared/pr-loop/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +82 -0
  115. package/_shared/pr-loop/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
  116. package/_shared/pr-loop/scripts/codex_review_scripts_constants/run_constants.py +53 -0
  117. package/_shared/pr-loop/scripts/codex_usage_probe.py +570 -0
  118. package/_shared/pr-loop/scripts/conftest.py +43 -0
  119. package/_shared/pr-loop/scripts/fetch_copilot_reviews.py +134 -0
  120. package/_shared/pr-loop/scripts/fixtures/auth_failure_synthetic.txt +1 -0
  121. package/_shared/pr-loop/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
  122. package/_shared/pr-loop/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
  123. package/_shared/pr-loop/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
  124. package/_shared/pr-loop/scripts/fixtures/structured_findings.txt +13 -0
  125. package/_shared/pr-loop/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
  126. package/_shared/pr-loop/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
  127. package/_shared/pr-loop/scripts/fixtures/usage_limit_synthetic.txt +1 -0
  128. package/_shared/pr-loop/scripts/parse_codex_findings.py +207 -0
  129. package/_shared/pr-loop/scripts/post_fix_reply.py +168 -0
  130. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
  131. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +18 -0
  132. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  133. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +70 -0
  134. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/pr_converge_constants.py +118 -0
  135. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +13 -0
  136. package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
  137. package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +26 -0
  138. package/_shared/pr-loop/scripts/pr_converge_skill_constants/__init__.py +0 -0
  139. package/_shared/pr-loop/scripts/pr_converge_skill_constants/constants.py +69 -0
  140. package/_shared/pr-loop/scripts/run_codex_review.py +609 -0
  141. package/_shared/pr-loop/scripts/test__pr_converge_path_setup.py +30 -0
  142. package/_shared/pr-loop/scripts/test_check_bugbot_ci.py +312 -0
  143. package/_shared/pr-loop/scripts/test_check_convergence.py +438 -0
  144. package/_shared/pr-loop/scripts/test_check_convergence_availability.py +391 -0
  145. package/_shared/pr-loop/scripts/test_check_convergence_codex.py +517 -0
  146. package/_shared/pr-loop/scripts/test_check_convergence_contract.py +400 -0
  147. package/_shared/pr-loop/scripts/test_check_convergence_fixture.py +179 -0
  148. package/_shared/pr-loop/scripts/test_check_convergence_gates.py +84 -0
  149. package/_shared/pr-loop/scripts/test_check_convergence_thread_gates.py +99 -0
  150. package/_shared/pr-loop/scripts/test_codex_down_classifier.py +143 -0
  151. package/_shared/pr-loop/scripts/test_codex_usage_probe.py +683 -0
  152. package/_shared/pr-loop/scripts/test_parse_codex_findings.py +130 -0
  153. package/_shared/pr-loop/scripts/test_run_codex_review.py +969 -0
  154. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +1 -1
  155. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +1 -1
  156. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +1 -1
  157. package/_shared/pr-loop/state-schema.md +20 -28
  158. package/_shared/pr-loop/worker-spawn.md +4 -3
  159. package/_shared/process-tree/AGENTS.md +3 -3
  160. package/bin/ever-shipped-skills.mjs +29 -1
  161. package/bin/install-constants.mjs +15 -6
  162. package/bin/install.agents-home.test.mjs +13 -0
  163. package/bin/install.cursor-rules.test.mjs +3 -3
  164. package/bin/install.mjs +80 -20
  165. package/bin/install.profile-root.test.mjs +1 -1
  166. package/bin/install.prune.test.mjs +23 -204
  167. package/bin/install.test.mjs +8 -5
  168. package/bin/resolve-install-root.mjs +21 -0
  169. package/bin/resolve-package-managed-directory.mjs +4 -4
  170. package/commands/AGENTS.md +2 -0
  171. package/commands/sr-loop.md +3 -0
  172. package/docs/references/prose-style-enforcement.md +3 -7
  173. package/docs/references/team-advisor-skill.md +2 -2
  174. package/hooks/AGENTS.md +0 -3
  175. package/hooks/blocking/AGENTS.md +0 -2
  176. package/hooks/blocking/ask_user_question_shape_blocker.py +83 -0
  177. package/hooks/blocking/pre_tool_use_dispatcher.py +2 -19
  178. package/hooks/blocking/state_description_blocker.py +1 -1
  179. package/hooks/blocking/test_ask_user_question_shape.py +69 -0
  180. package/hooks/blocking/test_pre_tool_use_dispatcher.py +17 -58
  181. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +9 -104
  182. package/hooks/blocking/test_state_description_blocker.py +1 -0
  183. package/hooks/blocking/test_stop_dispatcher.py +1 -26
  184. package/hooks/hooks.json +1 -1
  185. package/hooks/hooks_constants/AGENTS.md +0 -3
  186. package/hooks/hooks_constants/ask_user_question_shape.py +1 -1
  187. package/hooks/hooks_constants/ask_user_question_shape_constants.py +73 -0
  188. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +1 -2
  189. package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
  190. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -7
  191. package/hooks/hooks_constants/stop_dispatcher_constants.py +0 -1
  192. package/hooks/hooks_constants/test_ask_user_question_shape.py +1 -1
  193. package/hooks/hooks_constants/test_prose_metrics_parity.py +29 -107
  194. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +0 -1
  195. package/hooks/hooks_constants/working_style_prompt_constants.py +9 -10
  196. package/hooks/session/AGENTS.md +4 -1
  197. package/hooks/session/test_working_style_prompt.py +8 -4
  198. package/hooks/session/working_style_prompt.py +4 -2
  199. package/package.json +1 -4
  200. package/rules/AGENTS.md +2 -5
  201. package/rules/asd-ste100-language.md +39 -0
  202. package/rules/ask-user-question-required.md +1 -1
  203. package/rules/long-horizon-autonomy.md +1 -1
  204. package/scripts/AGENTS.md +1 -0
  205. package/scripts/Show-Asset.ps1 +106 -0
  206. package/scripts/test_validate_instruction_pairs.py +30 -3
  207. package/scripts/tests/test_engine.py +4 -4
  208. package/scripts/tests/test_rules.py +5 -5
  209. package/system-prompts/AGENTS.md +8 -0
  210. package/system-prompts/software-engineer.xml +8 -3
  211. package/.agents/skills/grokify/evals/README.md +0 -72
  212. package/.agents/skills/grokify/evals/parse-payload.test.mjs +0 -171
  213. package/.agents/skills/grokify/evals/run-capability-evals.mjs +0 -545
  214. package/_shared/pr-loop/scripts/README.md +0 -21
  215. package/docs/imagegen.md +0 -22
  216. package/hooks/blocking/eli11_reply_enforcer.py +0 -436
  217. package/hooks/blocking/plain_language_blocker.py +0 -758
  218. package/hooks/blocking/test_eli11_reply_enforcer.py +0 -390
  219. package/hooks/blocking/test_plain_language_blocker.py +0 -683
  220. package/hooks/blocking/test_plain_language_blocker_allowlist.py +0 -228
  221. package/hooks/diagnostic/AGENTS.md +0 -75
  222. package/hooks/diagnostic/CLAUDE.md +0 -1
  223. package/hooks/diagnostic/hook_log_extractor.py +0 -875
  224. package/hooks/diagnostic/hook_log_init.py +0 -202
  225. package/hooks/diagnostic/hook_log_stop_wrapper.py +0 -26
  226. package/hooks/diagnostic/migrations/2026-04-25-drop-themes-hook-events.sql +0 -3
  227. package/hooks/diagnostic/migrations/AGENTS.md +0 -16
  228. package/hooks/diagnostic/migrations/CLAUDE.md +0 -1
  229. package/hooks/diagnostic/migrations/README.md +0 -76
  230. package/hooks/diagnostic/queries/AGENTS.md +0 -19
  231. package/hooks/diagnostic/queries/CLAUDE.md +0 -1
  232. package/hooks/diagnostic/queries/block_details_for_hook.sql +0 -26
  233. package/hooks/diagnostic/queries/blocks_by_category.sql +0 -10
  234. package/hooks/diagnostic/queries/blocks_by_tool.sql +0 -9
  235. package/hooks/diagnostic/queries/blocks_last_7_days.sql +0 -11
  236. package/hooks/diagnostic/queries/top_blockers_last_24_hours.sql +0 -12
  237. package/hooks/diagnostic/queries/top_blockers_overall.sql +0 -12
  238. package/hooks/diagnostic/requirements-hook-logs-dev.txt +0 -2
  239. package/hooks/diagnostic/requirements-hook-logs.txt +0 -1
  240. package/hooks/diagnostic/schema.sql +0 -51
  241. package/hooks/diagnostic/test_hook_log_extractor.py +0 -1518
  242. package/hooks/diagnostic/test_hook_log_init.py +0 -227
  243. package/hooks/diagnostic/test_hook_log_stop_wrapper.py +0 -17
  244. package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +0 -94
  245. package/hooks/hooks_constants/hook_log_extractor_constants.py +0 -233
  246. package/hooks/hooks_constants/plain_language_blocker_constants.py +0 -366
  247. package/hooks/hooks_constants/test_hook_log_extractor_constants.py +0 -123
  248. package/rules/doc-prose-cuts.md +0 -58
  249. package/rules/eli11-replies.md +0 -36
  250. package/rules/opus5-communication-contract.md +0 -45
  251. package/rules/plain-language.md +0 -9
  252. /package/.agents/{skills → skills-archived}/anthropic-plan/.claude/CLAUDE.md +0 -0
  253. /package/.agents/{skills → skills-archived}/anthropic-plan/SKILL.md +0 -0
  254. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/.claude/CLAUDE.md +0 -0
  255. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/AGENTS.md +0 -0
  256. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -0
  257. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
  258. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
  259. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
  260. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/test_validate_packet.py +0 -0
  261. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/validate_packet.py +0 -0
  262. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/.claude/CLAUDE.md +0 -0
  263. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/AGENTS.md +0 -0
  264. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/README.md +0 -0
  265. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/build-prompt.md +0 -0
  266. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/reuse-audit.md +0 -0
  267. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/source-map.md +0 -0
  268. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/visual-plan.template.html +0 -0
  269. /package/.agents/{skills → skills-archived}/anthropic-plan/test_skill_contract.py +0 -0
  270. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/.claude/CLAUDE.md +0 -0
  271. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/AGENTS.md +0 -0
  272. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
  273. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.mjs +0 -0
  274. /package/.agents/{skills → skills-archived}/auditing-claude-config/.claude/CLAUDE.md +0 -0
  275. /package/.agents/{skills → skills-archived}/auditing-claude-config/AGENTS.md +0 -0
  276. /package/.agents/{skills → skills-archived}/auditing-claude-config/SKILL.md +0 -0
  277. /package/.agents/{skills → skills-archived}/auditing-claude-config/reference/probe-hook.md +0 -0
  278. /package/.agents/{skills → skills-archived}/beat-sheet/SKILL.md +0 -0
  279. /package/.agents/{skills → skills-archived}/beat-sheet/reference/visual-beats.md +0 -0
  280. /package/.agents/{skills → skills-archived}/bugteam/.claude/CLAUDE.md +0 -0
  281. /package/.agents/{skills → skills-archived}/bugteam/AGENTS.md +0 -0
  282. /package/.agents/{skills → skills-archived}/bugteam/CONSTRAINTS.md +0 -0
  283. /package/.agents/{skills → skills-archived}/bugteam/EXAMPLES.md +0 -0
  284. /package/.agents/{skills → skills-archived}/bugteam/PROMPTS.md +0 -0
  285. /package/.agents/{skills → skills-archived}/bugteam/SKILL.md +0 -0
  286. /package/.agents/{skills → skills-archived}/bugteam/reference/.claude/CLAUDE.md +0 -0
  287. /package/.agents/{skills → skills-archived}/bugteam/reference/AGENTS.md +0 -0
  288. /package/.agents/{skills → skills-archived}/bugteam/reference/README.md +0 -0
  289. /package/.agents/{skills → skills-archived}/bugteam/reference/audit-and-teammates.md +0 -0
  290. /package/.agents/{skills → skills-archived}/bugteam/reference/copilot-gap-analysis.md +0 -0
  291. /package/.agents/{skills → skills-archived}/bugteam/reference/design-rationale.md +0 -0
  292. /package/.agents/{skills → skills-archived}/bugteam/reference/github-pr-reviews.md +0 -0
  293. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -0
  294. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/AGENTS.md +0 -0
  295. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
  296. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
  297. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
  298. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
  299. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
  300. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
  301. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
  302. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-push.md +0 -0
  303. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
  304. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
  305. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
  306. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-read-files.md +0 -0
  307. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
  308. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
  309. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
  310. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
  311. /package/.agents/{skills → skills-archived}/bugteam/reference/team-setup.md +0 -0
  312. /package/.agents/{skills → skills-archived}/bugteam/scripts/.claude/CLAUDE.md +0 -0
  313. /package/.agents/{skills → skills-archived}/bugteam/scripts/AGENTS.md +0 -0
  314. /package/.agents/{skills → skills-archived}/bugteam/scripts/README.md +0 -0
  315. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_code_rules_gate.py +0 -0
  316. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_fix_hookspath.py +0 -0
  317. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_preflight.py +0 -0
  318. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -0
  319. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
  320. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
  321. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
  322. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
  323. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
  324. /package/.agents/{skills → skills-archived}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
  325. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
  326. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
  327. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_preflight.py +0 -0
  328. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
  329. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
  330. /package/.agents/{skills → skills-archived}/bugteam/scripts/windows_safe_rmtree.py +0 -0
  331. /package/.agents/{skills → skills-archived}/bugteam/sources.md +0 -0
  332. /package/.agents/{skills → skills-archived}/bugteam/test_skill_additions.py +0 -0
  333. /package/.agents/{skills → skills-archived}/closeout/SKILL.md +0 -0
  334. /package/.agents/{skills → skills-archived}/closeout/reference/handoff-prompt-template.md +0 -0
  335. /package/.agents/{skills → skills-archived}/closeout/reference/pii-redaction-checklist.md +0 -0
  336. /package/.agents/{skills → skills-archived}/codex-review/.claude/CLAUDE.md +0 -0
  337. /package/.agents/{skills → skills-archived}/codex-review/AGENTS.md +0 -0
  338. /package/.agents/{skills → skills-archived}/codex-review/SKILL.md +0 -0
  339. /package/.agents/{skills → skills-archived}/codex-review/reference/.claude/CLAUDE.md +0 -0
  340. /package/.agents/{skills → skills-archived}/codex-review/reference/AGENTS.md +0 -0
  341. /package/.agents/{skills → skills-archived}/codex-review/reference/cli-contract.md +0 -0
  342. /package/.agents/{skills → skills-archived}/codex-review/reference/loop-integration.md +0 -0
  343. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_down_classifier.py +0 -0
  344. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -0
  345. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
  346. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
  347. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
  348. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
  349. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
  350. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
  351. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_usage_probe.py +0 -0
  352. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
  353. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
  354. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
  355. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
  356. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
  357. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
  358. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
  359. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
  360. /package/.agents/{skills → skills-archived}/codex-review/scripts/parse_codex_findings.py +0 -0
  361. /package/.agents/{skills → skills-archived}/codex-review/scripts/run_codex_review.py +0 -0
  362. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_down_classifier.py +0 -0
  363. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_usage_probe.py +0 -0
  364. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_parse_codex_findings.py +0 -0
  365. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_run_codex_review.py +0 -0
  366. /package/.agents/{skills → skills-archived}/comments/SKILL.md +0 -0
  367. /package/.agents/{skills → skills-archived}/condensing-instructions/SKILL.md +0 -0
  368. /package/.agents/{skills → skills-archived}/copilot-finding-triage/reference/tier-rubric.md +0 -0
  369. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/conftest.py +0 -0
  370. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
  371. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
  372. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
  373. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
  374. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
  375. /package/.agents/{skills → skills-archived}/copilot-finding-triage/templates/notification.md +0 -0
  376. /package/.agents/{skills → skills-archived}/copilot-review/.claude/CLAUDE.md +0 -0
  377. /package/.agents/{skills → skills-archived}/copilot-review/AGENTS.md +0 -0
  378. /package/.agents/{skills → skills-archived}/copilot-review/SKILL.md +0 -0
  379. /package/.agents/{skills → skills-archived}/copilot-review/templates/subagent-prompt.md +0 -0
  380. /package/.agents/{skills → skills-archived}/descriptions/SKILL.md +0 -0
  381. /package/.agents/{skills → skills-archived}/emergencies/SKILL.md +0 -0
  382. /package/.agents/{skills → skills-archived}/grokify/SKILL.md +0 -0
  383. /package/.agents/{skills → skills-archived}/grokify/capability-claims.test.mjs +0 -0
  384. /package/.agents/{skills → skills-archived}/grokify/templates/handoff-template.md +0 -0
  385. /package/.agents/{skills → skills-archived}/plan-to-pr/SKILL.md +0 -0
  386. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/final-validation-tasks.md +0 -0
  387. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/model-routing.md +0 -0
  388. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-contract.md +0 -0
  389. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-schema.json +0 -0
  390. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/process-inventory.md +0 -0
  391. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/review-loop.md +0 -0
  392. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/run-record.schema.json +0 -0
  393. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/self-audit-tasks.md +0 -0
  394. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-seeds.md +0 -0
  395. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-ticket.md +0 -0
  396. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/__init__.py +0 -0
  397. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/constants.py +0 -0
  398. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/create_packet.py +0 -0
  399. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/load_skill_constants.py +0 -0
  400. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_create_packet.py +0 -0
  401. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_packet.py +0 -0
  402. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
  403. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_run.py +0 -0
  404. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_packet.py +0 -0
  405. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_protocol.py +0 -0
  406. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_run.py +0 -0
  407. /package/.agents/{skills → skills-archived}/plan-to-pr/test_skill_contract.py +0 -0
  408. /package/.agents/{skills → skills-archived}/plan-to-pr/test_task_ticket_contract.py +0 -0
  409. /package/.agents/{skills → skills-archived}/pr-converge/.claude/CLAUDE.md +0 -0
  410. /package/.agents/{skills → skills-archived}/pr-converge/AGENTS.md +0 -0
  411. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -0
  412. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
  413. /package/.agents/{skills → skills-archived}/pr-converge/reference/.claude/CLAUDE.md +0 -0
  414. /package/.agents/{skills → skills-archived}/pr-converge/reference/AGENTS.md +0 -0
  415. /package/.agents/{skills → skills-archived}/pr-converge/reference/convergence-gates.md +0 -0
  416. /package/.agents/{skills → skills-archived}/pr-converge/reference/examples.md +0 -0
  417. /package/.agents/{skills → skills-archived}/pr-converge/reference/fix-protocol.md +0 -0
  418. /package/.agents/{skills → skills-archived}/pr-converge/reference/ground-rules.md +0 -0
  419. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -0
  420. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/AGENTS.md +0 -0
  421. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
  422. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
  423. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-push.md +0 -0
  424. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
  425. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
  426. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
  427. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
  428. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
  429. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
  430. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
  431. /package/.agents/{skills → skills-archived}/pr-converge/reference/progress-checklist.md +0 -0
  432. /package/.agents/{skills → skills-archived}/pr-converge/reference/state-schema.md +0 -0
  433. /package/.agents/{skills → skills-archived}/pr-converge/reference/stop-conditions.md +0 -0
  434. /package/.agents/{skills → skills-archived}/pr-converge/scripts/.claude/CLAUDE.md +0 -0
  435. /package/.agents/{skills → skills-archived}/pr-converge/scripts/AGENTS.md +0 -0
  436. /package/.agents/{skills → skills-archived}/pr-converge/scripts/README.md +0 -0
  437. /package/.agents/{skills → skills-archived}/pr-converge/scripts/_pr_converge_path_setup.py +0 -0
  438. /package/.agents/{skills → skills-archived}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
  439. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_bugbot_ci.py +0 -0
  440. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence.py +0 -0
  441. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_availability.py +0 -0
  442. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_gates.py +0 -0
  443. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
  444. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_pending_reviews.py +0 -0
  445. /package/.agents/{skills → skills-archived}/pr-converge/scripts/conftest.py +0 -0
  446. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
  447. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
  448. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
  449. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
  450. /package/.agents/{skills → skills-archived}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
  451. /package/.agents/{skills → skills-archived}/pr-converge/scripts/post_fix_reply.py +0 -0
  452. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -0
  453. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
  454. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  455. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
  456. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
  457. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
  458. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test__pr_converge_path_setup.py +0 -0
  459. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
  460. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence.py +0 -0
  461. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
  462. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
  463. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
  464. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
  465. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
  466. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
  467. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
  468. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
  469. /package/.agents/{skills → skills-archived}/pr-converge/test_step5_host_branch.py +0 -0
  470. /package/.agents/{skills → skills-archived}/pr-converge/workflows/.claude/CLAUDE.md +0 -0
  471. /package/.agents/{skills → skills-archived}/pr-converge/workflows/AGENTS.md +0 -0
  472. /package/.agents/{skills → skills-archived}/pr-fix-protocol/SKILL.md +0 -0
  473. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/SKILL.md +0 -0
  474. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
  475. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
  476. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/SKILL.md +0 -0
  477. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
  478. /package/.agents/{skills → skills-archived}/recall/.claude/CLAUDE.md +0 -0
  479. /package/.agents/{skills → skills-archived}/recall/AGENTS.md +0 -0
  480. /package/.agents/{skills → skills-archived}/recall/SKILL.md +0 -0
  481. /package/.agents/{skills → skills-archived}/release-notes-html/SKILL.md +0 -0
  482. /package/.agents/{skills → skills-archived}/remember/.claude/CLAUDE.md +0 -0
  483. /package/.agents/{skills → skills-archived}/remember/AGENTS.md +0 -0
  484. /package/.agents/{skills → skills-archived}/remember/SKILL.md +0 -0
  485. /package/.agents/{skills → skills-archived}/reviewer-gates/SKILL.md +0 -0
  486. /package/.agents/{skills → skills-archived}/reviews/SKILL.md +0 -0
  487. /package/.agents/{skills → skills-archived}/show/SKILL.md +0 -0
  488. /package/.agents/{skills → skills-archived}/show/references/accessibility.md +0 -0
  489. /package/.agents/{skills → skills-archived}/show/references/art.md +0 -0
  490. /package/.agents/{skills → skills-archived}/show/references/charts.md +0 -0
  491. /package/.agents/{skills → skills-archived}/show/references/core-design.md +0 -0
  492. /package/.agents/{skills → skills-archived}/show/references/erds.md +0 -0
  493. /package/.agents/{skills → skills-archived}/show/references/flowcharts.md +0 -0
  494. /package/.agents/{skills → skills-archived}/show/references/host-and-html.md +0 -0
  495. /package/.agents/{skills → skills-archived}/show/references/illustrative-diagrams.md +0 -0
  496. /package/.agents/{skills → skills-archived}/show/references/interaction.md +0 -0
  497. /package/.agents/{skills → skills-archived}/show/references/mockups.md +0 -0
  498. /package/.agents/{skills → skills-archived}/show/references/quality-gates.md +0 -0
  499. /package/.agents/{skills → skills-archived}/show/references/structural-diagrams.md +0 -0
  500. /package/.agents/{skills → skills-archived}/show/references/subject-inventory.md +0 -0
  501. /package/.agents/{skills → skills-archived}/show/references/svg-contract.md +0 -0
  502. /package/.agents/{skills → skills-archived}/show/routing.yaml +0 -0
  503. /package/.agents/{skills → skills-archived}/show/samples/pr1262-v2.svg +0 -0
  504. /package/.agents/{skills → skills-archived}/show/scripts/README.md +0 -0
  505. /package/.agents/{skills → skills-archived}/show/scripts/validate-artifact.py +0 -0
  506. /package/.agents/{skills → skills-archived}/show/scripts/validate-package.py +0 -0
  507. /package/.agents/{skills → skills-archived}/show/templates/html-widget.html +0 -0
  508. /package/.agents/{skills → skills-archived}/show/templates/svg-base.svg +0 -0
  509. /package/.agents/{skills → skills-archived}/show/tests/fixtures/css-var.svg +0 -0
  510. /package/.agents/{skills → skills-archived}/show/tests/fixtures/dead-ref.svg +0 -0
  511. /package/.agents/{skills → skills-archived}/show/tests/fixtures/filled-glyph.svg +0 -0
  512. /package/.agents/{skills → skills-archived}/show/tests/fixtures/inherited-fill.svg +0 -0
  513. /package/.agents/{skills → skills-archived}/show/tests/fixtures/invalid.svg +0 -0
  514. /package/.agents/{skills → skills-archived}/show/tests/fixtures/large-canvas.svg +0 -0
  515. /package/.agents/{skills → skills-archived}/show/tests/fixtures/unfilled-connector.svg +0 -0
  516. /package/.agents/{skills → skills-archived}/show/tests/fixtures/valid.html +0 -0
  517. /package/.agents/{skills → skills-archived}/show/tests/test_validate-artifact.py +0 -0
  518. /package/.agents/{skills → skills-archived}/show/tests/test_validators.py +0 -0
  519. /package/.agents/{skills → skills-archived}/show/workflows/create-visual.md +0 -0
  520. /package/.agents/{skills → skills-archived}/show/workflows/review-visual.md +0 -0
  521. /package/.agents/{skills → skills-archived}/split-pr/SKILL.md +0 -0
  522. /package/.agents/{skills → skills-archived}/split-pr/reference/path-layers.md +0 -0
  523. /package/.agents/{skills → skills-archived}/split-pr/reference/split-further-loop.md +0 -0
  524. /package/.agents/{skills → skills-archived}/split-pr/reference/splitting-principles.md +0 -0
  525. /package/.agents/{skills → skills-archived}/split-pr/scripts/analyze_pr.py +0 -0
  526. /package/.agents/{skills → skills-archived}/split-pr/scripts/categorize_files.py +0 -0
  527. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/__init__.py +0 -0
  528. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/dependency_constants.py +0 -0
  529. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/git_operations_constants.py +0 -0
  530. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/packing_constants.py +0 -0
  531. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/plan_constants.py +0 -0
  532. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/split_pr_constants.py +0 -0
  533. /package/.agents/{skills → skills-archived}/split-pr/scripts/execute_split_slices.py +0 -0
  534. /package/.agents/{skills → skills-archived}/split-pr/scripts/pack_files_into_slices.py +0 -0
  535. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
  536. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_git_operations.py +0 -0
  537. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_layer_order.py +0 -0
  538. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_paginate.py +0 -0
  539. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_process_runner.py +0 -0
  540. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_script_types.py +0 -0
  541. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_title.py +0 -0
  542. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_analyze_pr.py +0 -0
  543. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files.py +0 -0
  544. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files_packing.py +0 -0
  545. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_execute_split_slices.py +0 -0
  546. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
  547. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
  548. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
  549. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_paginate.py +0 -0
  550. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_script_types.py +0 -0
  551. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_title.py +0 -0
  552. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
  553. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan.py +0 -0
  554. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_contract.py +0 -0
  555. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
  556. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_dependency_graph.py +0 -0
  557. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_plan.py +0 -0
@@ -0,0 +1,400 @@
1
+ """Contract-pin and flag tests for check_convergence.
2
+
3
+ ::
4
+
5
+ check_all(all gates passing,
6
+ is_bugteam_post_blocked=False,
7
+ ) -> exit 0, "All pre-conditions met ..."
8
+ check_all(one gate failing,
9
+ is_bugteam_post_blocked=False,
10
+ ) -> exit 1, "One or more ... do not mark ready."
11
+ _get_pr_head_sha raises SystemExit -> exit 2 propagates
12
+ parse_arguments([... --bugteam-post-blocked]) -> bugteam_post_blocked True
13
+
14
+ The pin tests fix the stdout consumers parse (converge.mjs, autoconverge,
15
+ archived bugteam) byte-for-byte, plus the exit codes and CLI surface. The flag tests
16
+ drive the ``--bugteam-post-blocked`` bypass.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import importlib.util
22
+ import sys
23
+ from pathlib import Path
24
+ from types import ModuleType
25
+
26
+ import pytest
27
+
28
+ import _pr_converge_path_setup # noqa: F401
29
+ import check_convergence_availability
30
+ from pr_converge_skill_constants.constants import EXIT_CODE_GH_ERROR
31
+
32
+ _SCRIPTS_DIRECTORY = Path(__file__).absolute().parent
33
+ _PR_CONVERGE_DIRECTORY = _SCRIPTS_DIRECTORY.parent
34
+
35
+ CURRENT_HEAD_SHA = "abcdef1234567890abcdef1234567890abcdef12"
36
+
37
+ _ALL_LEAF_GATE_NAMES = [
38
+ "_check_bugbot",
39
+ "_check_bugbot_not_dirty",
40
+ "_check_bugteam_clean",
41
+ "_check_bot_review",
42
+ "_count_unresolved_bot_threads",
43
+ "_get_mergeable",
44
+ "_check_no_pending_reviews",
45
+ ]
46
+
47
+ EXPECTED_ALL_PASS_STDOUT = (
48
+ "HEAD: abcdef1\n\n"
49
+ "1. bugbot_clean_at == current_head: PASS — clean\n"
50
+ "2. bugbot review body clean: PASS — clean\n"
51
+ "3. bugteam_clean_at == current_head: PASS — clean\n"
52
+ "4. copilot_clean_at == current_head: PASS — clean\n"
53
+ "5. codex_clean_at == current_head: PASS — skipped (codex review not required)\n"
54
+ "6. zero unresolved bot threads: PASS — clean\n"
55
+ "7. PR is mergeable: PASS — clean\n"
56
+ "8. no pending requested reviews: PASS — clean\n\n"
57
+ "All pre-conditions met — PR is ready to mark ready.\n"
58
+ )
59
+
60
+ EXPECTED_BUGBOT_DOWN_STDOUT = (
61
+ "HEAD: abcdef1\n\n"
62
+ "1. bugbot_clean_at == current_head: PASS — bypassed (bugbot_down)\n"
63
+ "2. bugteam_clean_at == current_head: PASS — clean\n"
64
+ "3. copilot_clean_at == current_head: PASS — clean\n"
65
+ "4. codex_clean_at == current_head: PASS — skipped (codex review not required)\n"
66
+ "5. zero unresolved bot threads: PASS — clean\n"
67
+ "6. PR is mergeable: PASS — clean\n"
68
+ "7. no pending requested reviews: PASS — clean\n\n"
69
+ "All pre-conditions met — PR is ready to mark ready.\n"
70
+ )
71
+
72
+ EXPECTED_COPILOT_DOWN_STDOUT = (
73
+ "HEAD: abcdef1\n\n"
74
+ "1. bugbot_clean_at == current_head: PASS — clean\n"
75
+ "2. bugbot review body clean: PASS — clean\n"
76
+ "3. bugteam_clean_at == current_head: PASS — clean\n"
77
+ "4. copilot_clean_at == current_head: PASS — bypassed (copilot_down)\n"
78
+ "5. codex_clean_at == current_head: PASS — skipped (codex review not required)\n"
79
+ "6. zero unresolved bot threads: PASS — clean\n"
80
+ "7. PR is mergeable: PASS — clean\n"
81
+ "8. no pending requested reviews: PASS — bypassed (copilot_down)\n\n"
82
+ "All pre-conditions met — PR is ready to mark ready.\n"
83
+ )
84
+
85
+ EXPECTED_FAIL_SUMMARY = "One or more pre-conditions not met — do not mark ready.\n"
86
+
87
+
88
+ def _load_check_convergence() -> ModuleType:
89
+ if str(_PR_CONVERGE_DIRECTORY) not in sys.path:
90
+ sys.path.insert(0, str(_PR_CONVERGE_DIRECTORY))
91
+ if str(_SCRIPTS_DIRECTORY) not in sys.path:
92
+ sys.path.insert(0, str(_SCRIPTS_DIRECTORY))
93
+ module_path = _SCRIPTS_DIRECTORY / "check_convergence.py"
94
+ spec = importlib.util.spec_from_file_location(
95
+ "check_convergence_contract_under_test", module_path
96
+ )
97
+ assert spec is not None
98
+ assert spec.loader is not None
99
+ module = importlib.util.module_from_spec(spec)
100
+ spec.loader.exec_module(module)
101
+ return module
102
+
103
+
104
+ check_convergence = _load_check_convergence()
105
+
106
+
107
+ def _clean_head(**_call_keywords: object) -> str:
108
+ return CURRENT_HEAD_SHA
109
+
110
+
111
+ def _clean_gate(**_call_keywords: object) -> tuple[bool, str]:
112
+ return True, "clean"
113
+
114
+
115
+ def _refuse_bugteam_clean(**_call_keywords: object) -> tuple[bool, str]:
116
+ raise AssertionError(
117
+ "_check_bugteam_clean must not run when is_bugteam_post_blocked=True"
118
+ )
119
+
120
+
121
+ def _null_codex_percent_left() -> float | None:
122
+ return None
123
+
124
+
125
+ def _patch_gates_clean(monkeypatch: pytest.MonkeyPatch) -> None:
126
+ monkeypatch.setattr(check_convergence, "_get_pr_head_sha", _clean_head)
127
+ monkeypatch.setattr(
128
+ check_convergence, "_probe_codex_percent_left", _null_codex_percent_left
129
+ )
130
+ for each_gate_name in _ALL_LEAF_GATE_NAMES:
131
+ monkeypatch.setattr(check_convergence, each_gate_name, _clean_gate)
132
+
133
+
134
+ def test_all_pass_stdout_and_exit_code_match_the_pinned_contract(
135
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
136
+ ) -> None:
137
+ _patch_gates_clean(monkeypatch)
138
+ exit_code = check_convergence.check_all(
139
+ owner="o", repo="r", number=1, is_bugbot_down=False, is_copilot_down=False
140
+ , is_bugteam_post_blocked=False, is_codex_down=False, live_codex_clean_at=None)
141
+ assert capsys.readouterr().out == EXPECTED_ALL_PASS_STDOUT
142
+ assert exit_code == 0
143
+
144
+
145
+ def test_bugbot_down_bypass_line_matches_the_pinned_contract(
146
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
147
+ ) -> None:
148
+ _patch_gates_clean(monkeypatch)
149
+ exit_code = check_convergence.check_all(
150
+ owner="o", repo="r", number=1, is_bugbot_down=True, is_copilot_down=False
151
+ , is_bugteam_post_blocked=False, is_codex_down=False, live_codex_clean_at=None)
152
+ assert capsys.readouterr().out == EXPECTED_BUGBOT_DOWN_STDOUT
153
+ assert exit_code == 0
154
+
155
+
156
+ def test_copilot_down_bypass_lines_match_the_pinned_contract(
157
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
158
+ ) -> None:
159
+ _patch_gates_clean(monkeypatch)
160
+ exit_code = check_convergence.check_all(
161
+ owner="o", repo="r", number=1, is_bugbot_down=False, is_copilot_down=True
162
+ , is_bugteam_post_blocked=False, is_codex_down=False, live_codex_clean_at=None)
163
+ assert capsys.readouterr().out == EXPECTED_COPILOT_DOWN_STDOUT
164
+ assert exit_code == 0
165
+
166
+
167
+ def test_a_failing_gate_yields_exit_one_and_the_fail_summary(
168
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
169
+ ) -> None:
170
+ _patch_gates_clean(monkeypatch)
171
+
172
+ def _blocked_mergeable(**_call_keywords: object) -> tuple[bool, str]:
173
+ return False, "blocked"
174
+
175
+ monkeypatch.setattr(check_convergence, "_get_mergeable", _blocked_mergeable)
176
+ exit_code = check_convergence.check_all(
177
+ owner="o", repo="r", number=1, is_bugbot_down=False, is_copilot_down=False
178
+ , is_bugteam_post_blocked=False, is_codex_down=False, live_codex_clean_at=None)
179
+ captured_stdout = capsys.readouterr().out
180
+ assert "7. PR is mergeable: FAIL — blocked\n" in captured_stdout
181
+ assert captured_stdout.endswith(EXPECTED_FAIL_SUMMARY)
182
+ assert exit_code == 1
183
+
184
+
185
+ def test_gh_error_exit_code_is_two_and_propagates_from_head_fetch(
186
+ monkeypatch: pytest.MonkeyPatch,
187
+ ) -> None:
188
+ def _raise_gh_error(**_call_keywords: object) -> str:
189
+ raise SystemExit(EXIT_CODE_GH_ERROR)
190
+
191
+ monkeypatch.setattr(check_convergence, "_get_pr_head_sha", _raise_gh_error)
192
+ with pytest.raises(SystemExit) as raised:
193
+ check_convergence.check_all(
194
+ owner="o", repo="r", number=1, is_bugbot_down=False, is_copilot_down=False
195
+ , is_bugteam_post_blocked=False, is_codex_down=False, live_codex_clean_at=None)
196
+ assert EXIT_CODE_GH_ERROR == 2
197
+ assert raised.value.code == 2
198
+
199
+
200
+ def test_existing_cli_flags_stay_on_the_argument_surface() -> None:
201
+ arguments = check_convergence.parse_arguments(
202
+ [
203
+ "--owner",
204
+ "o",
205
+ "--repo",
206
+ "r",
207
+ "--pr-number",
208
+ "1",
209
+ "--bugbot-down",
210
+ "--copilot-down",
211
+ ]
212
+ )
213
+ assert arguments.owner == "o"
214
+ assert arguments.repo == "r"
215
+ assert getattr(arguments, "pr_number") == 1
216
+ assert arguments.bugbot_down is True
217
+ assert arguments.copilot_down is True
218
+
219
+
220
+ def test_skip_bugteam_gate_when_bugteam_post_blocked_is_true(
221
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
222
+ ) -> None:
223
+ _patch_gates_clean(monkeypatch)
224
+ monkeypatch.setattr(
225
+ check_convergence, "_check_bugteam_clean", _refuse_bugteam_clean
226
+ )
227
+ exit_code = check_convergence.check_all(
228
+ owner="o",
229
+ repo="r",
230
+ number=1,
231
+ is_bugbot_down=False,
232
+ is_copilot_down=False,
233
+ is_bugteam_post_blocked=True,
234
+ is_codex_down=False,
235
+ live_codex_clean_at=None,
236
+ )
237
+ assert "bypassed (bugteam_post_blocked)" in capsys.readouterr().out
238
+ assert exit_code == 0
239
+
240
+
241
+ def test_run_bugteam_gate_when_bugteam_post_blocked_is_false(
242
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
243
+ ) -> None:
244
+ invoked_gate_names: list[str] = []
245
+
246
+ def _recording_bugteam_clean(**_call_keywords: object) -> tuple[bool, str]:
247
+ invoked_gate_names.append("_check_bugteam_clean")
248
+ return True, "clean"
249
+
250
+ _patch_gates_clean(monkeypatch)
251
+ monkeypatch.setattr(
252
+ check_convergence, "_check_bugteam_clean", _recording_bugteam_clean
253
+ )
254
+ exit_code = check_convergence.check_all(
255
+ owner="o",
256
+ repo="r",
257
+ number=1,
258
+ is_bugbot_down=False,
259
+ is_copilot_down=False,
260
+ is_bugteam_post_blocked=False,
261
+ is_codex_down=False,
262
+ live_codex_clean_at=None,
263
+ )
264
+ assert "_check_bugteam_clean" in invoked_gate_names
265
+ assert "bypassed (bugteam_post_blocked)" not in capsys.readouterr().out
266
+ assert exit_code == 0
267
+
268
+
269
+ def test_bugteam_post_blocked_flag_round_trips_through_parse_arguments() -> None:
270
+ arguments = check_convergence.parse_arguments(
271
+ ["--owner", "o", "--repo", "r", "--pr-number", "1", "--bugteam-post-blocked"]
272
+ )
273
+ assert arguments.bugteam_post_blocked is True
274
+
275
+
276
+ def test_bugteam_post_blocked_defaults_to_false_when_flag_absent() -> None:
277
+ arguments = check_convergence.parse_arguments(
278
+ ["--owner", "o", "--repo", "r", "--pr-number", "1"]
279
+ )
280
+ assert arguments.bugteam_post_blocked is False
281
+
282
+
283
+ def test_resolve_bugteam_post_blocked_true_when_flag_set(
284
+ monkeypatch: pytest.MonkeyPatch,
285
+ ) -> None:
286
+ monkeypatch.delenv("CLAUDE_REVIEWS_DISABLED", raising=False)
287
+ assert check_convergence._resolve_bugteam_post_blocked(True) is True
288
+
289
+
290
+ def test_resolve_bugteam_post_blocked_true_when_env_disables_bugteam(
291
+ monkeypatch: pytest.MonkeyPatch,
292
+ ) -> None:
293
+ monkeypatch.setenv("CLAUDE_REVIEWS_DISABLED", "bugteam")
294
+ assert check_convergence._resolve_bugteam_post_blocked(False) is True
295
+
296
+
297
+ def test_resolve_bugteam_post_blocked_false_when_flag_unset_and_bugteam_opted_in(
298
+ monkeypatch: pytest.MonkeyPatch,
299
+ ) -> None:
300
+ monkeypatch.delenv("CLAUDE_REVIEWS_DISABLED", raising=False)
301
+ assert check_convergence._resolve_bugteam_post_blocked(False) is False
302
+
303
+
304
+ def test_resolve_bugteam_post_blocked_true_when_neither_list_names_bugteam(
305
+ monkeypatch: pytest.MonkeyPatch,
306
+ ) -> None:
307
+ monkeypatch.delenv("CLAUDE_REVIEWS_ENABLED", raising=False)
308
+ assert check_convergence._resolve_bugteam_post_blocked(False) is True
309
+
310
+
311
+ def test_resolve_bugteam_post_blocked_false_when_opted_in_and_env_disables_copilot(
312
+ monkeypatch: pytest.MonkeyPatch,
313
+ ) -> None:
314
+ monkeypatch.setenv("CLAUDE_REVIEWS_DISABLED", "copilot")
315
+ assert check_convergence._resolve_bugteam_post_blocked(False) is False
316
+
317
+
318
+ def test_env_bugteam_token_does_not_disable_copilot_or_bugbot_opt_out(
319
+ monkeypatch: pytest.MonkeyPatch,
320
+ ) -> None:
321
+ monkeypatch.setenv("CLAUDE_REVIEWS_DISABLED", "bugteam")
322
+ assert check_convergence._resolve_copilot_down(False) is False
323
+ assert check_convergence._resolve_bugteam_post_blocked(False) is True
324
+
325
+
326
+ def test_main_derives_bugteam_post_blocked_from_env_when_flag_omitted(
327
+ monkeypatch: pytest.MonkeyPatch,
328
+ ) -> None:
329
+ monkeypatch.setenv("CLAUDE_REVIEWS_DISABLED", "bugteam")
330
+ captured_bugteam_post_blocked: list[bool] = []
331
+
332
+ def stub_check_all(
333
+ *,
334
+ owner: str,
335
+ repo: str,
336
+ number: int,
337
+ is_bugbot_down: bool,
338
+ is_copilot_down: bool,
339
+ is_bugteam_post_blocked: bool = False,
340
+ is_codex_down: bool = False,
341
+ live_codex_clean_at: str | None = None,
342
+ **_bypass_note_kwargs: str,
343
+ ) -> int:
344
+ captured_bugteam_post_blocked.append(is_bugteam_post_blocked)
345
+ return 0
346
+
347
+ monkeypatch.setattr(check_convergence, "check_all", stub_check_all)
348
+ exit_code = check_convergence.main(["--owner", "o", "--repo", "r", "--pr-number", "1"])
349
+ assert exit_code == 0
350
+ assert captured_bugteam_post_blocked == [True]
351
+
352
+
353
+ def test_copilot_probe_error_still_runs_live_gates(
354
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
355
+ ) -> None:
356
+ """A probe error must not hard-fail; live GitHub gates decide pass/fail."""
357
+ _patch_gates_clean(monkeypatch)
358
+ live_copilot_calls: list[str] = []
359
+ live_pending_calls: list[str] = []
360
+
361
+ def _recording_bot_review(**_keywords: object) -> tuple[bool, str]:
362
+ live_copilot_calls.append("copilot")
363
+ return True, "clean"
364
+
365
+ def _recording_pending(**_keywords: object) -> tuple[bool, str]:
366
+ live_pending_calls.append("pending")
367
+ return True, "clean"
368
+
369
+ monkeypatch.setattr(check_convergence, "_check_bot_review", _recording_bot_review)
370
+ monkeypatch.setattr(
371
+ check_convergence, "_check_no_pending_reviews", _recording_pending
372
+ )
373
+ monkeypatch.setattr(
374
+ check_convergence,
375
+ "_resolve_copilot_waiver",
376
+ lambda _flag: check_convergence_availability.ReviewerWaiver(
377
+ False, "", "quota API down"
378
+ ),
379
+ )
380
+ monkeypatch.setattr(
381
+ check_convergence,
382
+ "_resolve_bugbot_waiver",
383
+ lambda _flag: check_convergence_availability.ReviewerWaiver(True, "bugbot_down", ""),
384
+ )
385
+ exit_code = check_convergence.main(
386
+ [
387
+ "--owner",
388
+ "o",
389
+ "--repo",
390
+ "r",
391
+ "--pr-number",
392
+ "1",
393
+ "--bugbot-down",
394
+ ]
395
+ )
396
+ captured = capsys.readouterr().out
397
+ assert live_copilot_calls == ["copilot"]
398
+ assert live_pending_calls == ["pending"]
399
+ assert "enforced (probe error" not in captured
400
+ assert exit_code == 0
@@ -0,0 +1,179 @@
1
+ """Fixture-mode tests for check_convergence --fixture replay."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib.util
6
+ import json
7
+ import sys
8
+ from pathlib import Path
9
+ from types import ModuleType
10
+
11
+ import pytest
12
+
13
+ import _pr_converge_path_setup # noqa: F401
14
+
15
+ _SCRIPTS_DIRECTORY = Path(__file__).absolute().parent
16
+ _PR_CONVERGE_DIRECTORY = _SCRIPTS_DIRECTORY.parent
17
+
18
+ CLEAN_LABEL = "Clean \u2014 no findings"
19
+ CLEAN_BODY = (
20
+ f"**Bugteam audit completed** \u2014 {CLEAN_LABEL}\n\n"
21
+ "No findings.\n"
22
+ )
23
+ HEAD_SHA = "ae8005aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
24
+
25
+
26
+ def _load_module() -> ModuleType:
27
+ for each_cached_name in [
28
+ each_key
29
+ for each_key in list(sys.modules)
30
+ if each_key == "config" or each_key.startswith("config.")
31
+ ]:
32
+ sys.modules.pop(each_cached_name, None)
33
+ if str(_PR_CONVERGE_DIRECTORY) in sys.path:
34
+ sys.path.remove(str(_PR_CONVERGE_DIRECTORY))
35
+ sys.path.insert(0, str(_PR_CONVERGE_DIRECTORY))
36
+ module_path = _SCRIPTS_DIRECTORY / "check_convergence.py"
37
+ spec = importlib.util.spec_from_file_location(
38
+ "check_convergence_fixture_under_test", module_path
39
+ )
40
+ assert spec is not None
41
+ assert spec.loader is not None
42
+ module = importlib.util.module_from_spec(spec)
43
+ spec.loader.exec_module(module)
44
+ return module
45
+
46
+
47
+ check_convergence = _load_module()
48
+
49
+
50
+ def _write_passing_fixture(tmp_path: Path) -> Path:
51
+ fixture_path = tmp_path / "pr-at-merge.json"
52
+ payload = {
53
+ "head_sha": HEAD_SHA,
54
+ "pr_object": {"mergeable": True, "mergeable_state": "clean"},
55
+ "reviews": [
56
+ {
57
+ "id": 1,
58
+ "body": CLEAN_BODY,
59
+ "commit_id": HEAD_SHA,
60
+ }
61
+ ],
62
+ "unresolved_bot_threads_passed": True,
63
+ "unresolved_bot_threads_detail": "0 unresolved",
64
+ "pending_reviews_passed": True,
65
+ "pending_reviews_detail": "none pending",
66
+ }
67
+ fixture_path.write_text(json.dumps(payload), encoding="utf-8")
68
+ return fixture_path
69
+
70
+
71
+ def should_exit_zero_from_fixture_with_bugbot_and_copilot_down(
72
+ tmp_path: Path, capsys: pytest.CaptureFixture[str]
73
+ ) -> None:
74
+ fixture_path = _write_passing_fixture(tmp_path)
75
+ exit_code = check_convergence.main(
76
+ [
77
+ "--owner",
78
+ "jl-cmd",
79
+ "--repo",
80
+ "claude-dev-env",
81
+ "--pr-number",
82
+ "53",
83
+ "--fixture",
84
+ str(fixture_path),
85
+ "--bugbot-down",
86
+ "--copilot-down",
87
+ ]
88
+ )
89
+ captured = capsys.readouterr().out
90
+ assert exit_code == 0
91
+ assert "All pre-conditions met" in captured
92
+ assert "bypassed (bugbot_down)" in captured
93
+ assert "bypassed (copilot_down)" in captured
94
+ assert "clean bugteam audit" in captured
95
+ assert "PR is mergeable: PASS" in captured
96
+
97
+
98
+ def should_exit_one_from_fixture_when_bugteam_clean_missing(
99
+ tmp_path: Path, capsys: pytest.CaptureFixture[str]
100
+ ) -> None:
101
+ fixture_path = tmp_path / "missing-bugteam.json"
102
+ payload = {
103
+ "head_sha": HEAD_SHA,
104
+ "pr_object": {"mergeable": True, "mergeable_state": "clean"},
105
+ "reviews": [],
106
+ "unresolved_bot_threads_passed": True,
107
+ "unresolved_bot_threads_detail": "0 unresolved",
108
+ "pending_reviews_passed": True,
109
+ "pending_reviews_detail": "none pending",
110
+ }
111
+ fixture_path.write_text(json.dumps(payload), encoding="utf-8")
112
+ exit_code = check_convergence.main(
113
+ [
114
+ "--owner",
115
+ "jl-cmd",
116
+ "--repo",
117
+ "claude-dev-env",
118
+ "--pr-number",
119
+ "80",
120
+ "--fixture",
121
+ str(fixture_path),
122
+ "--bugbot-down",
123
+ "--copilot-down",
124
+ ]
125
+ )
126
+ captured = capsys.readouterr().out
127
+ assert exit_code == 1
128
+ assert "no bugteam review found" in captured
129
+ assert "do not mark ready" in captured
130
+
131
+
132
+ def should_parse_fixture_flag() -> None:
133
+ arguments = check_convergence.parse_arguments(
134
+ [
135
+ "--owner",
136
+ "o",
137
+ "--repo",
138
+ "r",
139
+ "--pr-number",
140
+ "1",
141
+ "--fixture",
142
+ "snap.json",
143
+ "--bugbot-down",
144
+ "--copilot-down",
145
+ ]
146
+ )
147
+ assert arguments.fixture == "snap.json"
148
+ assert arguments.bugbot_down is True
149
+ assert arguments.copilot_down is True
150
+
151
+
152
+ def should_evaluate_bugteam_clean_from_reviews_on_clean_body() -> None:
153
+ head = HEAD_SHA
154
+ passed, detail = check_convergence._evaluate_bugteam_clean_from_reviews(
155
+ [{"id": 9, "body": CLEAN_BODY, "commit_id": head}],
156
+ head,
157
+ )
158
+ assert passed is True
159
+ assert "clean bugteam audit" in detail
160
+
161
+
162
+ def should_load_convergence_fixture_from_disk(tmp_path: Path) -> None:
163
+ fixture_path = _write_passing_fixture(tmp_path)
164
+ fixture = check_convergence._load_convergence_fixture(fixture_path)
165
+ assert fixture.head_sha == HEAD_SHA
166
+ assert fixture.pr_object["mergeable"] is True
167
+ assert len(fixture.reviews) == 1
168
+
169
+
170
+ def should_reject_fixture_missing_safety_gate_flags(tmp_path: Path) -> None:
171
+ fixture_path = tmp_path / "missing-safety-flags.json"
172
+ payload = {
173
+ "head_sha": HEAD_SHA,
174
+ "pr_object": {"mergeable": True, "mergeable_state": "clean"},
175
+ "reviews": [{"id": 1, "body": CLEAN_BODY, "commit_id": HEAD_SHA}],
176
+ }
177
+ fixture_path.write_text(json.dumps(payload), encoding="utf-8")
178
+ with pytest.raises(ValueError):
179
+ check_convergence._load_convergence_fixture(fixture_path)
@@ -0,0 +1,84 @@
1
+ """Behavioral tests for the review and Bugbot convergence gate leaves.
2
+
3
+ ::
4
+
5
+ _flatten_paginated_reviews(two pages) -> newest-first flat list
6
+ _bugbot_run_conclusion_detail(success) -> (True, "check run ...")
7
+ _check_bugbot(named complete run) -> (True, "check run ...")
8
+
9
+ Each test drives the real leaf, stubbing only the ``gh`` transport helpers.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import json
15
+
16
+ import pytest
17
+
18
+ import check_convergence_gates as gates
19
+
20
+
21
+ def test_flatten_paginated_reviews_flattens_and_sorts_newest_first() -> None:
22
+ pages = [
23
+ [{"id": 1, "submitted_at": "2026-01-01T00:00:00Z"}],
24
+ [{"id": 2, "submitted_at": "2026-03-01T00:00:00Z"}],
25
+ ]
26
+ flattened = gates._flatten_paginated_reviews(json.dumps(pages))
27
+ assert flattened is not None
28
+ assert [each_review["id"] for each_review in flattened] == [2, 1]
29
+
30
+
31
+ def test_flatten_paginated_reviews_returns_none_for_non_list_payload() -> None:
32
+ assert (
33
+ gates._flatten_paginated_reviews(json.dumps({"message": "Not Found"})) is None
34
+ )
35
+
36
+
37
+ def test_bugbot_run_conclusion_detail_passes_on_a_complete_conclusion() -> None:
38
+ complete_conclusion = gates.ALL_BUGBOT_CHECK_RUN_COMPLETE_CONCLUSIONS[0]
39
+ passed, detail = gates._bugbot_run_conclusion_detail(
40
+ {"id": 55, "conclusion": complete_conclusion, "html_url": ""}
41
+ )
42
+ assert passed is True
43
+ assert "check run 55" in detail
44
+
45
+
46
+ def test_check_bugbot_reports_success_when_the_named_run_is_complete(
47
+ monkeypatch: pytest.MonkeyPatch,
48
+ ) -> None:
49
+ complete_conclusion = gates.ALL_BUGBOT_CHECK_RUN_COMPLETE_CONCLUSIONS[0]
50
+ run_name = f"x {gates.BUGBOT_CHECK_RUN_NAME_SUBSTRING} y"
51
+ payload = {
52
+ "check_runs": [
53
+ {
54
+ "name": run_name,
55
+ "id": 9,
56
+ "conclusion": complete_conclusion,
57
+ "html_url": "",
58
+ }
59
+ ]
60
+ }
61
+
62
+ def _stub_gh_api(endpoint_path: str) -> tuple[int, str]:
63
+ return 0, json.dumps(payload)
64
+
65
+ monkeypatch.setattr(gates, "_gh_api", _stub_gh_api)
66
+ passed, detail = gates._check_bugbot(owner="o", repo="r", sha="abc")
67
+ assert passed is True
68
+ assert "check run 9" in detail
69
+
70
+
71
+ def should_evaluate_mergeable_from_pr_object_clean() -> None:
72
+ passed, detail = gates._evaluate_mergeable_from_pr_object(
73
+ {"mergeable": True, "mergeable_state": "clean"}
74
+ )
75
+ assert passed is True
76
+ assert detail == "clean"
77
+
78
+
79
+ def should_evaluate_mergeable_from_pr_object_unknown() -> None:
80
+ passed, detail = gates._evaluate_mergeable_from_pr_object(
81
+ {"mergeable": None, "mergeable_state": "unknown"}
82
+ )
83
+ assert passed is False
84
+ assert detail == "unknown"