Development
Local verification gate (run all before opening a PR):
python -m ruff check .
python -m ruff format --check .
python -m pytest
sphinx-build -b html docs _build/html -W
python -m build
twine check dist/*
Testing
All tests use synthetic/public-safe fixtures (
fresh_fuchs.instance.syntheticandtests/conftest.py); no private bundle data, commercial GIS, desktop applications, credentials, or Gurobi licences are required in CI.The orchestration tests (
tests/test_orchestration.py) need thefreshforgepackage (theorchestration/devextra) and guard withpytest.importorskipso the core suite stays green without it.Deterministic anchors (managed land base, even-flow mean harvest, NPV-max parity) are regression-gated in the tests and recorded in
planning/validation-report.md.
ws3 version compatibility
The suite runs against both PyPI ws3 1.0.5 (what CI installs) and the
editable 1.1.0a4 source checkout. Two compatibility rules matter:
Never write
dt.operability[acode][period] = None— 1.0.5 crashes; use an empty age window(0, -1)to close a period.Rotation floor/ceiling policies are applied as operability age windows
(floor, ceiling), which works on both versions.
Layout
src/fresh_fuchs/instance— bundle -> extended ws3 model + synthetic instance (Phase 1).src/fresh_fuchs/economy— NPV surface and cash flows (Phase 2).src/fresh_fuchs/scenario— full-MC scenario engine (Phase 3).src/fresh_fuchs/outer— policy grid + risk + ranking (Phase 4).src/fresh_fuchs/orchestration— freshforge workflows/matrices + evidence (Phase 5).src/fresh_fuchs/cli.py— thin CLI wrappers over the Python APIs.
Governance, the strict development workflow (one phase = one parent issue =
one feature branch), issue-quality standards, and the reuse boundary are
documented in AGENTS.md and CONTRIBUTING.md.