claude-dev-env 4.3.0 → 7.0.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 (293) hide show
  1. package/.agents/agents/pr-description-writer.md +2 -2
  2. package/.agents/agents/test_agent_frontmatter.py +2 -2
  3. package/.agents/agents/test_pr_description_writer_style.py +1 -3
  4. package/.agents/skills/e-code-review/SKILL.md +12 -12
  5. package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +20 -0
  6. package/.agents/skills/e-code-review/reference/fix.md +15 -17
  7. package/.agents/skills/e-code-review/reference/loop.md +35 -39
  8. package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +2 -1
  9. package/.agents/skills/e-code-review/reference/preflight-proposal.md +44 -9
  10. package/.agents/skills/e-code-review/reference/runner-selection.md +13 -14
  11. package/.agents/skills/issue-tracker/SKILL.md +5 -4
  12. package/.agents/skills/pull-request/SKILL.md +11 -13
  13. package/.agents/skills/pull-request/reference/publication-tasks.md +3 -3
  14. package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +9 -1
  15. package/.agents/skills/pull-request/scripts/pull_request.py +33 -44
  16. package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +9 -0
  17. package/.agents/skills/pull-request/scripts/test_pull_request.py +1 -3
  18. package/.agents/skills/skill-builder/SKILL.md +3 -196
  19. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
  20. package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
  21. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
  22. package/bin/install.agents-home.test.mjs +15 -13
  23. package/bin/install.mjs +28 -0
  24. package/bin/install.policy-lint.test.mjs +78 -0
  25. package/bin/install.prune.test.mjs +59 -20
  26. package/bin/install.pstack-plugin.test.mjs +114 -0
  27. package/bin/install.test.mjs +37 -0
  28. package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
  29. package/hooks/advisory/pr_done_reminder.py +342 -0
  30. package/hooks/advisory/test_pr_done_reminder.py +249 -0
  31. package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
  32. package/hooks/blocking/code_rules_paired_test.py +22 -15
  33. package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
  34. package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
  35. package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
  36. package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
  37. package/hooks/blocking/test_pre_tool_use_dispatcher.py +68 -133
  38. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
  39. package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +18 -18
  40. package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
  41. package/hooks/git-hooks/pre_commit.py +52 -11
  42. package/hooks/git-hooks/test_installed_policy_lint.py +159 -0
  43. package/hooks/git-hooks/test_native_policy_commit.py +87 -0
  44. package/hooks/git-hooks/test_pre_commit.py +246 -0
  45. package/hooks/hooks.json +1 -1
  46. package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
  47. package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
  48. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -43
  49. package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
  50. package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
  51. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +20 -32
  52. package/package.json +2 -2
  53. package/rules/durable-post-artifacts.md +2 -1
  54. package/rules/git-workflow.md +6 -6
  55. package/scripts/check.ps1 +0 -1
  56. package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
  57. package/scripts/ci/installer-lifecycle.test.mjs +26 -0
  58. package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
  59. package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
  60. package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +5 -41
  61. package/{.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/durable_post_lint_constants.py → scripts/durable_post_lint_config/config/constants.py} +0 -10
  62. package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +1 -1
  63. package/scripts/policy_lint/adapter_detectors.py +13 -6
  64. package/scripts/policy_lint/adapters.py +7 -4
  65. package/scripts/policy_lint/config/constants.py +5 -0
  66. package/scripts/policy_lint/engine.py +48 -4
  67. package/scripts/policy_lint/model.py +1 -0
  68. package/scripts/policy_lint/registry.py +1 -1
  69. package/scripts/policy_lint/selection.py +2 -1
  70. package/scripts/policy_lint/selection_git.py +2 -0
  71. package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
  72. package/scripts/shared_tree_paths.py +32 -3
  73. package/scripts/test_shared_tree_paths.py +33 -0
  74. package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
  75. package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
  76. package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
  77. package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
  78. package/scripts/tests/test_policy_lint_selection.py +25 -2
  79. package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
  80. package/scripts/tests/test_rules.py +3 -7
  81. package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
  82. package/.agents/skills/_shared/pr-loop/AGENTS.md +0 -1
  83. package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
  84. package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
  85. package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
  86. package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
  87. package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
  88. package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
  89. package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
  90. package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
  91. package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
  92. package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
  93. package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
  94. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
  95. package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
  96. package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
  97. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
  98. package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
  99. package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
  100. package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
  101. package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
  102. package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
  103. package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
  104. package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
  105. package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
  106. package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
  107. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
  108. package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
  109. package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
  110. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
  111. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
  112. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
  113. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
  114. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
  115. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
  116. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
  117. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
  118. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
  119. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
  120. package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
  121. package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
  122. package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
  123. package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
  124. package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
  125. package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
  126. package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
  127. package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
  128. package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
  129. package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
  130. package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
  131. package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
  132. package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
  133. package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
  134. package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
  135. package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
  136. package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
  137. package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
  138. package/.agents/skills/autoconverge/AGENTS.md +0 -1
  139. package/.agents/skills/autoconverge/SKILL.md +0 -431
  140. package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
  141. package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
  142. package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
  143. package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
  144. package/.agents/skills/autoconverge/reference/convergence.md +0 -219
  145. package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
  146. package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
  147. package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
  148. package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
  149. package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
  150. package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
  151. package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
  152. package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
  153. package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
  154. package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
  155. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
  156. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
  157. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
  158. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
  159. package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
  160. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
  161. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
  162. package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
  163. package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
  164. package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
  165. package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
  166. package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
  167. package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
  168. package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
  169. package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
  170. package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
  171. package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
  172. package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
  173. package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
  174. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
  175. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
  176. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
  177. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
  178. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
  179. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
  180. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
  181. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
  182. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
  183. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
  184. package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
  185. package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
  186. package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
  187. package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
  188. package/.agents/skills/hitl/SKILL.md +0 -45
  189. package/.agents/skills/pr-cleanup/SKILL.md +0 -140
  190. package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
  191. package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
  192. package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
  193. package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
  194. package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
  195. package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
  196. package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
  197. package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
  198. package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
  199. package/.agents/skills/pr-refinement/SKILL.md +0 -31
  200. package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
  201. package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
  202. package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
  203. package/.agents/skills/pr-small-cl/SKILL.md +0 -52
  204. package/.agents/skills/pr-title-description/SKILL.md +0 -96
  205. package/.agents/skills/prototype/SKILL.md +0 -85
  206. package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
  207. package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
  208. package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
  209. package/.agents/skills/prototype/scripts/conftest.py +0 -15
  210. package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
  211. package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
  212. package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
  213. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
  214. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
  215. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
  216. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
  217. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
  218. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
  219. package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
  220. package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
  221. package/.agents/skills/prototype/workflows/promotion.md +0 -25
  222. package/.agents/skills/prototype/workflows/sandbox.md +0 -35
  223. package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
  224. package/.agents/skills/rebase/AGENTS.md +0 -1
  225. package/.agents/skills/rebase/SKILL.md +0 -178
  226. package/.agents/skills/review-router/SKILL.md +0 -51
  227. package/.agents/skills/review-router/reference/route-policy.json +0 -7
  228. package/.agents/skills/review-router/reference/task-seeds.md +0 -1
  229. package/.agents/skills/review-router/scripts/conftest.py +0 -4
  230. package/.agents/skills/review-router/scripts/review_router.py +0 -50
  231. package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
  232. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
  233. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  234. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +0 -13
  235. package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
  236. package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
  237. package/.agents/skills/review-tier/SKILL.md +0 -56
  238. package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
  239. package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
  240. package/.agents/skills/review-tier/scripts/conftest.py +0 -4
  241. package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
  242. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
  243. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  244. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +0 -29
  245. package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
  246. package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
  247. package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
  248. package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
  249. package/.agents/skills/session-log/AGENTS.md +0 -1
  250. package/.agents/skills/session-log/SKILL.md +0 -170
  251. package/.agents/skills/session-log/templates/frontmatter.md +0 -40
  252. package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
  253. package/.agents/skills/session-tidy/AGENTS.md +0 -1
  254. package/.agents/skills/session-tidy/SKILL.md +0 -191
  255. package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
  256. package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
  257. package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
  258. package/.agents/skills/skill-builder/references/description-field.md +0 -111
  259. package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
  260. package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
  261. package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
  262. package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
  263. package/.agents/skills/skill-builder/references/skill-types.md +0 -232
  264. package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
  265. package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
  266. package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
  267. package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
  268. package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
  269. package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
  270. package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
  271. package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
  272. package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
  273. package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
  274. package/.agents/skills/update/.claude/CLAUDE.md +0 -1
  275. package/.agents/skills/update/AGENTS.md +0 -1
  276. package/.agents/skills/update/SKILL.md +0 -190
  277. package/_shared/pr-loop/AGENTS.md +0 -1
  278. package/_shared/pr-loop/CLAUDE.md +0 -1
  279. package/_shared/pr-loop/audit-contract.md +0 -183
  280. package/_shared/pr-loop/audit-reply-template.md +0 -151
  281. package/_shared/pr-loop/code-rules-gate.md +0 -65
  282. package/_shared/pr-loop/fix-protocol.md +0 -60
  283. package/_shared/pr-loop/gh-payloads.md +0 -75
  284. package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
  285. package/_shared/pr-loop/precatch-rubric.md +0 -66
  286. package/_shared/pr-loop/preflight-proposal.md +0 -56
  287. package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
  288. package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
  289. package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
  290. package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
  291. package/_shared/pr-loop/state-schema.md +0 -45
  292. package/_shared/pr-loop/worker-spawn.md +0 -189
  293. /package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +0 -0
@@ -1,169 +0,0 @@
1
- /**
2
- * Autoconverge multi-PR fan-out workflow driver.
3
- *
4
- * SINGLE-FILE CONTRACT — keep this file self-contained. The Workflow runtime
5
- * wraps this body in a function (so top-level await and return work) and rejects
6
- * static import statements, and `export const meta` must be the first statement.
7
- * This driver fans out one converge.mjs child run per PR with parallel(); the
8
- * converge.mjs child uses only agent()/parallel() (never workflow()), so the
9
- * one-level workflow() nesting limit holds.
10
- */
11
-
12
- export const meta = {
13
- name: 'autoconverge-multi',
14
- description: 'Drive several draft PRs to convergence in one run: fan out one autoconverge converge.mjs child per PR in parallel, each pinned to its own checked-out worktree via repoPath, then report every PR\'s outcome together.',
15
- whenToUse: 'Launched by the /autoconverge skill when the user names more than one PR to converge at once; the single-PR path launches workflow/converge.mjs directly.',
16
- phases: [
17
- { title: 'Converge all', detail: 'One converge.mjs child run per PR, all in parallel; each child is pinned to its own PR worktree through repoPath' },
18
- ],
19
- }
20
-
21
- /**
22
- * Normalize the workflow args global into a parsed object.
23
- *
24
- * The Workflow runtime may deliver args as a JSON-encoded string or as an
25
- * object; a string is parsed and an object passes through unchanged. A non-JSON
26
- * or empty string yields null so a malformed payload becomes a structured
27
- * blocker rather than aborting the run.
28
- * @param {string|object} rawArgs the workflow args global (JSON string or object)
29
- * @returns {object|null} the parsed args, or null when a string payload fails to parse
30
- */
31
- function normalizeMultiInput(rawArgs) {
32
- if (typeof rawArgs !== 'string') return rawArgs
33
- try {
34
- return JSON.parse(rawArgs)
35
- } catch {
36
- return null
37
- }
38
- }
39
-
40
- /**
41
- * Decide whether one PR entry carries every coordinate a child run needs.
42
- *
43
- * A child converge run needs the PR's owner, repo, and number to address its
44
- * GitHub calls, and the absolute worktree path the PR is checked out in to pin
45
- * its agents there.
46
- * @param {object} prEntry one element of the args.prs array
47
- * @returns {boolean} true when owner, repo, prNumber, and a non-empty string repoPath are all present
48
- */
49
- function isUsablePrEntry(prEntry) {
50
- return (
51
- prEntry != null &&
52
- Boolean(prEntry.owner) &&
53
- Boolean(prEntry.repo) &&
54
- Boolean(prEntry.prNumber) &&
55
- typeof prEntry.repoPath === 'string' &&
56
- Boolean(prEntry.repoPath)
57
- )
58
- }
59
-
60
- const DEFAULT_GITHUB_TRANSPORT = 'local'
61
- const VALID_GITHUB_TRANSPORTS = new Set(['local', 'cloud'])
62
-
63
- function classifyMultiInput(rawArgs) {
64
- const candidate = normalizeMultiInput(rawArgs)
65
- if (candidate == null) {
66
- return {
67
- input: null,
68
- blocker: 'invalid run coordinates: the workflow args did not parse into an object',
69
- }
70
- }
71
- if (typeof candidate.convergeScriptPath !== 'string' || !candidate.convergeScriptPath) {
72
- return {
73
- input: null,
74
- blocker:
75
- 'invalid run coordinates: convergeScriptPath (absolute path to converge.mjs) is required',
76
- }
77
- }
78
- if (candidate.transport !== undefined && !VALID_GITHUB_TRANSPORTS.has(candidate.transport)) {
79
- return {
80
- input: null,
81
- blocker: 'invalid run transport: expected "local" or "cloud"',
82
- }
83
- }
84
- if (!Array.isArray(candidate.prs) || candidate.prs.length === 0) {
85
- return {
86
- input: null,
87
- blocker: 'invalid run coordinates: prs must be a non-empty array of PR entries',
88
- }
89
- }
90
- const unusableEntryCount = candidate.prs.filter(
91
- (eachEntry) => !isUsablePrEntry(eachEntry),
92
- ).length
93
- if (unusableEntryCount > 0) {
94
- return {
95
- input: null,
96
- blocker: `invalid run coordinates: ${unusableEntryCount} PR entry/entries missing owner, repo, prNumber, or repoPath`,
97
- }
98
- }
99
- return { input: candidate, blocker: null }
100
- }
101
-
102
- function childRunInput(prEntry, homeDirectory, transport = DEFAULT_GITHUB_TRANSPORT) {
103
- return {
104
- owner: prEntry.owner,
105
- repo: prEntry.repo,
106
- prNumber: prEntry.prNumber,
107
- repoPath: prEntry.repoPath,
108
- bugbotDisabled: Boolean(prEntry.bugbotDisabled),
109
- copilotDisabled: Boolean(prEntry.copilotDisabled),
110
- homeDirectory,
111
- transport,
112
- }
113
- }
114
-
115
- const multiInput = classifyMultiInput(args)
116
- if (multiInput.blocker) {
117
- return { converged: false, prCount: 0, convergedCount: 0, results: [], allDeferredPrs: [], blocker: multiInput.blocker }
118
- }
119
- const input = multiInput.input
120
-
121
- phase('Converge all')
122
- log(`autoconverge multi-PR: driving ${input.prs.length} PR(s) to ready in parallel`)
123
-
124
- const childResults = await parallel(
125
- input.prs.map((eachPr) => async () => {
126
- const childOutcome = await workflow(
127
- { scriptPath: input.convergeScriptPath },
128
- childRunInput(eachPr, input.homeDirectory, input.transport),
129
- )
130
- return {
131
- owner: eachPr.owner,
132
- repo: eachPr.repo,
133
- prNumber: eachPr.prNumber,
134
- converged: Boolean(childOutcome && childOutcome.converged),
135
- rounds: childOutcome && childOutcome.rounds !== undefined ? childOutcome.rounds : null,
136
- finalSha: childOutcome && childOutcome.finalSha !== undefined ? childOutcome.finalSha : null,
137
- blocker: childOutcome && childOutcome.blocker !== undefined ? childOutcome.blocker : null,
138
- deferredPrs: childOutcome && Array.isArray(childOutcome.deferredPrs) ? childOutcome.deferredPrs : [],
139
- }
140
- }),
141
- )
142
-
143
- const results = childResults.map((eachResult, eachIndex) =>
144
- eachResult === null
145
- ? {
146
- owner: input.prs[eachIndex].owner,
147
- repo: input.prs[eachIndex].repo,
148
- prNumber: input.prs[eachIndex].prNumber,
149
- converged: false,
150
- rounds: null,
151
- finalSha: null,
152
- blocker: 'child run threw or was skipped before returning an outcome',
153
- deferredPrs: [],
154
- }
155
- : eachResult,
156
- )
157
-
158
- const convergedCount = results.filter((eachResult) => eachResult.converged).length
159
- const allDeferredPrs = results.flatMap((eachResult) => eachResult.deferredPrs)
160
- log(`autoconverge multi-PR done: ${convergedCount}/${results.length} PR(s) converged, ${allDeferredPrs.length} deferred hardening PR(s) opened`)
161
-
162
- return {
163
- converged: convergedCount === results.length,
164
- prCount: results.length,
165
- convergedCount,
166
- results,
167
- allDeferredPrs,
168
- blocker: null,
169
- }
@@ -1,173 +0,0 @@
1
- import { test } from 'node:test';
2
- import { strict as assert } from 'node:assert';
3
- import { readFileSync } from 'node:fs';
4
- import { fileURLToPath } from 'node:url';
5
- import { dirname, join } from 'node:path';
6
-
7
- const workflowDirectory = dirname(fileURLToPath(import.meta.url));
8
- const multiSource = readFileSync(join(workflowDirectory, 'converge_multi.mjs'), 'utf8');
9
-
10
- function sourceSliceBetween(startNeedle, endNeedle) {
11
- const sliceStart = multiSource.indexOf(startNeedle);
12
- assert.notEqual(sliceStart, -1, `expected ${startNeedle} to exist`);
13
- const sliceEnd = multiSource.indexOf(endNeedle, sliceStart + startNeedle.length);
14
- assert.notEqual(sliceEnd, -1, `expected ${endNeedle} to exist after ${startNeedle}`);
15
- return multiSource.slice(sliceStart, sliceEnd);
16
- }
17
-
18
- const productionModule = new Function(
19
- `${sourceSliceBetween('function normalizeMultiInput(', '\nconst multiInput =')}\n` +
20
- 'return { normalizeMultiInput, isUsablePrEntry, classifyMultiInput, childRunInput };',
21
- )();
22
- const { normalizeMultiInput, classifyMultiInput, childRunInput } = productionModule;
23
-
24
- const AsyncFunction = async function () {}.constructor;
25
- const workflowBodySource = multiSource.slice(multiSource.indexOf('function normalizeMultiInput('));
26
- const runMultiWorkflowBody = new AsyncFunction(
27
- 'args',
28
- 'phase',
29
- 'log',
30
- 'parallel',
31
- 'workflow',
32
- workflowBodySource,
33
- );
34
-
35
- function ignoreCall() {}
36
-
37
- const SCRIPT_PATH = '/abs/skills/autoconverge/workflow/converge.mjs';
38
-
39
- function validEntry(prNumber) {
40
- return {
41
- owner: 'example-org',
42
- repo: 'example-repo',
43
- prNumber,
44
- repoPath: `/worktrees/pr-${prNumber}`,
45
- };
46
- }
47
-
48
- function validArgs() {
49
- return { convergeScriptPath: SCRIPT_PATH, prs: [validEntry(101), validEntry(102)] };
50
- }
51
-
52
- test('an object payload passes through unchanged', () => {
53
- const parsed = validArgs();
54
- assert.deepEqual(normalizeMultiInput(parsed), parsed);
55
- });
56
-
57
- test('a JSON-encoded string payload is parsed into coordinates', () => {
58
- assert.deepEqual(normalizeMultiInput(JSON.stringify(validArgs())), validArgs());
59
- });
60
-
61
- test('a non-JSON string returns null rather than throwing', () => {
62
- assert.equal(normalizeMultiInput('not json at all'), null);
63
- });
64
-
65
- test('valid coordinates classify with no blocker and keep every PR entry', () => {
66
- const classified = classifyMultiInput(validArgs());
67
- assert.equal(classified.blocker, null);
68
- assert.equal(classified.input.prs.length, 2);
69
- });
70
-
71
- test('a cloud transport classifies with no blocker', () => {
72
- const classified = classifyMultiInput({ ...validArgs(), transport: 'cloud' });
73
- assert.equal(classified.blocker, null);
74
- assert.equal(classified.input.transport, 'cloud');
75
- });
76
-
77
- test('an unknown transport is blocked before child workflows start', () => {
78
- const classified = classifyMultiInput({ ...validArgs(), transport: 'proxy' });
79
- assert.equal(classified.input, null);
80
- assert.match(classified.blocker, /transport/i);
81
- });
82
-
83
- test('a missing convergeScriptPath is blocked', () => {
84
- const classified = classifyMultiInput({ prs: [validEntry(101)] });
85
- assert.equal(classified.input, null);
86
- assert.match(classified.blocker, /convergeScriptPath/);
87
- });
88
-
89
- test('an empty prs array is blocked', () => {
90
- const classified = classifyMultiInput({ convergeScriptPath: SCRIPT_PATH, prs: [] });
91
- assert.equal(classified.input, null);
92
- assert.match(classified.blocker, /non-empty array/);
93
- });
94
-
95
- test('a missing prs list is blocked', () => {
96
- const classified = classifyMultiInput({ convergeScriptPath: SCRIPT_PATH });
97
- assert.equal(classified.input, null);
98
- assert.match(classified.blocker, /non-empty array/);
99
- });
100
-
101
- test('a non-array prs value is blocked', () => {
102
- const classified = classifyMultiInput({ convergeScriptPath: SCRIPT_PATH, prs: 'nope' });
103
- assert.equal(classified.input, null);
104
- assert.match(classified.blocker, /non-empty array/);
105
- });
106
-
107
- test('an entry missing prNumber is blocked', () => {
108
- const badEntry = { owner: 'example-org', repo: 'example-repo', repoPath: '/w/x' };
109
- const classified = classifyMultiInput({ convergeScriptPath: SCRIPT_PATH, prs: [badEntry] });
110
- assert.equal(classified.input, null);
111
- assert.match(classified.blocker, /missing/);
112
- });
113
-
114
- test('an entry missing repoPath is blocked', () => {
115
- const badEntry = { owner: 'example-org', repo: 'example-repo', prNumber: 101 };
116
- const classified = classifyMultiInput({ convergeScriptPath: SCRIPT_PATH, prs: [badEntry] });
117
- assert.equal(classified.input, null);
118
- assert.match(classified.blocker, /missing/);
119
- });
120
-
121
- test('a null payload is blocked', () => {
122
- const classified = classifyMultiInput('not json at all');
123
- assert.equal(classified.input, null);
124
- assert.match(classified.blocker, /did not parse/);
125
- });
126
-
127
- test('childRunInput forwards the PR coordinates to the child run', () => {
128
- const childArgs = childRunInput(validEntry(101));
129
- assert.equal(childArgs.owner, 'example-org');
130
- assert.equal(childArgs.repo, 'example-repo');
131
- assert.equal(childArgs.prNumber, 101);
132
- assert.equal(childArgs.repoPath, '/worktrees/pr-101');
133
- });
134
-
135
- test('childRunInput forwards copilotDisabled true when the entry opts out', () => {
136
- const optedOutEntry = { ...validEntry(101), copilotDisabled: true };
137
- assert.equal(childRunInput(optedOutEntry).copilotDisabled, true);
138
- });
139
-
140
- test('childRunInput defaults copilotDisabled to false when the entry omits it', () => {
141
- assert.equal(childRunInput(validEntry(101)).copilotDisabled, false);
142
- });
143
-
144
- test('childRunInput forwards bugbotDisabled true when the entry opts out', () => {
145
- const optedOutEntry = { ...validEntry(101), bugbotDisabled: true };
146
- assert.equal(childRunInput(optedOutEntry).bugbotDisabled, true);
147
- });
148
-
149
- test('childRunInput defaults bugbotDisabled to false when the entry omits it', () => {
150
- assert.equal(childRunInput(validEntry(101)).bugbotDisabled, false);
151
- });
152
-
153
- test('childRunInput forwards the selected cloud transport', () => {
154
- assert.equal(childRunInput(validEntry(101), '/home/dev', 'cloud').transport, 'cloud');
155
- });
156
-
157
- test('childRunInput forwards the run-level home directory to the child run', () => {
158
- const childArgs = childRunInput(validEntry(101), '/home/dev');
159
- assert.equal(childArgs.homeDirectory, '/home/dev');
160
- });
161
-
162
- test('the malformed-input blocker return carries an empty allDeferredPrs list', async () => {
163
- const blockerOutcome = await runMultiWorkflowBody(
164
- 'not json at all',
165
- ignoreCall,
166
- ignoreCall,
167
- ignoreCall,
168
- ignoreCall,
169
- );
170
- assert.notEqual(blockerOutcome.blocker, null);
171
- assert.equal(blockerOutcome.prCount, 0);
172
- assert.deepEqual(blockerOutcome.allDeferredPrs, []);
173
- });
@@ -1,110 +0,0 @@
1
- """Build the convergence-summary agent prompt over a PR's aggregated findings."""
2
-
3
- from autoconverge_report_constants.render_report_constants import (
4
- GITHUB_PR_URL_TEMPLATE,
5
- SUMMARY_COPILOT_NOTE_TEMPLATE,
6
- SUMMARY_DETAIL_MAX_CHARS,
7
- SUMMARY_FINDING_LINE_TEMPLATE,
8
- SUMMARY_FINDINGS_EMPTY_TEXT,
9
- SUMMARY_FIX_EMPTY_TEXT,
10
- SUMMARY_FIX_LINE_TEMPLATE,
11
- SUMMARY_PR_COORDINATES_TEMPLATE,
12
- SUMMARY_PROMPT_TEMPLATE,
13
- SUMMARY_STANDARDS_NOTE_TEMPLATE,
14
- )
15
-
16
-
17
- def _format_findings_block(findings: list[dict]) -> str:
18
- """Return the numbered findings block, or a clean-run sentence when empty.
19
-
20
- Args:
21
- findings: Aggregated distinct findings, each carrying severity, category,
22
- file, line, title, and detail keys.
23
-
24
- Returns:
25
- A newline-joined numbered list, or a sentence stating every lens was clean.
26
- """
27
- if not findings:
28
- return SUMMARY_FINDINGS_EMPTY_TEXT
29
- numbered_lines: list[str] = []
30
- for position, each_finding in enumerate(findings):
31
- detail = str(each_finding.get("detail", ""))[:SUMMARY_DETAIL_MAX_CHARS]
32
- numbered_lines.append(
33
- SUMMARY_FINDING_LINE_TEMPLATE.format(
34
- number=position + 1,
35
- severity=each_finding.get("severity", ""),
36
- category=each_finding.get("category", ""),
37
- file=each_finding.get("file", ""),
38
- line=each_finding.get("line", 0),
39
- title=each_finding.get("title", ""),
40
- detail=detail,
41
- )
42
- )
43
- return "\n".join(numbered_lines)
44
-
45
-
46
- def _format_fix_block(fix_summaries: list[str]) -> str:
47
- """Return the numbered per-round fix-summary block, or 'none' when empty.
48
-
49
- Args:
50
- fix_summaries: One-line fix summaries collected across every round.
51
-
52
- Returns:
53
- A newline-joined numbered list, or the empty-state literal.
54
- """
55
- if not fix_summaries:
56
- return SUMMARY_FIX_EMPTY_TEXT
57
- return "\n".join(
58
- SUMMARY_FIX_LINE_TEMPLATE.format(number=position + 1, summary=each_summary)
59
- for position, each_summary in enumerate(fix_summaries)
60
- )
61
-
62
-
63
- def build_summary_prompt(
64
- owner: str,
65
- repo: str,
66
- pr_number: int,
67
- round_count: int,
68
- findings: list[dict],
69
- fix_summaries: list[str],
70
- standards_note: str | None,
71
- copilot_note: str | None,
72
- ) -> str:
73
- """Return the convergence-summary agent prompt for a PR's aggregated findings.
74
-
75
- Args:
76
- owner: The PR's repository owner.
77
- repo: The PR's repository name.
78
- pr_number: The PR number.
79
- round_count: Total converge rounds across every run aggregated.
80
- findings: Aggregated distinct findings across every run.
81
- fix_summaries: One-line fix summaries collected across every run.
82
- standards_note: Deferral note when a round was code-standard-only, else None.
83
- copilot_note: Outage note when the Copilot gate was bypassed, else None.
84
-
85
- Returns:
86
- The full agent prompt instructing a plain-JSON convergence summary.
87
- """
88
- pr_url = GITHUB_PR_URL_TEMPLATE.format(owner=owner, repo=repo, number=pr_number)
89
- pr_coordinates = SUMMARY_PR_COORDINATES_TEMPLATE.format(
90
- owner=owner, repo=repo, pr_number=pr_number, url=pr_url
91
- )
92
- standards_block = (
93
- SUMMARY_STANDARDS_NOTE_TEMPLATE.format(note=standards_note)
94
- if standards_note
95
- else ""
96
- )
97
- copilot_block = (
98
- SUMMARY_COPILOT_NOTE_TEMPLATE.format(note=copilot_note) if copilot_note else ""
99
- )
100
- return SUMMARY_PROMPT_TEMPLATE.format(
101
- pr_coordinates=pr_coordinates,
102
- owner=owner,
103
- repo=repo,
104
- pr_number=pr_number,
105
- round_count=round_count,
106
- findings_block=_format_findings_block(findings),
107
- fix_block=_format_fix_block(fix_summaries),
108
- standards_block=standards_block,
109
- copilot_block=copilot_block,
110
- )
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a11d903476b803493-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a11d903476b803493-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a11d903476b803493", "name": "StructuredOutput", "input": {"sha": "7c2f420c4d5b7c83aa47f93d99a0f1420e3373c4", "clean": false, "findings": [{"file": "src/exports/core/export_runner.py", "line": 96, "severity": "P2", "title": "New inline log string literal flagged by Magic-values rule", "detail": "Copilot (CodingGuidelineID 1000000, \"Magic values & configuration\"): the new log message at this line introduces a new string literal in production code. Prefer reusing an existing configured UI message (e.g. web_editor_config.ui_messages.msg_detected_version) instead of adding a new inline literal.", "replyToCommentId": 3407912224}, {"file": "src/web/services/os_generation_ssot.py", "line": 265, "severity": "P2", "title": "New inline warning string literal flagged by Magic-values rule", "detail": "Copilot (CodingGuidelineID 1000000, \"Magic values & configuration\"): read_current_version_name_or_none() adds a new inline warning string in production code. Per repo convention, extract this message into a shared config constant (in src/shared/web_automation/config/) so future callers reuse it consistently.", "replyToCommentId": 3407912234}], "blocker": null}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a26213978adeef6fb-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a26213978adeef6fb-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a26213978adeef6fb", "name": "StructuredOutput", "input": {"newSha": "620382f766c4731ba92eefeb30bdbb9d0bcd4c90", "pushed": true, "resolvedWithoutCommit": false, "summary": "Fixed all 11 Copilot findings in one commit (620382f7): renamed banned `result` to `skip_path` in test_resume_skip_export.py and added `-> None` return annotations to the test functions across test_resume_skip_export.py, test_stp_path_selection.py, test_version_export_guards.py, and test_import_isolation.py; all 9 affected tests pass; pushed to fix/example-feature, posted 11 inline replies, and all 11 review threads are resolved."}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a3def0d15ed9d9110-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a3def0d15ed9d9110-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a3def0d15ed9d9110", "name": "StructuredOutput", "input": {"sha": "6a5169ef635ddb841e6f0465a309691ff77f033e", "clean": false, "blocker": null, "findings": [{"file": "src/exports/tests/test_resume_skip_export.py", "line": 35, "severity": "P2", "title": "Banned identifier `result` in test", "detail": "Naming guideline (CodingGuidelineID 1000000): newly introduced identifier `result` is banned; rename to a descriptive name such as `existing_apk_path` or `skip_path`.", "replyToCommentId": 3407883689}, {"file": "src/exports/tests/test_resume_skip_export.py", "line": 47, "severity": "P2", "title": "Banned identifier `result` in test", "detail": "Naming guideline (CodingGuidelineID 1000000): newly introduced identifier `result` is banned; rename to a descriptive name such as `existing_apk_path` or `skip_path`.", "replyToCommentId": 3407883707}, {"file": "src/logging/tests/test_import_isolation.py", "line": 33, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883713}, {"file": "src/logging/tests/test_import_isolation.py", "line": 43, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883717}, {"file": "src/exports/tests/test_version_export_guards.py", "line": 37, "severity": "P2", "title": "Missing return type annotation on async test", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added async test is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883723}, {"file": "src/exports/tests/test_version_export_guards.py", "line": 74, "severity": "P2", "title": "Missing return type annotation on async test", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added async test is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883727}, {"file": "src/exports/tests/test_stp_path_selection.py", "line": 19, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883731}, {"file": "src/exports/tests/test_stp_path_selection.py", "line": 31, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883736}, {"file": "src/exports/tests/test_stp_path_selection.py", "line": 43, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883740}, {"file": "src/exports/tests/test_resume_skip_export.py", "line": 21, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883749}, {"file": "src/exports/tests/test_resume_skip_export.py", "line": 38, "severity": "P2", "title": "Missing return type annotation on test function", "detail": "Repository guideline (CodingGuidelineID 1000000 \u2014 Types): newly added test function is missing an explicit return type annotation. Add `-> None`.", "replyToCommentId": 3407883755}]}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a41f41b1b708ee3b7-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a41f41b1b708ee3b7-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a41f41b1b708ee3b7", "name": "StructuredOutput", "input": {"sha": "7c2f420c4d5b7c83aa47f93d99a0f1420e3373c4", "clean": true, "findings": [], "blocker": null}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a758b880abecc3ff7-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a758b880abecc3ff7-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a758b880abecc3ff7", "name": "StructuredOutput", "input": {"newSha": "7c2f420c4d5b7c83aa47f93d99a0f1420e3373c4", "pushed": false, "resolvedWithoutCommit": true, "summary": "Both Copilot magic-value findings were already fixed at HEAD 7c2f420c (export_runner.py uses web_editor_config.ui_messages.msg_detected_version; os_generation_ssot.py uses os_generation_ssot_constants.unavailable_warning_template); posted inline replies and resolved both review threads (PRRT_kwDORiaSZc6JUqSw, PRRT_kwDORiaSZc6JUqS6)."}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "a8897b89656b1bd16-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "a8897b89656b1bd16-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_a8897b89656b1bd16", "name": "StructuredOutput", "input": {"newSha": "7c2f420c4d5b7c83aa47f93d99a0f1420e3373c4", "pushed": true, "resolvedWithoutCommit": false, "summary": "Fixed both Copilot magic-value findings on PR #211: export_runner.py now reuses web_editor_config.ui_messages.msg_detected_version, and os_generation_ssot.py references a new os_generation_ssot_constants.unavailable_warning_template. Added a behavioral TDD test, committed (7c2f420c) and pushed; posted inline replies to both comments (3407912224, 3407912234) and resolved both review threads (PRRT_kwDORiaSZc6JUqSw, PRRT_kwDORiaSZc6JUqS6)."}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "ab1c2d3e4f5a6b7c8-u", "message": {"role": "user", "content": "Return the convergence summary."}}
2
- {"type": "assistant", "uuid": "ab1c2d3e4f5a6b7c8-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_ab1c2d3e4f5a6b7c8", "name": "StructuredOutput", "input": {"prProblem": "DataBridge, the service that exports your records in batches, restarted an interrupted export from the beginning instead of continuing.", "prFix": "An interrupted export now resumes from the last finished batch.", "problemScenes": [{"trigger": "export stops at batch 90 of 100", "condition": "you restart it", "result": "starts again at batch 1", "caption": "A halted export threw away the 90 batches it had already finished and began again."}], "fixScenes": [{"trigger": "export stops at batch 90 of 100", "condition": "you restart it", "result": "continues at batch 91", "caption": "A restarted export now picks up at the next unfinished batch."}], "verdictLine": "Converged in 4 rounds; 3 distinct issue classes were caught and fixed.", "issueClasses": [{"plainName": "Tests did not declare their return type", "count": 7, "severity": "P2", "category": "code-standard", "status": "fixed", "cause": "Several new test functions did not state that they return nothing, which the project's type checker wants.", "medium": "code", "beforeLines": ["def test_resume_skip():", " ..."], "afterLines": ["def test_resume_skip() -> None:", " ..."]}, {"plainName": "A vague banned variable name", "count": 2, "severity": "P2", "category": "code-standard", "status": "fixed", "cause": "Two variables used a generic placeholder name the project bans.", "medium": "code", "beforeLines": ["result = fetch()"], "afterLines": ["exported_rows = fetch()"]}, {"plainName": "Hardcoded message strings", "count": 6, "severity": "P2", "category": "code-standard", "status": "fixed", "cause": "Warning text was written inline in code instead of shared configuration.", "medium": "text", "beforeLines": ["inline warning text"], "afterLines": ["shared config message"]}]}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "abd463d744a1437bc-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "abd463d744a1437bc-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_abd463d744a1437bc", "name": "StructuredOutput", "input": {"sha": "6a5169ef635ddb841e6f0465a309691ff77f033e", "clean": true, "down": false, "findings": []}}]}}
@@ -1,2 +0,0 @@
1
- {"type": "user", "uuid": "ad19d027ae8ee1816-u", "message": {"role": "user", "content": "Return the structured result."}}
2
- {"type": "assistant", "uuid": "ad19d027ae8ee1816-a", "message": {"role": "assistant", "content": [{"type": "tool_use", "id": "toolu_ad19d027ae8ee1816", "name": "StructuredOutput", "input": {"sha": "620382f766c4731ba92eefeb30bdbb9d0bcd4c90", "clean": false, "findings": [{"file": "src/exports/core/export_runner.py", "line": 94, "severity": "P2", "title": "New inline log string literal in production code", "detail": "Copilot (CodingGuidelineID 1000000, Magic values & configuration): the new log message at this line introduces a new string literal in production code. Prefer reusing an existing configured UI message (e.g., web_editor_config.ui_messages.msg_detected_version) instead of adding a new inline literal here.", "replyToCommentId": 3407912224}, {"file": "src/web/services/os_generation_ssot.py", "line": 266, "severity": "P2", "title": "New inline warning string literal in read_current_version_name_or_none()", "detail": "Copilot (CodingGuidelineID 1000000, Magic values & configuration): read_current_version_name_or_none() adds a new inline warning string in production code. Per repo convention, extract this message into a shared config constant (in src/shared/web_automation/config/) so future callers reuse it consistently.", "replyToCommentId": 3407912234}], "blocker": null}}]}}