feat(portfolio): K6 — pre-run cost simulation, priced what-if (parity row 18) [skip-docs]
Before ANY spend the operator sees a deterministic UPPER-BOUND USD estimate for a (portfolio-)run — a what-if over the models in model_map.json (Claude models) × effort levels (S3.6-analog, D-I pkt. 3 MUST-krav). No network, no model call, no key: pure config arithmetic (bound by an import-purity test, mirroring okf.py). - contracts.py: ModelPriceContract (usd_per_mtok > 0 + REQUIRED source + source_date so a stale rate is visible, never silent, §1) + PricingContract (non-empty; no hardcoded fallback rate) + load_pricing/_bundled_pricing. - data/pricing.example.json: per-Mtok rate per model id, each with source+date. Example rates are Anthropic's OUTPUT price (the higher rate) so the whole cap billed at that single rate can only overstate — the figure is marked ESTIMAT. Covers the model model_map configures, so the default path runs green. - costsim.py: estimate_costs (n_projects × cap × effort_factor tokens at the per-Mtok rate; a model with no price fails fast "missing price for <id>", never a guess) + render_estimate + `python -m …costsim`. Effort factors are a coarse modeling weight (not prices) — max effort = full cap = the true upper bound. No price literal anywhere (grep-guard proves it). - tests/test_costsim.py: schema fail-fast, missing-price fail-fast, scales with model × effort + reproducible, grep-guard, import purity, bundled-example + CLI offline smoke. Three seams detach-proven RED (effort factor, price guard, price literal). 462→478 green, golden byte-exact, full gate clean (ruff+format+mypy strict, 23 src files), run_s10.py/runs/ byte-untouched. README test-count sync ×2 + costsim.py module note. CLI run-total-cap wiring stays out of scope (planen lists 4 files); the mechanism is complete and proven load-bearing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RiTwaKLesgcwXx2mDviqpt
This commit is contained in:
parent
111b320b75
commit
1600c188b4
5 changed files with 495 additions and 2 deletions
12
README.md
12
README.md
|
|
@ -13,7 +13,7 @@ human-in-the-loop, and the system learns from the verdicts.
|
|||
> **Status:** the D7 build (S5–S10) is complete, and the deterministic **ingest layer**
|
||||
> (CSV and SQL source types) has since been added in front of the loop. The deterministic
|
||||
> backbone, the agentic loop, the learning loop, and the ingest connectors are wired seam by
|
||||
> seam, each proven by load-bearing tests (462 tests, all running offline without an API
|
||||
> seam, each proven by load-bearing tests (478 tests, all running offline without an API
|
||||
> key). The programme's single budgeted **live model run has been executed and validated** —
|
||||
> its artifacts are committed under [`runs/s10/`](runs/s10/) (see below).
|
||||
|
||||
|
|
@ -110,6 +110,14 @@ description, never from its code)
|
|||
portfolio-level expert inbox the system reads before each fold. The default failure policy
|
||||
raises (a stack-local choice until D-D flips it to collect-and-continue).
|
||||
- `run_s10.py` — the programme's ONE live run (cost discipline D6); run-path only.
|
||||
- `costsim.py` — pre-run cost simulation (**offline** — the one Run-layer module that never
|
||||
touches the network): a deterministic UPPER-BOUND USD estimate for a (portfolio-)run
|
||||
*before* any spend, a what-if over the models in `model_map.json` × effort levels. Pricing
|
||||
is schema-validated config (`data/pricing.example.json`): a per-Mtok rate per model, each
|
||||
with a required source + date so a stale rate is visible, never silent. A model configured
|
||||
with no price fails fast — there is no hardcoded rate anywhere (a grep-guard proves it), and
|
||||
the figure is marked `ESTIMAT` (the whole cap billed at the rate is an upper bound; real runs
|
||||
cost less). `uv run python -m portfolio_optimiser_claude.costsim`.
|
||||
|
||||
### Load-bearing tests (§11)
|
||||
|
||||
|
|
@ -188,7 +196,7 @@ Python ≥3.10 · [`claude-agent-sdk`](https://pypi.org/project/claude-agent-sdk
|
|||
|
||||
```bash
|
||||
uv sync # install dependencies
|
||||
uv run pytest # 462 tests — run without any API key and without network
|
||||
uv run pytest # 478 tests — run without any API key and without network
|
||||
uv run ruff check . && uv run ruff format --check .
|
||||
uv run mypy src # strict
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue