claude-dev-env 2.16.0 → 2.17.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 (535) 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/pr-cleanup/SKILL.md +99 -0
  28. package/.agents/skills/prototype/reference/honest-limitations.md +1 -1
  29. package/.agents/skills/prototype/reference/promotion-tasks.md +1 -1
  30. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +2 -2
  31. package/.agents/skills/prototype/workflows/promotion.md +2 -2
  32. package/.agents/skills/review-router/SKILL.md +51 -0
  33. package/.agents/skills/review-router/reference/route-policy.json +7 -0
  34. package/.agents/skills/review-router/reference/task-seeds.md +1 -0
  35. package/.agents/skills/review-router/scripts/conftest.py +4 -0
  36. package/.agents/skills/review-router/scripts/review_router.py +50 -0
  37. package/.agents/skills/review-router/scripts/review_router_cli.py +211 -0
  38. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +1 -0
  39. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  40. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +13 -0
  41. package/.agents/skills/review-router/scripts/test_review_router.py +23 -0
  42. package/.agents/skills/review-router/scripts/test_review_router_cli.py +47 -0
  43. package/.agents/skills/review-tier/SKILL.md +56 -0
  44. package/.agents/skills/review-tier/reference/task-seeds.md +1 -0
  45. package/.agents/skills/review-tier/reference/tier-policy.json +9 -0
  46. package/.agents/skills/review-tier/scripts/conftest.py +4 -0
  47. package/.agents/skills/review-tier/scripts/review_tier.py +332 -0
  48. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +1 -0
  49. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  50. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +29 -0
  51. package/.agents/skills/review-tier/scripts/test_generation.py +171 -0
  52. package/.agents/skills/review-tier/scripts/test_review_tier.py +33 -0
  53. package/.agents/skills/session-log/SKILL.md +1 -1
  54. package/.agents/skills/shared-extraction-audit/SKILL.md +160 -0
  55. package/.agents/skills/shared-extraction-audit/reference/examples.md +46 -0
  56. package/.agents/skills/shared-extraction-audit/reference/offense-taxonomy.md +100 -0
  57. package/.agents/skills/source-command-logifix/SKILL.md +29 -0
  58. package/.agents/skills/source-command-sr-loop/SKILL.md +58 -0
  59. package/.agents/skills-archived/AGENTS.md +45 -0
  60. package/.agents/{skills → skills-archived}/anthropic-plan/AGENTS.md +1 -1
  61. package/.agents/{skills → skills-archived}/bugteam/scripts/reflow_skill_md.py +3 -3
  62. package/.agents/{skills → skills-archived}/codex-review/test_skill_scaffold.py +1 -1
  63. package/.agents/{skills → skills-archived}/copilot-finding-triage/SKILL.md +1 -1
  64. package/.agents/{skills → skills-archived}/pr-converge/SKILL.md +6 -6
  65. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
  66. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
  67. package/.agents/{skills → skills-archived}/pr-converge/reference/multi-pr-orchestration.md +1 -1
  68. package/.agents/{skills → skills-archived}/pr-converge/reference/per-tick.md +3 -3
  69. package/.agents/{skills → skills-archived}/pr-converge/scripts/reflow_skill_md.py +2 -2
  70. package/.agents/{skills → skills-archived}/pr-converge/test_portable_pacer_gate.py +6 -2
  71. package/.agents/{skills → skills-archived}/pr-converge/workflows/schedule-wakeup-loop.md +1 -1
  72. package/.agents/{skills → skills-archived}/split-pr/reference/proposal-format.md +1 -1
  73. package/AGENTS.md +34 -58
  74. package/_shared/AGENTS.md +2 -0
  75. package/_shared/advisor/reference/sol-rung.md +2 -2
  76. package/_shared/advisor/reference/third-party-bind.md +1 -1
  77. package/_shared/pr-loop/audit-reply-template.md +4 -0
  78. package/_shared/pr-loop/fix-protocol.md +7 -6
  79. package/_shared/pr-loop/gh-payloads.md +8 -6
  80. package/_shared/pr-loop/precatch-rubric.md +6 -5
  81. package/_shared/pr-loop/scripts/AGENTS.md +15 -0
  82. package/_shared/pr-loop/scripts/_pr_converge_path_setup.py +38 -0
  83. package/_shared/pr-loop/scripts/check_bugbot_ci.py +279 -0
  84. package/_shared/pr-loop/scripts/check_convergence.py +923 -0
  85. package/_shared/pr-loop/scripts/check_convergence_availability.py +275 -0
  86. package/_shared/pr-loop/scripts/check_convergence_gates.py +279 -0
  87. package/_shared/pr-loop/scripts/check_convergence_thread_gates.py +219 -0
  88. package/_shared/pr-loop/scripts/check_pending_reviews.py +154 -0
  89. package/_shared/pr-loop/scripts/codex_down_classifier.py +98 -0
  90. package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
  91. package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +18 -0
  92. package/_shared/pr-loop/scripts/codex_review_scripts_constants/__init__.py +1 -0
  93. package/_shared/pr-loop/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
  94. package/_shared/pr-loop/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +82 -0
  95. package/_shared/pr-loop/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
  96. package/_shared/pr-loop/scripts/codex_review_scripts_constants/run_constants.py +53 -0
  97. package/_shared/pr-loop/scripts/codex_usage_probe.py +570 -0
  98. package/_shared/pr-loop/scripts/conftest.py +43 -0
  99. package/_shared/pr-loop/scripts/fetch_copilot_reviews.py +134 -0
  100. package/_shared/pr-loop/scripts/fixtures/auth_failure_synthetic.txt +1 -0
  101. package/_shared/pr-loop/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
  102. package/_shared/pr-loop/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
  103. package/_shared/pr-loop/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
  104. package/_shared/pr-loop/scripts/fixtures/structured_findings.txt +13 -0
  105. package/_shared/pr-loop/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
  106. package/_shared/pr-loop/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
  107. package/_shared/pr-loop/scripts/fixtures/usage_limit_synthetic.txt +1 -0
  108. package/_shared/pr-loop/scripts/parse_codex_findings.py +207 -0
  109. package/_shared/pr-loop/scripts/post_fix_reply.py +168 -0
  110. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
  111. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +18 -0
  112. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  113. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +70 -0
  114. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/pr_converge_constants.py +118 -0
  115. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +13 -0
  116. package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
  117. package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +26 -0
  118. package/_shared/pr-loop/scripts/pr_converge_skill_constants/__init__.py +0 -0
  119. package/_shared/pr-loop/scripts/pr_converge_skill_constants/constants.py +69 -0
  120. package/_shared/pr-loop/scripts/run_codex_review.py +609 -0
  121. package/_shared/pr-loop/scripts/test__pr_converge_path_setup.py +30 -0
  122. package/_shared/pr-loop/scripts/test_check_bugbot_ci.py +312 -0
  123. package/_shared/pr-loop/scripts/test_check_convergence.py +438 -0
  124. package/_shared/pr-loop/scripts/test_check_convergence_availability.py +391 -0
  125. package/_shared/pr-loop/scripts/test_check_convergence_codex.py +517 -0
  126. package/_shared/pr-loop/scripts/test_check_convergence_contract.py +400 -0
  127. package/_shared/pr-loop/scripts/test_check_convergence_fixture.py +179 -0
  128. package/_shared/pr-loop/scripts/test_check_convergence_gates.py +84 -0
  129. package/_shared/pr-loop/scripts/test_check_convergence_thread_gates.py +99 -0
  130. package/_shared/pr-loop/scripts/test_codex_down_classifier.py +143 -0
  131. package/_shared/pr-loop/scripts/test_codex_usage_probe.py +683 -0
  132. package/_shared/pr-loop/scripts/test_parse_codex_findings.py +130 -0
  133. package/_shared/pr-loop/scripts/test_run_codex_review.py +969 -0
  134. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +1 -1
  135. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +1 -1
  136. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +1 -1
  137. package/_shared/pr-loop/state-schema.md +20 -28
  138. package/_shared/process-tree/AGENTS.md +3 -3
  139. package/bin/ever-shipped-skills.mjs +29 -1
  140. package/bin/install-constants.mjs +15 -6
  141. package/bin/install.agents-home.test.mjs +13 -0
  142. package/bin/install.cursor-rules.test.mjs +3 -3
  143. package/bin/install.mjs +80 -20
  144. package/bin/install.profile-root.test.mjs +1 -1
  145. package/bin/install.prune.test.mjs +23 -204
  146. package/bin/install.test.mjs +8 -5
  147. package/bin/resolve-install-root.mjs +21 -0
  148. package/bin/resolve-package-managed-directory.mjs +4 -4
  149. package/commands/AGENTS.md +2 -0
  150. package/commands/sr-loop.md +3 -0
  151. package/docs/references/prose-style-enforcement.md +3 -7
  152. package/hooks/AGENTS.md +0 -3
  153. package/hooks/blocking/AGENTS.md +0 -2
  154. package/hooks/blocking/ask_user_question_shape_blocker.py +83 -0
  155. package/hooks/blocking/pre_tool_use_dispatcher.py +2 -19
  156. package/hooks/blocking/state_description_blocker.py +1 -1
  157. package/hooks/blocking/test_ask_user_question_shape.py +69 -0
  158. package/hooks/blocking/test_pre_tool_use_dispatcher.py +17 -58
  159. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +9 -104
  160. package/hooks/blocking/test_state_description_blocker.py +1 -0
  161. package/hooks/blocking/test_stop_dispatcher.py +1 -26
  162. package/hooks/hooks.json +1 -1
  163. package/hooks/hooks_constants/AGENTS.md +0 -3
  164. package/hooks/hooks_constants/ask_user_question_shape.py +1 -1
  165. package/hooks/hooks_constants/ask_user_question_shape_constants.py +73 -0
  166. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +1 -2
  167. package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
  168. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -7
  169. package/hooks/hooks_constants/stop_dispatcher_constants.py +0 -1
  170. package/hooks/hooks_constants/test_ask_user_question_shape.py +1 -1
  171. package/hooks/hooks_constants/test_prose_metrics_parity.py +29 -107
  172. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +0 -1
  173. package/hooks/hooks_constants/working_style_prompt_constants.py +9 -10
  174. package/hooks/session/AGENTS.md +4 -1
  175. package/hooks/session/test_working_style_prompt.py +8 -4
  176. package/hooks/session/working_style_prompt.py +4 -2
  177. package/package.json +1 -4
  178. package/rules/AGENTS.md +2 -5
  179. package/rules/asd-ste100-language.md +39 -0
  180. package/rules/ask-user-question-required.md +1 -1
  181. package/rules/long-horizon-autonomy.md +1 -1
  182. package/scripts/AGENTS.md +1 -0
  183. package/scripts/Show-Asset.ps1 +106 -0
  184. package/scripts/test_validate_instruction_pairs.py +30 -3
  185. package/scripts/tests/test_engine.py +4 -4
  186. package/scripts/tests/test_rules.py +5 -5
  187. package/system-prompts/AGENTS.md +8 -0
  188. package/system-prompts/software-engineer.xml +8 -3
  189. package/.agents/skills/grokify/evals/README.md +0 -72
  190. package/.agents/skills/grokify/evals/parse-payload.test.mjs +0 -171
  191. package/.agents/skills/grokify/evals/run-capability-evals.mjs +0 -545
  192. package/_shared/pr-loop/scripts/README.md +0 -21
  193. package/docs/imagegen.md +0 -22
  194. package/hooks/blocking/eli11_reply_enforcer.py +0 -436
  195. package/hooks/blocking/plain_language_blocker.py +0 -758
  196. package/hooks/blocking/test_eli11_reply_enforcer.py +0 -390
  197. package/hooks/blocking/test_plain_language_blocker.py +0 -683
  198. package/hooks/blocking/test_plain_language_blocker_allowlist.py +0 -228
  199. package/hooks/diagnostic/AGENTS.md +0 -75
  200. package/hooks/diagnostic/CLAUDE.md +0 -1
  201. package/hooks/diagnostic/hook_log_extractor.py +0 -875
  202. package/hooks/diagnostic/hook_log_init.py +0 -202
  203. package/hooks/diagnostic/hook_log_stop_wrapper.py +0 -26
  204. package/hooks/diagnostic/migrations/2026-04-25-drop-themes-hook-events.sql +0 -3
  205. package/hooks/diagnostic/migrations/AGENTS.md +0 -16
  206. package/hooks/diagnostic/migrations/CLAUDE.md +0 -1
  207. package/hooks/diagnostic/migrations/README.md +0 -76
  208. package/hooks/diagnostic/queries/AGENTS.md +0 -19
  209. package/hooks/diagnostic/queries/CLAUDE.md +0 -1
  210. package/hooks/diagnostic/queries/block_details_for_hook.sql +0 -26
  211. package/hooks/diagnostic/queries/blocks_by_category.sql +0 -10
  212. package/hooks/diagnostic/queries/blocks_by_tool.sql +0 -9
  213. package/hooks/diagnostic/queries/blocks_last_7_days.sql +0 -11
  214. package/hooks/diagnostic/queries/top_blockers_last_24_hours.sql +0 -12
  215. package/hooks/diagnostic/queries/top_blockers_overall.sql +0 -12
  216. package/hooks/diagnostic/requirements-hook-logs-dev.txt +0 -2
  217. package/hooks/diagnostic/requirements-hook-logs.txt +0 -1
  218. package/hooks/diagnostic/schema.sql +0 -51
  219. package/hooks/diagnostic/test_hook_log_extractor.py +0 -1518
  220. package/hooks/diagnostic/test_hook_log_init.py +0 -227
  221. package/hooks/diagnostic/test_hook_log_stop_wrapper.py +0 -17
  222. package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +0 -94
  223. package/hooks/hooks_constants/hook_log_extractor_constants.py +0 -233
  224. package/hooks/hooks_constants/plain_language_blocker_constants.py +0 -366
  225. package/hooks/hooks_constants/test_hook_log_extractor_constants.py +0 -123
  226. package/rules/doc-prose-cuts.md +0 -58
  227. package/rules/eli11-replies.md +0 -36
  228. package/rules/opus5-communication-contract.md +0 -45
  229. package/rules/plain-language.md +0 -9
  230. /package/.agents/{skills → skills-archived}/anthropic-plan/.claude/CLAUDE.md +0 -0
  231. /package/.agents/{skills → skills-archived}/anthropic-plan/SKILL.md +0 -0
  232. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/.claude/CLAUDE.md +0 -0
  233. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/AGENTS.md +0 -0
  234. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -0
  235. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
  236. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
  237. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
  238. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/test_validate_packet.py +0 -0
  239. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/validate_packet.py +0 -0
  240. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/.claude/CLAUDE.md +0 -0
  241. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/AGENTS.md +0 -0
  242. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/README.md +0 -0
  243. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/build-prompt.md +0 -0
  244. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/reuse-audit.md +0 -0
  245. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/source-map.md +0 -0
  246. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/visual-plan.template.html +0 -0
  247. /package/.agents/{skills → skills-archived}/anthropic-plan/test_skill_contract.py +0 -0
  248. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/.claude/CLAUDE.md +0 -0
  249. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/AGENTS.md +0 -0
  250. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
  251. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.mjs +0 -0
  252. /package/.agents/{skills → skills-archived}/auditing-claude-config/.claude/CLAUDE.md +0 -0
  253. /package/.agents/{skills → skills-archived}/auditing-claude-config/AGENTS.md +0 -0
  254. /package/.agents/{skills → skills-archived}/auditing-claude-config/SKILL.md +0 -0
  255. /package/.agents/{skills → skills-archived}/auditing-claude-config/reference/probe-hook.md +0 -0
  256. /package/.agents/{skills → skills-archived}/beat-sheet/SKILL.md +0 -0
  257. /package/.agents/{skills → skills-archived}/beat-sheet/reference/visual-beats.md +0 -0
  258. /package/.agents/{skills → skills-archived}/bugteam/.claude/CLAUDE.md +0 -0
  259. /package/.agents/{skills → skills-archived}/bugteam/AGENTS.md +0 -0
  260. /package/.agents/{skills → skills-archived}/bugteam/CONSTRAINTS.md +0 -0
  261. /package/.agents/{skills → skills-archived}/bugteam/EXAMPLES.md +0 -0
  262. /package/.agents/{skills → skills-archived}/bugteam/PROMPTS.md +0 -0
  263. /package/.agents/{skills → skills-archived}/bugteam/SKILL.md +0 -0
  264. /package/.agents/{skills → skills-archived}/bugteam/reference/.claude/CLAUDE.md +0 -0
  265. /package/.agents/{skills → skills-archived}/bugteam/reference/AGENTS.md +0 -0
  266. /package/.agents/{skills → skills-archived}/bugteam/reference/README.md +0 -0
  267. /package/.agents/{skills → skills-archived}/bugteam/reference/audit-and-teammates.md +0 -0
  268. /package/.agents/{skills → skills-archived}/bugteam/reference/copilot-gap-analysis.md +0 -0
  269. /package/.agents/{skills → skills-archived}/bugteam/reference/design-rationale.md +0 -0
  270. /package/.agents/{skills → skills-archived}/bugteam/reference/github-pr-reviews.md +0 -0
  271. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -0
  272. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/AGENTS.md +0 -0
  273. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
  274. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
  275. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
  276. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
  277. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
  278. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
  279. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
  280. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-push.md +0 -0
  281. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
  282. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
  283. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
  284. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-read-files.md +0 -0
  285. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
  286. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
  287. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
  288. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
  289. /package/.agents/{skills → skills-archived}/bugteam/reference/team-setup.md +0 -0
  290. /package/.agents/{skills → skills-archived}/bugteam/scripts/.claude/CLAUDE.md +0 -0
  291. /package/.agents/{skills → skills-archived}/bugteam/scripts/AGENTS.md +0 -0
  292. /package/.agents/{skills → skills-archived}/bugteam/scripts/README.md +0 -0
  293. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_code_rules_gate.py +0 -0
  294. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_fix_hookspath.py +0 -0
  295. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_preflight.py +0 -0
  296. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -0
  297. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
  298. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
  299. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
  300. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
  301. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
  302. /package/.agents/{skills → skills-archived}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
  303. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
  304. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
  305. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_preflight.py +0 -0
  306. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
  307. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
  308. /package/.agents/{skills → skills-archived}/bugteam/scripts/windows_safe_rmtree.py +0 -0
  309. /package/.agents/{skills → skills-archived}/bugteam/sources.md +0 -0
  310. /package/.agents/{skills → skills-archived}/bugteam/test_skill_additions.py +0 -0
  311. /package/.agents/{skills → skills-archived}/closeout/SKILL.md +0 -0
  312. /package/.agents/{skills → skills-archived}/closeout/reference/handoff-prompt-template.md +0 -0
  313. /package/.agents/{skills → skills-archived}/closeout/reference/pii-redaction-checklist.md +0 -0
  314. /package/.agents/{skills → skills-archived}/codex-review/.claude/CLAUDE.md +0 -0
  315. /package/.agents/{skills → skills-archived}/codex-review/AGENTS.md +0 -0
  316. /package/.agents/{skills → skills-archived}/codex-review/SKILL.md +0 -0
  317. /package/.agents/{skills → skills-archived}/codex-review/reference/.claude/CLAUDE.md +0 -0
  318. /package/.agents/{skills → skills-archived}/codex-review/reference/AGENTS.md +0 -0
  319. /package/.agents/{skills → skills-archived}/codex-review/reference/cli-contract.md +0 -0
  320. /package/.agents/{skills → skills-archived}/codex-review/reference/loop-integration.md +0 -0
  321. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_down_classifier.py +0 -0
  322. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -0
  323. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
  324. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
  325. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
  326. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
  327. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
  328. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
  329. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_usage_probe.py +0 -0
  330. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
  331. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
  332. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
  333. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
  334. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
  335. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
  336. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
  337. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
  338. /package/.agents/{skills → skills-archived}/codex-review/scripts/parse_codex_findings.py +0 -0
  339. /package/.agents/{skills → skills-archived}/codex-review/scripts/run_codex_review.py +0 -0
  340. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_down_classifier.py +0 -0
  341. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_usage_probe.py +0 -0
  342. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_parse_codex_findings.py +0 -0
  343. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_run_codex_review.py +0 -0
  344. /package/.agents/{skills → skills-archived}/comments/SKILL.md +0 -0
  345. /package/.agents/{skills → skills-archived}/condensing-instructions/SKILL.md +0 -0
  346. /package/.agents/{skills → skills-archived}/copilot-finding-triage/reference/tier-rubric.md +0 -0
  347. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/conftest.py +0 -0
  348. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
  349. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
  350. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
  351. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
  352. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
  353. /package/.agents/{skills → skills-archived}/copilot-finding-triage/templates/notification.md +0 -0
  354. /package/.agents/{skills → skills-archived}/copilot-review/.claude/CLAUDE.md +0 -0
  355. /package/.agents/{skills → skills-archived}/copilot-review/AGENTS.md +0 -0
  356. /package/.agents/{skills → skills-archived}/copilot-review/SKILL.md +0 -0
  357. /package/.agents/{skills → skills-archived}/copilot-review/templates/subagent-prompt.md +0 -0
  358. /package/.agents/{skills → skills-archived}/descriptions/SKILL.md +0 -0
  359. /package/.agents/{skills → skills-archived}/emergencies/SKILL.md +0 -0
  360. /package/.agents/{skills → skills-archived}/grokify/SKILL.md +0 -0
  361. /package/.agents/{skills → skills-archived}/grokify/capability-claims.test.mjs +0 -0
  362. /package/.agents/{skills → skills-archived}/grokify/templates/handoff-template.md +0 -0
  363. /package/.agents/{skills → skills-archived}/plan-to-pr/SKILL.md +0 -0
  364. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/final-validation-tasks.md +0 -0
  365. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/model-routing.md +0 -0
  366. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-contract.md +0 -0
  367. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-schema.json +0 -0
  368. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/process-inventory.md +0 -0
  369. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/review-loop.md +0 -0
  370. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/run-record.schema.json +0 -0
  371. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/self-audit-tasks.md +0 -0
  372. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-seeds.md +0 -0
  373. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-ticket.md +0 -0
  374. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/__init__.py +0 -0
  375. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/constants.py +0 -0
  376. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/create_packet.py +0 -0
  377. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/load_skill_constants.py +0 -0
  378. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_create_packet.py +0 -0
  379. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_packet.py +0 -0
  380. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
  381. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_run.py +0 -0
  382. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_packet.py +0 -0
  383. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_protocol.py +0 -0
  384. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_run.py +0 -0
  385. /package/.agents/{skills → skills-archived}/plan-to-pr/test_skill_contract.py +0 -0
  386. /package/.agents/{skills → skills-archived}/plan-to-pr/test_task_ticket_contract.py +0 -0
  387. /package/.agents/{skills → skills-archived}/pr-converge/.claude/CLAUDE.md +0 -0
  388. /package/.agents/{skills → skills-archived}/pr-converge/AGENTS.md +0 -0
  389. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -0
  390. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
  391. /package/.agents/{skills → skills-archived}/pr-converge/reference/.claude/CLAUDE.md +0 -0
  392. /package/.agents/{skills → skills-archived}/pr-converge/reference/AGENTS.md +0 -0
  393. /package/.agents/{skills → skills-archived}/pr-converge/reference/convergence-gates.md +0 -0
  394. /package/.agents/{skills → skills-archived}/pr-converge/reference/examples.md +0 -0
  395. /package/.agents/{skills → skills-archived}/pr-converge/reference/fix-protocol.md +0 -0
  396. /package/.agents/{skills → skills-archived}/pr-converge/reference/ground-rules.md +0 -0
  397. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -0
  398. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/AGENTS.md +0 -0
  399. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
  400. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
  401. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-push.md +0 -0
  402. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
  403. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
  404. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
  405. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
  406. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
  407. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
  408. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
  409. /package/.agents/{skills → skills-archived}/pr-converge/reference/progress-checklist.md +0 -0
  410. /package/.agents/{skills → skills-archived}/pr-converge/reference/state-schema.md +0 -0
  411. /package/.agents/{skills → skills-archived}/pr-converge/reference/stop-conditions.md +0 -0
  412. /package/.agents/{skills → skills-archived}/pr-converge/scripts/.claude/CLAUDE.md +0 -0
  413. /package/.agents/{skills → skills-archived}/pr-converge/scripts/AGENTS.md +0 -0
  414. /package/.agents/{skills → skills-archived}/pr-converge/scripts/README.md +0 -0
  415. /package/.agents/{skills → skills-archived}/pr-converge/scripts/_pr_converge_path_setup.py +0 -0
  416. /package/.agents/{skills → skills-archived}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
  417. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_bugbot_ci.py +0 -0
  418. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence.py +0 -0
  419. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_availability.py +0 -0
  420. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_gates.py +0 -0
  421. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
  422. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_pending_reviews.py +0 -0
  423. /package/.agents/{skills → skills-archived}/pr-converge/scripts/conftest.py +0 -0
  424. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
  425. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
  426. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
  427. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
  428. /package/.agents/{skills → skills-archived}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
  429. /package/.agents/{skills → skills-archived}/pr-converge/scripts/post_fix_reply.py +0 -0
  430. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -0
  431. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
  432. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  433. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
  434. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
  435. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
  436. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test__pr_converge_path_setup.py +0 -0
  437. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
  438. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence.py +0 -0
  439. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
  440. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
  441. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
  442. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
  443. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
  444. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
  445. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
  446. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
  447. /package/.agents/{skills → skills-archived}/pr-converge/test_step5_host_branch.py +0 -0
  448. /package/.agents/{skills → skills-archived}/pr-converge/workflows/.claude/CLAUDE.md +0 -0
  449. /package/.agents/{skills → skills-archived}/pr-converge/workflows/AGENTS.md +0 -0
  450. /package/.agents/{skills → skills-archived}/pr-fix-protocol/SKILL.md +0 -0
  451. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/SKILL.md +0 -0
  452. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
  453. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
  454. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/SKILL.md +0 -0
  455. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
  456. /package/.agents/{skills → skills-archived}/recall/.claude/CLAUDE.md +0 -0
  457. /package/.agents/{skills → skills-archived}/recall/AGENTS.md +0 -0
  458. /package/.agents/{skills → skills-archived}/recall/SKILL.md +0 -0
  459. /package/.agents/{skills → skills-archived}/release-notes-html/SKILL.md +0 -0
  460. /package/.agents/{skills → skills-archived}/remember/.claude/CLAUDE.md +0 -0
  461. /package/.agents/{skills → skills-archived}/remember/AGENTS.md +0 -0
  462. /package/.agents/{skills → skills-archived}/remember/SKILL.md +0 -0
  463. /package/.agents/{skills → skills-archived}/reviewer-gates/SKILL.md +0 -0
  464. /package/.agents/{skills → skills-archived}/reviews/SKILL.md +0 -0
  465. /package/.agents/{skills → skills-archived}/show/SKILL.md +0 -0
  466. /package/.agents/{skills → skills-archived}/show/references/accessibility.md +0 -0
  467. /package/.agents/{skills → skills-archived}/show/references/art.md +0 -0
  468. /package/.agents/{skills → skills-archived}/show/references/charts.md +0 -0
  469. /package/.agents/{skills → skills-archived}/show/references/core-design.md +0 -0
  470. /package/.agents/{skills → skills-archived}/show/references/erds.md +0 -0
  471. /package/.agents/{skills → skills-archived}/show/references/flowcharts.md +0 -0
  472. /package/.agents/{skills → skills-archived}/show/references/host-and-html.md +0 -0
  473. /package/.agents/{skills → skills-archived}/show/references/illustrative-diagrams.md +0 -0
  474. /package/.agents/{skills → skills-archived}/show/references/interaction.md +0 -0
  475. /package/.agents/{skills → skills-archived}/show/references/mockups.md +0 -0
  476. /package/.agents/{skills → skills-archived}/show/references/quality-gates.md +0 -0
  477. /package/.agents/{skills → skills-archived}/show/references/structural-diagrams.md +0 -0
  478. /package/.agents/{skills → skills-archived}/show/references/subject-inventory.md +0 -0
  479. /package/.agents/{skills → skills-archived}/show/references/svg-contract.md +0 -0
  480. /package/.agents/{skills → skills-archived}/show/routing.yaml +0 -0
  481. /package/.agents/{skills → skills-archived}/show/samples/pr1262-v2.svg +0 -0
  482. /package/.agents/{skills → skills-archived}/show/scripts/README.md +0 -0
  483. /package/.agents/{skills → skills-archived}/show/scripts/validate-artifact.py +0 -0
  484. /package/.agents/{skills → skills-archived}/show/scripts/validate-package.py +0 -0
  485. /package/.agents/{skills → skills-archived}/show/templates/html-widget.html +0 -0
  486. /package/.agents/{skills → skills-archived}/show/templates/svg-base.svg +0 -0
  487. /package/.agents/{skills → skills-archived}/show/tests/fixtures/css-var.svg +0 -0
  488. /package/.agents/{skills → skills-archived}/show/tests/fixtures/dead-ref.svg +0 -0
  489. /package/.agents/{skills → skills-archived}/show/tests/fixtures/filled-glyph.svg +0 -0
  490. /package/.agents/{skills → skills-archived}/show/tests/fixtures/inherited-fill.svg +0 -0
  491. /package/.agents/{skills → skills-archived}/show/tests/fixtures/invalid.svg +0 -0
  492. /package/.agents/{skills → skills-archived}/show/tests/fixtures/large-canvas.svg +0 -0
  493. /package/.agents/{skills → skills-archived}/show/tests/fixtures/unfilled-connector.svg +0 -0
  494. /package/.agents/{skills → skills-archived}/show/tests/fixtures/valid.html +0 -0
  495. /package/.agents/{skills → skills-archived}/show/tests/test_validate-artifact.py +0 -0
  496. /package/.agents/{skills → skills-archived}/show/tests/test_validators.py +0 -0
  497. /package/.agents/{skills → skills-archived}/show/workflows/create-visual.md +0 -0
  498. /package/.agents/{skills → skills-archived}/show/workflows/review-visual.md +0 -0
  499. /package/.agents/{skills → skills-archived}/split-pr/SKILL.md +0 -0
  500. /package/.agents/{skills → skills-archived}/split-pr/reference/path-layers.md +0 -0
  501. /package/.agents/{skills → skills-archived}/split-pr/reference/split-further-loop.md +0 -0
  502. /package/.agents/{skills → skills-archived}/split-pr/reference/splitting-principles.md +0 -0
  503. /package/.agents/{skills → skills-archived}/split-pr/scripts/analyze_pr.py +0 -0
  504. /package/.agents/{skills → skills-archived}/split-pr/scripts/categorize_files.py +0 -0
  505. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/__init__.py +0 -0
  506. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/dependency_constants.py +0 -0
  507. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/git_operations_constants.py +0 -0
  508. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/packing_constants.py +0 -0
  509. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/plan_constants.py +0 -0
  510. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/split_pr_constants.py +0 -0
  511. /package/.agents/{skills → skills-archived}/split-pr/scripts/execute_split_slices.py +0 -0
  512. /package/.agents/{skills → skills-archived}/split-pr/scripts/pack_files_into_slices.py +0 -0
  513. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
  514. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_git_operations.py +0 -0
  515. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_layer_order.py +0 -0
  516. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_paginate.py +0 -0
  517. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_process_runner.py +0 -0
  518. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_script_types.py +0 -0
  519. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_title.py +0 -0
  520. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_analyze_pr.py +0 -0
  521. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files.py +0 -0
  522. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files_packing.py +0 -0
  523. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_execute_split_slices.py +0 -0
  524. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
  525. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
  526. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
  527. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_paginate.py +0 -0
  528. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_script_types.py +0 -0
  529. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_title.py +0 -0
  530. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
  531. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan.py +0 -0
  532. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_contract.py +0 -0
  533. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
  534. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_dependency_graph.py +0 -0
  535. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_plan.py +0 -0
@@ -0,0 +1,171 @@
1
+ import subprocess
2
+ from pathlib import Path
3
+
4
+ import pytest
5
+
6
+ from review_tier import build_generation, inventory_generation, router_state_directory, router_state_root, router_state_root_id
7
+
8
+
9
+ def test_generation_uses_live_git_surface(tmp_path: Path) -> None:
10
+ subprocess.run(["git", "init", "-q", "-b", "main"], cwd=tmp_path, check=True)
11
+ (tmp_path / "tracked.py").write_text("x = 1\n", encoding="utf-8")
12
+ subprocess.run(["git", "add", "tracked.py"], cwd=tmp_path, check=True)
13
+ subprocess.run(["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-qm", "init"], cwd=tmp_path, check=True)
14
+ (tmp_path / "untracked.py").write_text("y = 2\n", encoding="utf-8")
15
+ inventory = inventory_generation(tmp_path)
16
+ assert "untracked.py" in inventory["untracked"]
17
+ card = build_generation(tmp_path, card_path=tmp_path / "card.json")
18
+ assert card["inventory_hash"] == inventory["inventory_hash"]
19
+
20
+
21
+ def test_router_state_root_id_is_stable_for_normalized_roots(tmp_path: Path) -> None:
22
+ (tmp_path / "data").mkdir()
23
+ (tmp_path / "data-link").symlink_to(tmp_path / "data", target_is_directory=True)
24
+ state_root = router_state_root(tmp_path, {"CLAUDE_PLUGIN_DATA": str(tmp_path / "data" / ".." / "data")})
25
+ symlink_root = router_state_root(tmp_path, {"CLAUDE_PLUGIN_DATA": str(tmp_path / "data-link")})
26
+ assert state_root == symlink_root
27
+ assert router_state_root_id(state_root) == router_state_root_id(symlink_root)
28
+
29
+
30
+ def test_router_state_directory_is_scoped_under_the_router_root(tmp_path: Path) -> None:
31
+ state_directory = router_state_directory(tmp_path)
32
+ custom_environment = {"CLAUDE_PLUGIN_DATA": str(tmp_path / "custom-data")}
33
+ custom_state_directory = router_state_directory(tmp_path, custom_environment)
34
+
35
+ assert state_directory.parent == router_state_root(tmp_path)
36
+ assert custom_state_directory == router_state_root(tmp_path, custom_environment) / state_directory.name
37
+ assert custom_state_directory != state_directory
38
+ assert len(state_directory.name) == 64
39
+
40
+
41
+ def test_generation_records_committed_and_working_domains_once(tmp_path: Path) -> None:
42
+ repository = tmp_path / "repository"
43
+ repository.mkdir()
44
+ subprocess.run(["git", "init", "-q", "-b", "main"], cwd=repository, check=True)
45
+ subprocess.run(["git", "config", "user.name", "Test"], cwd=repository, check=True)
46
+ subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=repository, check=True)
47
+ tracked = repository / "packages" / "feature.py"
48
+ tracked.parent.mkdir()
49
+ tracked.write_text("one\n", encoding="utf-8")
50
+ subprocess.run(["git", "add", "."], cwd=repository, check=True)
51
+ subprocess.run(["git", "commit", "-qm", "initial"], cwd=repository, check=True)
52
+ initial_commit = subprocess.run(["git", "rev-parse", "HEAD"], cwd=repository, check=True, capture_output=True, text=True).stdout.strip()
53
+ tracked.write_text("one\nbase\n", encoding="utf-8")
54
+ subprocess.run(["git", "add", str(tracked)], cwd=repository, check=True)
55
+ subprocess.run(["git", "commit", "-qm", "feature"], cwd=repository, check=True)
56
+ tracked.write_text("one\ntwo\n", encoding="utf-8")
57
+ subprocess.run(["git", "add", str(tracked)], cwd=repository, check=True)
58
+ tracked.write_text("one\ntwo\nthree\n", encoding="utf-8")
59
+ (repository / "new.py").write_text("new\n", encoding="utf-8")
60
+ inventory = inventory_generation(repository, initial_commit)
61
+ records = {record["path"]: record["domains"] for record in inventory["files_by_domain"]}
62
+ assert records["packages/feature.py"] == ["committed", "staged", "unstaged"]
63
+ assert records["new.py"] == ["untracked"]
64
+ assert inventory["base_ref"] and inventory["merge_base"] and inventory["HEAD"]
65
+
66
+
67
+ @pytest.mark.parametrize("base_ref", ["missing", "HEAD~99"])
68
+ def test_invalid_base_writes_no_card(tmp_path: Path, base_ref: str) -> None:
69
+ repository = tmp_path / "repository"
70
+ repository.mkdir()
71
+ subprocess.run(["git", "init", "-q", "-b", "main"], cwd=repository, check=True)
72
+ (repository / "seed.txt").write_text("seed\n", encoding="utf-8")
73
+ subprocess.run(["git", "add", "seed.txt"], cwd=repository, check=True)
74
+ subprocess.run(["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-qm", "initial"], cwd=repository, check=True)
75
+ with pytest.raises(ValueError, match="INVALID_BASE_REF"):
76
+ build_generation(repository, base_ref=base_ref, card_path=tmp_path / "card.json")
77
+ assert not (tmp_path / "card.json").exists()
78
+
79
+
80
+ def _git_repository(root: Path) -> None:
81
+ subprocess.run(["git", "init", "-q", "-b", "main"], cwd=root, check=True)
82
+ subprocess.run(["git", "config", "user.name", "Test"], cwd=root, check=True)
83
+ subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=root, check=True)
84
+ (root / "seed.txt").write_text("seed\n", encoding="utf-8")
85
+ subprocess.run(["git", "add", "."], cwd=root, check=True)
86
+ subprocess.run(["git", "commit", "-qm", "initial"], cwd=root, check=True)
87
+
88
+
89
+ def test_diff_hash_changes_when_same_path_content_changes(tmp_path: Path) -> None:
90
+ _git_repository(tmp_path)
91
+ tracked_path = tmp_path / "seed.txt"
92
+ first_hash = inventory_generation(tmp_path)["diff_hash"]
93
+ tracked_path.write_text("changed\n", encoding="utf-8")
94
+ assert inventory_generation(tmp_path)["diff_hash"] != first_hash
95
+
96
+
97
+ def test_effective_lines_include_committed_staged_unstaged_and_untracked(tmp_path: Path) -> None:
98
+ _git_repository(tmp_path)
99
+ committed_path = tmp_path / "committed.txt"
100
+ committed_path.write_text("one\ntwo\n", encoding="utf-8")
101
+ subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
102
+ subprocess.run(["git", "commit", "-qm", "committed"], cwd=tmp_path, check=True)
103
+ staged_path = tmp_path / "staged.txt"
104
+ staged_path.write_text("one\ntwo\n", encoding="utf-8")
105
+ subprocess.run(["git", "add", str(staged_path)], cwd=tmp_path, check=True)
106
+ staged_path.write_text("one\ntwo\nthree\n", encoding="utf-8")
107
+ unstaged_path = tmp_path / "seed.txt"
108
+ unstaged_path.write_text("seed\nchanged\n", encoding="utf-8")
109
+ (tmp_path / "untracked.txt").write_text("one\ntwo\n", encoding="utf-8")
110
+ inventory = inventory_generation(tmp_path)
111
+ assert inventory["lines"] >= 6
112
+
113
+
114
+ def test_inventory_preserves_rename_prior_path_and_operations(tmp_path: Path) -> None:
115
+ _git_repository(tmp_path)
116
+ old_path = tmp_path / "old name.txt"
117
+ old_path.write_text("content\n", encoding="utf-8")
118
+ subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
119
+ subprocess.run(["git", "commit", "-qm", "rename source"], cwd=tmp_path, check=True)
120
+ new_path = tmp_path / "new name.txt"
121
+ old_path.rename(new_path)
122
+ subprocess.run(["git", "add", "-A"], cwd=tmp_path, check=True)
123
+ records = {record["path"]: record for record in inventory_generation(tmp_path)["files_by_domain"]}
124
+ assert records["new name.txt"]["prior_path"] == "old name.txt"
125
+ assert records["new name.txt"]["operation_by_domain"]["staged"] == "R"
126
+
127
+
128
+ def test_inventory_preserves_delete_binary_space_unicode_and_symlink_identity(tmp_path: Path) -> None:
129
+ _git_repository(tmp_path)
130
+ deleted = tmp_path / "deleted file.txt"
131
+ deleted.write_text("delete me\n", encoding="utf-8")
132
+ binary = tmp_path / "binary.bin"
133
+ binary.write_bytes(b"\0\xff")
134
+ unicode_path = tmp_path / "café.txt"
135
+ unicode_path.write_text("unicode\n", encoding="utf-8")
136
+ link = tmp_path / "link.txt"
137
+ link.symlink_to("seed.txt")
138
+ subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
139
+ subprocess.run(["git", "commit", "-qm", "surface"], cwd=tmp_path, check=True)
140
+ surface_commit = subprocess.run(["git", "rev-parse", "HEAD"], cwd=tmp_path, check=True, capture_output=True, text=True).stdout.strip()
141
+ deleted.unlink()
142
+ binary.write_bytes(b"\0\x00changed")
143
+ unicode_path.write_text("unicode changed\n", encoding="utf-8")
144
+ link.unlink()
145
+ link.symlink_to("café.txt")
146
+ subprocess.run(["git", "add", "-u"], cwd=tmp_path, check=True)
147
+ subprocess.run(["git", "add", "-A"], cwd=tmp_path, check=True)
148
+ records = {record["path"]: record for record in inventory_generation(tmp_path, surface_commit)["files_by_domain"]}
149
+ assert records["deleted file.txt"]["content_sha256"] != "0" * 64
150
+ assert records["binary.bin"]["binary"] is True
151
+ assert records["café.txt"]["path"] == "café.txt"
152
+ assert records["link.txt"]["content_sha256"]
153
+
154
+
155
+ def test_package_count_uses_distinct_monorepo_package_keys(tmp_path: Path) -> None:
156
+ _git_repository(tmp_path)
157
+ for path in ("packages/one/a.py", "packages/one/b.py", "apps/two/c.py", "root.py"):
158
+ target = tmp_path / path
159
+ target.parent.mkdir(parents=True, exist_ok=True)
160
+ target.write_text("x\n", encoding="utf-8")
161
+ assert inventory_generation(tmp_path)["packages"] == 3
162
+
163
+
164
+ def test_explicit_and_default_base_provenance_fields_are_exact(tmp_path: Path) -> None:
165
+ _git_repository(tmp_path)
166
+ default_inventory = inventory_generation(tmp_path)
167
+ explicit_inventory = inventory_generation(tmp_path, "HEAD")
168
+ assert default_inventory["base_source"] == "configured_fallback"
169
+ assert explicit_inventory["base_source"] == "explicit"
170
+ for field in ("base_ref", "base_source", "base_sha", "merge_base_sha", "head_sha"):
171
+ assert default_inventory[field]
@@ -0,0 +1,33 @@
1
+ from review_tier import build_decision, calculate_tier, canonical_json_hash, effective_tier, load_policy, policy_hash
2
+
3
+
4
+ def test_public_policy_functions_return_behavior() -> None:
5
+ tier_policy = load_policy()
6
+ assert policy_hash(tier_policy)
7
+ assert canonical_json_hash(tier_policy) == policy_hash(tier_policy)
8
+ decision = build_decision({}, "base", "head", ".", "digest", requested_override="T1")
9
+ assert decision["effective_tier"] == "T1"
10
+
11
+
12
+ def test_tier_boundaries_and_hard_trigger() -> None:
13
+ assert calculate_tier({"files": 0, "lines": 0, "packages": 0, "risk": 0}) == "T1"
14
+ assert calculate_tier({"files": 2}) == "T2"
15
+ assert calculate_tier({"files": 5}) == "T2"
16
+ assert calculate_tier({"hard_triggers": ["security"]}) == "T3"
17
+
18
+
19
+ def test_all_six_axes_accept_zero_one_two_boundaries() -> None:
20
+ axes = ("files", "lines", "packages", "risk", "public_api", "dependencies")
21
+ assert calculate_tier({axis: 0 for axis in axes}) == "T1"
22
+ assert calculate_tier({axis: 1 for axis in axes}) == "T3"
23
+ assert calculate_tier({axis: 2 for axis in axes}) == "T3"
24
+
25
+
26
+ def test_score_boundaries_keep_small_changes_below_t3() -> None:
27
+ assert calculate_tier({"files": 1, "lines": 1}) == "T2"
28
+ assert calculate_tier({"files": 2, "packages": 1, "risk": 1}) == "T3"
29
+
30
+
31
+ def test_upward_and_approved_downward_override() -> None:
32
+ assert effective_tier("T1", "T3") == "T3"
33
+ assert effective_tier("T3", "T1") == "T1"
@@ -25,7 +25,7 @@ Sessions come in many shapes — convergence loops, feature builds, research div
25
25
  - **The `Artifact` tool wraps the file in a document skeleton at publish time.** It adds `<!doctype html>…<head>…</head><body>` around whatever the file holds — write page content only (a `<title>`, a `<style>` block, and the body markup). Do not include `<!DOCTYPE>`, `<html>`, `<head>`, or `<body>` tags in the file itself.
26
26
  - **The `Artifact` tool redeploys to the same URL only within the current run.** Editing the session's HTML file in a later step of this same skill run and calling `Artifact` again does not mint a new URL — it updates the same published page in place. A fresh session has no memory of an artifact's URL from an earlier run, so republishing a session report written in a prior session always mints a new URL (there is no other way to target the old one without the user supplying it).
27
27
  - **Vault paths sit outside `.claude/`.** Headless vault paths (e.g., `$OBSIDIAN_VAULT_PATH`) resolve outside the project tree. Session reports use HTML regardless of vault location — the Artifact tool needs a written file to publish.
28
- - **Sessions describe current state by convention.** The state_description_blocker hook does not scan .html, but the rule at `~/.claude/rules/doc-prose-cuts.md` applies as a writing standard skip historical and comparative language when composing the report; the rule file lists the full trigger set.
28
+ - **Sessions describe current state by convention.** The state_description_blocker hook does not scan .html. Apply `~/.claude/rules/asd-ste100-language.md` for user-facing word choice and sentence style, and keep the session report current and self-contained.
29
29
  - **`write_existing_file_blocker` rejects Write on existing paths.** Use Write only when creating a fresh session report; use Edit for the vault-context append in step 3.
30
30
  - **Obsidian frontmatter index is HTML-blind.** Obsidian's native YAML-frontmatter parser reads only `.md` files. HTML files do not appear in Obsidian's frontmatter index. Search by content still works; search by `type: session-report` does not.
31
31
 
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: shared-extraction-audit
3
+ description: Audits pull requests and packages for general helpers living in workflow-specific code instead of shared_utils, then applies extraction fixes by default in small tested CLs. Use when reviewing PRs for architectural layering, migrating utilities out of cert_fix_queue/theme_dialer_pipeline/skills, auditing "similar offenses", or when the user mentions extraction audit, shared_utils migration, orchestration-only packages, thin wrappers, or layer inversions.
4
+ ---
5
+
6
+ # Shared Extraction Audit
7
+
8
+ Audit PRs and packages, report findings, and apply extraction fixes by default to keep **orchestration packages thin** and **shared_utils canonical**.
9
+
10
+ ## When to use
11
+
12
+ - User points at a PR (e.g. `#1954`, `#1965`) and asks for the same review loop
13
+ - A package grew `fix_one`, `_default_*`, backup upload, rembg session, or residual gates alongside orchestration
14
+ - Before merge: confirm consumers are adapters, not second implementations
15
+
16
+ ## Target architecture
17
+
18
+ | Layer | Holds | Examples |
19
+ |-------|--------|----------|
20
+ | **shared_utils** | Reusable actions, I/O, DB flips, inference, constants used by 2+ workflows | `status_promotion`, `background_removal`, `drive_production_backup`, `stp_filenames` |
21
+ | **Workflow package** | Orchestration, CLI, sweep loops, workflow-specific constants only | `cert_fix_queue/pipeline/queue_run.py`, `theme_dialer_pipeline` compose runners |
22
+ | **Skills / scripts** | Operator entrypoints that **delegate** to shared_utils | No parallel rembg/session stacks |
23
+
24
+ **Load-bearing rule:** If another package would import it, put it in `shared_utils`. After the move, every former caller imports the shared symbol and the old module is deleted.
25
+
26
+ ## Audit workflow
27
+
28
+ Copy to TodoWrite:
29
+
30
+ ```
31
+ Shared extraction audit:
32
+ - [ ] 1. Scope the PR (base branch, changed packages, stated goal)
33
+ - [ ] 2. Map canonical homes already in shared_utils
34
+ - [ ] 3. Grep for offense patterns (see reference/offense-taxonomy.md)
35
+ - [ ] 4. Write prioritized findings (P0–P3)
36
+ - [ ] 5. Apply the prioritized fix band by default; an explicit audit-only request ends after the report
37
+ - [ ] 6. Extract in small CLs (~100 lines) + move/adjust tests
38
+ - [ ] 7. Run scoped pytest, commit, push, update PR
39
+ ```
40
+
41
+ ### Step 1 — Scope
42
+
43
+ ```bash
44
+ git fetch origin pull/<N>/head:pr-<N> # or checkout feature branch
45
+ git diff <base>...<head> --stat
46
+ git diff <base>...<head> --name-only | rg 'shared_utils|cert_fix_queue|theme_dialer|clean_room|\.claude/skills'
47
+ ```
48
+
49
+ Read the PR summary, then verify **what landed correctly** before listing offenses.
50
+
51
+ ### Step 2 — Search patterns
52
+
53
+ Run these greps on the PR diff scope:
54
+
55
+ ```bash
56
+ # Rename-only seams and re-export facades
57
+ rg '_default_|def _.*_flipper|def _.*_one\b|promote_one|fix_one|backup_upload' <package> shared_utils
58
+ rg '^from shared_utils\..* import \w+$' <package>
59
+
60
+ # Layer inversions (shared importing consumer)
61
+ rg 'from (cert_fix_queue|theme_dialer_pipeline|clean_room_theme_icons)\.' shared_utils/
62
+
63
+ # Parallel stacks (second session/cache for same concern)
64
+ rg 'new_session|lru_cache.*session|rembg\.remove' .claude/skills shared_utils
65
+
66
+ # Duplicate constants
67
+ rg 'ALPHA_CHANNEL_INDEX|RGBA_ALPHA|DEFAULT_.*_PREFIX|ONEUI_STP_BASENAME' --glob '*.py'
68
+
69
+ # Duplicate test support
70
+ rg 'fail_if_called|build_rejected_theme_row|preserve_supplied_alpha' --glob '**/tests/**'
71
+ ```
72
+
73
+ ### Step 3 — Classify offenses
74
+
75
+ Use [reference/offense-taxonomy.md](reference/offense-taxonomy.md). Assign priority:
76
+
77
+ | Priority | Meaning |
78
+ |----------|---------|
79
+ | **P0** | Layer inversion or duplicate production stack (must fix before merge) |
80
+ | **P1** | General helper/constants/tests still in consumer package |
81
+ | **P2** | Module shape, I/O overlap, monolith size |
82
+ | **P3** | Stale names, docstrings, test attribute bugs |
83
+
84
+ ### Step 4 — Report template
85
+
86
+ ```markdown
87
+ ## PR #<N> extraction audit
88
+
89
+ ### Done well
90
+ - [canonical modules and deletions]
91
+
92
+ ### P0 — …
93
+ | Offense | Where | Target module | Tests |
94
+ |---------|-------|---------------|-------|
95
+
96
+ ### Suggested fix order
97
+ 1. …
98
+ ```
99
+
100
+ Apply the prioritized fixes after the report by default. An explicit audit-only request ends after the report.
101
+
102
+ ## Fix workflow
103
+
104
+ ### Extraction rules
105
+
106
+ 1. **Move behavior** — delete the consumer copy; every caller imports the shared symbol
107
+ 2. **Wire shared APIs at the call site** — e.g. `db_flipper=promote_theme_to_status` with `filename_prefix=...`
108
+ 3. **Retarget every caller, then delete the old module** — grep the old import path; remove re-export facades
109
+ 4. **Constants:** one source; workflow CLI keeps only workflow-specific names (`LEDGER_FILENAME`, exit codes)
110
+ 5. **Tests move with behavior** — shared module gets shared tests; orchestration keeps integration tests only
111
+ 6. **Small CLs** — one concern per commit (~100 lines); run scoped pytest after each
112
+
113
+ ### Canonical target map (this repo)
114
+
115
+ | Need | Home |
116
+ |------|------|
117
+ | Theme DB status flip | `shared_utils/theme_db/status_promotion.py` |
118
+ | Account folder ↔ ThemeAccount | `shared_utils/theme_persistence/account_adapter.py` |
119
+ | STP basename parsing | `shared_utils/samsung_utils/stp_filenames.py` |
120
+ | Drive backup upload | `shared_utils/files/drive_production_backup.py` |
121
+ | Timestamp scratch dirs | `shared_utils/files/timestamp_directory_retention.py` |
122
+ | Foreground extraction | `shared_utils/theme_assets/background_removal.py` |
123
+ | Cert fix / promote actions | `shared_utils/theme_assets/cert_closeout/` |
124
+ | Fixed-STP promotion sweep | `shared_utils/samsung_utils/promote_fixed_stp_sweep.py` |
125
+ | Cert queue orchestration only | `cert_fix_queue/pipeline/` (`queue_run`) and `run_cli` |
126
+
127
+ See also `.claude/rules/reuse-existing-tooling.md` before adding helpers.
128
+
129
+ ### Verification
130
+
131
+ ```bash
132
+ # Package under change (from its directory or shared_utils)
133
+ cd shared_utils && python -m pytest path/to/tests -n 0 -q
134
+ cd cert_fix_queue && python -m pytest tests/ -n 0 -q
135
+
136
+ # After moving tests: bump CI collect floor in .github/workflows/standalone-packages-tests.yml if applicable
137
+ ```
138
+
139
+ Provide evidence: pytest output counts, not "should work".
140
+
141
+ ### Git / PR
142
+
143
+ - Branch: `cursor/<topic>-593d` or existing PR branch
144
+ - Commit message: `Extract <what> from <package> into shared_utils`
145
+ - Update PR body: architecture table + test counts
146
+ - Do not merge; draft PR unless user says otherwise
147
+
148
+ ## Anti-patterns (flag these)
149
+
150
+ - `_default_*` adapter around a shared_utils function in a consumer module
151
+ - Workflow module that only does `from shared_utils... import foo as foo`
152
+ - `fix_one.py` / `promote_one.py` / `promote_run.py` / `backup_upload.py` in orchestration packages
153
+ - `shared_utils` importing `theme_dialer_pipeline` or `cert_fix_queue`
154
+ - Second rembg/BiRefNet session in a skill while `background_removal` exists
155
+ - Identical `tests/support.py` in two packages
156
+ - `config/constants.py` that only aliases extracted helpers
157
+
158
+ ## Examples
159
+
160
+ See [reference/examples.md](reference/examples.md) for cert_fix_queue (#1965) and background_removal (#1954) audits.
@@ -0,0 +1,46 @@
1
+ # Audit examples (this repo)
2
+
3
+ ## cert_fix_queue — PR #1965
4
+
5
+ **Goal:** `cert_fix_queue` holds orchestration only; general cert-fix utilities in `shared_utils`.
6
+
7
+ **Done well:**
8
+ - `locate_cert_folder_for_row`, `select_production_stp`, atomic copy, drive staged upload → shared_utils
9
+ - Deleted `fix_one.py`, `promote_one.py`, `backup_upload.py` from pipeline
10
+
11
+ **Offenses found and fixed:**
12
+ - `_default_db_flipper` in `fix_theme.py` → wire `db_flipper=promote_theme_to_status` at the call site; delete the wrapper
13
+ - `production_backup.py` under cert_closeout → `shared_utils/files/drive_production_backup.py`
14
+ - Duplicate test `support.py` → `shared_utils/theme_assets/testing/cert_fix_test_support.py`
15
+ - `fix_queue_constants.py` misnamed → `fix_outcomes.py`
16
+ - `_account_by_fixed_stps_folder` → `cert_failure_folder_to_theme_account_map()` in `account_adapter`
17
+ - `_fresh_run_directories` / scratch helpers → `allocate_timestamp_run_directory()`
18
+
19
+ **Pipeline after:**
20
+ ```
21
+ cert_fix_queue/pipeline/
22
+ queue_run.py
23
+ promote_run.py
24
+ run_cli.py
25
+ ```
26
+
27
+ ---
28
+
29
+ ## background_removal — PR #1954
30
+
31
+ **Goal:** One BiRefNet CPU path in `shared_utils/theme_assets/background_removal.py`.
32
+
33
+ **Done well:**
34
+ - Deleted `clean_room_theme_icons/chroma.py`, dialer `art_masks.py`, `png_io.py`
35
+ - Added `pixel_masks.py`, `png_canonical.py`
36
+ - Clean-room and dialer call `extract_foreground` / `extract_foreground_file`
37
+
38
+ **Remaining offenses (audit):**
39
+ - P0: Residual gates in `theme_dialer_pipeline/pipeline/chroma_extract.py` (shared algorithm output)
40
+ - P0: `_extract_component_foreground` wrapper; same pattern inlined in `compose_from_masters.py`
41
+ - P0: Parallel rembg in `misc-asset-remaster/scripts/generated_alpha_mask.py`
42
+ - P1: Duplicate extraction test fixtures (dialer conftest vs clean-room conftest)
43
+ - P1: `ALPHA_CHANNEL_INDEX` duplicated across dialer/clean-room/color_constants
44
+ - P2: Atomic write helpers inside 723-line `background_removal.py`; PNG path vs `png_canonical`
45
+
46
+ **Suggested fix order:** residual gates → shared test fixtures → dedupe constants → migrate misc rembg → I/O split (optional).
@@ -0,0 +1,100 @@
1
+ # Offense taxonomy
2
+
3
+ ## O1 — General action in workflow package
4
+
5
+ **Signal:** Per-item function named `*_one`, `fix_*`, `promote_*`, `upload_*` in orchestration tree.
6
+
7
+ **Example:** `cert_fix_queue/pipeline/fix_one.py` → `shared_utils/.../fix_theme.py` (`fix_cert_rejected_theme`).
8
+
9
+ **Fix:** Move module; consumer passes workflow-specific `filename_prefix` / folder ids at call site.
10
+
11
+ ---
12
+
13
+ ## O2 — Thin wrapper / default seam / re-export facade
14
+
15
+ **Signal:** `_default_db_flipper`, `_default_*` that only renames kwargs and calls shared_utils. Also: a workflow module that only re-exports a shared symbol under the old path.
16
+
17
+ **Example:** Wrapper around `promote_theme_to_status` with `db_flip_log_filename_prefix`. After a move, `clean_room_theme_icons.rebuild_nine_patch` still contains `from shared_utils... import rebuild_nine_patch`.
18
+
19
+ **Fix:** Update every caller to the shared symbol (`filename_prefix`, `shared_utils.theme_assets.nine_patch_rebuild`, etc.) and delete the wrapper or facade.
20
+
21
+ ---
22
+
23
+ ## O3 — Layer inversion
24
+
25
+ **Signal:** `shared_utils/...` imports from `cert_fix_queue`, `theme_dialer_pipeline`, `clean_room_theme_icons`, or `.claude/skills/...`.
26
+
27
+ **Fix:** Move imported symbol into shared_utils; consumer imports shared.
28
+
29
+ ---
30
+
31
+ ## O4 — Parallel production stack
32
+
33
+ **Signal:** Second implementation of same concern (rembg session, despill, STP walk, DB flip) in skill or sibling package.
34
+
35
+ **Example:** `misc-asset-remaster/.../generated_alpha_mask.py` vs `background_removal.py`.
36
+
37
+ **Fix:** Delegate to canonical module; delete duplicate constants and session cache.
38
+
39
+ ---
40
+
41
+ ## O5 — Validation/gates on shared output in consumer
42
+
43
+ **Signal:** Functions that only inspect output of shared algorithm (residual alpha, edge green excess) live in dialer/clean-room.
44
+
45
+ **Example:** `theme_dialer_pipeline/pipeline/chroma_extract.py` using `edge_green_excess_mask` from shared.
46
+
47
+ **Fix:** `shared_utils/theme_assets/background_removal/residual_gates.py` (or sibling); optional `extract_foreground_gated`.
48
+
49
+ ---
50
+
51
+ ## O6 — Duplicate constants
52
+
53
+ **Signal:** Same literal or semantic constant in workflow `config/constants.py` and shared config.
54
+
55
+ **Examples:** `ALPHA_CHANNEL_INDEX`, `ONEUI_STP_BASENAME_RE`, two `DEFAULT_*_DB_FLIP_*` with same value.
56
+
57
+ **Fix:** Single definition in shared config; delete consumer copies.
58
+
59
+ ---
60
+
61
+ ## O7 — Misplaced config module
62
+
63
+ **Signal:** Constants named for workflow A live under package B's config (e.g. `fix_queue_constants` under `cert_closeout`).
64
+
65
+ **Fix:** Rename/move to owning workflow or shared outcomes module; drop re-export-only facades.
66
+
67
+ ---
68
+
69
+ ## O8 — Duplicate test support
70
+
71
+ **Signal:** Identical or near-identical `tests/support.py`, conftest bypass fixtures, synthetic PNG writers in multiple packages.
72
+
73
+ **Fix:** `shared_utils/theme_assets/testing/` or `shared_utils/.../tests/fixtures.py`; one import path.
74
+
75
+ ---
76
+
77
+ ## O9 — General I/O in domain module
78
+
79
+ **Signal:** Atomic staged writes, Drive upload, UTC helpers duplicated inside a 700-line domain file.
80
+
81
+ **Fix:** `shared_utils/files/` (e.g. `drive_production_backup`, `timestamp_directory_retention`, `record_persist`).
82
+
83
+ ---
84
+
85
+ ## O10 — Stale identifiers
86
+
87
+ **Signal:** Docstrings/tests still say `fix_one`, `promote_one`, `backup_upload` after rename.
88
+
89
+ **Fix:** Update docs; no behavior change.
90
+
91
+ ---
92
+
93
+ ## Priority guide
94
+
95
+ | Offense | Typical priority |
96
+ |---------|------------------|
97
+ | O3, O4 | P0 |
98
+ | O1, O2, O5, O6, O7, O8 | P1 |
99
+ | O9, monolith size | P2 |
100
+ | O10 | P3 |
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: "source-command-logifix"
3
+ description: "Restore the Logitech Gaming Software (LCore) tray icon when it disappears on Windows"
4
+ ---
5
+
6
+ # source-command-logifix
7
+
8
+ Use this skill when the user asks to run the migrated source command `logifix`.
9
+
10
+ ## Command Template
11
+
12
+ Run the logifix recovery script to restore the LCore tray icon. The procedure is verified in `sessions/System Support/2. Logitech Tray Icon Fix Recurrence.md` (2026-04-25).
13
+
14
+ Execute the script via PowerShell 7+:
15
+
16
+ ```
17
+ pwsh -NoProfile -File "$HOME\.Codex\skills\logifix\scripts\logifix.ps1"
18
+ ```
19
+
20
+ The script will prompt for UAC once. Approve it. After it finishes, ask the user to confirm the tray icon is now visible.
21
+
22
+ If the script reports that UAC was canceled, or LCore did not respond after both relaunch attempts, instruct the user:
23
+
24
+ 1. Press **Ctrl+Shift+Esc** to open Task Manager.
25
+ 2. Find **Windows Explorer** in the process list.
26
+ 3. Right-click → **Restart**.
27
+ 4. Re-run `/logifix`.
28
+
29
+ The Task Manager Explorer restart is the guaranteed-correct fallback because it always hits the user's interactive session and the right elevation context, regardless of how the calling shell was launched.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: "source-command-sr-loop"
3
+ description: "Converging cleanup loop: repeat /simplify until clean, then repeat /code-review --fix until clean"
4
+ ---
5
+
6
+ # source-command-sr-loop
7
+
8
+ Use this skill when the user asks to run the migrated source command `sr-loop`.
9
+
10
+ ## Command Template
11
+
12
+ Run the converging cleanup loop on the target the user names (a PR URL,
13
+ a branch, or blank for the current branch's diff). Each phase invokes an
14
+ existing skill and repeats it until a pass returns zero new findings.
15
+
16
+ ### Phase A — loop simplify
17
+
18
+ 1. Invoke the `simplify` skill (or its local equivalent, e.g. `e-simplify`)
19
+ on the target. Let it run its 4-lens review fan-out (reuse,
20
+ simplification, efficiency, altitude) and apply its fixes.
21
+ 2. After each pass: run the scoped test suite (test files beside the touched
22
+ code, not the full repo suite), commit once (commit body via
23
+ `git commit -F <file>`, 10-minute timeout — the pre-commit gate runs its
24
+ own tests), and push to the PR head branch. The PR stays draft.
25
+ 3. Repeat the invocation. Skips are sticky: carry every adjudicated skip
26
+ forward into the next pass as "already adjudicated — do not re-report: ..."
27
+ context, or the loop never converges.
28
+ 4. Phase A converges when a full pass returns zero new findings. When the
29
+ previous pass changed only a line or two, a single combined-lens
30
+ confirmation agent may serve as the final pass.
31
+
32
+ ### Phase B — loop code-review with fixes
33
+
34
+ 1. Run the real code-review command through a headless subprocess in the
35
+ target worktree: `claude -p "/code-review low --fix" --max-turns 40` with a
36
+ 10-minute timeout, reading its final text for findings and applied fixes.
37
+ (The skill's `disable-model-invocation` flag blocks only programmatic tool
38
+ starts; a `-p` prompt arrives as user input and loads normally.) Fallback
39
+ when the headless run fails: invoke the `e-code-review` skill with
40
+ `low --fix` — same review-and-fix contract, no invocation restriction.
41
+ 2. After any pass that changed files: test, commit, push as in Phase A.
42
+ 3. Repeat until a pass reports zero findings. Phase B usually converges in
43
+ one pass when Phase A ran first.
44
+
45
+ ### Finish
46
+
47
+ Report: passes run per phase, commits pushed with hashes, fixes applied, and
48
+ the standing skip list with reasons.
49
+
50
+ ### Constraints (observed under headless runs)
51
+
52
+ - Run this loop in the main conversation. A wrapper subagent cannot see the
53
+ review skills, and a nested agent's own subagent reports route to the main
54
+ conversation instead of back to it.
55
+ - Scope test runs to the touched files; a full-suite run can outlive one
56
+ foreground tool call.
57
+ - A hung or newly slow test suite is a finding to investigate, not an
58
+ inconvenience.
@@ -0,0 +1,45 @@
1
+ # skills-archived
2
+
3
+ Versioned archive of retired Claude Code skills. These trees stay in the repository for reference and history but are not shipped to users.
4
+
5
+ ## Layout
6
+
7
+ Each subdirectory is one retired skill with its historical `SKILL.md`, reference docs, scripts, and tests. Live runtime helpers for convergence and Codex review live under `packages/claude-dev-env/_shared/pr-loop/scripts/` — not in these trees.
8
+
9
+ ## Installer behavior
10
+
11
+ `bin/install.mjs` copies skills only from `.agents/skills/`. This directory is outside that path and outside the `.claude/skills` lookup pointer, so archived skills never install to `~/.agents/skills/`.
12
+
13
+ `bin/ever-shipped-skills.mjs` still lists retired skill names so a full install prunes stale copies from prior releases.
14
+
15
+ ## Archived skills
16
+
17
+ | Skill | Role |
18
+ |---|---|
19
+ | `anthropic-plan` | Source-grounded plan packet workflow |
20
+ | `auditing-claude-config` | Claude Code startup instruction audit |
21
+ | `beat-sheet` | Single-line beat formatting |
22
+ | `bugteam` | Open PR audit-fix loop |
23
+ | `closeout` | Session obstacle harvest to GitHub issues |
24
+ | `codex-review` | Local Codex PR reviewer (runtime scripts in `_shared`) |
25
+ | `comments` | PR review comment guide |
26
+ | `condensing-instructions` | Instruction slimming for Claude 5 |
27
+ | `copilot-finding-triage` | Copilot gate finding tiering |
28
+ | `copilot-review` | Copilot reviewer babysitter |
29
+ | `descriptions` | PR description guide |
30
+ | `emergencies` | Emergency change guide |
31
+ | `grokify` | Grok Build handoff prompt |
32
+ | `plan-to-pr` | Plan packet to PR workflow |
33
+ | `pr-converge` | Paced PR convergence loop (runtime scripts in `_shared`) |
34
+ | `pr-fix-protocol` | Reviewer finding fix protocol |
35
+ | `pr-loop-cloud-transport` | Cloud session gh-to-MCP transport |
36
+ | `pr-loop-lifecycle` | PR-loop open and close |
37
+ | `recall` | Obsidian vault recall |
38
+ | `release-notes-html` | Session release-notes HTML page |
39
+ | `remember` | Obsidian vault remember |
40
+ | `reviewer-gates` | External reviewer availability gates |
41
+ | `reviews` | Code review guide |
42
+ | `show` | Inline visual explanations |
43
+ | `split-pr` | PR split analyzer |
44
+
45
+ Prompt-generator dependency skills (`agent-prompt`, `pmin`, `pmax`, `pmid`, `prompt-generator`) shipped via the `@jl-cmd/prompt-generator` npm package and never had source trees in this repository.