amicus 0.2.0__tar.gz → 0.4.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 (541) hide show
  1. {amicus-0.2.0 → amicus-0.4.0}/.claude-plugin/plugin.json +1 -1
  2. {amicus-0.2.0 → amicus-0.4.0}/.codex-plugin/plugin.json +1 -1
  3. amicus-0.4.0/.github/copilot-instructions.md +42 -0
  4. {amicus-0.2.0 → amicus-0.4.0}/.github/dependabot.yml +11 -0
  5. {amicus-0.2.0 → amicus-0.4.0}/.github/workflows/publish.yml +2 -2
  6. {amicus-0.2.0 → amicus-0.4.0}/.github/workflows/test.yml +18 -1
  7. {amicus-0.2.0 → amicus-0.4.0}/.mcp.json +1 -1
  8. {amicus-0.2.0 → amicus-0.4.0}/AGENTS.md +20 -12
  9. amicus-0.4.0/CHANGELOG.md +722 -0
  10. {amicus-0.2.0 → amicus-0.4.0}/PKG-INFO +32 -25
  11. {amicus-0.2.0 → amicus-0.4.0}/README.md +30 -22
  12. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/adversarial.md +4 -3
  13. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/consult.md +4 -3
  14. amicus-0.4.0/commands/amicus/delegate-async.md +36 -0
  15. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/delegate.md +4 -4
  16. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/dry-run.md +1 -1
  17. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/jobs.md +12 -2
  18. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/review.md +5 -4
  19. {amicus-0.2.0 → amicus-0.4.0}/commands/amicus/status.md +3 -1
  20. {amicus-0.2.0 → amicus-0.4.0}/docs/DEPRECATING-SIBLINGS.md +10 -6
  21. amicus-0.4.0/docs/MIGRATION.md +266 -0
  22. {amicus-0.2.0 → amicus-0.4.0}/docs/RELEASING.md +27 -15
  23. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0002-backend-options-is-a-closed-superset.md +2 -1
  24. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0003-workspace-resolution.md +1 -0
  25. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0004-tasks-and-jobs.md +1 -0
  26. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0007-m1-codex-port-decisions.md +3 -1
  27. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0008-m2-jobs-surface-decisions.md +4 -2
  28. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0011-m5-tasks-decisions.md +1 -0
  29. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0015-mcp-json-pins-an-already-published-release.md +2 -1
  30. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0017-an-unreadable-machine-enum-falls-to-its-own-floor.md +2 -0
  31. amicus-0.4.0/docs/adr/0019-review-results-disclose-coverage-as-a-field.md +60 -0
  32. amicus-0.4.0/docs/adr/0020-idempotency-keys-on-the-sync-tools.md +70 -0
  33. amicus-0.4.0/docs/adr/0021-repair-arguments-are-a-complete-call.md +53 -0
  34. amicus-0.4.0/docs/adr/0022-consume-reports-its-discard-outcome.md +70 -0
  35. amicus-0.4.0/docs/adr/0023-dependency-loggers-are-owned-at-a-warning-floor.md +65 -0
  36. amicus-0.4.0/docs/adr/0024-prose-list-loss-is-disclosed-never-folded.md +70 -0
  37. amicus-0.4.0/docs/adr/0025-success-meta-is-sparse-on-every-tool.md +46 -0
  38. amicus-0.4.0/docs/adr/0026-a-not-run-review-carries-no-confidence-rating.md +45 -0
  39. amicus-0.4.0/docs/adr/0027-every-instructions-rule-fits-the-shown-prefix.md +61 -0
  40. amicus-0.4.0/docs/adr/0028-a-deprecated-tool-keeps-its-record-beside-one-marker.md +65 -0
  41. amicus-0.4.0/docs/adr/0029-the-backend-sdk-lives-in-tree.md +63 -0
  42. amicus-0.4.0/docs/adr/0030-the-sdk-keeps-what-a-backend-imports.md +46 -0
  43. amicus-0.4.0/docs/adr/0031-the-marketplace-pointer-decides-what-users-run.md +47 -0
  44. amicus-0.4.0/docs/adr/0032-a-claude-review-defaults-to-readonly-access.md +43 -0
  45. amicus-0.4.0/docs/adr/0033-an-unreadable-review-answer-is-delivered-unstructured.md +63 -0
  46. amicus-0.4.0/docs/adr/0034-claude-usage-is-read-from-model-usage.md +29 -0
  47. amicus-0.4.0/docs/adr/0035-a-backend-answer-is-kept-on-the-job-record.md +53 -0
  48. amicus-0.4.0/docs/claude-help/2.1.274/FINDINGS.md +39 -0
  49. amicus-0.4.0/docs/claude-help/2.1.274/budget-stop-envelope-shape.json +52 -0
  50. amicus-0.4.0/docs/claude-help/2.1.274/claude-version.txt +1 -0
  51. amicus-0.4.0/docs/kimi-help/0.42.0/FINDINGS.md +25 -0
  52. amicus-0.4.0/docs/kimi-help/0.42.0/kimi-help.txt +50 -0
  53. amicus-0.4.0/docs/kimi-help/0.42.0/kimi-version.txt +1 -0
  54. amicus-0.4.0/docs/kimi-help/0.42.0/provider-list-shape.json +18 -0
  55. amicus-0.4.0/docs/kimi-help/0.43.1/FINDINGS.md +35 -0
  56. amicus-0.4.0/docs/kimi-help/0.43.1/kimi-help.txt +50 -0
  57. amicus-0.4.0/docs/kimi-help/0.43.1/kimi-version.txt +1 -0
  58. amicus-0.4.0/docs/kimi-help/0.43.1/provider-list-shape.json +18 -0
  59. {amicus-0.2.0 → amicus-0.4.0}/docs/superpowers/specs/2026-09-04-amicus-design.md +38 -44
  60. amicus-0.4.0/docs/superpowers/specs/2026-09-15-amicus-M8-sdk-in-tree-design.md +224 -0
  61. amicus-0.4.0/docs/superpowers/specs/2026-09-16-amicus-release-activation-design.md +343 -0
  62. {amicus-0.2.0 → amicus-0.4.0}/prek.toml +2 -1
  63. {amicus-0.2.0 → amicus-0.4.0}/pyproject.toml +45 -4
  64. {amicus-0.2.0 → amicus-0.4.0}/scripts/check_commit_message.py +1 -0
  65. amicus-0.4.0/scripts/check_release_state.py +922 -0
  66. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/SKILL.md +88 -41
  67. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/active-workflows.md +5 -5
  68. amicus-0.4.0/skills/collaborating-with-amicus/references/blind-comparison.md +149 -0
  69. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/choosing-a-backend.md +36 -13
  70. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/options-and-errors.md +35 -12
  71. amicus-0.4.0/skills/collaborating-with-amicus/references/reading-results.md +218 -0
  72. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/reviewing-a-returned-diff.md +1 -1
  73. amicus-0.4.0/skills/collaborating-with-amicus/references/sync-vs-async.md +99 -0
  74. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/tests/scenarios.md +127 -3
  75. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/__init__.py +1 -1
  76. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/_worker.py +31 -5
  77. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/__init__.py +1 -1
  78. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/__init__.py +4 -5
  79. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/adapter.py +25 -12
  80. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/adversarial.py +18 -1
  81. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/cli.py +19 -19
  82. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/config.py +34 -15
  83. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/contract.py +17 -6
  84. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/normalize.py +66 -18
  85. amicus-0.4.0/src/amicus/backends/claude/options.py +48 -0
  86. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/status.py +1 -2
  87. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/__init__.py +4 -5
  88. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/adapter.py +6 -9
  89. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/binary.py +1 -2
  90. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/cli.py +71 -21
  91. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/config.py +9 -10
  92. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/contract.py +77 -20
  93. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/models.py +2 -3
  94. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/normalize.py +28 -12
  95. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/status.py +5 -5
  96. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/__init__.py +4 -5
  97. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/adapter.py +6 -8
  98. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/cli.py +7 -8
  99. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/config.py +8 -10
  100. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/contract.py +6 -6
  101. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/models.py +1 -2
  102. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/normalize.py +1 -2
  103. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/status.py +2 -4
  104. amicus-0.4.0/src/amicus/compaction.py +53 -0
  105. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/config/__init__.py +21 -14
  106. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/config/envspec.py +58 -11
  107. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/errors.py +71 -20
  108. amicus-0.4.0/src/amicus/jobs/__init__.py +2 -0
  109. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/jobs/delivery.py +38 -20
  110. amicus-0.4.0/src/amicus/jobs/idempotency.py +466 -0
  111. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/jobs/lifecycle.py +223 -44
  112. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/jobs/lookup.py +6 -4
  113. amicus-0.4.0/src/amicus/jobs/polling.py +33 -0
  114. amicus-0.4.0/src/amicus/jobs/store.py +1049 -0
  115. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/jobs/taskmap.py +8 -3
  116. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/manifest.py +160 -9
  117. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/middleware.py +62 -4
  118. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/obs.py +215 -29
  119. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/finalize.py +131 -40
  120. amicus-0.4.0/src/amicus/orchestration/gitdiff.py +1179 -0
  121. amicus-0.4.0/src/amicus/orchestration/gitproc.py +205 -0
  122. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/isolation.py +10 -8
  123. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/prompts.py +131 -9
  124. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/review.py +73 -27
  125. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/run.py +23 -20
  126. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/workspace.py +68 -12
  127. amicus-0.4.0/src/amicus/orchestration/worktree.py +665 -0
  128. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/plugin.py +11 -10
  129. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/registry.py +4 -5
  130. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/request.py +4 -4
  131. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/result_format_snapshot.py +8 -0
  132. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/codes.py +5 -5
  133. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/envelope.py +117 -9
  134. amicus-0.4.0/src/amicus/schemas/fingerprint.py +184 -0
  135. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/options.py +3 -2
  136. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/params.py +110 -59
  137. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/publish.py +7 -10
  138. amicus-0.4.0/src/amicus/schemas/results.py +744 -0
  139. amicus-0.4.0/src/amicus/schemas/structured.py +95 -0
  140. amicus-0.4.0/src/amicus/sdk/__init__.py +14 -0
  141. amicus-0.4.0/src/amicus/sdk/backend/__init__.py +19 -0
  142. amicus-0.4.0/src/amicus/sdk/backend/contract.py +137 -0
  143. amicus-0.4.0/src/amicus/sdk/backend/protocol.py +311 -0
  144. amicus-0.4.0/src/amicus/sdk/conventions/__init__.py +8 -0
  145. amicus-0.4.0/src/amicus/sdk/conventions/annotations.py +97 -0
  146. amicus-0.4.0/src/amicus/sdk/conventions/envelope.py +380 -0
  147. amicus-0.4.0/src/amicus/sdk/conventions/preflight.py +100 -0
  148. amicus-0.4.0/src/amicus/sdk/core/__init__.py +7 -0
  149. amicus-0.4.0/src/amicus/sdk/core/jsoncache.py +42 -0
  150. amicus-0.4.0/src/amicus/sdk/core/pathalias.py +430 -0
  151. amicus-0.4.0/src/amicus/sdk/core/redaction.py +1515 -0
  152. amicus-0.4.0/src/amicus/sdk/core/runtime.py +617 -0
  153. amicus-0.4.0/src/amicus/sdk/core/streamcap.py +286 -0
  154. amicus-0.4.0/src/amicus/sdk/testing/__init__.py +7 -0
  155. amicus-0.4.0/src/amicus/sdk/testing/conformance.py +119 -0
  156. amicus-0.4.0/src/amicus/sdk/testing/surface_honesty.py +52 -0
  157. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/server.py +58 -49
  158. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/surface.py +1 -1
  159. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/__init__.py +5 -1
  160. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/_guard.py +5 -3
  161. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/_meta.py +38 -6
  162. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/_prepare.py +10 -10
  163. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/_resolve.py +9 -0
  164. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/consult.py +10 -4
  165. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/delegate.py +8 -4
  166. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/discovery.py +109 -37
  167. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/dry_run.py +85 -18
  168. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/jobs.py +22 -12
  169. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/resources.py +75 -28
  170. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/tools/review.py +17 -7
  171. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/wire_shape_snapshot.py +69 -9
  172. {amicus-0.2.0 → amicus-0.4.0}/tests/conftest.py +113 -5
  173. amicus-0.4.0/tests/fixtures/claude_budget_stop_envelope.json +82 -0
  174. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/fakebackend/src/fakebackend/__init__.py +11 -12
  175. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/manifest_snapshot.all.json +2026 -574
  176. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/manifest_snapshot.claude.json +2026 -574
  177. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/manifest_snapshot.codex-kimi.json +2026 -574
  178. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/result_format_snapshot.json +1061 -23
  179. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/wire_shape_snapshot.json +284 -69
  180. amicus-0.4.0/tests/sdk/conftest.py +96 -0
  181. amicus-0.4.0/tests/sdk/test_annotations.py +85 -0
  182. amicus-0.4.0/tests/sdk/test_classified_failure_fields.py +70 -0
  183. amicus-0.4.0/tests/sdk/test_conformance_fakes.py +510 -0
  184. amicus-0.4.0/tests/sdk/test_conformance_inspector.py +94 -0
  185. amicus-0.4.0/tests/sdk/test_contract.py +88 -0
  186. amicus-0.4.0/tests/sdk/test_envelope.py +92 -0
  187. amicus-0.4.0/tests/sdk/test_fingerprint.py +93 -0
  188. amicus-0.4.0/tests/sdk/test_git_isolation.py +65 -0
  189. amicus-0.4.0/tests/sdk/test_gitdiff.py +2153 -0
  190. amicus-0.4.0/tests/sdk/test_gitproc.py +205 -0
  191. amicus-0.4.0/tests/sdk/test_idempotency.py +490 -0
  192. amicus-0.4.0/tests/sdk/test_jobs.py +1548 -0
  193. amicus-0.4.0/tests/sdk/test_jsoncache.py +59 -0
  194. amicus-0.4.0/tests/sdk/test_orphan_sweep.py +245 -0
  195. amicus-0.4.0/tests/sdk/test_outcome_inspector.py +90 -0
  196. amicus-0.4.0/tests/sdk/test_pair_parity_kit.py +72 -0
  197. amicus-0.4.0/tests/sdk/test_pathalias.py +614 -0
  198. amicus-0.4.0/tests/sdk/test_preflight.py +132 -0
  199. amicus-0.4.0/tests/sdk/test_prompts.py +119 -0
  200. amicus-0.4.0/tests/sdk/test_redaction.py +3411 -0
  201. amicus-0.4.0/tests/sdk/test_run_request.py +156 -0
  202. amicus-0.4.0/tests/sdk/test_runtime.py +1018 -0
  203. amicus-0.4.0/tests/sdk/test_runtime_kill_and_sweep_paths.py +145 -0
  204. amicus-0.4.0/tests/sdk/test_streamcap.py +351 -0
  205. amicus-0.4.0/tests/sdk/test_surface_honesty_kit.py +49 -0
  206. amicus-0.4.0/tests/sdk/test_usage_cache_fields.py +49 -0
  207. amicus-0.4.0/tests/sdk/test_workspace.py +53 -0
  208. amicus-0.4.0/tests/sdk/test_worktree.py +1004 -0
  209. amicus-0.4.0/tests/sdk/test_worktree_config.py +93 -0
  210. amicus-0.4.0/tests/support/__init__.py +0 -0
  211. {amicus-0.2.0 → amicus-0.4.0}/tests/support/claudefixtures.py +21 -3
  212. {amicus-0.2.0 → amicus-0.4.0}/tests/support/codexfixtures.py +2 -3
  213. {amicus-0.2.0 → amicus-0.4.0}/tests/support/fakeplugin.py +11 -12
  214. {amicus-0.2.0 → amicus-0.4.0}/tests/support/kimifixtures.py +2 -3
  215. amicus-0.4.0/tests/support/pair_parity.py +62 -0
  216. {amicus-0.2.0 → amicus-0.4.0}/tests/test_adversarial.py +31 -4
  217. {amicus-0.2.0 → amicus-0.4.0}/tests/test_async_tools.py +2 -2
  218. {amicus-0.2.0 → amicus-0.4.0}/tests/test_cache_hints.py +7 -24
  219. {amicus-0.2.0 → amicus-0.4.0}/tests/test_check_commit_message.py +6 -0
  220. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_adapter.py +91 -16
  221. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_argv_differential.py +1 -1
  222. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_cli.py +13 -2
  223. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_config.py +46 -14
  224. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_contract.py +3 -3
  225. amicus-0.4.0/tests/test_claude_golden_envelope.py +158 -0
  226. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_live.py +66 -5
  227. amicus-0.4.0/tests/test_claude_normalize.py +190 -0
  228. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_plugin.py +30 -2
  229. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_result_differential.py +14 -7
  230. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_status.py +1 -1
  231. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_sync_tools.py +199 -5
  232. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codes.py +4 -5
  233. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_adapter.py +83 -5
  234. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_argv_differential.py +5 -5
  235. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_binary.py +1 -1
  236. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_cli.py +168 -7
  237. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_config.py +15 -6
  238. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_contract.py +132 -3
  239. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_normalize.py +34 -0
  240. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_result_differential.py +15 -3
  241. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_status.py +23 -4
  242. {amicus-0.2.0 → amicus-0.4.0}/tests/test_commands.py +57 -4
  243. amicus-0.4.0/tests/test_compaction.py +154 -0
  244. {amicus-0.2.0 → amicus-0.4.0}/tests/test_config.py +23 -11
  245. {amicus-0.2.0 → amicus-0.4.0}/tests/test_delivery.py +61 -2
  246. {amicus-0.2.0 → amicus-0.4.0}/tests/test_discovery.py +135 -23
  247. amicus-0.4.0/tests/test_discovery_cost.py +224 -0
  248. amicus-0.4.0/tests/test_dry_run.py +304 -0
  249. {amicus-0.2.0 → amicus-0.4.0}/tests/test_envelope.py +45 -0
  250. amicus-0.4.0/tests/test_envspec.py +208 -0
  251. {amicus-0.2.0 → amicus-0.4.0}/tests/test_errors.py +111 -3
  252. amicus-0.4.0/tests/test_fastmcp_argument_log.py +442 -0
  253. {amicus-0.2.0 → amicus-0.4.0}/tests/test_finalize.py +304 -41
  254. {amicus-0.2.0 → amicus-0.4.0}/tests/test_fingerprint.py +3 -3
  255. {amicus-0.2.0 → amicus-0.4.0}/tests/test_guard.py +23 -0
  256. amicus-0.4.0/tests/test_import_contracts.py +47 -0
  257. {amicus-0.2.0 → amicus-0.4.0}/tests/test_isolation.py +1 -1
  258. amicus-0.4.0/tests/test_job_tools.py +641 -0
  259. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_adapter.py +3 -3
  260. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_argv_differential.py +5 -5
  261. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_cli.py +2 -2
  262. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_config.py +12 -9
  263. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_contract.py +63 -14
  264. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_live.py +6 -1
  265. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_models.py +1 -2
  266. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_result_differential.py +15 -3
  267. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_status.py +4 -2
  268. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_sync_tools.py +4 -2
  269. {amicus-0.2.0 → amicus-0.4.0}/tests/test_lifecycle.py +522 -6
  270. {amicus-0.2.0 → amicus-0.4.0}/tests/test_log_redaction.py +42 -26
  271. {amicus-0.2.0 → amicus-0.4.0}/tests/test_lookup.py +18 -1
  272. {amicus-0.2.0 → amicus-0.4.0}/tests/test_manifest.py +129 -8
  273. amicus-0.4.0/tests/test_meta.py +138 -0
  274. {amicus-0.2.0 → amicus-0.4.0}/tests/test_middleware.py +75 -1
  275. {amicus-0.2.0 → amicus-0.4.0}/tests/test_migration_doc.py +73 -13
  276. {amicus-0.2.0 → amicus-0.4.0}/tests/test_obs.py +8 -1
  277. {amicus-0.2.0 → amicus-0.4.0}/tests/test_packaging.py +38 -20
  278. {amicus-0.2.0 → amicus-0.4.0}/tests/test_paid_tools.py +45 -0
  279. {amicus-0.2.0 → amicus-0.4.0}/tests/test_params.py +35 -1
  280. {amicus-0.2.0 → amicus-0.4.0}/tests/test_plugin.py +2 -2
  281. amicus-0.4.0/tests/test_poll_hint.py +57 -0
  282. {amicus-0.2.0 → amicus-0.4.0}/tests/test_prepare.py +10 -1
  283. {amicus-0.2.0 → amicus-0.4.0}/tests/test_registry.py +1 -1
  284. amicus-0.4.0/tests/test_release_state.py +1197 -0
  285. {amicus-0.2.0 → amicus-0.4.0}/tests/test_resources.py +22 -6
  286. amicus-0.4.0/tests/test_results.py +265 -0
  287. {amicus-0.2.0 → amicus-0.4.0}/tests/test_review.py +87 -10
  288. {amicus-0.2.0 → amicus-0.4.0}/tests/test_run.py +4 -5
  289. amicus-0.4.0/tests/test_sdk_in_tree.py +183 -0
  290. {amicus-0.2.0 → amicus-0.4.0}/tests/test_server.py +94 -14
  291. amicus-0.4.0/tests/test_skill_contract.py +360 -0
  292. amicus-0.4.0/tests/test_structured.py +111 -0
  293. amicus-0.4.0/tests/test_surface_honesty.py +366 -0
  294. {amicus-0.2.0 → amicus-0.4.0}/tests/test_sync_tools.py +122 -0
  295. {amicus-0.2.0 → amicus-0.4.0}/tests/test_tasks_client.py +7 -1
  296. {amicus-0.2.0 → amicus-0.4.0}/tests/test_wire_shape.py +32 -1
  297. {amicus-0.2.0 → amicus-0.4.0}/tests/test_worker.py +125 -10
  298. {amicus-0.2.0 → amicus-0.4.0}/tests/test_workspace.py +58 -0
  299. {amicus-0.2.0 → amicus-0.4.0}/uv.lock +430 -77
  300. amicus-0.2.0/CHANGELOG.md +0 -226
  301. amicus-0.2.0/docs/MIGRATION.md +0 -158
  302. amicus-0.2.0/scripts/check_release_state.py +0 -480
  303. amicus-0.2.0/skills/collaborating-with-amicus/references/reading-results.md +0 -139
  304. amicus-0.2.0/skills/collaborating-with-amicus/references/sync-vs-async.md +0 -67
  305. amicus-0.2.0/src/amicus/backends/claude/options.py +0 -24
  306. amicus-0.2.0/src/amicus/jobs/__init__.py +0 -1
  307. amicus-0.2.0/src/amicus/schemas/fingerprint.py +0 -57
  308. amicus-0.2.0/src/amicus/schemas/results.py +0 -451
  309. amicus-0.2.0/src/amicus/schemas/structured.py +0 -47
  310. amicus-0.2.0/tests/test_claude_golden_envelope.py +0 -79
  311. amicus-0.2.0/tests/test_claude_normalize.py +0 -86
  312. amicus-0.2.0/tests/test_discovery_cost.py +0 -75
  313. amicus-0.2.0/tests/test_dry_run.py +0 -127
  314. amicus-0.2.0/tests/test_envspec.py +0 -93
  315. amicus-0.2.0/tests/test_import_contracts.py +0 -17
  316. amicus-0.2.0/tests/test_job_tools.py +0 -313
  317. amicus-0.2.0/tests/test_meta.py +0 -70
  318. amicus-0.2.0/tests/test_release_state.py +0 -621
  319. amicus-0.2.0/tests/test_results.py +0 -128
  320. amicus-0.2.0/tests/test_skill_contract.py +0 -119
  321. amicus-0.2.0/tests/test_structured.py +0 -10
  322. amicus-0.2.0/tests/test_surface_honesty.py +0 -104
  323. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/SKILL.md +0 -0
  324. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/references/design-workflow.md +0 -0
  325. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/references/docs-checklist.md +0 -0
  326. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/references/examples.md +0 -0
  327. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/references/review-workflow.md +0 -0
  328. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-docs/tests/scenarios.md +0 -0
  329. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/SKILL.md +0 -0
  330. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/decisions/001-github-fact-sheet.md +0 -0
  331. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/audit-workflow.md +0 -0
  332. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/config-checklist.md +0 -0
  333. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/README.md +0 -0
  334. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/codeowners.md +0 -0
  335. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/harness-deny.md +0 -0
  336. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/identity.md +0 -0
  337. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/repo-files.md +0 -0
  338. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/required-checks.md +0 -0
  339. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/rulesets.md +0 -0
  340. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/examples/workflows.md +0 -0
  341. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/operating-playbook.md +0 -0
  342. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/setup-workflow.md +0 -0
  343. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/references/threat-model.md +0 -0
  344. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/tests/check_authority.py +0 -0
  345. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-github/tests/scenarios.md +0 -0
  346. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/SKILL.md +0 -0
  347. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/decisions/001-mcp-2026-07-28-rebase.md +0 -0
  348. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/decisions/002-machine-code-rename-rationale.md +0 -0
  349. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/decisions/003-offending-value-omission.md +0 -0
  350. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/decisions/004-ownership-boundaries.md +0 -0
  351. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/contract-checklist.md +0 -0
  352. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/design-workflow.md +0 -0
  353. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/examples.md +0 -0
  354. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/mcp-2025-11-25-compat.md +0 -0
  355. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/mcp-vs-cli.md +0 -0
  356. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/native-wire-shapes.md +0 -0
  357. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/review-workflow.md +0 -0
  358. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/references/vocabulary.md +0 -0
  359. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/check_fact_sync.py +0 -0
  360. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/check_rule_ids.py +0 -0
  361. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/check_stale_terms.py +0 -0
  362. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/fixtures/github_issues.json +0 -0
  363. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/fixtures/github_repo_resource.json +0 -0
  364. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/rule-ids.txt +0 -0
  365. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-baseline.md +0 -0
  366. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-outputschema-error.md +0 -0
  367. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario1-with-skill.md +0 -0
  368. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario2-baseline.md +0 -0
  369. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario2-with-skill.md +0 -0
  370. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario3-baseline.md +0 -0
  371. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario3-with-skill.md +0 -0
  372. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario4-baseline.md +0 -0
  373. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario4-with-skill.md +0 -0
  374. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario5-baseline.md +0 -0
  375. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario5-with-skill.md +0 -0
  376. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario6-baseline.md +0 -0
  377. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario6-with-skill.md +0 -0
  378. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-11-scenario7-trigger.md +0 -0
  379. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario1-baseline.md +0 -0
  380. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario1-with-skill.md +0 -0
  381. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario3-baseline.md +0 -0
  382. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario3-with-skill.md +0 -0
  383. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario5-baseline.md +0 -0
  384. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-29-scenario5-with-skill.md +0 -0
  385. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-30-scenario1-with-skill.md +0 -0
  386. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/runs/2026-07-30-scenario8-severity-calibration.md +0 -0
  387. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/scenarios.md +0 -0
  388. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/test_check_fact_sync.py +0 -0
  389. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/test_check_rule_ids.py +0 -0
  390. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/test_validate_fixture.py +0 -0
  391. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/agent-friendly-mcp/tests/validate_fixture.py +0 -0
  392. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/SKILL.md +0 -0
  393. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/agents/openai.yaml +0 -0
  394. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/references/example-audit.md +0 -0
  395. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/rescore-2026-08-06/preregistration.md +0 -0
  396. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/rescore-2026-08-06/results.md +0 -0
  397. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario1-baseline.md +0 -0
  398. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario1-with-skill.md +0 -0
  399. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario2-baseline.md +0 -0
  400. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario2-with-skill.md +0 -0
  401. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario3-baseline.md +0 -0
  402. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario3-with-skill.md +0 -0
  403. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario4-baseline.md +0 -0
  404. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario4-with-skill.md +0 -0
  405. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario5-baseline.md +0 -0
  406. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario5-with-skill.md +0 -0
  407. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario6-baseline.md +0 -0
  408. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario6-with-skill.md +0 -0
  409. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario7-baseline.md +0 -0
  410. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario7-with-skill.md +0 -0
  411. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario8-baseline.md +0 -0
  412. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario8-with-skill.md +0 -0
  413. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-07-11-scenario9-trigger.md +0 -0
  414. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-06-scenario1-with-skill.md +0 -0
  415. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-06-scenario6-with-skill.md +0 -0
  416. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-confirmation-r1-both-directions.md +0 -0
  417. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario1-with-skill.md +0 -0
  418. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario2-with-skill.md +0 -0
  419. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario5-with-skill.md +0 -0
  420. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario6-with-skill.md +0 -0
  421. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario7-with-skill.md +0 -0
  422. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/runs/2026-08-23-scenario8-with-skill.md +0 -0
  423. {amicus-0.2.0 → amicus-0.4.0}/.agents/skills/separating-context-from-constraints/tests/scenarios.md +0 -0
  424. {amicus-0.2.0 → amicus-0.4.0}/.claude-plugin/marketplace.json +0 -0
  425. {amicus-0.2.0 → amicus-0.4.0}/.gitattributes +0 -0
  426. {amicus-0.2.0 → amicus-0.4.0}/.github/CODEOWNERS +0 -0
  427. {amicus-0.2.0 → amicus-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  428. {amicus-0.2.0 → amicus-0.4.0}/.github/workflows/ci.yml +0 -0
  429. {amicus-0.2.0 → amicus-0.4.0}/.github/workflows/codeql.yml +0 -0
  430. {amicus-0.2.0 → amicus-0.4.0}/.github/workflows/dependency-review.yml +0 -0
  431. {amicus-0.2.0 → amicus-0.4.0}/.gitignore +0 -0
  432. {amicus-0.2.0 → amicus-0.4.0}/CLAUDE.md +0 -0
  433. {amicus-0.2.0 → amicus-0.4.0}/LICENSE +0 -0
  434. {amicus-0.2.0 → amicus-0.4.0}/docs/2026-09-04-naming-and-scoping-notes.md +0 -0
  435. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0001-annotations-follow-the-worst-enabled-backend.md +0 -0
  436. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0005-error-envelope-and-repair-precedence.md +0 -0
  437. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0006-fingerprint-and-surface-digest.md +0 -0
  438. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0009-m3-kimi-port-decisions.md +0 -0
  439. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0010-m4-claude-port-decisions.md +0 -0
  440. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0012-m6-packaging-decisions.md +0 -0
  441. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0013-proceed-without-trademark-clearance.md +0 -0
  442. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0014-release-predicate-on-the-tag.md +0 -0
  443. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0016-skill-rules-are-a-complete-contract.md +0 -0
  444. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/0018-the-catalog-carries-a-ttl-and-resource-reads-do-not.md +0 -0
  445. {amicus-0.2.0 → amicus-0.4.0}/docs/adr/README.md +0 -0
  446. {amicus-0.2.0 → amicus-0.4.0}/docs/claude-help/2.1.263/FINDINGS.md +0 -0
  447. {amicus-0.2.0 → amicus-0.4.0}/docs/claude-help/2.1.263/claude-help.txt +0 -0
  448. {amicus-0.2.0 → amicus-0.4.0}/docs/claude-help/2.1.263/claude-version.txt +0 -0
  449. {amicus-0.2.0 → amicus-0.4.0}/docs/claude-help/2.1.263/envelope-shape.json +0 -0
  450. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/claude-code/2.1.263/FINDINGS.md +0 -0
  451. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/claude-code/2.1.263/connection.log +0 -0
  452. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/claude-code/2.1.263/host-output.json +0 -0
  453. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/codex/0.153.4/FINDINGS.md +0 -0
  454. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/codex/0.153.4/connection.log +0 -0
  455. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/codex/0.153.4/host-output.jsonl +0 -0
  456. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/notes.md +0 -0
  457. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/server.log +0 -0
  458. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/free-scenarios/claude-code/2.1.263/transcript.md +0 -0
  459. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/claude-code/2.1.263/notes.md +0 -0
  460. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/claude-code/2.1.263/server.log +0 -0
  461. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/claude-code/2.1.263/transcript.md +0 -0
  462. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/codex/0.153.4/notes.md +0 -0
  463. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/codex/0.153.4/server.log +0 -0
  464. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/install-smoke/codex/0.153.4/transcript.md +0 -0
  465. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/notes.md +0 -0
  466. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/server.log +0 -0
  467. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-f3-recon-attempt/claude-code/2.1.265/transcript.md +0 -0
  468. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/notes.md +0 -0
  469. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/server.log +0 -0
  470. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-old-text-new-grader/claude-code/2.1.263/transcript.md +0 -0
  471. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/notes.md +0 -0
  472. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/server.log +0 -0
  473. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-rerun/claude-code/2.1.263/transcript.md +0 -0
  474. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/notes.md +0 -0
  475. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/server.log +0 -0
  476. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s6-response-contract/claude-code/2.1.263/transcript.md +0 -0
  477. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/notes.md +0 -0
  478. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/server.log +0 -0
  479. {amicus-0.2.0 → amicus-0.4.0}/docs/host-captures/s7-rule5-recheck/claude-code/2.1.265/transcript.md +0 -0
  480. {amicus-0.2.0 → amicus-0.4.0}/docs/kimi-help/0.41.0/FINDINGS.md +0 -0
  481. {amicus-0.2.0 → amicus-0.4.0}/docs/kimi-help/0.41.0/kimi-help.txt +0 -0
  482. {amicus-0.2.0 → amicus-0.4.0}/docs/kimi-help/0.41.0/kimi-version.txt +0 -0
  483. {amicus-0.2.0 → amicus-0.4.0}/docs/kimi-help/0.41.0/provider-list-shape.json +0 -0
  484. {amicus-0.2.0 → amicus-0.4.0}/docs/reviews/2026-09-07-agent-friendly-mcp-walk.md +0 -0
  485. {amicus-0.2.0 → amicus-0.4.0}/docs/superpowers/plans/2026-09-04-amicus-execution-model.md +0 -0
  486. {amicus-0.2.0 → amicus-0.4.0}/scripts/capture_claude_differentials.py +0 -0
  487. {amicus-0.2.0 → amicus-0.4.0}/scripts/capture_codex_differentials.py +0 -0
  488. {amicus-0.2.0 → amicus-0.4.0}/scripts/capture_kimi_differentials.py +0 -0
  489. {amicus-0.2.0 → amicus-0.4.0}/scripts/check_github_actions_pinning.py +0 -0
  490. {amicus-0.2.0 → amicus-0.4.0}/scripts/record_live_gate_evidence.py +0 -0
  491. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/independent-attempt.md +0 -0
  492. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/review-revise.md +0 -0
  493. {amicus-0.2.0 → amicus-0.4.0}/skills/collaborating-with-amicus/references/server-down-fallback.md +0 -0
  494. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/appstate.py +0 -0
  495. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/binary.py +0 -0
  496. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/claude/models.py +0 -0
  497. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/codex/options.py +0 -0
  498. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/binary.py +0 -0
  499. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/backends/kimi/options.py +0 -0
  500. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/orchestration/__init__.py +0 -0
  501. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/packaging.py +0 -0
  502. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/py.typed +0 -0
  503. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/__init__.py +0 -0
  504. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/field_policy.py +0 -0
  505. {amicus-0.2.0 → amicus-0.4.0}/src/amicus/schemas/instructions.py +0 -0
  506. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/claude_differentials.json +0 -0
  507. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/claude_golden_envelope.json +0 -0
  508. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/codex_differentials.json +0 -0
  509. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/fakebackend/pyproject.toml +0 -0
  510. {amicus-0.2.0 → amicus-0.4.0}/tests/fixtures/kimi_differentials.json +0 -0
  511. {amicus-0.2.0/tests/support → amicus-0.4.0/tests/sdk}/__init__.py +0 -0
  512. {amicus-0.2.0 → amicus-0.4.0}/tests/support/fake_claude.py +0 -0
  513. {amicus-0.2.0 → amicus-0.4.0}/tests/support/fake_codex.py +0 -0
  514. {amicus-0.2.0 → amicus-0.4.0}/tests/support/fake_kimi.py +0 -0
  515. {amicus-0.2.0 → amicus-0.4.0}/tests/test_check_github_actions_pinning.py +0 -0
  516. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_binary.py +0 -0
  517. {amicus-0.2.0 → amicus-0.4.0}/tests/test_claude_models.py +0 -0
  518. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_live.py +0 -0
  519. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_models.py +0 -0
  520. {amicus-0.2.0 → amicus-0.4.0}/tests/test_codex_plugin.py +0 -0
  521. {amicus-0.2.0 → amicus-0.4.0}/tests/test_conftest_guards.py +0 -0
  522. {amicus-0.2.0 → amicus-0.4.0}/tests/test_field_policy.py +0 -0
  523. {amicus-0.2.0 → amicus-0.4.0}/tests/test_host_captures.py +0 -0
  524. {amicus-0.2.0 → amicus-0.4.0}/tests/test_instructions.py +0 -0
  525. {amicus-0.2.0 → amicus-0.4.0}/tests/test_job_durability.py +0 -0
  526. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_binary.py +0 -0
  527. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_normalize.py +0 -0
  528. {amicus-0.2.0 → amicus-0.4.0}/tests/test_kimi_plugin.py +0 -0
  529. {amicus-0.2.0 → amicus-0.4.0}/tests/test_live_gate_report.py +0 -0
  530. {amicus-0.2.0 → amicus-0.4.0}/tests/test_live_suite_hygiene.py +0 -0
  531. {amicus-0.2.0 → amicus-0.4.0}/tests/test_options.py +0 -0
  532. {amicus-0.2.0 → amicus-0.4.0}/tests/test_prompts.py +0 -0
  533. {amicus-0.2.0 → amicus-0.4.0}/tests/test_publish.py +0 -0
  534. {amicus-0.2.0 → amicus-0.4.0}/tests/test_release_evidence.py +0 -0
  535. {amicus-0.2.0 → amicus-0.4.0}/tests/test_request.py +0 -0
  536. {amicus-0.2.0 → amicus-0.4.0}/tests/test_result_format.py +0 -0
  537. {amicus-0.2.0 → amicus-0.4.0}/tests/test_review_artifact.py +0 -0
  538. {amicus-0.2.0 → amicus-0.4.0}/tests/test_surface.py +0 -0
  539. {amicus-0.2.0 → amicus-0.4.0}/tests/test_taskmap.py +0 -0
  540. {amicus-0.2.0 → amicus-0.4.0}/tests/test_tasks_spike.py +0 -0
  541. {amicus-0.2.0 → amicus-0.4.0}/tests/test_wheel_seam.py +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "One MCP server for every second-opinion model: consult, review, and delegate with the backend as a parameter.",
5
5
  "author": { "name": "Brian Connelly", "url": "https://github.com/briandconnelly" },
6
6
  "homepage": "https://github.com/briandconnelly/amicus",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "One MCP server for every second-opinion model: consult, review, and delegate with the backend as a parameter.",
5
5
  "author": { "name": "Brian Connelly", "url": "https://github.com/briandconnelly" },
6
6
  "homepage": "https://github.com/briandconnelly/amicus",
@@ -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.
@@ -15,6 +15,17 @@ updates:
15
15
  dependency-type: "development"
16
16
  python-runtime:
17
17
  dependency-type: "production"
18
+ # pyproject.toml caps fastmcp and mcp to a minor line because fastmcp
19
+ # documents breaking changes in minor releases. Widening a cap is a
20
+ # hand-written upgrade PR (#106), so Dependabot is told not to propose the
21
+ # minor or major that would move it; patch releases inside the cap still
22
+ # arrive through the python-runtime group. `ignore` also covers security
23
+ # updates, which changes nothing: the cap already excludes those versions.
24
+ ignore:
25
+ - dependency-name: "fastmcp"
26
+ update-types: ["version-update:semver-minor", "version-update:semver-major"]
27
+ - dependency-name: "mcp"
28
+ update-types: ["version-update:semver-minor", "version-update:semver-major"]
18
29
 
19
30
  # GitHub Actions used in workflows (keeps SHA pins current).
20
31
  - package-ecosystem: "github-actions"
@@ -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
@@ -37,3 +37,20 @@ jobs:
37
37
  run: uv run lint-imports
38
38
  - name: Test (95% coverage floor)
39
39
  run: uv run pytest
40
+
41
+ marketplace-pointer:
42
+ name: marketplace pointer
43
+ # Only a pull request has a base to compare the pointer against.
44
+ if: github.event_name == 'pull_request'
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
48
+ with:
49
+ persist-credentials: false
50
+ # Full history and tags: the pointer's tag is checked, and the base commit is read.
51
+ fetch-depth: 0
52
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
53
+ - name: The marketplace pointer is consistent and never moves backwards
54
+ env:
55
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
56
+ run: uv run python scripts/check_release_state.py --base "$BASE_SHA"
@@ -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.4.0",
8
8
  "amicus-mcp"
9
9
  ],
10
10
  "env_vars": [
@@ -31,10 +31,11 @@ The rules bind; the context after them explains and points elsewhere.
31
31
  This binds amicus's own handling and everything it commits, including host captures and eval prompt bodies, which are recorded as an id and a `sha256` instead.
32
32
  A backend's own native carrier is exempt where that backend offers no alternative and the carrier is disclosed in its `CARRIERS` string and surfaced on `amicus_backends`; the two that exist today are Kimi's handshake file, because kimi ignores stdin, and Codex's `-c developer_instructions` argv token.
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
- 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.
34
+ No exemption reaches text that amicus itself, or anyone working in this repository, copies, derives or replays from a prompt anyone sent: that stays bound however it is later stored or relabelled.
35
+ A backend's answer, and the result amicus builds from it — its parsed fields and, for a delegate, the diff captured from the worktree — is output, not a prompt input, even where it quotes or paraphrases one: amicus keeps it only on the job record (`result.json`, written through a staging file in the same directory), under the job retention the tool surface discloses (`AMICUS_JOB_TTL`, the per-workspace cap, `amicus_job_consume_result`), and writes it to no log, argv or other file; what this repository commits of an answer stays bound by the sentence before this one wherever the answer repeats a prompt anyone sent.
35
36
  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` 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
+ The literals are `pyproject.toml`, `src/amicus/__init__.py`, `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json` and `.mcp.json`'s `--from` pin, which names the tag of the release being made; README's "Any other MCP client" example moves with that pin.
38
+ `.claude-plugin/marketplace.json`'s pointer is NOT one of them; rule 24 governs it, and a release must not touch it.
38
39
  `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.
39
40
  Only the maintainer merges that PR, and only the maintainer pushes the tag.
40
41
  Push the matching tag before any other work follows that merge: until it exists, `main` declares a version that has no release.
@@ -47,16 +48,20 @@ The rules bind; the context after them explains and points elsewhere.
47
48
  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.
48
49
  23. Never describe the rule-20 record, in any document or output, as proof that the live gates ran.
49
50
  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.
51
+ 24. `.claude-plugin/marketplace.json`'s plugin entry names a release that is already published, by `ref` and a `sha` equal to that tag's peeled commit, never the one being released, and it may never name a version newer than the one the tree declares.
52
+ A release PR under rule 19 leaves it untouched; advance it to the new tag in its own `chore(release):` PR after that tag is published and its install has been checked, and a release is not complete until that PR merges.
52
53
  That PR is not a release: it needs no rule-20 evidence, because it moves a pointer to a tag that already exists.
54
+ Until the 0.4.0 pointer PR merges the entry's `source` is `"./"`; for 0.4.0 only, nothing else merges to `main` between the release PR and that pointer PR.
53
55
 
54
56
  ## Context
55
57
 
56
58
  ### What this is
57
59
 
58
- One MCP server for every second-opinion model: a verb-first tool surface with the backend as a parameter, built on FastMCP and the [pontonier](https://github.com/briandconnelly/pontonier) backend SDK.
60
+ One MCP server for every second-opinion model: a verb-first tool surface with the backend as a parameter, built on FastMCP and its own in-tree backend SDK, `amicus.sdk`.
59
61
  The package is `amicus` under `src/`; each backend is a plugin under `src/amicus/backends/<id>/` behind the `BackendPlugin` seam in `src/amicus/plugin.py`.
62
+ `amicus.sdk` (under `src/amicus/sdk/`) is the backend-facing layer: the backend protocol and contract, the error vocabulary, annotations and preflight, the subprocess runtime with stream capping, redaction, path-alias sanitizing and a bounded JSON reader, and the conformance kit a plugin must pass before the registry will use it.
63
+ It was copied from [pontonier](https://github.com/briandconnelly/pontonier) v0.9.0, and amicus no longer depends on pontonier (ADR 0029).
64
+ ADR 0030 holds it to that role, so what only the server uses lives in the amicus package that owns it: the job store is `amicus.jobs`, worktrees and diff gathering are `amicus.orchestration`, and the fingerprint mechanics are `amicus.schemas.fingerprint`.
60
65
  Import boundaries between layers are enforced by the import-linter contracts in `pyproject.toml`.
61
66
  A backend's own prompt carriers (for Codex, the developer-instructions argv token and the stdin prompt) are disclosed on `amicus_backends`.
62
67
 
@@ -76,12 +81,14 @@ The README's "Where things are" table indexes the rest.
76
81
 
77
82
  ### Releases
78
83
 
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.
84
+ Users add this repository as a plugin marketplace, and a host copies the plugin into a directory keyed by `plugin.json`'s version, re-reading it only when that version changes.
85
+ ADR 0031 is shaped by that fact, established by probe on Claude Code and Codex, and it supersedes ADR 0015, which had assumed a host re-reads `.mcp.json`.
86
+ Under ADR 0015 the pin trailed the release, so an install taken before the pin-move PR, or anywhere mid-cycle, kept running an older server than its own skills (issue #117).
87
+ So `.mcp.json` names its own release, and from 0.4.0 the marketplace entry pins a published tag by `ref` and `sha`, so hosts install that self-consistent tag snapshot rather than `main`.
88
+ Until the 0.4.0 pointer PR merges, the entry is still `"./"` and hosts install `main`, which is why rule 24 bars anything else from merging during that one transition.
89
+ Rule 24's invariant, that the pointer users follow names an already-published release, moved with it from `.mcp.json` to the marketplace entry.
90
+ `sha` is required because a host serves `sha` over a disagreeing `ref` without complaint, and the `v*` ruleset's admin bypass means a tag can be moved.
91
+ `uvx` reuses a cached tool environment without querying any index, so the version in `.mcp.json`'s requirement string is still what makes an existing install pick up a new server.
85
92
  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.
86
93
  That evidence is an honest-mistake guard, not an attestation; it is a local file its author can write by hand.
87
94
  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.
@@ -101,6 +108,7 @@ Those are held by the platform controls around the release — rule 21's ruleset
101
108
  ### Siblings
102
109
 
103
110
  The sibling checkouts named in rule 17 are read for porting, and their virtualenvs are used to capture differential fixtures (`scripts/capture_codex_differentials.py` runs inside codex-in-claude's).
111
+ `~/projects/pontonier` is a sibling in the same sense: amicus no longer depends on it, its `v0.9.0` tag is where `amicus.sdk` came from, and it stays published only for the three older siblings until they are archived (ADR 0029).
104
112
 
105
113
  ### Local hooks
106
114