minima-cli 0.8.0__tar.gz → 0.10.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.
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.gitignore +9 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/CHANGELOG.md +81 -1
- minima_cli-0.10.0/CLAUDE.md +104 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/PKG-INFO +1 -1
- minima_cli-0.10.0/bench/.gitignore +1 -0
- minima_cli-0.10.0/bench/README.md +374 -0
- minima_cli-0.10.0/bench/assert/check.ts +41 -0
- minima_cli-0.10.0/bench/assert/db.ts +74 -0
- minima_cli-0.10.0/bench/driver/env.ts +92 -0
- minima_cli-0.10.0/bench/driver/headless.ts +54 -0
- minima_cli-0.10.0/bench/driver/mock_server.ts +138 -0
- minima_cli-0.10.0/bench/driver/rig.ts +253 -0
- minima_cli-0.10.0/bench/driver/scratch.ts +57 -0
- minima_cli-0.10.0/bench/fixtures/templates/_example/mathx.py +11 -0
- minima_cli-0.10.0/bench/fixtures/templates/_example/tests/test_public.py +9 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/README.md +29 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/package.json +10 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/src/csv.ts +205 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/src/index.ts +55 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/src/object.ts +253 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/src/stats.ts +156 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/src/transform.ts +138 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/tests/csv.test.ts +100 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/tests/object.test.ts +108 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/tests/stats.test.ts +80 -0
- minima_cli-0.10.0/bench/fixtures/templates/js-lib/tests/transform.test.ts +114 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/README.md +15 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/js/chunk.js +25 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/js/droot.js +24 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/js/duration.js +27 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/js/wrap.js +29 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/py/checksum.py +27 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/py/intervals.py +24 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/py/rle.py +27 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/py/roman.py +21 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/js/chunk/smoke.test.js +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/js/droot/smoke.test.js +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/js/duration/smoke.test.js +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/js/wrap/smoke.test.js +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/py/conftest.py +8 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/py/test_checksum_smoke.py +5 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/py/test_intervals_smoke.py +5 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/py/test_rle_smoke.py +5 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/py/test_roman_smoke.py +5 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/ts/brackets/smoke.test.ts +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/ts/drift/smoke.test.ts +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/ts/ordinal/smoke.test.ts +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/tests/ts/slug/smoke.test.ts +6 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/ts/brackets.ts +25 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/ts/drift.ts +26 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/ts/ordinal.ts +22 -0
- minima_cli-0.10.0/bench/fixtures/templates/katas/ts/slug.ts +23 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/.gitignore +3 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/README.md +35 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/pytest.ini +3 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/__init__.py +20 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/__main__.py +8 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/cli.py +247 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/dates.py +94 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/migrations.py +109 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/models.py +193 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/query.py +178 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/report.py +211 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/taskman/storage.py +110 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/__init__.py +1 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/conftest.py +48 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_cli.py +169 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_dates.py +61 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_models.py +120 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_query.py +173 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_report.py +125 -0
- minima_cli-0.10.0/bench/fixtures/templates/py-cli/tests/test_storage.py +148 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/README.md +41 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/package.json +9 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/app.ts +127 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/auth.ts +76 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/errors.ts +27 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/handlers/admin.ts +53 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/handlers/links.ts +114 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/handlers/notes.ts +67 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/handlers/stats.ts +45 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/persist.ts +152 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/ratelimit.ts +92 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/respond.ts +20 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/router.ts +90 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/server.ts +67 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/store.ts +310 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/types.ts +96 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/src/validate.ts +219 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/auth.test.ts +46 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/health.test.ts +18 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/helpers.ts +58 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/links.test.ts +153 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/notes.test.ts +88 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/persist.test.ts +95 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/ratelimit.test.ts +51 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/router.test.ts +34 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/stats.test.ts +59 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/store.test.ts +75 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tests/validate.test.ts +72 -0
- minima_cli-0.10.0/bench/fixtures/templates/ts-api/tsconfig.json +12 -0
- minima_cli-0.10.0/bench/flows/f10_recovery_ladder.ts +93 -0
- minima_cli-0.10.0/bench/flows/f12_learning_loop.ts +228 -0
- minima_cli-0.10.0/bench/flows/f1_headless.ts +178 -0
- minima_cli-0.10.0/bench/flows/f4_cost_budget.ts +152 -0
- minima_cli-0.10.0/bench/flows/f5_task_dag_worktree.ts +114 -0
- minima_cli-0.10.0/bench/flows/f6_resume_lineage.ts +144 -0
- minima_cli-0.10.0/bench/flows/f7_permissions_plan.ts +202 -0
- minima_cli-0.10.0/bench/flows/f9_offline_reconnect.ts +116 -0
- minima_cli-0.10.0/bench/gen/attempt.ts +214 -0
- minima_cli-0.10.0/bench/gen/build_index.ts +78 -0
- minima_cli-0.10.0/bench/gen/calibrate.ts +92 -0
- minima_cli-0.10.0/bench/gen/calibrate_all.ts +114 -0
- minima_cli-0.10.0/bench/gen/calibration_report.ts +98 -0
- minima_cli-0.10.0/bench/gen/materialize.ts +126 -0
- minima_cli-0.10.0/bench/gen/savings_ab.ts +119 -0
- minima_cli-0.10.0/bench/gen/savings_report.ts +105 -0
- minima_cli-0.10.0/bench/gen/validate_task.ts +125 -0
- minima_cli-0.10.0/bench/run.ts +52 -0
- minima_cli-0.10.0/bench/tasks/_example/ex-001/bug.patch +10 -0
- minima_cli-0.10.0/bench/tasks/_example/ex-001/hidden_tests.patch +21 -0
- minima_cli-0.10.0/bench/tasks/_example/ex-001/task.json +13 -0
- minima_cli-0.10.0/bench/tasks/calibration.jsonl +330 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-001/bug.patch +14 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-001/hidden_tests.patch +22 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-001/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-002/bug.patch +13 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-002/hidden_tests.patch +22 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-002/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-003/bug.patch +42 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-003/hidden_tests.patch +55 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-003/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-004/bug.patch +48 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-004/hidden_tests.patch +37 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-004/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-005/hidden_tests.patch +36 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-005/oracle.patch +68 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-005/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-006/bug.patch +102 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-006/hidden_tests.patch +46 -0
- minima_cli-0.10.0/bench/tasks/js-lib/jl-006/task.json +13 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-001/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-001/oracle.patch +24 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-001/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-002/hidden_tests.patch +39 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-002/oracle.patch +27 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-002/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-003/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-003/oracle.patch +21 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-003/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-004/hidden_tests.patch +35 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-004/oracle.patch +28 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-004/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-005/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-005/oracle.patch +29 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-005/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-006/hidden_tests.patch +33 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-006/oracle.patch +15 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-006/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-007/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-007/oracle.patch +22 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-007/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-008/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-008/oracle.patch +27 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-008/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-009/hidden_tests.patch +40 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-009/oracle.patch +22 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-009/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-010/hidden_tests.patch +42 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-010/oracle.patch +34 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-010/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-011/hidden_tests.patch +46 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-011/oracle.patch +16 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-011/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-012/hidden_tests.patch +41 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-012/oracle.patch +26 -0
- minima_cli-0.10.0/bench/tasks/katas/ka-012/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-001/bug.patch +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-001/hidden_tests.patch +31 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-001/task.json +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-002/bug.patch +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-002/hidden_tests.patch +31 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-002/task.json +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-003/bug.patch +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-003/hidden_tests.patch +34 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-003/task.json +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-004/bug.patch +24 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-004/hidden_tests.patch +45 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-004/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-005/bug.patch +37 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-005/hidden_tests.patch +38 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-005/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-006/bug.patch +24 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-006/hidden_tests.patch +39 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-006/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-007/bug.patch +89 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-007/hidden_tests.patch +84 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-007/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-008/bug.patch +13 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-008/hidden_tests.patch +37 -0
- minima_cli-0.10.0/bench/tasks/py-cli/pc-008/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/savings_ab.jsonl +66 -0
- minima_cli-0.10.0/bench/tasks/tasks.jsonl +33 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-001/hidden_tests.patch +41 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-001/oracle.patch +31 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-001/task.json +12 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-002/hidden_tests.patch +68 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-002/oracle.patch +68 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-002/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-003/hidden_tests.patch +67 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-003/oracle.patch +105 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-003/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-004/bug.patch +24 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-004/hidden_tests.patch +42 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-004/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-005/bug.patch +21 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-005/hidden_tests.patch +51 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-005/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-006/bug.patch +27 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-006/hidden_tests.patch +49 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-006/task.json +14 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-007/bug.patch +27 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-007/hidden_tests.patch +79 -0
- minima_cli-0.10.0/bench/tasks/ts-api/ta-007/task.json +15 -0
- minima_cli-0.10.0/docs/ground-truth-build-guide.md +535 -0
- minima_cli-0.10.0/docs/ground-truth-tui-plan.md +730 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/README.md +4 -2
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/package.json +1 -1
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/agent.ts +69 -10
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/loop.ts +102 -13
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/faux.ts +22 -2
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/google.ts +4 -1
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/stream.ts +17 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/cli/main.ts +51 -10
- minima_cli-0.10.0/packages/tui/src/db/minima_db.ts +1133 -0
- minima_cli-0.10.0/packages/tui/src/minima/behavior.ts +138 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/budget.ts +20 -1
- minima_cli-0.10.0/packages/tui/src/minima/check.ts +308 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/client.ts +10 -3
- minima_cli-0.10.0/packages/tui/src/minima/confidence.ts +16 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/config.ts +20 -0
- minima_cli-0.10.0/packages/tui/src/minima/ground_truth.ts +1011 -0
- minima_cli-0.10.0/packages/tui/src/minima/gt_contract.ts +99 -0
- minima_cli-0.10.0/packages/tui/src/minima/gt_factors.ts +331 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/index.ts +22 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/judge.ts +18 -1
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/meter.ts +18 -0
- minima_cli-0.10.0/packages/tui/src/minima/plan_council.ts +912 -0
- minima_cli-0.10.0/packages/tui/src/minima/plan_session.ts +506 -0
- minima_cli-0.10.0/packages/tui/src/minima/plan_turn.ts +165 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/router.ts +7 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/runtime.ts +158 -30
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/spawn.ts +21 -1
- minima_cli-0.10.0/packages/tui/src/minima/why.ts +158 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/run_modes.ts +8 -0
- minima_cli-0.10.0/packages/tui/src/tools/_ddg.ts +245 -0
- minima_cli-0.10.0/packages/tui/src/tools/_search.ts +79 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/bash.ts +6 -5
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/builtin.ts +7 -1
- minima_cli-0.10.0/packages/tui/src/tools/todowrite.ts +92 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/web_fetch.ts +10 -6
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/web_search.ts +10 -7
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/app.tsx +873 -122
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/child_tree.tsx +17 -4
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/layout.ts +171 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/messages.tsx +21 -7
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/permissions.ts +116 -5
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/routing-warnings.ts +4 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/text-input.tsx +13 -4
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/agent.test.ts +153 -0
- minima_cli-0.10.0/packages/tui/tests/bash-group.test.ts +56 -0
- minima_cli-0.10.0/packages/tui/tests/behavior.test.ts +399 -0
- minima_cli-0.10.0/packages/tui/tests/check.test.ts +346 -0
- minima_cli-0.10.0/packages/tui/tests/confidence.test.ts +74 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/db.test.ts +8 -1
- minima_cli-0.10.0/packages/tui/tests/db_migrate.test.ts +122 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/error-ux.test.ts +2 -0
- minima_cli-0.10.0/packages/tui/tests/feedback-grounded.test.ts +255 -0
- minima_cli-0.10.0/packages/tui/tests/gate.test.ts +836 -0
- minima_cli-0.10.0/packages/tui/tests/ground_truth.test.ts +912 -0
- minima_cli-0.10.0/packages/tui/tests/grounded.test.ts +307 -0
- minima_cli-0.10.0/packages/tui/tests/gt-attribution.test.ts +206 -0
- minima_cli-0.10.0/packages/tui/tests/gt-contract.test.ts +104 -0
- minima_cli-0.10.0/packages/tui/tests/gt-e2e.test.ts +335 -0
- minima_cli-0.10.0/packages/tui/tests/gt-footer.test.ts +76 -0
- minima_cli-0.10.0/packages/tui/tests/gt_factors.test.ts +211 -0
- minima_cli-0.10.0/packages/tui/tests/hooks.test.ts +245 -0
- minima_cli-0.10.0/packages/tui/tests/judge-cost-booking.test.ts +219 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/judge.test.ts +31 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/ladder.test.ts +182 -2
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/layout.test.ts +233 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/minima.test.ts +49 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/minima_memory.test.ts +52 -0
- minima_cli-0.10.0/packages/tui/tests/permissions.test.ts +324 -0
- minima_cli-0.10.0/packages/tui/tests/plan_council.test.ts +709 -0
- minima_cli-0.10.0/packages/tui/tests/plan_session.test.ts +566 -0
- minima_cli-0.10.0/packages/tui/tests/plan_turn.test.ts +218 -0
- minima_cli-0.10.0/packages/tui/tests/recall-user-id.test.ts +87 -0
- minima_cli-0.10.0/packages/tui/tests/resume-gt.test.ts +116 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/run_modes.test.ts +50 -4
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/tools.test.ts +120 -4
- minima_cli-0.10.0/packages/tui/tests/why.test.ts +154 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/pyproject.toml +1 -1
- {minima_cli-0.8.0 → minima_cli-0.10.0}/uv.lock +1 -1
- minima_cli-0.8.0/packages/tui/src/db/minima_db.ts +0 -442
- minima_cli-0.8.0/packages/tui/src/tools/todowrite.ts +0 -65
- minima_cli-0.8.0/packages/tui/tests/permissions.test.ts +0 -128
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.dockerignore +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.env.example +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.github/workflows/catalog-snapshot.yml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.github/workflows/ci.yml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.github/workflows/prod.yml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.github/workflows/release-cli.yml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/.github/workflows/staging.yml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/AGENTS.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/Dockerfile +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/LICENSE +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/Makefile +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/README.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/client_sdk/minima_client/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/client_sdk/minima_client/autocapture.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/client_sdk/minima_client/client.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/client_sdk/minima_client/errors.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/README.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/agent-core-architecture.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/agent-core-implementation-plan.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/api-reference.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/client-sdk.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/concepts.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/configuration.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/examples.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/feature-gap-analysis.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/getting-started.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/goals-feature-plan.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/harness.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/multi-tenancy.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/operations.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/publishing.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs/seeding.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/.dockerignore +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/Dockerfile +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Accordion.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Badge.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Card.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/CardGroup.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Frame.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Note.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/PageHeader.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Steps.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/Tabs.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/components/sidebar.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/netlify.toml +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/nginx.conf +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/package-lock.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/package.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/api-reference/endpoints.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/cli.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/configuration.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/installation.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/interactive.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/overview.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/routing.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/sessions.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/tools.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/harness/troubleshooting.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/index.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/sdk/client-sdk.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/sdk/concepts.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/sdk/examples.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/pages/sdk/getting-started.mdx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/public/images/favicon.png +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/public/images/logo-dark.svg +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/public/images/logo-light.svg +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/public/styles/global.css +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/tsconfig.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/docs-site/vocs.config.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/01_quickstart.sh +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/02_recommend_and_feedback.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/03_constraints_and_tradeoff.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/04_workflow.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/05_autocapture.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/06_routed_llm_call.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/07_multitenant_admin.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/README.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_escalation.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_escalation_learn.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_gemini.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_retention.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_warmup.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/agent_warmup_vary.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/metrics_demo.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/examples/smoke_test.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/maybe.js +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/maybe.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/.gitignore +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/biome.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/bun.lock +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/scripts/build-all.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/scripts/build.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/scripts/install.sh +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/scripts/pty_capture.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/scripts/stub-devtools.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/events.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/state.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/agent/tools.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/compat.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/events.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/provider_catalog.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/provider_quirks.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/_common.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/anthropic.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/base.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/providers/openai_compat.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/registry.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/types.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/ai/usage.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/db/metrics.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/db/rehydrate.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/db/sink.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/errtext.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/catalog.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/errors.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/mapping.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/memory.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/mubit_memory_factory.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/minima/schemas.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/session/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/session/store.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/_exa.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/_io.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/apply_patch.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/at_mentions.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/edit.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/glob.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/grep.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/index.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/ls.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/question.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/read.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/schema.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/task.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/types.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tools/write.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/auth.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/busy.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/compact.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/config_store.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/context.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/current_action.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/model-picker.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/mouse-scroll.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/projects.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/status.tsx +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/tui/tips.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/types.d.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/src/version.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/ai.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/anthropic.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/apply_patch.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/auth.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/budget.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/busy.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/candidate-filter.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/catalog.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/client.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/config_store.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/current_action.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/effort.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/google.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/isolation.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/memory.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/mouse-scroll.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/openai_compat.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/render-buffer.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/session.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/spawn.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/task.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/thinking.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tests/tips.test.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packages/tui/tsconfig.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packaging/homebrew/README.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/packaging/homebrew/render_formula.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_125009/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_125009/strategies_run1.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_125009/strategies_run2.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_125009/strategies_run3.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_125009/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/strategies_run1.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/strategies_run2.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/strategies_run3.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/strategies_run4.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/strategies_run5.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_130252/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_182838/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_182838/strategies_run1.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_182838/strategies_run2.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_182838/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/memory_audit.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/strategies_run1.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/strategies_run2.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/strategies_run3.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/strategies_run4.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/strategies_run5.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260612_183343/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/memory_audit.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/strategies_run1.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/strategies_run2.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/strategies_run3.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/strategies_run4.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/strategies_run5.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260615_101732/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260624_103307/memory_audit.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260624_103307/recall_debug.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/20260624_103307/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_133108/cold_probe.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_133108/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_133108/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_134209/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_134209/cold_probe.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_134209/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalate_20260615_134209/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalation_20260612_201825/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalation_20260612_201825/results.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/escalation_20260612_201825/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/_manifest.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/calibration.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/feedback.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/health.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/models.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/recommend.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/savings.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/strategies.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/playground_p1/workflow.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/retention_20260612_201828/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/retention_20260612_201828/results.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/retention_20260612_201828/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/warmupvary_20260615_123818/REPORT.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/warmupvary_20260615_123818/summary.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/runs/warmupvary_20260615_123818/tasks.jsonl +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/scripts/eval/classify_dataset.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/scripts/eval/eval_classify.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/scripts/test-routing-web.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/scripts/test-routing.sh +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/scripts/test-routing.ts +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/auth.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/errors.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/calibration.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/capabilities.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/feedback.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/health.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/models.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/recommend.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/savings.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/api/routers/strategies.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/data/capability_priors.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/data/model_aliases.json +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/merge.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/refresh.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/sources/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/sources/litellm.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/sources/openrouter.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/catalog/store.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/config.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/deps.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/llm/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/llm/anthropic.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/llm/base.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/llm/gemini.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/llm/registry.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/logging.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/main.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/memory/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/memory/adapter.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/memory/keys.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/memory/records.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/memory/threadpool.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/metrics/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/metrics/calibration.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/metrics/report.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/metrics/savings.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/_pg_pool.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/_redis_client.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/aggregate.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/classify.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/decisionlog.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/durablerefs.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/engine.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/escalation.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/propensity.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/recstore.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/score.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/recommender/types.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/capabilities.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/common.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/feedback.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/models_catalog.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/recommend.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/savings.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/strategies.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/schemas/workflow.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/items.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/llmrouterbench.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/routerbench.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/run_seed.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/seeding/synthetic.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/tenancy/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/tenancy/context.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/tenancy/passthrough.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/src/minima/version.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/conftest.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/BENCHMARKS.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/CRITERIA.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/RESULTS.md +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/__init__.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/harness.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/llmrouterbench_config.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/prompt_length_benchmark.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/test_llmrouterbench_savings.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/eval/test_routerbench_savings.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/factories.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_auth.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_escalation_reasoner.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_feedback_loop.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_lesson_promotion.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_measurement_api.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_observed_cost_ranking.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_recommend_api.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_strategies_api.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/integration/test_workflow_models_health.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_cost_savings_spotcheck_live.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_escalation_fixes.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_full_surface_live.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_mubit_roundtrip.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_phase3_live.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_reasoner_live.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/live/test_recall_params_live.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_aggregate.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_aggregate_decay.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_autocapture.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_calibration_fit.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_capabilities.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_classify_benchmark.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_classify_keys.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_cluster.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_collapse_guard.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_cost_band.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_decisionlog.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_escalation.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_exploration.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_ipw.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_iterations.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_latency_quality.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_lever_cost.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_metrics.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_metrics_demo.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_neighbor_classify.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_prompt_length_benchmark.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_reasoner.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_records_catalog.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_recstore_sqlite.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_score.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_shadow_bandit.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_store_backends.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_strategies.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_tenancy.py +0 -0
- {minima_cli-0.8.0 → minima_cli-0.10.0}/tests/unit/test_thompson.py +0 -0
|
@@ -4,7 +4,87 @@ 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
|
+
## [0.10.0] - 2026-07-12
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **Ground-truth spine hardened end-to-end** (still opt-in via `MINIMA_TUI_GROUND_TRUTH=1`):
|
|
11
|
+
- Gate verdicts now carry the `rec_id` of the turn that minted them, so grounded
|
|
12
|
+
feedback can never be poisoned by a stale gate from an earlier prompt, and a
|
|
13
|
+
blocked step's red verdict is superseded by its retry (content-first flip
|
|
14
|
+
identity). Plans close when their last flip is verified, instead of haunting
|
|
15
|
+
every later turn.
|
|
16
|
+
- Step identity survives rewording (token-set matching), a step's baseline resets
|
|
17
|
+
when its `verify` command changes (no fabricated red→green), and resuming a run
|
|
18
|
+
re-adopts its active plan.
|
|
19
|
+
- Bash writes and sub-agent writes are attributed to the run; unattributed
|
|
20
|
+
("blind") writes cap confidence at 🟡 instead of silently passing.
|
|
21
|
+
- Check runner: verify commands run in their own process group and are killed as a
|
|
22
|
+
group on timeout/abort (no orphaned children), run under a minimal env allowlist,
|
|
23
|
+
and honor `MINIMA_TUI_CHECK_TIMEOUT`.
|
|
24
|
+
- `/plan` council: injected findings are fenced as untrusted data, the whole plan
|
|
25
|
+
turn aborts cleanly on Esc (partial research kept), and each council round is
|
|
26
|
+
budget-metered ($0.25/round soft cap).
|
|
27
|
+
- **Default path** (no flag required): the SQLite migration runner is race-safe across
|
|
28
|
+
concurrent sessions and self-heals a previously wedged DB; a bash tool timeout/abort
|
|
29
|
+
kills the whole process group; a throwing after-hook no longer wedges the agent loop;
|
|
30
|
+
the `task` tool is blocked in plan mode.
|
|
31
|
+
- Gate-focus modal: keyboard verdict overrides (approve / reject / steer with a note)
|
|
32
|
+
reach the correct gate, and the TUI footer/overlay no longer overflow on narrow
|
|
33
|
+
terminals.
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- With `MINIMA_LLM_JUDGE=1`, judge grading spend is now booked to the session wallet —
|
|
37
|
+
visible in `/cost` (as `judge overhead`), the footer, and enforced by `--budget` —
|
|
38
|
+
while staying out of feedback's `actual_cost_usd` so the cost model Minima learns
|
|
39
|
+
from stays clean.
|
|
40
|
+
|
|
41
|
+
## [0.9.0] - 2026-07-10
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- **Ground-Truth verification spine (experimental, opt-in via `MINIMA_TUI_GROUND_TRUTH=1`)** —
|
|
45
|
+
the agent's plan steps can carry `verify` shell commands; the harness runs them
|
|
46
|
+
(pre-work baseline → done-gate red→green), records every verdict in the SQLite ledger,
|
|
47
|
+
and derives a confidence tier that drives the UI (🟢 glide / 🟡 flag / 🔴 stop) plus
|
|
48
|
+
grounded, deterministic-over-judge feedback to Minima. Includes `/why` (inspect why the
|
|
49
|
+
harness trusts/distrusts a step), a plan footer strip, and red-gate override capture.
|
|
50
|
+
Off by default — with the flag unset the CLI behaves exactly as 0.8.x.
|
|
51
|
+
- **`/plan` planning workflow (part of the same experimental gate)** — a planner persona
|
|
52
|
+
plus a design council of sub-agents that researches, drafts, critiques, and synthesizes
|
|
53
|
+
a `GROUND_TRUTH.md` design document (`/plan start · status · finalize · cancel`).
|
|
54
|
+
Without the flag, `/plan` stays the read-only toggle it always was.
|
|
55
|
+
- Permission hardening for verify commands: every LLM-authored `verify` is shown verbatim
|
|
56
|
+
in the approval overlay (with an explicit "… +N more lines" marker when truncated), and
|
|
57
|
+
a stored "always allow" on todowrite never covers a verify command the user hasn't seen.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
- Transcript rendering is memoized (windowing + `memo()` message rows, render-time ref
|
|
61
|
+
mutations moved to effects) — typing no longer re-renders the whole transcript per
|
|
62
|
+
keystroke.
|
|
63
|
+
- Repo-root `CLAUDE.md` added (agent-facing repo guide).
|
|
64
|
+
|
|
65
|
+
## [0.8.0] - 2026-07-07
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
- **Learning loop now takes effect** — the client sends a stable `user_id` on every
|
|
69
|
+
recommend, so Minima's memory recall actually surfaces your prior outcomes and routing
|
|
70
|
+
can move off the cold-start prior. Previously no `user_id` was sent, so server-side
|
|
71
|
+
recall was always empty and `decision_basis` never left `prior`.
|
|
72
|
+
- **Esc reliably aborts** — pressing Esc now cancels during the routing/recommend phase
|
|
73
|
+
too (it was a no-op there, so the model still ran), and an aborted turn no longer leaves
|
|
74
|
+
a dangling message that made the next prompt re-answer the previous one.
|
|
75
|
+
- **Web search/fetch work without an Exa key** — `web_search` and `web_fetch` fall back to
|
|
76
|
+
DuckDuckGo when `EXA_API_KEY` is unset (they previously failed at call time); with a key
|
|
77
|
+
set they still prefer Exa.
|
|
78
|
+
- **Rendering** — long lines (routing warnings, reasoning, tool output) are clipped inside
|
|
79
|
+
their bordered cells instead of drawing past the border; the `escalation_suggested`
|
|
80
|
+
internal hint is no longer leaked into the info line; the question and `/tree` overlays
|
|
81
|
+
reserve their height so they can't corrupt terminal scrollback.
|
|
82
|
+
|
|
83
|
+
### Changed
|
|
84
|
+
- Learning-loop write failures are now surfaced — a muted `ℹ learning loop: …` line in the
|
|
85
|
+
TUI and a `feedback_error` event in `--mode json` — instead of being silently swallowed.
|
|
86
|
+
|
|
87
|
+
## [0.7.2] - 2026-07-06
|
|
8
88
|
|
|
9
89
|
### Added (TUI)
|
|
10
90
|
- **Fullscreen renderer (new default)** — alternate screen buffer with the prompt glued
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What this repo is
|
|
6
|
+
|
|
7
|
+
A Python service + client SDK, and a separate TypeScript harness:
|
|
8
|
+
|
|
9
|
+
- **`src/minima/`** — Minima: a **recommend-only** LLM cost-optimization service (FastAPI, Python 3.11+). It never proxies, runs, or caches an LLM call. It answers "which model should I run for this task?" and learns from the outcome you report back. Memory is backed by [Mubit](https://docs.mubit.ai) and is the *only* external dependency of the core recommender. Hosted at `api.minima.sh`; deployed from GitHub releases (publishing a release triggers the prod deploy AND the CLI binary build).
|
|
10
|
+
- **`client_sdk/minima_client/`** — bundled sync + async Python client. Ships in the same wheel as `src/minima` (`minima-cli` on PyPI).
|
|
11
|
+
- **`packages/tui/`** — `minima-tui`: the **active harness** — a TypeScript/Ink agent runtime + TUI run on **Bun** (`bun:sqlite`, `>=1.2`). This is the `minima` CLI users install via Homebrew (`brew tap mubit-ai/minima`). Same `route → run → judge → feedback` loop against the `/v1/*` contract, with its own SQLite persistence spine (`src/db/minima_db.ts`, event-sourced, WAL, append-only migrations) and a `BudgetLedger`. Separate toolchain — not part of the Python wheel or `uv`. The version of record is `packages/tui/package.json` (kept in lockstep with `pyproject.toml`).
|
|
12
|
+
|
|
13
|
+
### The Minima loop (respect this everywhere)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
recommend -> run the model yourself -> judge quality -> feedback
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Minima never runs the model. Feedback MUST carry realized `input_tokens` / `output_tokens` / `actual_cost_usd` / `latency_ms` so the cost basis can climb `estimate -> observed -> rescaled` — the single biggest accuracy lever. Do **not** echo Minima's own `est_cost_usd` back as the actual cost. Outcome thresholds: `success >= 0.8`, `partial >= 0.4`, else `failure`.
|
|
20
|
+
|
|
21
|
+
## Commands
|
|
22
|
+
|
|
23
|
+
`uv` is the package manager for the Python side. Common targets (see `Makefile`):
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
make install # uv sync --extra dev
|
|
27
|
+
make run # local Minima on :8080 (uvicorn, --reload); interactive docs at /docs
|
|
28
|
+
make test # unit + integration, hermetic/offline: pytest -m "not live and not eval"
|
|
29
|
+
make lint # ruff check + mypy src/minima
|
|
30
|
+
make fmt # ruff check --fix + ruff format
|
|
31
|
+
make live # pytest -m live — needs a running Mubit (make run-mubit in the Mubit repo)
|
|
32
|
+
make eval # pytest -m eval — slow offline RouterBench savings evaluation
|
|
33
|
+
make seed # minima-seed (LIMIT=, LANE= overridable) — load cold-start memory
|
|
34
|
+
uv run pytest tests/unit/test_foo.py::test_bar # single test
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Test markers (`pyproject.toml`): `live` = requires a running Mubit; `eval` = slow offline RouterBench. Default `make test`/`pytest` excludes both.
|
|
38
|
+
|
|
39
|
+
The **TypeScript harness** (`packages/tui/`) has its own Bun toolchain (also exposed as `make tui-*` targets):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cd packages/tui && bun install
|
|
43
|
+
bun test # hermetic (mock fetch + faux provider + in-process mock service)
|
|
44
|
+
bun run check # tsc --noEmit
|
|
45
|
+
bun run lint # biome check src
|
|
46
|
+
bun run format # biome format --write src
|
|
47
|
+
bun run build # -> dist/minima native binary (bun build --compile)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Testing constraints (important)
|
|
51
|
+
|
|
52
|
+
- **Offline tests MUST stay hermetic.** `tests/conftest.py` has an autouse fixture that neutralizes `.env` — never rely on ambient credentials in a non-`live` test.
|
|
53
|
+
- For service tests: `tests/factories.py:FakeMemory` + `create_app(...)` + `TestClient` gives a full in-process app with no Mubit.
|
|
54
|
+
- For TUI tests: register a faux provider/model and mock `fetch` — see existing `packages/tui/tests/*.test.ts` for the pattern. No test may hit the network or spend money.
|
|
55
|
+
|
|
56
|
+
## Conventions
|
|
57
|
+
|
|
58
|
+
Python (`src/minima`):
|
|
59
|
+
|
|
60
|
+
- `from __future__ import annotations` at the top of every module.
|
|
61
|
+
- Pydantic v2 `BaseModel` for serializable schemas; `@dataclass(slots=True)` for internal types; `StrEnum` for enums; `Protocol` for seams (`Memory`, `Reasoner`, `QualityJudge`).
|
|
62
|
+
- Async-first. Bridge sync SDKs (Mubit) off the event loop via `anyio`/threadpools.
|
|
63
|
+
- Logging: `structlog` via `get_logger("minima.<sub>")`.
|
|
64
|
+
- ruff `line-length=100`, target `py311`, lint set `E,F,I,UP,B,C4`. **Never break the hot path**: bookkeeping/feedback failures are logged-and-swallowed.
|
|
65
|
+
|
|
66
|
+
TypeScript (`packages/tui`): biome for lint/format, strict tsc, Bun APIs (`bun:sqlite`, `Bun.write`) are fine. **Do NOT add the `openai` SDK** — the OpenAI-compatible provider speaks raw HTTP. Routing must stay bypassable (offline/no-Minima still works, with no feedback sent).
|
|
67
|
+
|
|
68
|
+
- **No comments unless asked.** Match existing style.
|
|
69
|
+
|
|
70
|
+
## Architecture — the service (`src/minima/`)
|
|
71
|
+
|
|
72
|
+
Request flow (`api/routers/recommend.py` → `recommender/engine.py`):
|
|
73
|
+
|
|
74
|
+
1. **classify** (`recommender/classify.py`) — derives task features/type from the prompt (regex + signal tables).
|
|
75
|
+
2. **recall** (`memory/adapter.py`) — the *only* Mubit touchpoint; pulls similar past `task → model → outcome` records using Mubit's server-side embeddings (no local embedding model).
|
|
76
|
+
3. **aggregate + score** (`recommender/aggregate.py`, `score.py`) — ranks candidates by *real* cost. The cost basis is one of three tiers chosen for the whole candidate set: `estimate` (catalog prices, cold start) → `observed` (median realized $/call) → `rescaled` (this request's input priced + observed output behavior).
|
|
77
|
+
4. **escalation** (`recommender/escalation.py`) — when memory is thin/conflicting, optionally consult a cheap-LLM reasoner (`llm/`, off by default, `MINIMA_REASONER_PROVIDER`).
|
|
78
|
+
5. **feedback** (`api/routers/feedback.py`) — writes the outcome back to Mubit, reinforcing memory.
|
|
79
|
+
|
|
80
|
+
Other packages: `catalog/` (model cost + capability priors), `tenancy/` (multi-tenant runtime — many orgs, per-org Mubit, one deployment; auth is pass-through: the client's Mubit key IS the credential), `seeding/` (`minima-seed` CLI for cold-start history), `schemas/` (Pydantic request/response models — the wire source of truth; every field must also land in the TS mirror `packages/tui/src/minima/schemas.ts`).
|
|
81
|
+
|
|
82
|
+
Everything external is behind a Protocol so it can be faked in tests. The server stack (fastapi/uvicorn/psycopg2/redis) lives in the `[server]` extra — the core recommender + client is dependency-light on purpose.
|
|
83
|
+
|
|
84
|
+
## Architecture — the harness (`packages/tui/`)
|
|
85
|
+
|
|
86
|
+
`MinimaAgent.promptRouted(task)` = **route** (`src/minima/router.ts` → `POST /v1/recommend`) → **run** (agent loop in `src/agent/`, streams the model, executes tools, before/afterToolCall hook stacks, abort via AbortSignal) → **judge** (`src/minima/judge.ts`, abstains unless `MINIMA_LLM_JUDGE=1`) → **feed back** (`POST /v1/feedback` with realized cost). Layers: `src/ai/` (multi-provider LLM API + `faux` test provider) · `src/agent/` (loop, tools, hooks) · `src/minima/` (router, runtime, meter, budget, spawn/sub-agents, ground truth) · `src/tools/` (bash/edit/read/write/grep/todowrite/websearch…) · `src/tui/` (Ink app) · `src/db/` (SQLite spine).
|
|
87
|
+
|
|
88
|
+
**Ground-Truth verification spine** (shipped 2026-07, `docs/ground-truth-build-guide.md`): behind `MINIMA_TUI_GROUND_TRUTH=1` (**off by default — the default path must behave exactly as before**). When on: plan steps carry `verify` shell commands, the harness runs them (baseline → done-gate red→green), verdicts land in the `gates` ledger (migrations v3–v5), a confidence tier drives the UI (🟢 glide / 🟡 flag / 🔴 stop), and grounded outcomes stamp `routing_decisions` for deterministic-over-judge feedback. `/plan` (planner persona + design council + `GROUND_TRUTH.md` output) is part of this gate. Anything that changes default-path behavior does NOT belong behind guidance text — gate it on `config.groundTruth`.
|
|
89
|
+
|
|
90
|
+
Design principles that constrain any work in this direction:
|
|
91
|
+
|
|
92
|
+
- **State in the DB, projections in the context** — anything that must survive scroll/compaction/restart/a lying model lives in the ledger; the model sees only a compact re-injected projection.
|
|
93
|
+
- **Enforcement in the dispatcher, guidance in the prompt** — plan/permission/gate guarantees are enforced by harness code at tool-dispatch or turn boundaries, never by prompt text (which is bypassable).
|
|
94
|
+
- **Feedback truth** — realized usage only; no fabricated quality (gate verdict → outcome label only; judge abstention stays `null`); `verified_in_production` only from user/repo/ci-origin gates, never agent-authored ones.
|
|
95
|
+
- **Recommend-only server stands** — plan state is never server-authoritative.
|
|
96
|
+
- **Append-only migrations** (shipped batch strings never edited) · **`rec_id` discipline** as the sole local↔server↔Mubit join key · **propensity integrity** (no client-side re-ranking; pins are pre-request candidate assembly, never post-hoc overrides).
|
|
97
|
+
|
|
98
|
+
## Entry points
|
|
99
|
+
|
|
100
|
+
Python (`pyproject.toml [project.scripts]`): `minima-seed` · `minima-calibration-report`. Server app: `minima.main:app`. The `minima` CLI/TUI is NOT a Python entry point — it is the compiled Bun binary from `packages/tui`, distributed via Homebrew.
|
|
101
|
+
|
|
102
|
+
## Docs
|
|
103
|
+
|
|
104
|
+
Deep docs live in `docs/` (concepts, api-reference, configuration, multi-tenancy, operations, seeding, ground-truth-build-guide). All service config is via environment variables — see `.env.example` and `docs/configuration.md`; the only required value (single-tenant mode) is `MUBIT_API_KEY`. Never commit `.env`/`.env.harness`; never print secret values.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: minima-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
artifacts/
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
# bench/ — Minima harness scripted test flows
|
|
2
|
+
|
|
3
|
+
Scripted end-to-end flows that drive the **installed** `minima` binary (Homebrew, currently
|
|
4
|
+
0.7.1) the way a user would — headless one-shots and full interactive PTY sessions — and
|
|
5
|
+
assert on the artifacts the harness actually produces: the SQLite DB, the transcript, git
|
|
6
|
+
state, and server responses. Born from the 2026-07-06 demo/test-flow research plan
|
|
7
|
+
(14-agent inventory + web research + 3 designs + 2 adversarial critiques).
|
|
8
|
+
|
|
9
|
+
## Why this exists
|
|
10
|
+
|
|
11
|
+
We want to demo every Minima harness feature and regression-test the full loop
|
|
12
|
+
(recommend → run → judge → feedback → memory) with **long conversational sessions on
|
|
13
|
+
disposable test dirs**, one session id per flow. No such infrastructure existed: the repo
|
|
14
|
+
had only in-process bun tests (faux provider) and two live smoke scripts.
|
|
15
|
+
|
|
16
|
+
## Layout
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
bench/
|
|
20
|
+
driver/
|
|
21
|
+
rig.ts PTY rig — spawns the TUI in a real pseudo-terminal via Bun.spawn
|
|
22
|
+
{terminal} (Bun >= 1.3.5), accumulates output, regex wait/assert,
|
|
23
|
+
types + submits prompts and slash commands
|
|
24
|
+
headless.ts one-shot runner for --print / --mode json invocations
|
|
25
|
+
mock_server.ts scripted /v1 Minima server (recommend/feedback/models/capabilities)
|
|
26
|
+
with full request capture — makes offline/reconnect + ladder flows
|
|
27
|
+
deterministic and free
|
|
28
|
+
assert/
|
|
29
|
+
db.ts readonly bun:sqlite helpers over the harness DB
|
|
30
|
+
(runs / routing_decisions / budgets / budget_events / tool_calls)
|
|
31
|
+
check.ts assertion collector → per-flow PASS/FAIL report
|
|
32
|
+
flows/
|
|
33
|
+
f1_headless.ts F1: headless CLI battery (exit codes, routed/pinned/offline
|
|
34
|
+
rows, JSON-event contract, budget deny)
|
|
35
|
+
f9_offline_reconnect.ts F9: offline fallback → mock server comes up → /reconnect →
|
|
36
|
+
routed=server (deterministic, no config writes)
|
|
37
|
+
f4_cost_budget.ts F4: PTY session — /budget set/mode ladder (warn → enforce
|
|
38
|
+
refusal → warn → shadow), /clear display-only lock-in,
|
|
39
|
+
/cost, context retention
|
|
40
|
+
gen/
|
|
41
|
+
materialize.ts template + patches → agent-visible working copy (git HEAD = seeded
|
|
42
|
+
state; hidden tests applied only at grade time)
|
|
43
|
+
validate_task.ts the 5 execution gates every task must pass (SWE-bench-Verified
|
|
44
|
+
style): template green → bug invisible to public suite → hidden
|
|
45
|
+
tests fail pre-fix → oracle restores green → statement >= 40 words
|
|
46
|
+
calibrate.ts k-run empirical difficulty calibration: pinned cheap/frontier arms
|
|
47
|
+
through the installed binary, cheat-guarded hidden-test grading,
|
|
48
|
+
appends bench/tasks/calibration.jsonl
|
|
49
|
+
build_index.ts task dirs (+ calibration rates when present) → bench/tasks/tasks.jsonl
|
|
50
|
+
fixtures/templates/ clean fixture repos (py-cli, ts-api, js-lib, katas; _example is the
|
|
51
|
+
canonical reference the validator smoke uses)
|
|
52
|
+
tasks/<repo>/<id>/ task instances: task.json, bug.patch?, hidden_tests.patch, oracle.patch?
|
|
53
|
+
run.ts entry point: `bun bench/run.ts f1 f9 f4`
|
|
54
|
+
artifacts/ (gitignored) per-run scratch dirs, DBs, transcripts on failure
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## The session recipe (validated live 2026-07-06)
|
|
58
|
+
|
|
59
|
+
There is **no CLI flag** to pin or resume a session id in 0.7.1. The only supported
|
|
60
|
+
recipe, validated against the installed binary:
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
cd <disposable-dir> # NEVER a real repo: headless mode has ZERO
|
|
64
|
+
# permission gating (hook only wired in the TUI)
|
|
65
|
+
MINIMA_DB_PATH=<flow>.db \
|
|
66
|
+
MINIMA_NAMESPACE=bench-<flow>-<id> \
|
|
67
|
+
minima -nt --budget 0.05 --budget-enforce -p "..."
|
|
68
|
+
sqlite3 <flow>.db "SELECT run_id,status FROM runs" # ← captured session id
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
One DB path per flow (one per case for headless batteries) removes all "newest run"
|
|
72
|
+
ambiguity. Multi-turn = PTY-drive the interactive TUI; `/resume <FULL run_id>` after
|
|
73
|
+
restart (exact match — the picker's 12-char ids are display-only).
|
|
74
|
+
|
|
75
|
+
## Task dataset (Phase B, 2026-07-06)
|
|
76
|
+
|
|
77
|
+
**33 execution-validated tasks** across 4 purpose-built fixture repos (34 counting the
|
|
78
|
+
`_example` reference), authored by a 4-agent fan-out and independently re-validated
|
|
79
|
+
(`bun bench/gen/validate_task.ts --all` → 34/34):
|
|
80
|
+
|
|
81
|
+
| repo | template | tasks | mix |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| `py-cli` ("taskman") | ~1.2k LOC argparse CLI, 60 pytest tests | 8 | 3 easy + 3 medium + 1 hard (cross-module schema-migration data loss) + 1 **trap** (168-word panic statement, 1-line fix) |
|
|
84
|
+
| `ts-api` ("linkbox") | ~1.6k LOC bun HTTP handlers, 60 tests | 7 | 3 feature-adds (hidden-test spec) + 3 medium bugfixes + 1 **trap** (casual statement, diagnosis spans store/persist/stats) |
|
|
85
|
+
| `js-lib` ("datakit") | ~0.8k LOC zero-dep utils, 50 tests, fastest suite | 6 | 2 easy + 2 medium + 1 feature + 1 hard (CSV round-trip state machine) |
|
|
86
|
+
| `katas` | 12 single-file stubs (4 py / 4 ts / 4 js) | 12 | all trivial → the unambiguous cheap tier |
|
|
87
|
+
|
|
88
|
+
**Difficulty labels are EMPIRICAL** (k=5 × cheap(haiku)/frontier(sonnet) arms, 330
|
|
89
|
+
attempts, $17.90, 0 errors, 0 cheats — `calibration.jsonl`, report via
|
|
90
|
+
`gen/calibration_report.ts`). The 2026-07-06 full pass rewrote the structural bins:
|
|
91
|
+
|
|
92
|
+
- **haiku solves 30/33 tasks at ~100%** — well-specified, symptoms-only bugfixes in
|
|
93
|
+
1-2k-LOC repos are simply within a 2026 cheap model's reach, including the authored-
|
|
94
|
+
hard 72-line cross-module migration (pc-007: 5/5 cheap). 12 authored-medium/hard
|
|
95
|
+
tasks were NO-SIGNAL (both arms 5/5) → re-labeled easy/cheap with
|
|
96
|
+
`authored_difficulty` preserved.
|
|
97
|
+
- **jl-006 is the perfect hard task**: cheap 0/5, frontier 5/5 (CSV state-machine
|
|
98
|
+
round-trip) — the escalation-value demo in one row.
|
|
99
|
+
- **ta-004 is a cheap-beats-frontier anomaly**: cheap 4/5, frontier 0/5 — sonnet
|
|
100
|
+
consistently fails a task haiku solves (kept medium, route=cheap, flagged for
|
|
101
|
+
failure-mode investigation; excellent routing-demo material).
|
|
102
|
+
- Final spread: 12 trivial / 19 easy / 1 medium / 1 hard; expected_route: 32 cheap,
|
|
103
|
+
1 frontier. **Consequence for the demo:** this dataset proves the savings story
|
|
104
|
+
(quality parity at cheap prices) overwhelmingly, but differentiated escalation
|
|
105
|
+
routing rests on jl-006/ta-004 alone — a "genuinely hard" authoring round (vaguer
|
|
106
|
+
statements, composite multi-bug patches, larger repos) is queued for the demo phase.
|
|
107
|
+
|
|
108
|
+
Anti-leakage: agents under test see ONLY the materialized template (+ seeded bug) and
|
|
109
|
+
the `problem_statement` — never `task.json` (whose `notes` describe the defect), never
|
|
110
|
+
`hidden_tests.patch`. Statements are symptoms-only for bugfixes (audited: no defect
|
|
111
|
+
file/function names, no fix quotes); feature statements specify routes/signatures.
|
|
112
|
+
|
|
113
|
+
## Savings A/B (Phase D, 2026-07-06) — the honest headline
|
|
114
|
+
|
|
115
|
+
Paired protocol per router-eval best practice: all 33 tasks fresh-executed twice
|
|
116
|
+
(identical prompts, fresh checkouts, hidden-test graded) — arm A pinned
|
|
117
|
+
`claude-opus-4-8` (all-premium baseline), arm B **routed** via api.minima.sh
|
|
118
|
+
(namespace `bench-ab-v1`, feedback live). Runner: `gen/savings_ab.ts` · report:
|
|
119
|
+
`gen/savings_report.ts` · raw log: `tasks/savings_ab.jsonl`. Total run cost $8.71.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
1. COST premium: $7.89 total, $0.2546/completed
|
|
123
|
+
routed: $0.82 total, $0.0302/completed → 89.7% saved
|
|
124
|
+
2. PARITY premium 31/33 (93.9%) vs routed 27/33 (81.8%)
|
|
125
|
+
both=26 · premium-only=5 · routed-only=1 · neither=1
|
|
126
|
+
McNemar exact p=0.219 — no significant difference at n=33
|
|
127
|
+
3. ROUTED DISTRIBUTION: gemini-2.5-flash × 33 (cold-prior argmin; no escalation)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Present all three together, never % saved alone; state the n=33 parity bound (±10-15pp).
|
|
131
|
+
Noteworthy pairs: jl-003 is a cheap-beats-premium case (flash PASS $0.008, opus FAIL
|
|
132
|
+
$0.40); the 5 routed-only failures are all tasks haiku solved 5/5 in calibration —
|
|
133
|
+
i.e. flash-specific misses on a cold prior, exactly the signal the learning loop
|
|
134
|
+
should absorb (F12 tests that transition).
|
|
135
|
+
|
|
136
|
+
**Finding — the server's premium counterfactual understates reality ~10×**: summed
|
|
137
|
+
`all_premium_cost_usd` estimates for the routed arm came to $0.77 vs the MEASURED
|
|
138
|
+
premium arm's $7.89. Single-call token estimates don't capture multi-turn agentic
|
|
139
|
+
tool loops. Real savings are LARGER than /v1/savings claims, but the estimate is not
|
|
140
|
+
a credible counterfactual for agentic workloads — measured paired baselines are.
|
|
141
|
+
(Feeds the GT-8 observed-best/IPS work.)
|
|
142
|
+
|
|
143
|
+
## Learning loop (F12) — GREEN (took TWO fixes: the key AND user_id)
|
|
144
|
+
|
|
145
|
+
`flows/f12_learning_loop.ts` (live-lane, ~$0.60/run): first a free WRITE-HEALTH probe
|
|
146
|
+
(direct recommend→feedback, hard check on the feedback BODY's `accepted` field,
|
|
147
|
+
early-exit on failure), then warms a fresh namespace with 8 judged kata runs (separate
|
|
148
|
+
sessions) and re-runs 4 of the SAME tasks as probes in warm-vs-cold namespaces.
|
|
149
|
+
|
|
150
|
+
**Verified PASS 2026-07-07 (5/5 hard + 4/4 soft)** against `api.minima.sh` with a binary
|
|
151
|
+
carrying BOTH fixes below — cold probes route `prior`, all four warm probes flip to
|
|
152
|
+
`memory`. It needed two independent fixes; #1 alone left the flip still red.
|
|
153
|
+
|
|
154
|
+
- **FIX 1 — writes (the key).** Minima uses pass-through auth (`src/minima/api/auth.py`):
|
|
155
|
+
the `MUBIT_API_KEY` the harness/binary send as `Authorization: Bearer` IS the key
|
|
156
|
+
Minima uses against Mubit. Repo `.env` ships the LOCAL dev key `mbt_local_admin` (instance
|
|
157
|
+
`local`) that prod can't reach → `accepted=false`/`memory_write_failed`. `.env.harness`
|
|
158
|
+
has the DEPLOYED key that writes. Wired via `driver/env.ts` `loadBenchEnv()` (layers
|
|
159
|
+
`.env.harness` over Bun's auto-loaded `.env`, forcing `MUBIT_API_KEY`/`MINIMA_URL`/
|
|
160
|
+
`MINIMA_API_KEY`; called from `run.ts`, `gen/savings_ab.ts`, `f12()`). Escape hatches:
|
|
161
|
+
`BENCH_NO_HARNESS_ENV=1`, `BENCH_MUBIT_API_KEY=…`.
|
|
162
|
+
- **FIX 2 — recall (user_id), PR #90.** Fixing #1 uncovered this: prod recall is scoped
|
|
163
|
+
by `user_id`, and `router.ts` recommend omitted it → the server surfaced nothing and
|
|
164
|
+
`decision_basis` never left `prior`, so the binary couldn't recall its own writes.
|
|
165
|
+
Direct A/B: single write+read in one namespace flips to `basis=memory,ev=1` WITH a
|
|
166
|
+
user_id, stays `prior,ev=0` WITHOUT. PR #90 sends the stable `memorySession`
|
|
167
|
+
(`namespace ?? repo identity`) as `user_id`. **The installed brew binary does NOT have
|
|
168
|
+
#90 yet** — until a release ships it, run F12 against a local build:
|
|
169
|
+
`cd packages/tui && bun run build` then
|
|
170
|
+
`BENCH_MINIMA_BIN="$PWD/dist/minima" bun bench/run.ts f12`.
|
|
171
|
+
- Still worth keeping: the write-health probe (asserts on the BODY — HTTP 200 hid the
|
|
172
|
+
write failure) and PR #84 (the binary swallowed the rejection in a write-only
|
|
173
|
+
`lastFeedbackError`; #84 surfaces it as a TUI line + `--mode json` `feedback_error`).
|
|
174
|
+
- Optional server hardening (defense-in-depth): the SDK treats a done ingest-job with
|
|
175
|
+
`writes[].success=false` as success; `recall.degraded` is parsed but never read.
|
|
176
|
+
- Also noteworthy: routing drifted flash→pro for identical kata prompts within hours
|
|
177
|
+
(catalog/prior drift) — validates the suite-wide rule of never asserting model ids.
|
|
178
|
+
|
|
179
|
+
## Running
|
|
180
|
+
|
|
181
|
+
```sh
|
|
182
|
+
bun bench/run.ts # all flows
|
|
183
|
+
bun bench/run.ts f1 f9 # a subset
|
|
184
|
+
|
|
185
|
+
bun bench/gen/validate_task.ts --all # re-validate every task (local, free)
|
|
186
|
+
bun bench/gen/calibrate.ts --tasks all --arms cheap,frontier --k 5 # full calibration (costed)
|
|
187
|
+
bun bench/gen/build_index.ts # rebuild tasks.jsonl (+ measured rates)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Live-lane cost: the full Phase A suite spends well under $0.10/run (trivial prompts,
|
|
191
|
+
mock server wherever determinism matters). Exit code is non-zero if any hard check fails;
|
|
192
|
+
per-flow transcripts land in `bench/artifacts/scratch/<flow>-<ts>/transcript.txt`.
|
|
193
|
+
|
|
194
|
+
Status (2026-07-06): **full suite 7/7 flows PASS — f1 30/30 · f9 11/11 · f4 16/16 ·
|
|
195
|
+
f5 5/5 · f6 6/6 · f7 13/13 · f10 5/5 (86 hard checks)** against installed 0.7.1 +
|
|
196
|
+
hosted api.minima.sh; ~3.3 min, ~$0.15/run.
|
|
197
|
+
|
|
198
|
+
## Findings log
|
|
199
|
+
|
|
200
|
+
Datestamped facts discovered while building/running the flows — kept current; newest first.
|
|
201
|
+
|
|
202
|
+
### 2026-07-07 — memory loop GREEN: TWO bugs (key + user_id); F12 PASS 5/5
|
|
203
|
+
- Two independent bugs; fixing the first uncovered the second. Neither is a server bug.
|
|
204
|
+
- **BUG 1 (writes) — the key.** Minima is pass-through auth (`api/auth.py`): the client's
|
|
205
|
+
`Authorization: Bearer <mubit_key>` IS the key used against Mubit. A/B (same endpoint +
|
|
206
|
+
payload, only the key differs): repo `.env` `mbt_local_admin` →
|
|
207
|
+
`accepted=false`/`memory_write_failed`; `.env.harness` deployed key → `accepted=true`,
|
|
208
|
+
real record_id. Wired via `driver/env.ts` `loadBenchEnv()` (forces `.env.harness`'s
|
|
209
|
+
routing keys over Bun's auto-loaded `.env`; `run.ts`/`savings_ab.ts`/`f12()`;
|
|
210
|
+
`BENCH_NO_HARNESS_ENV=1` / `BENCH_MUBIT_API_KEY=…` escape hatches).
|
|
211
|
+
- **BUG 2 (recall) — user_id, PR #90.** After BUG 1, F12 warm probes STILL all `prior`.
|
|
212
|
+
A/B: single write+read in one namespace flips to `basis=memory,ev=1` WITH a `user_id`,
|
|
213
|
+
stays `prior,ev=0` WITHOUT. `router.ts` recommend omitted `user_id` → prod recall
|
|
214
|
+
(user-scoped) surfaced nothing → basis never left `prior`; the binary couldn't recall
|
|
215
|
+
its own writes (affects every user, any key). PR #90 sends the stable `memorySession`
|
|
216
|
+
as `user_id`.
|
|
217
|
+
- **F12 PASS 5/5 (+4/4 soft)** against api.minima.sh with a binary carrying #90: cold
|
|
218
|
+
probes `prior`, all 4 warm probes `memory`. Installed brew binary lacks #90 → run F12
|
|
219
|
+
against a local `packages/tui` build until a release ships it.
|
|
220
|
+
- The earlier "blocked SERVER-side" framing was wrong on cause, right on symptom; the
|
|
221
|
+
write-health probe + PR #84 (surface the swallowed rejection) stay useful.
|
|
222
|
+
|
|
223
|
+
### 2026-07-06 (later) — memory-loop root cause + write-health detector
|
|
224
|
+
- **Every memory write is rejected by the server**: direct `POST /v1/feedback` returns
|
|
225
|
+
HTTP 200 `accepted=false, record_id=null, warnings=["memory_write_failed"]`. The
|
|
226
|
+
HTTP status is useless as a health signal — assert on the BODY.
|
|
227
|
+
- The binary knew and stayed silent: the rejection landed in `lastFeedbackError`,
|
|
228
|
+
which no code read (write-only diagnostics). PR #84 surfaces it (TUI info line +
|
|
229
|
+
`--mode json` `feedback_error` event).
|
|
230
|
+
- F12 now opens with a direct-API write-health probe and exits early on failure:
|
|
231
|
+
fails in <1s at the true cause instead of ~5min/$0.60 at the basis=prior symptom.
|
|
232
|
+
- `memory_unavailable` on recommends is INTERMITTENT — its absence during one run must
|
|
233
|
+
not be read as "recall healthy" (it briefly sent this investigation toward evidence
|
|
234
|
+
thresholds).
|
|
235
|
+
- 5-agent code-trace of the server path (journal in the session workflow dir):
|
|
236
|
+
`reinforced_entry_ids` echoes recommend-time recall neighbors, so `[]` during
|
|
237
|
+
warm-up is expected and diagnostic of nothing; `MEMORY_WEIGHT_MIN=0.0` means ONE
|
|
238
|
+
retrieved outcome flips basis to memory — no threshold story; lane/namespace
|
|
239
|
+
computed once and reused on both paths — no scoping mismatch. The break is at the
|
|
240
|
+
Minima↔Mubit ingest boundary (and the SDK treats a done-ingest-job with
|
|
241
|
+
`writes[].success=false` as success — silent-failure hole worth a server PR).
|
|
242
|
+
|
|
243
|
+
### 2026-07-06 — v0.7.2 release compat + memory-loop status
|
|
244
|
+
- **Suite green on both binaries**: installed 0.7.1 and the v0.7.2 release asset
|
|
245
|
+
(`BENCH_MINIMA_BIN=<path> bun bench/run.ts`). Version-tolerant assertions cover the
|
|
246
|
+
0.7.2 renames: `· working`→`· running` (isIdle accepts both), denial copy
|
|
247
|
+
("Permission denied for X" → "The user declined the X call"), `/fork`+`/clone`
|
|
248
|
+
honest copy, and models satisfying an "edit" ask with the new `apply_patch` tool.
|
|
249
|
+
- v0.7.2 plan-mode correctly blocks `apply_patch` (the #77 review fix) — verified live
|
|
250
|
+
by F7 against the release binary.
|
|
251
|
+
- **Memory loop: partially restored, still not closing.** The v0.7.2 prod redeploy
|
|
252
|
+
cleared the `memory_unavailable` recommend warning, but F12 still shows
|
|
253
|
+
reinforced_entry_ids never echoing and same-task warm-namespace probes routing on
|
|
254
|
+
`prior`. Needs server-side investigation of the feedback→Mubit write path; F12 is
|
|
255
|
+
the standing detector. (Possible contributor: one outcome per task may be below the
|
|
256
|
+
evidence threshold — a heavier warm phase, k=3 per task, is worth trying.)
|
|
257
|
+
|
|
258
|
+
### 2026-07-06 — Phase C (flow suite) findings
|
|
259
|
+
- **Child routing decisions DO persist correctly** — each sub-agent writes its own
|
|
260
|
+
routing_decisions row with `agent_id = <childId>` demuxing it from the lead (verified
|
|
261
|
+
live: 3 children with per-child tool_calls read/glob/bash + worktree isolation). Two
|
|
262
|
+
false alarms on the way were both harness-side: the assert library's SELECT omitted
|
|
263
|
+
agent_id, and rows become visible to external readers slightly after the lead's
|
|
264
|
+
(write-queue flush lag) — poll with a grace window, never point-read.
|
|
265
|
+
- **The packages/tui test suite leaks git worktrees**: stale `/tmp/minima-wt-dirty-step-*`
|
|
266
|
+
and `/tmp/minima-wt-wt-step-*` dirs from spawn tests predate bench runs. Flows must
|
|
267
|
+
baseline `/tmp/minima-wt-*` pre-run and assert on the set DIFFERENCE; worth a small
|
|
268
|
+
cleanup fix in the tui test suite.
|
|
269
|
+
- **In-cwd reads DO prompt** despite the `app.tsx:565` comment claiming "read/ls
|
|
270
|
+
auto-allow within cwd" — `permissions.ts:41` starts `allowedDirs` empty and nothing
|
|
271
|
+
pre-approves the cwd. Locked in by F7; either the comment or the behavior should change.
|
|
272
|
+
- **Overlay answering must be effect-keyed**: a single keypress can race the overlay
|
|
273
|
+
lifecycle (deny → model instantly retries → new overlay paints inside the same poll
|
|
274
|
+
window). F7's driver retries each answer key until its observable effect (deny text,
|
|
275
|
+
disk change, transcript content) lands.
|
|
276
|
+
- **Idle detection that survives repaints**: compare `lastIndexOf("· ready")` vs
|
|
277
|
+
`lastIndexOf("· working")` over the accumulated output — the last footer paint always
|
|
278
|
+
reflects current state. Needed before typing after DB-predicate turn ends (the visible
|
|
279
|
+
turn end precedes busy-clear by seconds; typed chars during the tail may not echo).
|
|
280
|
+
- **Prompt-dictated task-tool JSON is genuinely nondeterministic**: the model sometimes
|
|
281
|
+
omits `isolation:"workdir"` even when asked; quoting the exact field name + a one-shot
|
|
282
|
+
in-session retry makes F5 reliable. The ladder (F10), by contrast, is fully
|
|
283
|
+
deterministic via the mock's recommendQueue + a present-but-invalid provider key.
|
|
284
|
+
|
|
285
|
+
### 2026-07-06 — Phase B (dataset) findings
|
|
286
|
+
- **Never `await` child stdout/stderr streams to completion after killing a process**:
|
|
287
|
+
the agent's grandchildren (pytest, bun test) inherit the pipe and hold it open past
|
|
288
|
+
the parent's death, hanging the collector indefinitely — this stalled the first
|
|
289
|
+
calibration batch. `sh()` now awaits `proc.exited` and gives the streams a 2s grace
|
|
290
|
+
race instead.
|
|
291
|
+
- **k=1 calibration is a smoke, not a label**: single-attempt solves by the cheap arm
|
|
292
|
+
demoted ta-007 (with the audit's structural evidence agreeing) but cannot
|
|
293
|
+
distinguish "cheap solves 100%" from "cheap solves 40% and got lucky" — medium bins
|
|
294
|
+
especially need the full k=5 pass before routing accuracy is judged against them.
|
|
295
|
+
- **Pinned calibration runs never touch the Minima server** — `--model X` bypasses
|
|
296
|
+
routing entirely, so difficulty calibration is pure provider spend with zero effect
|
|
297
|
+
on the routing namespace. Exactly what we want: calibration cannot pollute the
|
|
298
|
+
learning loop.
|
|
299
|
+
- **Cheat-guard needs an artifact filter**: running pytest inside the attempt drops
|
|
300
|
+
`tests/__pycache__/*.pyc` as untracked files under `tests/`, which false-flagged the
|
|
301
|
+
very first calibration attempt as test-tampering. The guard now ignores
|
|
302
|
+
`__pycache__/.pyc/.pytest_cache/node_modules` before applying the tests/ rule.
|
|
303
|
+
- Headless agent runs on seeded tasks work exactly as designed: haiku found and fixed
|
|
304
|
+
the `_example` seeded bug in ~23s for ~$0.01, graded by hidden tests post-hoc.
|
|
305
|
+
- Go is not installed on this machine → the plan's `go-tool` fixture became `js-lib`
|
|
306
|
+
(zero-dep bun:test library, same fastest-suite role for future worktree/DAG flows).
|
|
307
|
+
|
|
308
|
+
### 2026-07-06 — findings from making the flows green
|
|
309
|
+
|
|
310
|
+
- **PRODUCT FINDING — offline turns bypass the budget ledger entirely.** An
|
|
311
|
+
offline-fallback turn runs the default model (real provider spend, `actual_cost_usd`
|
|
312
|
+
recorded on the decision row) but books NOTHING to the ledger: no reserve/reconcile
|
|
313
|
+
events, `spent_usd` stays 0, and `--budget-enforce` cannot refuse it (the reserve path
|
|
314
|
+
needs a positive server cost estimate; offline/pinned synthetic rows have est 0 and the
|
|
315
|
+
reserve block is routing-gated in runtime.ts). Locked in as F1's `offline-budget
|
|
316
|
+
lock-in` case — flips loudly if a fix lands. Follow-on: enforce-deny tests MUST route
|
|
317
|
+
through a server (bench uses the mock) or a transient offline fallback silently
|
|
318
|
+
neuters them.
|
|
319
|
+
- **TUI drops Enter while busy — including the invisible post-turn tail.** After the
|
|
320
|
+
reply finishes streaming, judge + feedback + memory-write keep `busy` true for up to
|
|
321
|
+
several seconds; during that window typed characters still echo into the input box but
|
|
322
|
+
Enter is silently ignored (same `if (busy) return` guard family as the known abort bug
|
|
323
|
+
#83). Naive scripted typing concatenates commands in the input box. Driver fix:
|
|
324
|
+
`rig.submitUntil(text, effect)` — type once, then retry Enter until the command's
|
|
325
|
+
unique effect appears (fresh response regex or DB predicate). A retried Enter is
|
|
326
|
+
harmless (input is empty if the previous one submitted).
|
|
327
|
+
- **Accumulated-output matching must use UNIQUE expected strings.** Ink repaints the
|
|
328
|
+
whole screen constantly, so previously-rendered content reappears after any
|
|
329
|
+
`mark()` — a `since` offset does NOT protect against matching stale repaints.
|
|
330
|
+
Assert on strings that appear exactly once per flow (include arguments/amounts:
|
|
331
|
+
`Budget set: $0.02 (warn mode)`), and prefer DB predicates over screen text.
|
|
332
|
+
- **Live routing can transiently fall back offline** (cold-start recommend latency) even
|
|
333
|
+
when api.minima.sh is healthy — never build a hard check on "this turn will be
|
|
334
|
+
server-routed" unless the flow retries or uses the mock. F4 asserts all-turns-routed
|
|
335
|
+
as a flow-level invariant and accepts the rerun cost.
|
|
336
|
+
- **Turn-end signal**: the `routing_decisions` row is the reliable "turn substantively
|
|
337
|
+
done" oracle (WAL lets a readonly reader poll while the TUI writes), but it lands
|
|
338
|
+
BEFORE busy clears — combine row-polling with submitUntil for the next input.
|
|
339
|
+
- Boot state: default model is `gpt-4o-mini` before any routing; readiness marker is
|
|
340
|
+
the status-bar `· ready`; typing `/xyz` opens a commands suggestion box that does not
|
|
341
|
+
interfere with Enter-submission of a fully-typed command; `/exit` exits 0; `/clear`
|
|
342
|
+
clears only the transcript (locked in by F4: planted token still recalled after).
|
|
343
|
+
- `/budget set <tiny>` renders `$0.00` (`toFixed(2)`) — match `Budget set: \$0\.00` for
|
|
344
|
+
sub-cent limits; the exhausted-refusal message is `budget exhausted: $X spent of $Y`.
|
|
345
|
+
|
|
346
|
+
### 2026-07-06 — Phase A bring-up
|
|
347
|
+
- **Bun 1.3.14 native PTY works** for driving the Ink TUI: `Bun.spawn(cmd, {terminal:
|
|
348
|
+
{cols, rows, data(term, chunk){...}}})`; the data callback signature is
|
|
349
|
+
`(Terminal, Buffer)`; write with `proc.terminal.write("...\r")`. No node-pty needed.
|
|
350
|
+
- **Keys resolve from the global config store** (`~/.minima-harness/config.env` +
|
|
351
|
+
keychain) even in disposable cwds — that's what makes scratch-dir flows work with zero
|
|
352
|
+
per-flow env setup. Repo `.env.harness` has the same key names if explicit env is wanted.
|
|
353
|
+
- **`/reconnect` re-reads `process.env.MINIMA_URL`** (`config.ts:75` — env wins over cfg).
|
|
354
|
+
So the deterministic offline→online story is: launch with `MINIMA_URL=http://127.0.0.1:
|
|
355
|
+
<port>` while nothing listens (offline fallback), start the mock server on that port,
|
|
356
|
+
`/reconnect`. `--offline` itself is a one-way door (sets cfg.minimaUrl='' and no env var
|
|
357
|
+
exists to restore) — never use it for reconnect flows.
|
|
358
|
+
- **`/budget set` preserves accumulated spend** (new ledger, same `session:<run_id>`
|
|
359
|
+
scope, ON CONFLICT keeps `spent_usd`) and **preserves the current mode**. Deterministic
|
|
360
|
+
enforce-refusal: spend under warn first, tighten the limit below observed spend, then
|
|
361
|
+
`/budget mode enforce` — the next prompt is refused at the exhausted gate
|
|
362
|
+
(`budget exhausted: $X spent of $Y`) *before any provider spend*, and no
|
|
363
|
+
routing_decisions row is written for the refused prompt.
|
|
364
|
+
- **Smoke economics**: one routed trivial turn ≈ $0.004 (sonnet via prior basis, argmin).
|
|
365
|
+
|
|
366
|
+
### 2026-07-06 — from the research inventory (file:line ground truth)
|
|
367
|
+
- Do not script/demo: `/undo` (no-op `git checkout --`), `/fork`+`/clone` (stubs),
|
|
368
|
+
`--thinking` (parsed, never applied), Ctrl+R confirm (cosmetic), Esc/Ctrl+C abort
|
|
369
|
+
(dead code, task #83), `/tree` cost/status rows (stuck "running" — screenshot during
|
|
370
|
+
run only), `save$` column (baselineModelId has no setter).
|
|
371
|
+
- `--mode json` events are lossy (no tool args / model / cost) → SQLite is the primary
|
|
372
|
+
oracle; the JSON stream is asserted only as a frozen vocabulary contract.
|
|
373
|
+
- Headless `--print`/`--mode json`: single prompt per process, budget events on stderr,
|
|
374
|
+
exit 1 on provider hard-failure/offline-empty, exit 2 on usage errors.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Assertion collector: gathers named checks, prints a per-flow report, computes PASS/FAIL. */
|
|
2
|
+
|
|
3
|
+
export interface CheckResult {
|
|
4
|
+
name: string;
|
|
5
|
+
ok: boolean;
|
|
6
|
+
soft: boolean;
|
|
7
|
+
detail?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class Checks {
|
|
11
|
+
results: CheckResult[] = [];
|
|
12
|
+
constructor(readonly flowId: string) {}
|
|
13
|
+
|
|
14
|
+
check(name: string, ok: boolean, detail?: string): boolean {
|
|
15
|
+
this.results.push({ name, ok, soft: false, detail });
|
|
16
|
+
console.log(` ${ok ? "✓" : "✗"} ${name}${!ok && detail ? ` — ${detail}` : ""}`);
|
|
17
|
+
return ok;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Recorded but never gates the flow (nondeterministic/live-dependent signals). */
|
|
21
|
+
soft(name: string, ok: boolean, detail?: string): boolean {
|
|
22
|
+
this.results.push({ name, ok, soft: true, detail });
|
|
23
|
+
console.log(` ${ok ? "✓" : "~"} [soft] ${name}${!ok && detail ? ` — ${detail}` : ""}`);
|
|
24
|
+
return ok;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
get passed(): boolean {
|
|
28
|
+
return this.results.filter((r) => !r.soft).every((r) => r.ok);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
summary(): string {
|
|
32
|
+
const hard = this.results.filter((r) => !r.soft);
|
|
33
|
+
const soft = this.results.filter((r) => r.soft);
|
|
34
|
+
const failedHard = hard.filter((r) => !r.ok);
|
|
35
|
+
return (
|
|
36
|
+
`${this.flowId}: ${this.passed ? "PASS" : "FAIL"} — ${hard.length - failedHard.length}/${hard.length} checks` +
|
|
37
|
+
(soft.length ? ` (+${soft.filter((r) => r.ok).length}/${soft.length} soft)` : "") +
|
|
38
|
+
(failedHard.length ? `\n failed: ${failedHard.map((r) => r.name).join(", ")}` : "")
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|