amicus 0.1.0__tar.gz → 0.3.0__tar.gz

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 (468) hide show
  1. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/SKILL.md +6 -2
  2. {amicus-0.1.0 → amicus-0.3.0}/.claude-plugin/plugin.json +3 -3
  3. {amicus-0.1.0 → amicus-0.3.0}/.codex-plugin/plugin.json +3 -3
  4. amicus-0.3.0/.github/copilot-instructions.md +42 -0
  5. {amicus-0.1.0 → amicus-0.3.0}/.github/workflows/publish.yml +2 -2
  6. {amicus-0.1.0 → amicus-0.3.0}/.github/workflows/test.yml +1 -1
  7. {amicus-0.1.0 → amicus-0.3.0}/.mcp.json +1 -1
  8. {amicus-0.1.0 → amicus-0.3.0}/AGENTS.md +17 -8
  9. amicus-0.3.0/CHANGELOG.md +538 -0
  10. {amicus-0.1.0 → amicus-0.3.0}/PKG-INFO +30 -11
  11. {amicus-0.1.0 → amicus-0.3.0}/README.md +28 -9
  12. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/adversarial.md +4 -3
  13. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/consult.md +4 -3
  14. amicus-0.3.0/commands/amicus/delegate-async.md +36 -0
  15. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/delegate.md +4 -4
  16. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/dry-run.md +1 -1
  17. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/jobs.md +12 -2
  18. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/review.md +5 -4
  19. {amicus-0.1.0 → amicus-0.3.0}/commands/amicus/status.md +3 -1
  20. {amicus-0.1.0 → amicus-0.3.0}/docs/MIGRATION.md +89 -7
  21. {amicus-0.1.0 → amicus-0.3.0}/docs/RELEASING.md +40 -6
  22. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0002-backend-options-is-a-closed-superset.md +2 -1
  23. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0004-tasks-and-jobs.md +1 -0
  24. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0006-fingerprint-and-surface-digest.md +4 -1
  25. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0007-m1-codex-port-decisions.md +3 -1
  26. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0008-m2-jobs-surface-decisions.md +4 -2
  27. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0011-m5-tasks-decisions.md +1 -0
  28. amicus-0.3.0/docs/adr/0015-mcp-json-pins-an-already-published-release.md +104 -0
  29. amicus-0.3.0/docs/adr/0016-skill-rules-are-a-complete-contract.md +75 -0
  30. amicus-0.3.0/docs/adr/0017-an-unreadable-machine-enum-falls-to-its-own-floor.md +71 -0
  31. amicus-0.3.0/docs/adr/0018-the-catalog-carries-a-ttl-and-resource-reads-do-not.md +94 -0
  32. amicus-0.3.0/docs/adr/0019-review-results-disclose-coverage-as-a-field.md +60 -0
  33. amicus-0.3.0/docs/adr/0020-idempotency-keys-on-the-sync-tools.md +70 -0
  34. amicus-0.3.0/docs/adr/0021-repair-arguments-are-a-complete-call.md +53 -0
  35. amicus-0.3.0/docs/adr/0022-consume-reports-its-discard-outcome.md +70 -0
  36. amicus-0.3.0/docs/adr/0023-dependency-loggers-are-owned-at-a-warning-floor.md +61 -0
  37. amicus-0.3.0/docs/adr/0024-prose-list-loss-is-disclosed-never-folded.md +70 -0
  38. amicus-0.3.0/docs/adr/0025-success-meta-is-sparse-on-every-tool.md +46 -0
  39. amicus-0.3.0/docs/adr/0026-a-not-run-review-carries-no-confidence-rating.md +45 -0
  40. amicus-0.3.0/docs/adr/0027-every-instructions-rule-fits-the-shown-prefix.md +61 -0
  41. amicus-0.3.0/docs/adr/0028-a-deprecated-tool-keeps-its-record-beside-one-marker.md +65 -0
  42. amicus-0.3.0/docs/kimi-help/0.42.0/FINDINGS.md +25 -0
  43. amicus-0.3.0/docs/kimi-help/0.42.0/kimi-help.txt +50 -0
  44. amicus-0.3.0/docs/kimi-help/0.42.0/kimi-version.txt +1 -0
  45. amicus-0.3.0/docs/kimi-help/0.42.0/provider-list-shape.json +18 -0
  46. amicus-0.3.0/docs/kimi-help/0.43.1/FINDINGS.md +35 -0
  47. amicus-0.3.0/docs/kimi-help/0.43.1/kimi-help.txt +50 -0
  48. amicus-0.3.0/docs/kimi-help/0.43.1/kimi-version.txt +1 -0
  49. amicus-0.3.0/docs/kimi-help/0.43.1/provider-list-shape.json +18 -0
  50. {amicus-0.1.0 → amicus-0.3.0}/docs/superpowers/specs/2026-09-04-amicus-design.md +24 -24
  51. {amicus-0.1.0 → amicus-0.3.0}/pyproject.toml +8 -2
  52. amicus-0.3.0/scripts/check_release_state.py +712 -0
  53. amicus-0.3.0/skills/collaborating-with-amicus/SKILL.md +289 -0
  54. amicus-0.3.0/skills/collaborating-with-amicus/references/active-workflows.md +119 -0
  55. amicus-0.3.0/skills/collaborating-with-amicus/references/choosing-a-backend.md +124 -0
  56. amicus-0.3.0/skills/collaborating-with-amicus/references/independent-attempt.md +108 -0
  57. amicus-0.3.0/skills/collaborating-with-amicus/references/options-and-errors.md +102 -0
  58. amicus-0.3.0/skills/collaborating-with-amicus/references/reading-results.md +203 -0
  59. amicus-0.3.0/skills/collaborating-with-amicus/references/review-revise.md +70 -0
  60. amicus-0.3.0/skills/collaborating-with-amicus/references/reviewing-a-returned-diff.md +119 -0
  61. amicus-0.3.0/skills/collaborating-with-amicus/references/server-down-fallback.md +104 -0
  62. amicus-0.3.0/skills/collaborating-with-amicus/references/sync-vs-async.md +94 -0
  63. {amicus-0.1.0 → amicus-0.3.0}/skills/collaborating-with-amicus/tests/scenarios.md +277 -24
  64. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/__init__.py +1 -1
  65. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/_worker.py +2 -2
  66. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/adapter.py +13 -3
  67. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/adversarial.py +11 -0
  68. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/config.py +3 -1
  69. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/contract.py +11 -4
  70. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/options.py +19 -2
  71. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/contract.py +10 -7
  72. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/normalize.py +6 -8
  73. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/contract.py +4 -4
  74. amicus-0.3.0/src/amicus/compaction.py +53 -0
  75. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/config/__init__.py +3 -0
  76. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/config/envspec.py +6 -1
  77. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/errors.py +68 -15
  78. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/jobs/delivery.py +47 -21
  79. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/jobs/lifecycle.py +236 -45
  80. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/jobs/lookup.py +5 -2
  81. amicus-0.3.0/src/amicus/jobs/polling.py +36 -0
  82. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/jobs/taskmap.py +5 -0
  83. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/manifest.py +160 -9
  84. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/middleware.py +61 -3
  85. amicus-0.3.0/src/amicus/obs.py +512 -0
  86. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/finalize.py +166 -33
  87. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/review.py +100 -20
  88. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/run.py +20 -15
  89. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/workspace.py +5 -1
  90. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/plugin.py +3 -1
  91. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/result_format_snapshot.py +8 -0
  92. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/envelope.py +116 -8
  93. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/fingerprint.py +11 -2
  94. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/params.py +127 -57
  95. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/publish.py +7 -10
  96. amicus-0.3.0/src/amicus/schemas/results.py +737 -0
  97. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/structured.py +19 -2
  98. amicus-0.3.0/src/amicus/server.py +305 -0
  99. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/__init__.py +5 -1
  100. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/_guard.py +17 -8
  101. amicus-0.3.0/src/amicus/tools/_meta.py +114 -0
  102. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/_prepare.py +8 -7
  103. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/consult.py +6 -2
  104. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/delegate.py +7 -3
  105. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/discovery.py +93 -36
  106. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/dry_run.py +83 -16
  107. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/jobs.py +27 -15
  108. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/resources.py +77 -30
  109. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/review.py +13 -5
  110. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/wire_shape_snapshot.py +46 -9
  111. {amicus-0.1.0 → amicus-0.3.0}/tests/conftest.py +77 -2
  112. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/manifest_snapshot.all.json +2170 -559
  113. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/manifest_snapshot.claude.json +2170 -559
  114. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/manifest_snapshot.codex-kimi.json +2170 -559
  115. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/result_format_snapshot.json +1244 -26
  116. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/wire_shape_snapshot.json +115 -72
  117. {amicus-0.1.0 → amicus-0.3.0}/tests/support/claudefixtures.py +15 -0
  118. {amicus-0.1.0 → amicus-0.3.0}/tests/test_adversarial.py +21 -1
  119. {amicus-0.1.0 → amicus-0.3.0}/tests/test_async_tools.py +2 -2
  120. amicus-0.3.0/tests/test_cache_hints.py +197 -0
  121. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_adapter.py +36 -12
  122. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_cli.py +11 -0
  123. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_contract.py +1 -1
  124. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_golden_envelope.py +12 -4
  125. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_live.py +66 -5
  126. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_plugin.py +16 -1
  127. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_sync_tools.py +103 -4
  128. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codes.py +2 -2
  129. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_adapter.py +10 -0
  130. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_config.py +2 -1
  131. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_contract.py +12 -2
  132. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_normalize.py +8 -0
  133. {amicus-0.1.0 → amicus-0.3.0}/tests/test_commands.py +57 -4
  134. amicus-0.3.0/tests/test_compaction.py +154 -0
  135. {amicus-0.1.0 → amicus-0.3.0}/tests/test_delivery.py +98 -2
  136. {amicus-0.1.0 → amicus-0.3.0}/tests/test_discovery.py +158 -16
  137. amicus-0.3.0/tests/test_discovery_cost.py +191 -0
  138. amicus-0.3.0/tests/test_dry_run.py +304 -0
  139. {amicus-0.1.0 → amicus-0.3.0}/tests/test_envelope.py +45 -0
  140. {amicus-0.1.0 → amicus-0.3.0}/tests/test_errors.py +108 -0
  141. amicus-0.3.0/tests/test_fastmcp_argument_log.py +448 -0
  142. amicus-0.3.0/tests/test_finalize.py +743 -0
  143. {amicus-0.1.0 → amicus-0.3.0}/tests/test_fingerprint.py +3 -3
  144. {amicus-0.1.0 → amicus-0.3.0}/tests/test_guard.py +23 -0
  145. {amicus-0.1.0 → amicus-0.3.0}/tests/test_job_tools.py +243 -11
  146. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_contract.py +61 -12
  147. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_live.py +6 -1
  148. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_sync_tools.py +4 -2
  149. {amicus-0.1.0 → amicus-0.3.0}/tests/test_lifecycle.py +520 -4
  150. amicus-0.3.0/tests/test_log_redaction.py +579 -0
  151. {amicus-0.1.0 → amicus-0.3.0}/tests/test_lookup.py +18 -1
  152. amicus-0.3.0/tests/test_manifest.py +386 -0
  153. amicus-0.3.0/tests/test_meta.py +138 -0
  154. {amicus-0.1.0 → amicus-0.3.0}/tests/test_middleware.py +75 -1
  155. {amicus-0.1.0 → amicus-0.3.0}/tests/test_migration_doc.py +54 -0
  156. {amicus-0.1.0 → amicus-0.3.0}/tests/test_packaging.py +64 -14
  157. {amicus-0.1.0 → amicus-0.3.0}/tests/test_paid_tools.py +47 -1
  158. {amicus-0.1.0 → amicus-0.3.0}/tests/test_params.py +35 -1
  159. amicus-0.3.0/tests/test_poll_hint.py +38 -0
  160. {amicus-0.1.0 → amicus-0.3.0}/tests/test_prepare.py +9 -0
  161. amicus-0.3.0/tests/test_release_state.py +887 -0
  162. {amicus-0.1.0 → amicus-0.3.0}/tests/test_resources.py +22 -6
  163. amicus-0.3.0/tests/test_results.py +265 -0
  164. {amicus-0.1.0 → amicus-0.3.0}/tests/test_review.py +86 -9
  165. {amicus-0.1.0 → amicus-0.3.0}/tests/test_server.py +94 -14
  166. amicus-0.3.0/tests/test_skill_contract.py +360 -0
  167. amicus-0.3.0/tests/test_structured.py +44 -0
  168. amicus-0.3.0/tests/test_surface_honesty.py +326 -0
  169. {amicus-0.1.0 → amicus-0.3.0}/tests/test_sync_tools.py +95 -0
  170. {amicus-0.1.0 → amicus-0.3.0}/tests/test_tasks_client.py +7 -1
  171. {amicus-0.1.0 → amicus-0.3.0}/tests/test_wire_shape.py +32 -1
  172. {amicus-0.1.0 → amicus-0.3.0}/tests/test_worker.py +11 -9
  173. {amicus-0.1.0 → amicus-0.3.0}/tests/test_workspace.py +5 -0
  174. {amicus-0.1.0 → amicus-0.3.0}/uv.lock +420 -53
  175. amicus-0.1.0/CHANGELOG.md +0 -33
  176. amicus-0.1.0/scripts/check_release_state.py +0 -359
  177. amicus-0.1.0/skills/collaborating-with-amicus/SKILL.md +0 -137
  178. amicus-0.1.0/skills/collaborating-with-amicus/references/choosing-a-backend.md +0 -51
  179. amicus-0.1.0/skills/collaborating-with-amicus/references/reviewing-a-returned-diff.md +0 -61
  180. amicus-0.1.0/skills/collaborating-with-amicus/references/sync-vs-async.md +0 -55
  181. amicus-0.1.0/src/amicus/obs.py +0 -51
  182. amicus-0.1.0/src/amicus/schemas/results.py +0 -392
  183. amicus-0.1.0/src/amicus/server.py +0 -227
  184. amicus-0.1.0/src/amicus/tools/_meta.py +0 -70
  185. amicus-0.1.0/tests/test_discovery_cost.py +0 -50
  186. amicus-0.1.0/tests/test_dry_run.py +0 -127
  187. amicus-0.1.0/tests/test_finalize.py +0 -193
  188. amicus-0.1.0/tests/test_manifest.py +0 -193
  189. amicus-0.1.0/tests/test_meta.py +0 -53
  190. amicus-0.1.0/tests/test_release_state.py +0 -452
  191. amicus-0.1.0/tests/test_results.py +0 -128
  192. amicus-0.1.0/tests/test_structured.py +0 -10
  193. amicus-0.1.0/tests/test_surface_honesty.py +0 -44
  194. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/SKILL.md +0 -0
  195. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/references/design-workflow.md +0 -0
  196. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/references/docs-checklist.md +0 -0
  197. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/references/examples.md +0 -0
  198. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/references/review-workflow.md +0 -0
  199. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-docs/tests/scenarios.md +0 -0
  200. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/SKILL.md +0 -0
  201. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/decisions/001-github-fact-sheet.md +0 -0
  202. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/audit-workflow.md +0 -0
  203. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/config-checklist.md +0 -0
  204. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/README.md +0 -0
  205. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/codeowners.md +0 -0
  206. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/harness-deny.md +0 -0
  207. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/identity.md +0 -0
  208. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/repo-files.md +0 -0
  209. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/required-checks.md +0 -0
  210. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/rulesets.md +0 -0
  211. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/examples/workflows.md +0 -0
  212. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/operating-playbook.md +0 -0
  213. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/setup-workflow.md +0 -0
  214. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/references/threat-model.md +0 -0
  215. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/tests/check_authority.py +0 -0
  216. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-github/tests/scenarios.md +0 -0
  217. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/SKILL.md +0 -0
  218. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/decisions/001-mcp-2026-07-28-rebase.md +0 -0
  219. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/decisions/002-machine-code-rename-rationale.md +0 -0
  220. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/decisions/003-offending-value-omission.md +0 -0
  221. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/decisions/004-ownership-boundaries.md +0 -0
  222. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/contract-checklist.md +0 -0
  223. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/design-workflow.md +0 -0
  224. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/examples.md +0 -0
  225. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/mcp-2025-11-25-compat.md +0 -0
  226. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/mcp-vs-cli.md +0 -0
  227. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/native-wire-shapes.md +0 -0
  228. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/review-workflow.md +0 -0
  229. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/references/vocabulary.md +0 -0
  230. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/check_fact_sync.py +0 -0
  231. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/check_rule_ids.py +0 -0
  232. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/check_stale_terms.py +0 -0
  233. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/fixtures/github_issues.json +0 -0
  234. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/fixtures/github_repo_resource.json +0 -0
  235. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/rule-ids.txt +0 -0
  236. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-baseline.md +0 -0
  237. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-outputschema-error.md +0 -0
  238. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-with-skill.md +0 -0
  239. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario2-baseline.md +0 -0
  240. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario2-with-skill.md +0 -0
  241. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario3-baseline.md +0 -0
  242. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario3-with-skill.md +0 -0
  243. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario4-baseline.md +0 -0
  244. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario4-with-skill.md +0 -0
  245. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario5-baseline.md +0 -0
  246. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario5-with-skill.md +0 -0
  247. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario6-baseline.md +0 -0
  248. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario6-with-skill.md +0 -0
  249. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario7-trigger.md +0 -0
  250. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario1-baseline.md +0 -0
  251. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario1-with-skill.md +0 -0
  252. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario3-baseline.md +0 -0
  253. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario3-with-skill.md +0 -0
  254. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario5-baseline.md +0 -0
  255. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario5-with-skill.md +0 -0
  256. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-30-scenario1-with-skill.md +0 -0
  257. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-30-scenario8-severity-calibration.md +0 -0
  258. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/scenarios.md +0 -0
  259. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/test_check_fact_sync.py +0 -0
  260. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/test_check_rule_ids.py +0 -0
  261. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/test_validate_fixture.py +0 -0
  262. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/agent-friendly-mcp/tests/validate_fixture.py +0 -0
  263. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/agents/openai.yaml +0 -0
  264. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/references/example-audit.md +0 -0
  265. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/rescore-2026-08-06/preregistration.md +0 -0
  266. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/rescore-2026-08-06/results.md +0 -0
  267. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario1-baseline.md +0 -0
  268. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario1-with-skill.md +0 -0
  269. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario2-baseline.md +0 -0
  270. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario2-with-skill.md +0 -0
  271. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario3-baseline.md +0 -0
  272. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario3-with-skill.md +0 -0
  273. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario4-baseline.md +0 -0
  274. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario4-with-skill.md +0 -0
  275. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario5-baseline.md +0 -0
  276. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario5-with-skill.md +0 -0
  277. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario6-baseline.md +0 -0
  278. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario6-with-skill.md +0 -0
  279. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario7-baseline.md +0 -0
  280. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario7-with-skill.md +0 -0
  281. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario8-baseline.md +0 -0
  282. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario8-with-skill.md +0 -0
  283. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario9-trigger.md +0 -0
  284. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-06-scenario1-with-skill.md +0 -0
  285. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-06-scenario6-with-skill.md +0 -0
  286. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-confirmation-r1-both-directions.md +0 -0
  287. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario1-with-skill.md +0 -0
  288. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario2-with-skill.md +0 -0
  289. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario5-with-skill.md +0 -0
  290. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario6-with-skill.md +0 -0
  291. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario7-with-skill.md +0 -0
  292. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario8-with-skill.md +0 -0
  293. {amicus-0.1.0 → amicus-0.3.0}/.agents/skills/separating-context-from-constraints/tests/scenarios.md +0 -0
  294. {amicus-0.1.0 → amicus-0.3.0}/.claude-plugin/marketplace.json +0 -0
  295. {amicus-0.1.0 → amicus-0.3.0}/.gitattributes +0 -0
  296. {amicus-0.1.0 → amicus-0.3.0}/.github/CODEOWNERS +0 -0
  297. {amicus-0.1.0 → amicus-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  298. {amicus-0.1.0 → amicus-0.3.0}/.github/dependabot.yml +0 -0
  299. {amicus-0.1.0 → amicus-0.3.0}/.github/workflows/ci.yml +0 -0
  300. {amicus-0.1.0 → amicus-0.3.0}/.github/workflows/codeql.yml +0 -0
  301. {amicus-0.1.0 → amicus-0.3.0}/.github/workflows/dependency-review.yml +0 -0
  302. {amicus-0.1.0 → amicus-0.3.0}/.gitignore +0 -0
  303. {amicus-0.1.0 → amicus-0.3.0}/CLAUDE.md +0 -0
  304. {amicus-0.1.0 → amicus-0.3.0}/LICENSE +0 -0
  305. {amicus-0.1.0 → amicus-0.3.0}/docs/2026-09-04-naming-and-scoping-notes.md +0 -0
  306. {amicus-0.1.0 → amicus-0.3.0}/docs/DEPRECATING-SIBLINGS.md +0 -0
  307. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0001-annotations-follow-the-worst-enabled-backend.md +0 -0
  308. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0003-workspace-resolution.md +0 -0
  309. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0005-error-envelope-and-repair-precedence.md +0 -0
  310. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0009-m3-kimi-port-decisions.md +0 -0
  311. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0010-m4-claude-port-decisions.md +0 -0
  312. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0012-m6-packaging-decisions.md +0 -0
  313. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0013-proceed-without-trademark-clearance.md +0 -0
  314. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/0014-release-predicate-on-the-tag.md +0 -0
  315. {amicus-0.1.0 → amicus-0.3.0}/docs/adr/README.md +0 -0
  316. {amicus-0.1.0 → amicus-0.3.0}/docs/claude-help/2.1.263/FINDINGS.md +0 -0
  317. {amicus-0.1.0 → amicus-0.3.0}/docs/claude-help/2.1.263/claude-help.txt +0 -0
  318. {amicus-0.1.0 → amicus-0.3.0}/docs/claude-help/2.1.263/claude-version.txt +0 -0
  319. {amicus-0.1.0 → amicus-0.3.0}/docs/claude-help/2.1.263/envelope-shape.json +0 -0
  320. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/claude-code/2.1.263/FINDINGS.md +0 -0
  321. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/claude-code/2.1.263/connection.log +0 -0
  322. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/claude-code/2.1.263/host-output.json +0 -0
  323. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/codex/0.153.4/FINDINGS.md +0 -0
  324. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/codex/0.153.4/connection.log +0 -0
  325. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/codex/0.153.4/host-output.jsonl +0 -0
  326. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/notes.md +0 -0
  327. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/server.log +0 -0
  328. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/transcript.md +0 -0
  329. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/claude-code/2.1.263/notes.md +0 -0
  330. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/claude-code/2.1.263/server.log +0 -0
  331. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/claude-code/2.1.263/transcript.md +0 -0
  332. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/codex/0.153.4/notes.md +0 -0
  333. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/codex/0.153.4/server.log +0 -0
  334. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/install-smoke/codex/0.153.4/transcript.md +0 -0
  335. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/notes.md +0 -0
  336. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/server.log +0 -0
  337. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/transcript.md +0 -0
  338. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/notes.md +0 -0
  339. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/server.log +0 -0
  340. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/transcript.md +0 -0
  341. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/notes.md +0 -0
  342. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/server.log +0 -0
  343. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/transcript.md +0 -0
  344. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/notes.md +0 -0
  345. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/server.log +0 -0
  346. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/transcript.md +0 -0
  347. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/notes.md +0 -0
  348. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/server.log +0 -0
  349. {amicus-0.1.0 → amicus-0.3.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/transcript.md +0 -0
  350. {amicus-0.1.0 → amicus-0.3.0}/docs/kimi-help/0.41.0/FINDINGS.md +0 -0
  351. {amicus-0.1.0 → amicus-0.3.0}/docs/kimi-help/0.41.0/kimi-help.txt +0 -0
  352. {amicus-0.1.0 → amicus-0.3.0}/docs/kimi-help/0.41.0/kimi-version.txt +0 -0
  353. {amicus-0.1.0 → amicus-0.3.0}/docs/kimi-help/0.41.0/provider-list-shape.json +0 -0
  354. {amicus-0.1.0 → amicus-0.3.0}/docs/reviews/2026-09-07-agent-friendly-mcp-walk.md +0 -0
  355. {amicus-0.1.0 → amicus-0.3.0}/docs/superpowers/plans/2026-09-04-amicus-execution-model.md +0 -0
  356. {amicus-0.1.0 → amicus-0.3.0}/prek.toml +0 -0
  357. {amicus-0.1.0 → amicus-0.3.0}/scripts/capture_claude_differentials.py +0 -0
  358. {amicus-0.1.0 → amicus-0.3.0}/scripts/capture_codex_differentials.py +0 -0
  359. {amicus-0.1.0 → amicus-0.3.0}/scripts/capture_kimi_differentials.py +0 -0
  360. {amicus-0.1.0 → amicus-0.3.0}/scripts/check_commit_message.py +0 -0
  361. {amicus-0.1.0 → amicus-0.3.0}/scripts/check_github_actions_pinning.py +0 -0
  362. {amicus-0.1.0 → amicus-0.3.0}/scripts/record_live_gate_evidence.py +0 -0
  363. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/appstate.py +0 -0
  364. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/__init__.py +0 -0
  365. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/__init__.py +0 -0
  366. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/binary.py +0 -0
  367. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/cli.py +0 -0
  368. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/models.py +0 -0
  369. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/normalize.py +0 -0
  370. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/claude/status.py +0 -0
  371. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/__init__.py +0 -0
  372. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/adapter.py +0 -0
  373. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/binary.py +0 -0
  374. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/cli.py +0 -0
  375. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/config.py +0 -0
  376. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/models.py +0 -0
  377. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/options.py +0 -0
  378. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/codex/status.py +0 -0
  379. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/__init__.py +0 -0
  380. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/adapter.py +0 -0
  381. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/binary.py +0 -0
  382. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/cli.py +0 -0
  383. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/config.py +0 -0
  384. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/models.py +0 -0
  385. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/normalize.py +0 -0
  386. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/options.py +0 -0
  387. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/backends/kimi/status.py +0 -0
  388. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/jobs/__init__.py +0 -0
  389. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/__init__.py +0 -0
  390. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/isolation.py +0 -0
  391. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/orchestration/prompts.py +0 -0
  392. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/packaging.py +0 -0
  393. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/py.typed +0 -0
  394. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/registry.py +0 -0
  395. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/request.py +0 -0
  396. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/__init__.py +0 -0
  397. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/codes.py +0 -0
  398. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/field_policy.py +0 -0
  399. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/instructions.py +0 -0
  400. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/schemas/options.py +0 -0
  401. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/surface.py +0 -0
  402. {amicus-0.1.0 → amicus-0.3.0}/src/amicus/tools/_resolve.py +0 -0
  403. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/claude_differentials.json +0 -0
  404. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/claude_golden_envelope.json +0 -0
  405. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/codex_differentials.json +0 -0
  406. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/fakebackend/pyproject.toml +0 -0
  407. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/fakebackend/src/fakebackend/__init__.py +0 -0
  408. {amicus-0.1.0 → amicus-0.3.0}/tests/fixtures/kimi_differentials.json +0 -0
  409. {amicus-0.1.0 → amicus-0.3.0}/tests/support/__init__.py +0 -0
  410. {amicus-0.1.0 → amicus-0.3.0}/tests/support/codexfixtures.py +0 -0
  411. {amicus-0.1.0 → amicus-0.3.0}/tests/support/fake_claude.py +0 -0
  412. {amicus-0.1.0 → amicus-0.3.0}/tests/support/fake_codex.py +0 -0
  413. {amicus-0.1.0 → amicus-0.3.0}/tests/support/fake_kimi.py +0 -0
  414. {amicus-0.1.0 → amicus-0.3.0}/tests/support/fakeplugin.py +0 -0
  415. {amicus-0.1.0 → amicus-0.3.0}/tests/support/kimifixtures.py +0 -0
  416. {amicus-0.1.0 → amicus-0.3.0}/tests/test_check_commit_message.py +0 -0
  417. {amicus-0.1.0 → amicus-0.3.0}/tests/test_check_github_actions_pinning.py +0 -0
  418. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_argv_differential.py +0 -0
  419. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_binary.py +0 -0
  420. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_config.py +0 -0
  421. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_models.py +0 -0
  422. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_normalize.py +0 -0
  423. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_result_differential.py +0 -0
  424. {amicus-0.1.0 → amicus-0.3.0}/tests/test_claude_status.py +0 -0
  425. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_argv_differential.py +0 -0
  426. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_binary.py +0 -0
  427. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_cli.py +0 -0
  428. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_live.py +0 -0
  429. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_models.py +0 -0
  430. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_plugin.py +0 -0
  431. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_result_differential.py +0 -0
  432. {amicus-0.1.0 → amicus-0.3.0}/tests/test_codex_status.py +0 -0
  433. {amicus-0.1.0 → amicus-0.3.0}/tests/test_config.py +0 -0
  434. {amicus-0.1.0 → amicus-0.3.0}/tests/test_conftest_guards.py +0 -0
  435. {amicus-0.1.0 → amicus-0.3.0}/tests/test_envspec.py +0 -0
  436. {amicus-0.1.0 → amicus-0.3.0}/tests/test_field_policy.py +0 -0
  437. {amicus-0.1.0 → amicus-0.3.0}/tests/test_host_captures.py +0 -0
  438. {amicus-0.1.0 → amicus-0.3.0}/tests/test_import_contracts.py +0 -0
  439. {amicus-0.1.0 → amicus-0.3.0}/tests/test_instructions.py +0 -0
  440. {amicus-0.1.0 → amicus-0.3.0}/tests/test_isolation.py +0 -0
  441. {amicus-0.1.0 → amicus-0.3.0}/tests/test_job_durability.py +0 -0
  442. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_adapter.py +0 -0
  443. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_argv_differential.py +0 -0
  444. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_binary.py +0 -0
  445. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_cli.py +0 -0
  446. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_config.py +0 -0
  447. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_models.py +0 -0
  448. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_normalize.py +0 -0
  449. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_plugin.py +0 -0
  450. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_result_differential.py +0 -0
  451. {amicus-0.1.0 → amicus-0.3.0}/tests/test_kimi_status.py +0 -0
  452. {amicus-0.1.0 → amicus-0.3.0}/tests/test_live_gate_report.py +0 -0
  453. {amicus-0.1.0 → amicus-0.3.0}/tests/test_live_suite_hygiene.py +0 -0
  454. {amicus-0.1.0 → amicus-0.3.0}/tests/test_obs.py +0 -0
  455. {amicus-0.1.0 → amicus-0.3.0}/tests/test_options.py +0 -0
  456. {amicus-0.1.0 → amicus-0.3.0}/tests/test_plugin.py +0 -0
  457. {amicus-0.1.0 → amicus-0.3.0}/tests/test_prompts.py +0 -0
  458. {amicus-0.1.0 → amicus-0.3.0}/tests/test_publish.py +0 -0
  459. {amicus-0.1.0 → amicus-0.3.0}/tests/test_registry.py +0 -0
  460. {amicus-0.1.0 → amicus-0.3.0}/tests/test_release_evidence.py +0 -0
  461. {amicus-0.1.0 → amicus-0.3.0}/tests/test_request.py +0 -0
  462. {amicus-0.1.0 → amicus-0.3.0}/tests/test_result_format.py +0 -0
  463. {amicus-0.1.0 → amicus-0.3.0}/tests/test_review_artifact.py +0 -0
  464. {amicus-0.1.0 → amicus-0.3.0}/tests/test_run.py +0 -0
  465. {amicus-0.1.0 → amicus-0.3.0}/tests/test_surface.py +0 -0
  466. {amicus-0.1.0 → amicus-0.3.0}/tests/test_taskmap.py +0 -0
  467. {amicus-0.1.0 → amicus-0.3.0}/tests/test_tasks_spike.py +0 -0
  468. {amicus-0.1.0 → amicus-0.3.0}/tests/test_wheel_seam.py +0 -0
@@ -1,8 +1,12 @@
1
1
  ---
2
- name: separating-context-from-constraints
3
2
  description: Use when auditing or reviewing a skill, system prompt, CLAUDE.md/AGENTS.md, MCP tool or resource description, slash-command prompt, or any document an AI agent consumes as instructions, to check that binding rules are separated from background context. Symptoms include rules buried mid-paragraph in narrative prose, hedged statements ("generally", "try to") that leave unclear whether they bind, untestable directives like "be concise", compound rules bundling several obligations, rule sections padded with explanation, and agents that follow a document's flavor text but miss its requirements. Produces findings with two-level severity and semantic-preserving suggested rewrites; does not score documents, analyze conflicts with parent instruction layers, or review general prose quality.
3
+ metadata:
4
+ github-path: separating-context-from-constraints
5
+ github-ref: refs/heads/main
6
+ github-repo: https://github.com/briandconnelly/skills
7
+ github-tree-sha: 967a99232de22bc967c12a7aefcf272cfe2fb938
8
+ name: separating-context-from-constraints
4
9
  ---
5
-
6
10
  # Separating Context from Constraints
7
11
 
8
12
  Audit agent-consumed instruction documents — skills, system prompts, CLAUDE.md/AGENTS.md, MCP tool and resource descriptions, slash-command prompts — for separation of binding rules from context.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "One MCP server for every second-opinion model: consult, review, and delegate with the backend as a parameter.",
5
- "author": { "name": "Brian Connelly" },
5
+ "author": { "name": "Brian Connelly", "url": "https://github.com/briandconnelly" },
6
6
  "homepage": "https://github.com/briandconnelly/amicus",
7
7
  "repository": "https://github.com/briandconnelly/amicus",
8
8
  "license": "MIT",
@@ -13,7 +13,7 @@
13
13
  "interface": {
14
14
  "displayName": "amicus",
15
15
  "shortDescription": "Consult, review, and delegate to Codex, Kimi, or Claude — one server, backend as a parameter.",
16
- "longDescription": "amicus gives Claude Code one tool surface for every second-opinion model. Pick the backend as a parameter instead of installing a server per model. Delegation runs in a throwaway git worktree and returns a reviewable diff that is never applied to your working tree. Long jobs run asynchronously with a job id you can poll, cancel, and recover. Enabling a backend that can write makes every tool carry that backend's approval annotations — see docs/MIGRATION.md.",
16
+ "longDescription": "amicus gives Claude Code one tool surface for every second-opinion model. Pick the backend as a parameter instead of installing a server per model. Delegation runs in a throwaway git worktree and returns a reviewable diff that is never applied to your working tree. Long jobs run asynchronously with a job id you can poll, cancel, and recover. Enabling a backend that can write makes every tool carry that backend's approval annotations — see https://github.com/briandconnelly/amicus/blob/main/docs/MIGRATION.md.",
17
17
  "developerName": "Brian Connelly",
18
18
  "category": "Developer Tools",
19
19
  "capabilities": ["MCP", "Skills"],
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "One MCP server for every second-opinion model: consult, review, and delegate with the backend as a parameter.",
5
- "author": { "name": "Brian Connelly" },
5
+ "author": { "name": "Brian Connelly", "url": "https://github.com/briandconnelly" },
6
6
  "homepage": "https://github.com/briandconnelly/amicus",
7
7
  "repository": "https://github.com/briandconnelly/amicus",
8
8
  "license": "MIT",
@@ -12,7 +12,7 @@
12
12
  "interface": {
13
13
  "displayName": "amicus (for Codex)",
14
14
  "shortDescription": "Consult, review, and delegate to Codex, Kimi, or Claude — one server, backend as a parameter.",
15
- "longDescription": "amicus gives Codex one tool surface for every second-opinion model. Pick the backend as a parameter instead of installing a server per model. Delegation runs in a throwaway git worktree and returns a reviewable diff that is never applied to your working tree. Long jobs run asynchronously with a job id you can poll, cancel, and recover. Enabling a backend that can write makes every tool carry that backend's approval annotations — see docs/MIGRATION.md.",
15
+ "longDescription": "amicus gives Codex one tool surface for every second-opinion model. Pick the backend as a parameter instead of installing a server per model. Delegation runs in a throwaway git worktree and returns a reviewable diff that is never applied to your working tree. Long jobs run asynchronously with a job id you can poll, cancel, and recover. Enabling a backend that can write makes every tool carry that backend's approval annotations — see https://github.com/briandconnelly/amicus/blob/main/docs/MIGRATION.md.",
16
16
  "developerName": "Brian Connelly",
17
17
  "category": "Developer Tools",
18
18
  "capabilities": ["MCP", "Skills"],
@@ -0,0 +1,42 @@
1
+ # Copilot code review instructions
2
+
3
+ Review guidance for GitHub Copilot code review in this repository.
4
+ `AGENTS.md` holds the rules every contributor and reviewer works under; this file adds what a reviewer needs on top of it and does not restate it.
5
+ Rule numbers below refer to the numbered list under "Rules" in `AGENTS.md`.
6
+ Copilot reads this file from a pull request's head branch, so the pull request that changes it is reviewed under the changed version.
7
+
8
+ ## Rules
9
+
10
+ 1. When a comment enforces a numbered `AGENTS.md` rule, name the rule number.
11
+ A convention that only the surrounding code establishes needs no citation; describe the pattern the change breaks instead.
12
+ 2. Never propose a new or widened contract as a review fix: a tool name, parameter, description claim, error code, value enum or result envelope the pull request did not already change, or a change to the persisted result shape.
13
+ The surface categories are listed in `FINGERPRINT_COVERS` (`src/amicus/schemas/fingerprint.py`); a change there moves `FINGERPRINT` (rule 10), and a persisted-shape change moves `RESULT_FORMAT` (rule 11); the test that guards each pin states the commit shape it requires.
14
+ A new contract is a design decision, made in a milestone plan or by the maintainer, so state the concern and say that it needs a decision.
15
+ Do ask that a contract the pull request changes match its implementation, its plan and its stated intent; that is a correction, and it still moves the version it touches.
16
+ 3. Never propose a hand edit to a generated pin: the `*_snapshot.json` and `*_differentials.json` files under `tests/fixtures/`, or `uv.lock`.
17
+ The test that guards each pin names the command that regenerates it; if a pin looks wrong, say which source of truth it disagrees with.
18
+ `tests/fixtures/fakebackend/` is source for the wheel-seam test and is edited by hand.
19
+ 4. Before flagging a rule-18 violation, read rule 18's exemptions from `AGENTS.md` itself and check the path against them; never flag a use of one of those exemptions, and flag every path rule 18 does not exempt.
20
+ 5. For every defect, give a concrete input or sequence that produces the wrong outcome; if you cannot, label the comment a question.
21
+ 6. Do not report what a gate command reports on its own: a lint, format, type, import-boundary or test failure, or a Markdown claim that a test pins (see Context).
22
+ 7. Put one issue in each comment, and say whether it blocks merging or is optional.
23
+ 8. When a test is added or changed, check that its assertion can fail: name the change to the code under test that would turn it red, and flag the test if there is none.
24
+ 9. When prose describes code (a tool description, a docstring, a README section, `CHANGELOG.md`, an ADR), check the claim against the source in the same pull request and flag any claim the code does not bear out.
25
+ 10. Under `docs/`, flag a prose paragraph that wraps one sentence across several lines (rule 16).
26
+ 11. Under `.github/workflows/`, check the change against rules 14, 15 and 22 and name the one it breaks.
27
+
28
+ ## Context
29
+
30
+ ### What the gate already checks
31
+
32
+ Rule 2 in `AGENTS.md` defines the gate; CI runs it, preceded by the Actions-pinning check (rule 3).
33
+ Some tests pin Markdown surfaces against the code, for example `docs/MIGRATION.md`'s tool and parameter names and the README install pin; a claim one of those tests pins is gate-covered.
34
+ Nothing in the gate checks prose style, so rule 16, stale claims no test pins and unpinned drift between documentation and code are reviewer work.
35
+
36
+ ### Where the risk concentrates
37
+
38
+ - Rule 18 governs every path a prompt input (`INPUT_FIELDS` in `src/amicus/request.py`) can take.
39
+ Any new log line, error message, argv construction, fixture or committed capture that can carry one of those values is the highest-value place to look.
40
+ - `src/amicus/jobs/delivery.py` is the chokepoint through which every stored result is delivered; a schema gap there reaches every client.
41
+ - `scripts/check_release_state.py`, `scripts/record_live_gate_evidence.py`, `.github/workflows/publish.yml` and `docs/RELEASING.md` implement rules 19 to 24; check that a change to one keeps the others true.
42
+ - `tests/conftest.py` carries the rule-6 guard and `tests/support/fake_codex.py` stands in for the real CLI, so a test that would only pass with a real `codex`, `kimi` or `claude` on `PATH` is a defect.
@@ -22,7 +22,7 @@ jobs:
22
22
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
23
  with:
24
24
  persist-credentials: false
25
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
25
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
26
26
  - run: uv build
27
27
  - run: uv run --with twine twine check dist/*
28
28
  - name: The built wheel's console script must start a real MCP server
@@ -70,7 +70,7 @@ jobs:
70
70
  persist-credentials: false
71
71
  # Full history and tags: the check reads the annotated tag OBJECT, not just the ref.
72
72
  fetch-depth: 0
73
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
73
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
74
74
  - name: The tagged tree and the tag must satisfy the release predicate
75
75
  # See scripts/check_release_state.py for what a pass does and does not prove. In
76
76
  # short: the tree's release-state coherence is proven; the live-gate record carried in
@@ -19,7 +19,7 @@ jobs:
19
19
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
20
  with:
21
21
  persist-credentials: false
22
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
22
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
23
23
  with:
24
24
  python-version: ${{ matrix.python-version }}
25
25
  enable-cache: true
@@ -4,7 +4,7 @@
4
4
  "command": "uvx",
5
5
  "args": [
6
6
  "--from",
7
- "git+https://github.com/briandconnelly/amicus.git@v0.1.0",
7
+ "git+https://github.com/briandconnelly/amicus.git@v0.2.0",
8
8
  "amicus-mcp"
9
9
  ],
10
10
  "env_vars": [
@@ -33,10 +33,11 @@ The rules bind; the context after them explains and points elsewhere.
33
33
  Prompt text that a test or capture script assembles entirely from its own literals is exempt, including the `build_*_prompt` output committed in `tests/fixtures/*_differentials.json`; it stays verbatim, because a differential must show what changed and a hash cannot.
34
34
  No exemption reaches text that was copied, derived or replayed from a prompt anyone sent: that stays bound however it is later stored or relabelled.
35
35
  19. Release in two PRs: the work lands with the version literals untouched, then a `chore(release):` PR moves them together and rolls `## [Unreleased]` in `CHANGELOG.md` into a dated section.
36
- The literals are `pyproject.toml`, `src/amicus/__init__.py`, `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json` and the `.mcp.json` tag pin.
36
+ The literals are `pyproject.toml`, `src/amicus/__init__.py`, `.claude-plugin/plugin.json` and `.codex-plugin/plugin.json`.
37
+ `.mcp.json`'s pin is NOT one of them; rule 24 governs it, and a release must not touch it.
37
38
  `uv.lock` mirrors the version rather than declaring it: regenerate it in that same PR with `uv lock`, or the `uv lock --check` hook fails.
38
39
  Only the maintainer merges that PR, and only the maintainer pushes the tag.
39
- Push the matching tag immediately after that merge, before any other work: the interval in which `main` names a tag that does not yet exist cannot be made zero, so closing it is the only task that may follow the merge.
40
+ Push the matching tag before any other work follows that merge: until it exists, `main` declares a version that has no release.
40
41
  20. Never push a `v*` tag unless the three live gates — `tests/test_codex_live.py`, `tests/test_kimi_live.py` and `tests/test_claude_live.py`, run under rule 5 — have all PASSED on that exact commit, with those passing outcomes recorded.
41
42
  The record is `.release-evidence/live-gates.json`, written by `scripts/record_live_gate_evidence.py`, naming that commit, each suite and its outcome; a terminal transcript or a recollection is not a record.
42
43
  A record showing a failed suite does not satisfy this rule; it is a reason not to tag.
@@ -46,6 +47,9 @@ The rules bind; the context after them explains and points elsewhere.
46
47
  Never move a release check into the `pypi` job: GitHub holds every step of an environment job behind that environment's required reviewer, so a check placed there runs only after the approval it exists to inform.
47
48
  23. Never describe the rule-20 record, in any document or output, as proof that the live gates ran.
48
49
  It is the maintainer's assertion, machine-checked for shape and for naming the tagged commit; the runs happen on the maintainer's machine and the record is written there.
50
+ 24. `.mcp.json`'s `--from` pin names a release that is already published, never the one being released, and it may never name a version newer than the one the tree declares.
51
+ A release PR under rule 19 leaves it untouched; move it to the new tag in its own `chore(release):` PR after that tag is published and its install has been checked.
52
+ That PR is not a release: it needs no rule-20 evidence, because it moves a pointer to a tag that already exists.
49
53
 
50
54
  ## Context
51
55
 
@@ -72,21 +76,26 @@ The README's "Where things are" table indexes the rest.
72
76
 
73
77
  ### Releases
74
78
 
75
- Rules 19 and 20 exist because `.mcp.json` pins `git+https://github.com/briandconnelly/amicus.git@v{version}`.
76
- Until the matching tag exists, a plugin install from `main` fails on an unresolvable ref.
77
- That window opens at every release and cannot be eliminated, because merging and tagging are separate operations; rule 19's last clause keeps it to the seconds between them rather than removing it.
78
- `main` carries exactly that unresolvable pin today, because 0.1.0 has never been tagged, and the first release closes this instance of it.
79
+ `.mcp.json` pins `git+https://github.com/briandconnelly/amicus.git@v{version}`, and that pin is what a fresh plugin install actually fetches: users add this repository as a marketplace, so the manifest they read is the one on `main`.
80
+ Rule 24 therefore keeps it naming a release that is already published rather than the one being released.
81
+ A manifest on `main` cannot name an artifact that only exists after `main` has moved, and pinning the version under release meant every release broke a fresh install for the interval between the release merge and the tag push.
82
+ Rule 24 removes that interval rather than shortening it.
83
+ Two facts decided the shape, and both were established by probe rather than argued: a commit SHA resolves over the same git transport a tag does, so the install path can be rehearsed before any tag exists; and `uvx` reuses a cached tool environment without querying any index, so the version in the requirement string is what makes an existing user pick up a new release — which is why an unpinned source was rejected rather than adopted.
84
+ 0.1.0 was the bootstrap, tagged and published on 2026-09-09; it named the tag it created because no earlier release existed, and that case cannot recur.
79
85
  Rule 20 is a local pre-tag gate rather than a CI job: hosted runners have no authenticated `codex`, `kimi` or `claude`, so the evidence is recorded on the maintainer's machine against the exact commit to be tagged.
80
86
  That evidence is an honest-mistake guard, not an attestation; it is a local file its author can write by hand.
81
87
  Rule 21 covers creation as well as update and deletion because pushing a `v*` tag is by itself what triggers `.github/workflows/publish.yml`: an identity that can create one can publish a release without rules 19 and 20 ever being satisfied, and a moved tag silently changes what users install under a version they already trust.
82
- No such ruleset exists yet, so rule 21 currently forbids tagging; creating it is a maintainer prerequisite of the first release, and `docs/RELEASING.md` reads it back rather than assuming it.
88
+ That ruleset now exists — `release tags`, active, covering `refs/tags/v*` and restricting creation, update and deletion — and 0.1.0 was tagged under it.
89
+ Its bypass list is the part an agent here cannot check: the ruleset response seen from this repository's agent token carries no `bypass_actors` key at all.
90
+ GitHub omits that key from responses to requesters without sufficient permission on the ruleset rather than returning an empty list, so its absence is not evidence that nobody may bypass, and must never be reported as though it were.
91
+ `docs/RELEASING.md` reads that back with the maintainer's own token rather than assuming it.
83
92
  The executable procedure — preconditions, the evidence run, the environment approval pause and the post-tag checks — is `docs/RELEASING.md`.
84
93
 
85
94
  Rules 20, 22 and 23 are shaped by what a CI job can and cannot establish, which is the subject of ADR 0014 and of issue #25 before it.
86
95
  The `verify` job runs `scripts/check_release_state.py` on the tagged commit, and the two halves of that script are worth different amounts.
87
96
  Its release-state coherence half **proves** what it reports: every version literal rule 19 names, the dated `CHANGELOG.md` section, and `uv.lock` are all facts of the tagged tree.
88
97
  Its live-gate half checks only that the record carried on the tag is well formed, names this commit and asserts three passing suites — never that those suites ran, which is why rule 23 forbids saying otherwise.
89
- Everything else rule 19 requires is a convention no CI job can prove: two PRs, an ordinary merge commit rather than a squash, the maintainer merging rather than an agent, and the tag pushed before any other work.
98
+ Everything else rule 19 requires is a convention no CI job can prove: two PRs, an ordinary merge commit rather than a squash, the maintainer merging rather than an agent, and the tag pushed promptly after the merge.
90
99
  Those are held by the platform controls around the release — rule 21's ruleset and the `pypi` environment's required reviewer — and by whoever runs the procedure, and this repository states that plainly rather than implying the workflow checks it.
91
100
 
92
101
  ### Siblings