make verify
CI runs the same target. The two must stay identical: if you add a check, add it to the
verify list, not only to the workflow.
make verify runs uv lock --check, ruff, ruff format --check, mypy --strict,
pytest with branch coverage against a 90% floor, pip-audit, an offline build over the
fixtures, and the determinism gate.
uv sync --locked
uv sync --locked, never --frozen. --frozen means "do not resolve", not "the lock is
current": against a pyproject.toml the lockfile does not satisfy, --frozen exits 0 and
installs the stale set.
src/wildfire_service_territory_overlap/artifacts.py. These are the rules about what this project will say
about a named company. Weakening one is not a refactor. Every rule has a test that feeds
it something it must refuse; keep that pairing.
src/wildfire_service_territory_overlap/intervals.py. The only route a proportion takes to an artifact. If you
find yourself dividing two integers anywhere else, that is the bug.
src/wildfire_service_territory_overlap/sources.py. Reviewed endpoints and quoted publisher caveats. A change
here moves published numbers or points the acquisition somewhere new. PROVENANCE.md
must be updated in the same change; a test compares them.
src/wildfire_service_territory_overlap/acquire.py. Run by hand, never in CI. It must never gain a retry under
a different identity, a browser-shaped User-Agent, or a path that writes a partial walk.
- Publish a rate without its denominator and its interval.
- Publish a zero for a measurement that could not be made.
- Publish a damage rate for a named utility, or order territories by any measured value.
- Read, infer, approximate, or publish the location of any physical utility asset, from any source.
- Award a contested record to one of the territories contesting it.
- Fetch an address, parcel number or assessed value it does not need.
A change that does any of these will be declined regardless of how well it is written.
make acquire # network, by hand, never in CI
make report # rebuild published/ from data/raw/
Then copy the new feature counts, byte counts and hashes from data/raw/acquisition.json
into src/wildfire_service_territory_overlap/sources.py, update PROVENANCE.md and the figures in README.md,
and commit the new published/ tree. data/raw/ stays out of git.
Prose in comments and documentation explains why, not what. No em dashes or en dashes.
Follow this walkthrough to make and verify your first change using only uv:
-
Setup and offline build: Run
uv sync --lockedto install pinned dependencies. Runmake report-offline(oruv run python -m wildfire_service_territory_overlap.cli --fixture --dins fixtures/dins_sample.json --iou-pou fixtures/else_iou_pou_sample.geojson --other fixtures/else_other_sample.geojson --counties fixtures/county_boundaries_sample.geojson --out build/offline). This builds artifacts intobuild/offline/measurements.jsonandbuild/offline/REPORT.md. Notice"is_fixture": trueinsidemeasurements.json: this flag distinguishes offline fixture runs from live published data. -
Inspect the generated report: Open
build/offline/REPORT.md. Locate the invented territories documented infixtures/README.md(such as Alpha Electric Company, Beta Municipal Utility, Gamma Rural Cooperative, and Delta Choice Energy). -
Observe the determinism gate in action: Break something tiny on purpose to see how the gates protect determinism. For example, edit
fixtures/else_iou_pou_sample.geojsonand rename a territory inside the fixture. Runmake determinism. Watch the gate refuse: two builds of byte-identical inputs must agree byte for byte, and any deviation or nondeterminism is rejected. Revert your temporary change before continuing. -
Understanding the verification gates:
make verifyruns the following sequential gates. If a gate fails, here is what it means:lock-check:uv lock --checkfails whenpyproject.tomlanduv.lockare out of sync.sync:uv sync --lockedfails if dependencies cannot be cleanly installed from the lockfile.lint:ruff check .fails when code style or static quality rules are violated.format:ruff format --check .fails if code formatting deviates from ruff formatting rules.typecheck:mypy --strict srcfails when static type annotations are missing or inconsistent.test:pytestwith coverage fails when unit tests fail or branch coverage drops below the 90% floor.audit:pip-auditfails if any dependency contains known vulnerabilities.report-offline: fails if the offline report generation pipeline breaks on committed fixtures.determinism: fails if two consecutive builds from the same inputs produce different output bytes.
For in-depth operational guidance and refusal troubleshooting, consult docs/RUNBOOK.md.