network.py: tools/network.py now computes freight cost from the real fuel model (puga.shipping.round_trip_cost) for direct-jump transfers instead of the flat 9250 AIC placeholder; gateway transfers or an explicit trip_cost in the chain YAML still use that as a fallback. puga/network.py's combine() docstring now flags that its "flows cancel, only freight matters" claim only holds under a symmetric-price basis (uni30, the default) - under --basis real it understates the benefit of physical transfer by the bid-ask spread on the moved quantity. whatif.py: now charges marginal freight too - only the EXTRA round trips an addition needs beyond the base's existing traffic, so a small addition riding along on already-necessary hauls costs ~0, while one that adds meaningfully to shipped tonnage doesn't get a free pass. Terminology: "profit/day ÷ capex" was being reported as "ROI/day X%", which invites reading it as a compoundable rate. It's just 1/payback_days - there's no reinvestment mechanism and every opportunity here is capacity/market-limited, so it can't be annualized like a real yield. Payback in days is now the primary number everywhere (scan.py, simulate.py, network.py, whatif.py); see docs/decisions.md for the reasoning. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Decisions log
2026-09-18 Project plan and working agreements
- Goal: agent-first toolkit; the player asks, the agent answers by running tools against live data. Not an end-user app.
- PRUNplanner source (
ref/) is the source of truth for mechanics; conflicts with the old handoff resolved in its favour (docs/mechanics.md). - Scope: whole universe, default region Antares (CX AI1). Python in
.venv, secrets in.env, git branchmaster. No commits unless the player asks. - Every reported opportunity must include market saturation (buildings the market can absorb, fill-price ROI, absorbable profit/day). Reason: PRUNplanner's ROI Overview ranks recipes with no depth awareness (e.g. 0.25 day ROI on recipes 2 buildings saturate).
- PRUNplanner integration: API key auth (
Authorization: Api-Key <key>); plans can be created/updated via/planning/plan/. Writes only create/update/delete plans prefixed[PuGa](enforced intools/plan_push.py); never touch the player's other plans. Deleting is allowed only on request (or for throwaway test plans the tool itself made). When the player explicitly asks for a plan, creating it directly is fine; show the dry run in the reply.
Model and review policy
- Default: Sonnet 5 does the building (API plumbing, CLIs, ports, tests).
- Bigger model (Agent tool
model: opusorfable, fresh context, brief with files and question) is allowed and expected at these points:- Saturation model design, before building it, and again on real output.
- Econ formula port (efficiency stack, workforce, hab LP, extraction) checked against PRUNplanner numbers.
plan_pushpayload handling and the own-plans-only guard.- Big-money recommendations (e.g. BHP go/no-go, roughly 100k AIC): independent second opinion on the numbers.
- If a bigger-model spawn is refused, tell the player and ask them to run the review.
- Routine tool building is not reviewed by a bigger model.
2026-10-09 Drop "ROI/day %" terminology
profit/day ÷ new_capex(what tools were calling "ROI/day X%") is just 1/payback_days rewritten as a percentage. It is NOT a compoundable rate of return - there's no reinvestment mechanism, and every opportunity here is capacity/market-limited (saturation), so it can't be extrapolated or annualized like an interest rate.- Report payback in days as the primary number everywhere. A "%/day" figure, if shown at all, must be labelled as simple/non-compounding and never compared to a real yield/interest rate.
- Applies to
tools/whatif.py,tools/simulate.py,tools/scan.py,tools/persistence.py,tools/history.py, and anything built after this that reports a return on a one-time building cost.