minima-cli 0.7.0__tar.gz → 0.7.1__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 (414) hide show
  1. minima_cli-0.7.1/.github/workflows/catalog-snapshot.yml +100 -0
  2. minima_cli-0.7.1/.github/workflows/ci.yml +69 -0
  3. {minima_cli-0.7.0 → minima_cli-0.7.1}/CHANGELOG.md +31 -0
  4. {minima_cli-0.7.0 → minima_cli-0.7.1}/PKG-INFO +1 -1
  5. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/package.json +1 -1
  6. {minima_cli-0.7.0 → minima_cli-0.7.1}/pyproject.toml +1 -1
  7. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/auth.py +26 -2
  8. minima_cli-0.7.1/src/minima/catalog/data/capability_priors.json +330 -0
  9. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/decisionlog.py +4 -1
  10. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/engine.py +18 -8
  11. minima_cli-0.7.1/src/minima/version.py +9 -0
  12. minima_cli-0.7.1/tests/integration/test_auth.py +58 -0
  13. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_recommend_api.py +43 -0
  14. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_decisionlog.py +21 -0
  15. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_records_catalog.py +27 -0
  16. {minima_cli-0.7.0 → minima_cli-0.7.1}/uv.lock +1 -1
  17. minima_cli-0.7.0/src/minima/catalog/data/capability_priors.json +0 -210
  18. minima_cli-0.7.0/src/minima/version.py +0 -3
  19. {minima_cli-0.7.0 → minima_cli-0.7.1}/.dockerignore +0 -0
  20. {minima_cli-0.7.0 → minima_cli-0.7.1}/.env.example +0 -0
  21. {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/prod.yml +0 -0
  22. {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/release-cli.yml +0 -0
  23. {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/staging.yml +0 -0
  24. {minima_cli-0.7.0 → minima_cli-0.7.1}/.gitignore +0 -0
  25. {minima_cli-0.7.0 → minima_cli-0.7.1}/AGENTS.md +0 -0
  26. {minima_cli-0.7.0 → minima_cli-0.7.1}/Dockerfile +0 -0
  27. {minima_cli-0.7.0 → minima_cli-0.7.1}/LICENSE +0 -0
  28. {minima_cli-0.7.0 → minima_cli-0.7.1}/Makefile +0 -0
  29. {minima_cli-0.7.0 → minima_cli-0.7.1}/README.md +0 -0
  30. {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/__init__.py +0 -0
  31. {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/autocapture.py +0 -0
  32. {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/client.py +0 -0
  33. {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/errors.py +0 -0
  34. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/README.md +0 -0
  35. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/agent-core-architecture.md +0 -0
  36. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/agent-core-implementation-plan.md +0 -0
  37. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/api-reference.md +0 -0
  38. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/client-sdk.md +0 -0
  39. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/concepts.md +0 -0
  40. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/configuration.md +0 -0
  41. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/examples.md +0 -0
  42. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/getting-started.md +0 -0
  43. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/goals-feature-plan.md +0 -0
  44. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/harness.md +0 -0
  45. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/multi-tenancy.md +0 -0
  46. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/operations.md +0 -0
  47. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/publishing.md +0 -0
  48. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/seeding.md +0 -0
  49. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/.dockerignore +0 -0
  50. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/Dockerfile +0 -0
  51. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Accordion.tsx +0 -0
  52. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Badge.tsx +0 -0
  53. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Card.tsx +0 -0
  54. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/CardGroup.tsx +0 -0
  55. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Frame.tsx +0 -0
  56. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Note.tsx +0 -0
  57. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/PageHeader.tsx +0 -0
  58. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Steps.tsx +0 -0
  59. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Tabs.tsx +0 -0
  60. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/index.ts +0 -0
  61. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/sidebar.ts +0 -0
  62. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/netlify.toml +0 -0
  63. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/nginx.conf +0 -0
  64. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/package-lock.json +0 -0
  65. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/package.json +0 -0
  66. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/api-reference/endpoints.mdx +0 -0
  67. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/cli.mdx +0 -0
  68. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/configuration.mdx +0 -0
  69. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/installation.mdx +0 -0
  70. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/interactive.mdx +0 -0
  71. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/overview.mdx +0 -0
  72. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/routing.mdx +0 -0
  73. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/sessions.mdx +0 -0
  74. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/tools.mdx +0 -0
  75. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/troubleshooting.mdx +0 -0
  76. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/index.mdx +0 -0
  77. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/client-sdk.mdx +0 -0
  78. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/concepts.mdx +0 -0
  79. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/examples.mdx +0 -0
  80. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/getting-started.mdx +0 -0
  81. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/favicon.png +0 -0
  82. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/logo-dark.svg +0 -0
  83. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/logo-light.svg +0 -0
  84. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/styles/global.css +0 -0
  85. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/tsconfig.json +0 -0
  86. {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/vocs.config.ts +0 -0
  87. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/01_quickstart.sh +0 -0
  88. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/02_recommend_and_feedback.py +0 -0
  89. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/03_constraints_and_tradeoff.py +0 -0
  90. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/04_workflow.py +0 -0
  91. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/05_autocapture.py +0 -0
  92. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/06_routed_llm_call.py +0 -0
  93. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/07_multitenant_admin.py +0 -0
  94. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/README.md +0 -0
  95. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_escalation.py +0 -0
  96. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_escalation_learn.py +0 -0
  97. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_gemini.py +0 -0
  98. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_retention.py +0 -0
  99. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_warmup.py +0 -0
  100. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_warmup_vary.py +0 -0
  101. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/metrics_demo.py +0 -0
  102. {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/smoke_test.py +0 -0
  103. {minima_cli-0.7.0 → minima_cli-0.7.1}/maybe.js +0 -0
  104. {minima_cli-0.7.0 → minima_cli-0.7.1}/maybe.ts +0 -0
  105. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/.gitignore +0 -0
  106. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/README.md +0 -0
  107. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/biome.json +0 -0
  108. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/bun.lock +0 -0
  109. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/build-all.ts +0 -0
  110. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/build.ts +0 -0
  111. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/install.sh +0 -0
  112. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/stub-devtools.ts +0 -0
  113. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/agent.ts +0 -0
  114. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/events.ts +0 -0
  115. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/index.ts +0 -0
  116. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/loop.ts +0 -0
  117. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/state.ts +0 -0
  118. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/tools.ts +0 -0
  119. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/compat.ts +0 -0
  120. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/events.ts +0 -0
  121. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/index.ts +0 -0
  122. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/provider_catalog.ts +0 -0
  123. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/provider_quirks.ts +0 -0
  124. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/_common.ts +0 -0
  125. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/anthropic.ts +0 -0
  126. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/base.ts +0 -0
  127. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/faux.ts +0 -0
  128. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/google.ts +0 -0
  129. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/index.ts +0 -0
  130. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/openai_compat.ts +0 -0
  131. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/registry.ts +0 -0
  132. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/stream.ts +0 -0
  133. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/types.ts +0 -0
  134. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/usage.ts +0 -0
  135. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/cli/main.ts +0 -0
  136. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/metrics.ts +0 -0
  137. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/minima_db.ts +0 -0
  138. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/rehydrate.ts +0 -0
  139. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/sink.ts +0 -0
  140. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/errtext.ts +0 -0
  141. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/index.ts +0 -0
  142. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/budget.ts +0 -0
  143. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/catalog.ts +0 -0
  144. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/client.ts +0 -0
  145. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/config.ts +0 -0
  146. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/errors.ts +0 -0
  147. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/index.ts +0 -0
  148. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/judge.ts +0 -0
  149. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/mapping.ts +0 -0
  150. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/memory.ts +0 -0
  151. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/meter.ts +0 -0
  152. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/mubit_memory_factory.ts +0 -0
  153. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/router.ts +0 -0
  154. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/runtime.ts +0 -0
  155. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/schemas.ts +0 -0
  156. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/spawn.ts +0 -0
  157. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/run_modes.ts +0 -0
  158. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/session/index.ts +0 -0
  159. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/session/store.ts +0 -0
  160. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/_io.ts +0 -0
  161. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/at_mentions.ts +0 -0
  162. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/bash.ts +0 -0
  163. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/builtin.ts +0 -0
  164. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/edit.ts +0 -0
  165. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/glob.ts +0 -0
  166. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/grep.ts +0 -0
  167. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/index.ts +0 -0
  168. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/ls.ts +0 -0
  169. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/read.ts +0 -0
  170. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/schema.ts +0 -0
  171. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/task.ts +0 -0
  172. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/todowrite.ts +0 -0
  173. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/types.ts +0 -0
  174. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/web_fetch.ts +0 -0
  175. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/write.ts +0 -0
  176. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/app.tsx +0 -0
  177. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/auth.ts +0 -0
  178. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/child_tree.tsx +0 -0
  179. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/compact.ts +0 -0
  180. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/config_store.ts +0 -0
  181. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/context.ts +0 -0
  182. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/layout.ts +0 -0
  183. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/messages.tsx +0 -0
  184. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/model-picker.tsx +0 -0
  185. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/mouse-scroll.ts +0 -0
  186. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/permissions.ts +0 -0
  187. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/projects.ts +0 -0
  188. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/routing-warnings.ts +0 -0
  189. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/status.tsx +0 -0
  190. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/text-input.tsx +0 -0
  191. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/types.d.ts +0 -0
  192. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/version.ts +0 -0
  193. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/agent.test.ts +0 -0
  194. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/ai.test.ts +0 -0
  195. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/anthropic.test.ts +0 -0
  196. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/auth.test.ts +0 -0
  197. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/budget.test.ts +0 -0
  198. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/candidate-filter.test.ts +0 -0
  199. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/catalog.test.ts +0 -0
  200. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/client.test.ts +0 -0
  201. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/config_store.test.ts +0 -0
  202. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/db.test.ts +0 -0
  203. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/effort.test.ts +0 -0
  204. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/error-ux.test.ts +0 -0
  205. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/google.test.ts +0 -0
  206. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/isolation.test.ts +0 -0
  207. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/judge.test.ts +0 -0
  208. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/ladder.test.ts +0 -0
  209. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/layout.test.ts +0 -0
  210. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/memory.test.ts +0 -0
  211. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/minima.test.ts +0 -0
  212. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/minima_memory.test.ts +0 -0
  213. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/openai_compat.test.ts +0 -0
  214. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/run_modes.test.ts +0 -0
  215. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/session.test.ts +0 -0
  216. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/spawn.test.ts +0 -0
  217. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/task.test.ts +0 -0
  218. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/thinking.test.ts +0 -0
  219. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/tools.test.ts +0 -0
  220. {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tsconfig.json +0 -0
  221. {minima_cli-0.7.0 → minima_cli-0.7.1}/packaging/homebrew/README.md +0 -0
  222. {minima_cli-0.7.0 → minima_cli-0.7.1}/packaging/homebrew/render_formula.py +0 -0
  223. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/recall_debug.jsonl +0 -0
  224. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run1.json +0 -0
  225. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run2.json +0 -0
  226. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run3.json +0 -0
  227. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/tasks.jsonl +0 -0
  228. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/REPORT.md +0 -0
  229. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/recall_debug.jsonl +0 -0
  230. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run1.json +0 -0
  231. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run2.json +0 -0
  232. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run3.json +0 -0
  233. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run4.json +0 -0
  234. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run5.json +0 -0
  235. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/summary.json +0 -0
  236. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/tasks.jsonl +0 -0
  237. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/recall_debug.jsonl +0 -0
  238. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/strategies_run1.json +0 -0
  239. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/strategies_run2.json +0 -0
  240. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/tasks.jsonl +0 -0
  241. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/REPORT.md +0 -0
  242. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/memory_audit.json +0 -0
  243. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/recall_debug.jsonl +0 -0
  244. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run1.json +0 -0
  245. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run2.json +0 -0
  246. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run3.json +0 -0
  247. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run4.json +0 -0
  248. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run5.json +0 -0
  249. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/summary.json +0 -0
  250. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/tasks.jsonl +0 -0
  251. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/REPORT.md +0 -0
  252. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/memory_audit.json +0 -0
  253. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/recall_debug.jsonl +0 -0
  254. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run1.json +0 -0
  255. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run2.json +0 -0
  256. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run3.json +0 -0
  257. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run4.json +0 -0
  258. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run5.json +0 -0
  259. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/summary.json +0 -0
  260. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/tasks.jsonl +0 -0
  261. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/memory_audit.json +0 -0
  262. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/recall_debug.jsonl +0 -0
  263. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/tasks.jsonl +0 -0
  264. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/cold_probe.json +0 -0
  265. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/summary.json +0 -0
  266. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/tasks.jsonl +0 -0
  267. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/REPORT.md +0 -0
  268. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/cold_probe.json +0 -0
  269. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/summary.json +0 -0
  270. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/tasks.jsonl +0 -0
  271. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/REPORT.md +0 -0
  272. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/results.jsonl +0 -0
  273. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/summary.json +0 -0
  274. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/_manifest.json +0 -0
  275. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/calibration.json +0 -0
  276. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/feedback.json +0 -0
  277. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/health.json +0 -0
  278. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/models.json +0 -0
  279. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/recommend.json +0 -0
  280. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/savings.json +0 -0
  281. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/strategies.json +0 -0
  282. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/workflow.json +0 -0
  283. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/REPORT.md +0 -0
  284. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/results.jsonl +0 -0
  285. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/summary.json +0 -0
  286. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/REPORT.md +0 -0
  287. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/summary.json +0 -0
  288. {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/tasks.jsonl +0 -0
  289. {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/eval/classify_dataset.json +0 -0
  290. {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/eval/eval_classify.py +0 -0
  291. {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing-web.ts +0 -0
  292. {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing.sh +0 -0
  293. {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing.ts +0 -0
  294. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/__init__.py +0 -0
  295. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/__init__.py +0 -0
  296. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/errors.py +0 -0
  297. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/__init__.py +0 -0
  298. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/calibration.py +0 -0
  299. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/capabilities.py +0 -0
  300. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/feedback.py +0 -0
  301. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/health.py +0 -0
  302. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/models.py +0 -0
  303. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/recommend.py +0 -0
  304. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/savings.py +0 -0
  305. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/strategies.py +0 -0
  306. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/__init__.py +0 -0
  307. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/data/model_aliases.json +0 -0
  308. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/merge.py +0 -0
  309. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/refresh.py +0 -0
  310. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/__init__.py +0 -0
  311. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/litellm.py +0 -0
  312. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/openrouter.py +0 -0
  313. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/store.py +0 -0
  314. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/config.py +0 -0
  315. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/deps.py +0 -0
  316. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/__init__.py +0 -0
  317. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/anthropic.py +0 -0
  318. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/base.py +0 -0
  319. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/gemini.py +0 -0
  320. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/registry.py +0 -0
  321. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/logging.py +0 -0
  322. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/main.py +0 -0
  323. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/__init__.py +0 -0
  324. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/adapter.py +0 -0
  325. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/keys.py +0 -0
  326. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/records.py +0 -0
  327. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/threadpool.py +0 -0
  328. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/__init__.py +0 -0
  329. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/calibration.py +0 -0
  330. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/report.py +0 -0
  331. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/savings.py +0 -0
  332. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/__init__.py +0 -0
  333. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/_pg_pool.py +0 -0
  334. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/_redis_client.py +0 -0
  335. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/aggregate.py +0 -0
  336. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/classify.py +0 -0
  337. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/durablerefs.py +0 -0
  338. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/escalation.py +0 -0
  339. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/propensity.py +0 -0
  340. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/recstore.py +0 -0
  341. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/score.py +0 -0
  342. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/types.py +0 -0
  343. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/__init__.py +0 -0
  344. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/capabilities.py +0 -0
  345. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/common.py +0 -0
  346. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/feedback.py +0 -0
  347. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/models_catalog.py +0 -0
  348. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/recommend.py +0 -0
  349. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/savings.py +0 -0
  350. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/strategies.py +0 -0
  351. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/workflow.py +0 -0
  352. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/__init__.py +0 -0
  353. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/items.py +0 -0
  354. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/llmrouterbench.py +0 -0
  355. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/routerbench.py +0 -0
  356. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/run_seed.py +0 -0
  357. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/synthetic.py +0 -0
  358. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/__init__.py +0 -0
  359. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/context.py +0 -0
  360. {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/passthrough.py +0 -0
  361. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/__init__.py +0 -0
  362. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/conftest.py +0 -0
  363. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/BENCHMARKS.md +0 -0
  364. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/CRITERIA.md +0 -0
  365. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/RESULTS.md +0 -0
  366. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/__init__.py +0 -0
  367. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/harness.py +0 -0
  368. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/llmrouterbench_config.py +0 -0
  369. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/prompt_length_benchmark.py +0 -0
  370. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/test_llmrouterbench_savings.py +0 -0
  371. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/test_routerbench_savings.py +0 -0
  372. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/factories.py +0 -0
  373. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_escalation_reasoner.py +0 -0
  374. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_feedback_loop.py +0 -0
  375. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_lesson_promotion.py +0 -0
  376. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_measurement_api.py +0 -0
  377. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_observed_cost_ranking.py +0 -0
  378. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_strategies_api.py +0 -0
  379. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_workflow_models_health.py +0 -0
  380. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_cost_savings_spotcheck_live.py +0 -0
  381. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_escalation_fixes.py +0 -0
  382. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_full_surface_live.py +0 -0
  383. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_mubit_roundtrip.py +0 -0
  384. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_phase3_live.py +0 -0
  385. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_reasoner_live.py +0 -0
  386. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_recall_params_live.py +0 -0
  387. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_aggregate.py +0 -0
  388. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_aggregate_decay.py +0 -0
  389. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_autocapture.py +0 -0
  390. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_calibration_fit.py +0 -0
  391. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_capabilities.py +0 -0
  392. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_classify_benchmark.py +0 -0
  393. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_classify_keys.py +0 -0
  394. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_cluster.py +0 -0
  395. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_collapse_guard.py +0 -0
  396. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_cost_band.py +0 -0
  397. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_escalation.py +0 -0
  398. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_exploration.py +0 -0
  399. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_ipw.py +0 -0
  400. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_iterations.py +0 -0
  401. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_latency_quality.py +0 -0
  402. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_lever_cost.py +0 -0
  403. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_metrics.py +0 -0
  404. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_metrics_demo.py +0 -0
  405. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_neighbor_classify.py +0 -0
  406. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_prompt_length_benchmark.py +0 -0
  407. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_reasoner.py +0 -0
  408. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_recstore_sqlite.py +0 -0
  409. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_score.py +0 -0
  410. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_shadow_bandit.py +0 -0
  411. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_store_backends.py +0 -0
  412. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_strategies.py +0 -0
  413. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_tenancy.py +0 -0
  414. {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_thompson.py +0 -0
@@ -0,0 +1,100 @@
1
+ name: Catalog — refresh vendored snapshot
2
+
3
+ # Keeps the vendored cold-start model catalog fresh so it stops drifting by hand.
4
+ #
5
+ # WHAT/WHY: src/minima/catalog/data/capability_priors.json is the cold-start
6
+ # fallback the server loads when the live cost feed (LiteLLM/OpenRouter) is
7
+ # unreachable — see src/minima/catalog/store.py (load_snapshot_cards) and the
8
+ # /v1/models router. It used to be hand-maintained and drifted stale (e.g.
9
+ # missing the gpt-5 family). This job pulls the *live* served catalog from
10
+ # api.minima.sh/v1/models — the source-of-truth that already merges curated
11
+ # capability priors with live cost — normalizes it (via jq) into the EXACT
12
+ # shape the loader reads, and opens a PR only when it actually changed.
13
+ #
14
+ # We deliberately DO NOT commit straight to main and DO NOT hand-edit the JSON:
15
+ # a reviewer sees the diff, and the automation (not a human) keeps it current.
16
+ on:
17
+ schedule:
18
+ - cron: "17 6 * * *" # daily (~every 24h); minute offset avoids the top-of-hour rush
19
+ workflow_dispatch: {}
20
+
21
+ concurrency:
22
+ group: catalog-snapshot
23
+ cancel-in-progress: false
24
+
25
+ # Least privilege: only what's needed to push a chore branch and open a PR.
26
+ permissions:
27
+ contents: write
28
+ pull-requests: write
29
+
30
+ env:
31
+ # Source-of-truth: the live served catalog. Override via repo/environment var
32
+ # CATALOG_SOURCE_URL if the prod host ever changes.
33
+ CATALOG_URL: ${{ vars.CATALOG_SOURCE_URL || 'https://api.minima.sh/v1/models' }}
34
+ SNAPSHOT_PATH: src/minima/catalog/data/capability_priors.json
35
+ BRANCH: chore/catalog-snapshot-auto
36
+
37
+ jobs:
38
+ refresh:
39
+ name: Fetch live catalog → PR if changed
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - name: Checkout
43
+ uses: actions/checkout@v5
44
+
45
+ - name: Fetch + normalize live catalog into the vendored snapshot shape
46
+ run: |
47
+ set -euo pipefail
48
+ # /v1/models returns {models:[ModelCard...], catalog_version, stale}.
49
+ # ModelCard is a superset of the snapshot object, so we project it back
50
+ # to the exact fields load_snapshot_cards() reads and drop the runtime
51
+ # metadata (cost_source/cost_fetched_at/cost_stale/capability_source),
52
+ # which the loader always re-stamps as "fallback-snapshot".
53
+ curl -fsSL --retry 3 --retry-delay 5 --max-time 60 "$CATALOG_URL" -o live.json
54
+
55
+ count="$(jq '.models | length' live.json)"
56
+ if [ "$count" -lt 5 ]; then
57
+ echo "::error::live catalog returned only $count models (<5); refusing to overwrite snapshot"
58
+ exit 1
59
+ fi
60
+
61
+ version="fallback-snapshot-$(date -u +%Y-%m)"
62
+ note="Cold-start fallback only. Auto-refreshed by .github/workflows/catalog-snapshot.yml from the live /v1/models catalog — do not hand-edit. Live cost is overlaid from LiteLLM/OpenRouter at runtime; capability_by_task_type are normalized [0,1] heuristic priors, corrected by accumulated memory. Prices are approximate USD per million tokens."
63
+
64
+ jq \
65
+ --arg version "$version" \
66
+ --arg note "$note" '{
67
+ version: $version,
68
+ note: $note,
69
+ models: (.models | sort_by(.model_id) | map({
70
+ model_id, provider, display_name,
71
+ input_cost_per_mtok, output_cost_per_mtok, cache_read_cost_per_mtok,
72
+ supports_prompt_caching, context_window, max_output_tokens,
73
+ capability_priors, capability_by_task_type
74
+ }))
75
+ }' live.json > "$SNAPSHOT_PATH.tmp"
76
+ mv "$SNAPSHOT_PATH.tmp" "$SNAPSHOT_PATH"
77
+ rm -f live.json
78
+ echo "Normalized $count models into $SNAPSHOT_PATH"
79
+
80
+ - name: Commit + open PR only if the snapshot changed
81
+ env:
82
+ GH_TOKEN: ${{ github.token }}
83
+ run: |
84
+ set -euo pipefail
85
+ if git diff --quiet -- "$SNAPSHOT_PATH"; then
86
+ echo "Snapshot already up to date; nothing to do."
87
+ exit 0
88
+ fi
89
+
90
+ git config user.name "github-actions[bot]"
91
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
92
+ git checkout -B "$BRANCH"
93
+ git add "$SNAPSHOT_PATH"
94
+ git commit -m "chore(catalog): refresh vendored model snapshot from live /v1/models"
95
+ git push -u origin "$BRANCH" --force-with-lease
96
+
97
+ gh pr create --base main --head "$BRANCH" \
98
+ --title "chore(catalog): refresh vendored model snapshot" \
99
+ --body "Automated refresh of \`$SNAPSHOT_PATH\` from the live catalog at \`$CATALOG_URL\` (normalized to the loader's shape). Opened by \`.github/workflows/catalog-snapshot.yml\`. Review the diff — this is the cold-start fallback the server serves when the live cost feed is unreachable." \
100
+ || echo "PR already open for $BRANCH; pushed update."
@@ -0,0 +1,69 @@
1
+ name: CI — PR checks
2
+
3
+ # Gate on every PR to main (and on push to main) with the exact local test
4
+ # conventions: server (ruff + offline pytest) and TUI (bun test + tsc). Two
5
+ # independent jobs so a red on one surfaces without masking the other. No
6
+ # deploy, no secrets — the suites are offline (`-m "not live and not eval"`).
7
+ # mypy runs after ruff/pytest: src/minima is now type-clean, so it gates too.
8
+ on:
9
+ pull_request:
10
+ branches: [main]
11
+ push:
12
+ branches: [main]
13
+
14
+ concurrency:
15
+ group: ci-${{ github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ env:
22
+ BUN_VERSION: "1.3.14"
23
+
24
+ jobs:
25
+ server:
26
+ name: Server — ruff + pytest + mypy
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - name: Checkout
30
+ uses: actions/checkout@v5
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v6
34
+
35
+ - name: Sync deps (dev extra)
36
+ run: uv sync --extra dev
37
+
38
+ - name: Ruff
39
+ run: uv run ruff check src client_sdk tests
40
+
41
+ - name: Pytest (offline)
42
+ run: uv run pytest -m "not live and not eval" -q
43
+
44
+ - name: Mypy
45
+ run: uv run mypy src/minima
46
+
47
+ tui:
48
+ name: TUI — bun test + tsc
49
+ runs-on: ubuntu-latest
50
+ defaults:
51
+ run:
52
+ working-directory: packages/tui
53
+ steps:
54
+ - name: Checkout
55
+ uses: actions/checkout@v5
56
+
57
+ - name: Set up Bun
58
+ uses: oven-sh/setup-bun@v2
59
+ with:
60
+ bun-version: ${{ env.BUN_VERSION }}
61
+
62
+ - name: Install deps
63
+ run: bun install --frozen-lockfile
64
+
65
+ - name: Test
66
+ run: bun test
67
+
68
+ - name: Typecheck
69
+ run: bun run check
@@ -4,6 +4,37 @@ All notable changes to Minima are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/), and the project aims to follow
5
5
  [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [0.7.1] - 2026-07-05
8
+
9
+ ### Changed (API behavior — note for integrators)
10
+ - **`max_cost_per_call` is now a true hard filter.** When no model fits the budget,
11
+ `POST /v1/recommend` returns **422** (`"no model within max_cost_per_call budget"`)
12
+ instead of 200 with the cheapest over-budget model plus a `no_model_within_cost_budget`
13
+ warning. This matches the documented "hard filter" contract and the existing
14
+ no-candidates behavior. Callers who want "cheapest possible regardless of ceiling"
15
+ should use the cost-quality slider, not `max_cost_per_call`.
16
+ - **Auth rejects malformed bearer tokens.** A bearer token that is not in the Mubit key
17
+ format (`mbt_…`) now returns **401** before any work, instead of being accepted and
18
+ served from priors. A missing bearer with a server-configured `MUBIT_API_KEY` fallback
19
+ is unaffected.
20
+
21
+ ### Fixed
22
+ - **Cold-start catalog prices were stale.** The vendored fallback snapshot
23
+ (`capability_priors.json`) is refreshed from the live catalog (e.g. `claude-opus-4-8`
24
+ `15/75` → `5/25`), and a scheduled workflow now keeps it current so it stops drifting
25
+ by hand. (The auto-refresh updates prices for the curated model list; it does not add
26
+ new models — expanded provider coverage such as the gpt-5 family remains a separate
27
+ curation.)
28
+ - **Server version string can no longer drift.** `minima.__version__` (reported by
29
+ `/v1/health` and `/v1/capabilities`) now derives from installed package metadata instead
30
+ of a hardcoded constant that had silently lagged across releases.
31
+ - **Feedback reconciliation types the quality value honestly** as `float | None` — unjudged
32
+ rows keep `NULL`, no fabricated default (preserves the M-J2 fix).
33
+
34
+ ### Internal
35
+ - **PR CI added** — every PR now runs server (`ruff` + `pytest` + `mypy`) and TUI
36
+ (`bun test` + `tsc`) checks; the recommender is mypy-clean.
37
+
7
38
  ## [0.7.0] - 2026-07-05
8
39
 
9
40
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: minima-cli
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: Minima CLI: cost-aware LLM model routing — recommend cheaper models, backed by Mubit memory.
5
5
  Project-URL: Homepage, https://docs.minima.sh
6
6
  Project-URL: Documentation, https://docs.minima.sh
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minima-tui",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Minima harness + TUI — the `minima` CLI (TypeScript/Ink; successor to the removed Python harness). Talks to the Python FastAPI recommender service over the /v1/* contract.",
5
5
  "type": "module",
6
6
  "license": "FSL-1.1-Apache-2.0",
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
7
7
  # package stays `minima`. This package ships the server + client SDK only; the `minima` CLI
8
8
  # is the TypeScript binary installed via Homebrew (brew tap mubit-ai/minima).
9
9
  name = "minima-cli"
10
- version = "0.7.0"
10
+ version = "0.7.1"
11
11
  description = "Minima CLI: cost-aware LLM model routing — recommend cheaper models, backed by Mubit memory."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.11"
@@ -20,6 +20,20 @@ def bearer_key(request: Request) -> str | None:
20
20
  return None
21
21
 
22
22
 
23
+ def is_mubit_key_format(key: str) -> bool:
24
+ """Cheap client-side shape check for a canonical Mubit key.
25
+
26
+ Canonical keys are ``mbt_<instance>_...`` (see tenancy.passthrough._org_id). This is
27
+ a front-door format gate only — it rejects tokens that clearly are not Mubit keys
28
+ (e.g. ``not-a-key``) before any work is done, without a Mubit round-trip. It does NOT
29
+ authenticate the key; a well-formed key still resolves normally (and works offline
30
+ from local priors). Kept deliberately permissive to avoid locking out real callers:
31
+ the only requirement is an ``mbt_`` prefix followed by a non-empty instance segment.
32
+ """
33
+ prefix, sep, rest = key.partition("_")
34
+ return prefix == "mbt" and sep == "_" and bool(rest)
35
+
36
+
23
37
  def configured_key(request: Request) -> str | None:
24
38
  settings = getattr(request.app.state, "settings", None)
25
39
  key = getattr(settings, "mubit_api_key", None)
@@ -27,7 +41,14 @@ def configured_key(request: Request) -> str | None:
27
41
 
28
42
 
29
43
  async def get_tenant(request: Request) -> TenantContext:
30
- key = bearer_key(request) or configured_key(request)
44
+ token = bearer_key(request)
45
+ if token is not None and not is_mubit_key_format(token):
46
+ raise ApiError(
47
+ 401,
48
+ "Unauthorized",
49
+ "Authorization bearer token is not a valid Mubit API key (expected 'mbt_...' format)",
50
+ )
51
+ key = token or configured_key(request)
31
52
  if not key:
32
53
  raise ApiError(
33
54
  401,
@@ -39,7 +60,10 @@ async def get_tenant(request: Request) -> TenantContext:
39
60
 
40
61
  async def get_tenant_optional(request: Request) -> TenantContext | None:
41
62
  """Like get_tenant but returns None instead of 401 (for health probes)."""
42
- key = bearer_key(request) or configured_key(request)
63
+ token = bearer_key(request)
64
+ if token is not None and not is_mubit_key_format(token):
65
+ return None
66
+ key = token or configured_key(request)
43
67
  if not key:
44
68
  return None
45
69
  return request.app.state.passthrough_runtime.resolve(key)
@@ -0,0 +1,330 @@
1
+ {
2
+ "version": "fallback-snapshot-2026-07",
3
+ "note": "Cold-start fallback only.",
4
+ "models": [
5
+ {
6
+ "model_id": "claude-haiku-4-5",
7
+ "provider": "anthropic",
8
+ "display_name": "Claude Haiku 4.5",
9
+ "input_cost_per_mtok": 1.0,
10
+ "output_cost_per_mtok": 5.0,
11
+ "cache_read_cost_per_mtok": 0.09999999999999999,
12
+ "supports_prompt_caching": true,
13
+ "context_window": 200000,
14
+ "max_output_tokens": 64000,
15
+ "capability_priors": {
16
+ "intelligence_index": 0.5
17
+ },
18
+ "capability_by_task_type": {
19
+ "code": 0.7,
20
+ "summarization": 0.85,
21
+ "extraction": 0.88,
22
+ "qa": 0.8,
23
+ "reasoning": 0.6,
24
+ "classification": 0.9,
25
+ "translation": 0.85,
26
+ "creative": 0.75,
27
+ "rag": 0.82,
28
+ "tool_use": 0.75,
29
+ "other": 0.72
30
+ }
31
+ },
32
+ {
33
+ "model_id": "claude-opus-4-8",
34
+ "provider": "anthropic",
35
+ "display_name": "Claude Opus 4.8",
36
+ "input_cost_per_mtok": 5.0,
37
+ "output_cost_per_mtok": 25.0,
38
+ "cache_read_cost_per_mtok": 0.5,
39
+ "supports_prompt_caching": true,
40
+ "context_window": 1000000,
41
+ "max_output_tokens": 64000,
42
+ "capability_priors": {
43
+ "intelligence_index": 0.95
44
+ },
45
+ "capability_by_task_type": {
46
+ "code": 0.96,
47
+ "summarization": 0.93,
48
+ "extraction": 0.94,
49
+ "qa": 0.95,
50
+ "reasoning": 0.97,
51
+ "classification": 0.95,
52
+ "translation": 0.93,
53
+ "creative": 0.94,
54
+ "rag": 0.94,
55
+ "tool_use": 0.95,
56
+ "other": 0.93
57
+ }
58
+ },
59
+ {
60
+ "model_id": "claude-sonnet-4-6",
61
+ "provider": "anthropic",
62
+ "display_name": "Claude Sonnet 4.6",
63
+ "input_cost_per_mtok": 3.0,
64
+ "output_cost_per_mtok": 15.0,
65
+ "cache_read_cost_per_mtok": 0.3,
66
+ "supports_prompt_caching": true,
67
+ "context_window": 1000000,
68
+ "max_output_tokens": 64000,
69
+ "capability_priors": {
70
+ "intelligence_index": 0.72
71
+ },
72
+ "capability_by_task_type": {
73
+ "code": 0.88,
74
+ "summarization": 0.9,
75
+ "extraction": 0.92,
76
+ "qa": 0.9,
77
+ "reasoning": 0.85,
78
+ "classification": 0.93,
79
+ "translation": 0.9,
80
+ "creative": 0.88,
81
+ "rag": 0.9,
82
+ "tool_use": 0.9,
83
+ "other": 0.86
84
+ }
85
+ },
86
+ {
87
+ "model_id": "gemini-2.5-flash",
88
+ "provider": "google",
89
+ "display_name": "Gemini 2.5 Flash",
90
+ "input_cost_per_mtok": 0.3,
91
+ "output_cost_per_mtok": 2.5,
92
+ "cache_read_cost_per_mtok": 0.03,
93
+ "supports_prompt_caching": true,
94
+ "context_window": 1048576,
95
+ "max_output_tokens": 65536,
96
+ "capability_priors": {
97
+ "intelligence_index": 0.55
98
+ },
99
+ "capability_by_task_type": {
100
+ "code": 0.74,
101
+ "summarization": 0.88,
102
+ "extraction": 0.88,
103
+ "qa": 0.82,
104
+ "reasoning": 0.66,
105
+ "classification": 0.9,
106
+ "translation": 0.88,
107
+ "creative": 0.78,
108
+ "rag": 0.86,
109
+ "tool_use": 0.8,
110
+ "other": 0.76
111
+ }
112
+ },
113
+ {
114
+ "model_id": "gemini-2.5-flash-lite",
115
+ "provider": "google",
116
+ "display_name": "Gemini 2.5 Flash-Lite",
117
+ "input_cost_per_mtok": 0.09999999999999999,
118
+ "output_cost_per_mtok": 0.39999999999999997,
119
+ "cache_read_cost_per_mtok": 0.01,
120
+ "supports_prompt_caching": true,
121
+ "context_window": 1048576,
122
+ "max_output_tokens": 65536,
123
+ "capability_priors": {
124
+ "intelligence_index": 0.4
125
+ },
126
+ "capability_by_task_type": {
127
+ "code": 0.62,
128
+ "summarization": 0.8,
129
+ "extraction": 0.84,
130
+ "qa": 0.74,
131
+ "reasoning": 0.5,
132
+ "classification": 0.86,
133
+ "translation": 0.82,
134
+ "creative": 0.68,
135
+ "rag": 0.78,
136
+ "tool_use": 0.68,
137
+ "other": 0.64
138
+ }
139
+ },
140
+ {
141
+ "model_id": "gemini-2.5-pro",
142
+ "provider": "google",
143
+ "display_name": "Gemini 2.5 Pro",
144
+ "input_cost_per_mtok": 1.25,
145
+ "output_cost_per_mtok": 10.0,
146
+ "cache_read_cost_per_mtok": 0.125,
147
+ "supports_prompt_caching": true,
148
+ "context_window": 1048576,
149
+ "max_output_tokens": 65536,
150
+ "capability_priors": {
151
+ "intelligence_index": 0.8
152
+ },
153
+ "capability_by_task_type": {
154
+ "code": 0.9,
155
+ "summarization": 0.92,
156
+ "extraction": 0.92,
157
+ "qa": 0.91,
158
+ "reasoning": 0.88,
159
+ "classification": 0.93,
160
+ "translation": 0.92,
161
+ "creative": 0.89,
162
+ "rag": 0.91,
163
+ "tool_use": 0.9,
164
+ "other": 0.88
165
+ }
166
+ },
167
+ {
168
+ "model_id": "gemini-3-flash-preview",
169
+ "provider": "google",
170
+ "display_name": "Gemini 3 Flash (Preview)",
171
+ "input_cost_per_mtok": 0.5,
172
+ "output_cost_per_mtok": 3.0,
173
+ "cache_read_cost_per_mtok": 0.049999999999999996,
174
+ "supports_prompt_caching": true,
175
+ "context_window": 1048576,
176
+ "max_output_tokens": 65536,
177
+ "capability_priors": {
178
+ "intelligence_index": 0.62
179
+ },
180
+ "capability_by_task_type": {
181
+ "code": 0.8,
182
+ "summarization": 0.87,
183
+ "extraction": 0.88,
184
+ "qa": 0.83,
185
+ "reasoning": 0.7,
186
+ "classification": 0.9,
187
+ "translation": 0.87,
188
+ "creative": 0.8,
189
+ "rag": 0.85,
190
+ "tool_use": 0.84,
191
+ "other": 0.78
192
+ }
193
+ },
194
+ {
195
+ "model_id": "gemini-3.1-flash-lite",
196
+ "provider": "google",
197
+ "display_name": "Gemini 3.1 Flash-Lite",
198
+ "input_cost_per_mtok": 0.25,
199
+ "output_cost_per_mtok": 1.5,
200
+ "cache_read_cost_per_mtok": 0.024999999999999998,
201
+ "supports_prompt_caching": true,
202
+ "context_window": 1048576,
203
+ "max_output_tokens": 65536,
204
+ "capability_priors": {
205
+ "intelligence_index": 0.48
206
+ },
207
+ "capability_by_task_type": {
208
+ "code": 0.68,
209
+ "summarization": 0.83,
210
+ "extraction": 0.86,
211
+ "qa": 0.78,
212
+ "reasoning": 0.58,
213
+ "classification": 0.88,
214
+ "translation": 0.84,
215
+ "creative": 0.72,
216
+ "rag": 0.8,
217
+ "tool_use": 0.72,
218
+ "other": 0.68
219
+ }
220
+ },
221
+ {
222
+ "model_id": "gemini-3.1-pro-preview",
223
+ "provider": "google",
224
+ "display_name": "Gemini 3.1 Pro (Preview)",
225
+ "input_cost_per_mtok": 2.0,
226
+ "output_cost_per_mtok": 12.0,
227
+ "cache_read_cost_per_mtok": 0.19999999999999998,
228
+ "supports_prompt_caching": true,
229
+ "context_window": 1048576,
230
+ "max_output_tokens": 65536,
231
+ "capability_priors": {
232
+ "intelligence_index": 0.9
233
+ },
234
+ "capability_by_task_type": {
235
+ "code": 0.93,
236
+ "summarization": 0.93,
237
+ "extraction": 0.93,
238
+ "qa": 0.93,
239
+ "reasoning": 0.95,
240
+ "classification": 0.94,
241
+ "translation": 0.93,
242
+ "creative": 0.91,
243
+ "rag": 0.93,
244
+ "tool_use": 0.92,
245
+ "other": 0.91
246
+ }
247
+ },
248
+ {
249
+ "model_id": "gemini-3.5-flash",
250
+ "provider": "google",
251
+ "display_name": "Gemini 3.5 Flash",
252
+ "input_cost_per_mtok": 1.5,
253
+ "output_cost_per_mtok": 9.0,
254
+ "cache_read_cost_per_mtok": 0.15,
255
+ "supports_prompt_caching": true,
256
+ "context_window": 1048576,
257
+ "max_output_tokens": 65536,
258
+ "capability_priors": {
259
+ "intelligence_index": 0.65
260
+ },
261
+ "capability_by_task_type": {
262
+ "code": 0.85,
263
+ "summarization": 0.88,
264
+ "extraction": 0.9,
265
+ "qa": 0.84,
266
+ "reasoning": 0.72,
267
+ "classification": 0.91,
268
+ "translation": 0.88,
269
+ "creative": 0.82,
270
+ "rag": 0.87,
271
+ "tool_use": 0.88,
272
+ "other": 0.8
273
+ }
274
+ },
275
+ {
276
+ "model_id": "gpt-4o",
277
+ "provider": "openai",
278
+ "display_name": "GPT-4o",
279
+ "input_cost_per_mtok": 2.5,
280
+ "output_cost_per_mtok": 10.0,
281
+ "cache_read_cost_per_mtok": 1.25,
282
+ "supports_prompt_caching": true,
283
+ "context_window": 128000,
284
+ "max_output_tokens": 16384,
285
+ "capability_priors": {
286
+ "intelligence_index": 0.7
287
+ },
288
+ "capability_by_task_type": {
289
+ "code": 0.85,
290
+ "summarization": 0.9,
291
+ "extraction": 0.9,
292
+ "qa": 0.89,
293
+ "reasoning": 0.82,
294
+ "classification": 0.92,
295
+ "translation": 0.9,
296
+ "creative": 0.87,
297
+ "rag": 0.89,
298
+ "tool_use": 0.89,
299
+ "other": 0.85
300
+ }
301
+ },
302
+ {
303
+ "model_id": "gpt-4o-mini",
304
+ "provider": "openai",
305
+ "display_name": "GPT-4o mini",
306
+ "input_cost_per_mtok": 0.15,
307
+ "output_cost_per_mtok": 0.6,
308
+ "cache_read_cost_per_mtok": 0.075,
309
+ "supports_prompt_caching": true,
310
+ "context_window": 128000,
311
+ "max_output_tokens": 16384,
312
+ "capability_priors": {
313
+ "intelligence_index": 0.45
314
+ },
315
+ "capability_by_task_type": {
316
+ "code": 0.68,
317
+ "summarization": 0.84,
318
+ "extraction": 0.86,
319
+ "qa": 0.78,
320
+ "reasoning": 0.55,
321
+ "classification": 0.9,
322
+ "translation": 0.83,
323
+ "creative": 0.72,
324
+ "rag": 0.8,
325
+ "tool_use": 0.72,
326
+ "other": 0.7
327
+ }
328
+ }
329
+ ]
330
+ }
@@ -119,7 +119,10 @@ class Reconciliation:
119
119
 
120
120
  model_id: str
121
121
  outcome: str
122
- quality: float
122
+ # None for UNJUDGED feedback (judged=False): never fabricate a quality for
123
+ # rows the harness didn't judge (M-J2). _apply stores it straight through to
124
+ # DecisionRecord.realized_quality, which is likewise `float | None` (NULL).
125
+ quality: float | None
123
126
  cost_usd: float | None = None
124
127
  latency_ms: int | None = None
125
128
  ts: float = 0.0
@@ -108,11 +108,17 @@ class Recommender:
108
108
  warnings: list[str] = []
109
109
 
110
110
  classification = classify_details(req.task)
111
+ # classify_details always populates `profile`; bind it locally so the type
112
+ # checker sees a non-None ClassificationProfile (narrowing on the attribute
113
+ # is otherwise dropped across the awaits below). Mutations still apply to the
114
+ # same object, so behavior is unchanged.
115
+ class_profile = classification.profile
116
+ assert class_profile is not None
111
117
  task_type = classification.task_type
112
118
  difficulty = classification.difficulty
113
119
  profile.mark("classify")
114
- classification.profile.final_task_type = task_type
115
- classification.profile.final_difficulty = difficulty
120
+ class_profile.final_task_type = task_type
121
+ class_profile.final_difficulty = difficulty
116
122
  signature = (
117
123
  salient_signature(req.task.task, settings.minima_cluster_signature_tokens)
118
124
  if settings.minima_cluster_granularity.lower() == "fine"
@@ -152,16 +158,16 @@ class Recommender:
152
158
  [(ev.record.task_type, ev.score) for ev in evidence if ev.record is not None]
153
159
  )
154
160
  if neighbor_estimate is not None:
155
- classification.profile.neighbor_support = neighbor_estimate.neighbor_support
156
- classification.profile.neighbor_count = neighbor_estimate.neighbor_count
161
+ class_profile.neighbor_support = neighbor_estimate.neighbor_support
162
+ class_profile.neighbor_count = neighbor_estimate.neighbor_count
157
163
  if (
158
164
  neighbor_estimate.task_type != task_type
159
- and classification.profile.caller_task_type is None
165
+ and class_profile.caller_task_type is None
160
166
  and task_type == TaskType.other
161
167
  ):
162
168
  task_type = neighbor_estimate.task_type
163
- classification.profile.task_type_source = "neighbor_vote"
164
- classification.profile.final_task_type = task_type
169
+ class_profile.task_type_source = "neighbor_vote"
170
+ class_profile.final_task_type = task_type
165
171
  cluster = task_cluster(task_type, difficulty, signature)
166
172
  warnings.append("neighbor_classified")
167
173
  profile.mark("neighbor_classify")
@@ -224,7 +230,11 @@ class Recommender:
224
230
  if affordable:
225
231
  scored = affordable
226
232
  else:
227
- warnings.append("no_model_within_cost_budget")
233
+ # max_cost_per_call is a hard filter: if no model fits the budget the
234
+ # eligible set is empty, which is the same "nothing fits" condition as an
235
+ # impossible candidate/exclusion set — surface it as the same 422 instead
236
+ # of serving an over-budget model.
237
+ raise NoCandidatesError("no model within max_cost_per_call budget")
228
238
 
229
239
  if req.constraints.max_latency_ms is not None:
230
240
  # Only exclude candidates with OBSERVED latency evidence above the budget —