- tools/simulate.py + puga/simulate.py: replica of PRUNplanner's simulator (flows and efficiency verified against screenshots), reports real new capex (planned minus built) - tools/scan.py: staffing variants, freight, HQ/experts, --planet mode, demolish-later, --min-n as a pure market-size filter, --json output - tools/history.py, tools/persistence.py: margin history and short-horizon payback checks - tools/plan_push.py: guarded delete; tools/state.py: syncs to empire/ - README with features and setup; CLAUDE.md made generic - Own-empire material (profile, state, plans, notes) moved to gitignored empire/; generic examples in plans/examples and state/company.example.yaml Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
6.0 KiB
6.0 KiB
PuGa: Prosperous Universe advisory toolkit
Agent-first toolkit for advising a Prosperous Universe player. The player asks questions; you answer by running the tools in tools/ against live data, not by guessing.
Read first
empire/PROFILE.mdif it exists: who the player is, how they want answers, their company and current plans.empire/is gitignored and holds everything specific to this player's empire (see Layout). If it does not exist, ask the player the basics and create it.docs/mechanics.mdfor game mechanics (source of truth order below).empire/state/company.yamlfor the current position; refresh it withtools/state.py syncbefore answering anything about it.
Working rules
- Numbers, tables, ROI per day. Short answers, no fluff. Match the style in the player's profile.
- The player plays on browser APEX and may send screenshots; read them carefully, they override assumptions.
- Never guess APEX commands or numbers. Pull data (tools, FIO, PRUNplanner) or search.
- Label every number: live (tool output), state (company.yaml), or estimate; say which in-game command would confirm an estimate.
- Prices move; re-run tools before quoting. Anything older than a day is stale.
- Do not commit or push unless asked. Writes to the player's PRUNplanner account follow the guardrails in
docs/decisions.md.
Source-of-truth rules
- PRUNplanner code wins over our own docs for game mechanics (
ref/frontend/src/features/planning/calculations/,ref/backend/). If any older handoff or note conflicts with it, the note is wrong; fixdocs/mechanics.md. - In-game numbers the player reports beat both, especially for planet resource factors.
ref/is a gitignored copy of the PRUNplanner repos; refresh withtools/refresh_refs.sh.
Setup
- Python venv at
.venv(.venv/bin/python,.venv/bin/pip). Deps inrequirements.txt. - Secrets in
.env(gitignored; template.env.example): FIO REST key, FIO API key, PRUNplanner key, FIO username, company code. Never print or commit them; do not ask the player to paste keys into chat. - Scope: whole universe supported; default exchange from
DEFAULT_CX(AI1 = Antares),--cxto change.
Layout
CLAUDE.mdthis file;README.mdfor humans.docs/GAME and toolkit knowledge, safe to publish:mechanics.md(verified rules),saturation-design.md(market model),decisions.md(toolkit decisions and guardrails),roadmap.md.empire/(gitignored) OUR game state, nothing here goes public:PROFILE.md,state/company.yaml(synced from FIO),plans/(own plan specs),docs/(handoffs, build plans, personal notes).puga/library;tools/CLIs;plans/examples/generic plan specs (also test fixtures);state/company.example.yamlexample state;tests/;data/(gitignored fetched data cache);ref/(gitignored PRUNplanner source).- Rule: game facts and generic methods go in
docs/; anything about the player's own bases, cash, decisions or preferences goes inempire/.
Tools
tools/state.py sync|showrefreshesempire/state/company.yamlfrom live FIO (cash, permits, buildings, real production efficiency, storage, ships).tools/plan_push.pybuilds/validates PRUNplanner plans from YAML specs (plans/examples/,empire/plans/). Dry run by default;--applyonly after the player says yes; only[PuGa]-named plans are created/updated/deleted (delete <uuid>, only when asked);listshows the account's plans.tools/simulate.py <spec.yaml | --uuid U> [--off EXT,SME] [--basis real|uni30|vwap30|ask|...]replica of PRUNplanner's simulator (efficiency, workforce, material I/O, profit). Flows and efficiency verified exact vs screenshots; profit within ~2%. The NEW CAPEX line = planned minus already built (from state), the honest payback; ignore the plan-level ROI (PRUNplanner always adds a core module).--uuidreads the SAVED plan from the account (UI edits must be saved first).tools/scan.pyDEPTH-AWARE recipe scan (use this): buildings the market could absorb, ROI for our own size, patient prices, ask-walked inputs. Fully staffed AND understaffed variants by default (--staffing), freight netted out (--trip-cost,--cargo), HQ/COGC/experts/faction,--planet IDadds that planet's extraction, fertility and COGC (a planet not in state is a new base: no HQ, permits+1),--deprec 60prices demolish-later.--min-nis ONLY a noise filter on market capacity (use 3, ideally 10); ROI is always for our own size (--own, default 1 building), never at the filtered scale. Below 1 lets sub-building junk in.--json rows.jsonfeedspersistence.py. Library:puga/saturation.py.tools/history.py TICKERmonthly margin history of the recipe producing TICKER;tools/persistence.py rows.jsonre-prices scan rows over history (mean ROI 7/14/30/90/180d, payback, net gain over 7 and 14 days, % days profitable). ALWAYS check persistence before recommending: current margins are often a spike.tools/chain.py TICKERmake-vs-buy cost tree plus sourcing depth of inputs.tools/price.pyprices across exchanges with VWAP, volume, fill price for a quantity;tools/book.pyorder-book ladder.tools/prun_scan.py,tools/prun_cxarb.pylegacy top-of-book scans; overstate thin markets. Baseline only.tools/arb.pyreplacement is on the roadmap.puga/econ.pypure formulas ported from PRUNplanner (efficiency stack, workforce, extraction, production I/O, hab optimizer);tests/test_econ.pyholds the reference values.
Model policy
Sonnet builds; spawn a bigger model (Agent model: opus|fable) for the review points in docs/decisions.md. Roadmap: docs/roadmap.md.
Key analytic rule: depth matters
PRUNplanner's ROI Overview ranks recipes as if the market absorbs unlimited output (e.g. 0.25 day ROI on a recipe whose whole market fits in 2 buildings). Every opportunity we report must include saturation (buildings the market can absorb) and, for anything we would act on, persistence (is the margin a spike?). Report ROI at realistic fill prices, not top-of-book.