Policy for this repo, adopted 2026-10-19. master is the only long-lived
branch. Everything else is temporary.
- One trunk.
masteralways builds, always passes the gates below, and always runs against a local hardhat chain. Releases are tags onmaster(vX.Y.Zpublishes to PyPI through.github/workflows/release.yml). - Topic branches are short. Name them
<topic>or<area>/<topic>. A topic branch lives for one piece of work and is merged or deleted within the sprint that opened it. Parallel work uses git worktrees offmaster, each on its own topic branch. - No branch stacks. Do not base a topic branch on another unmerged topic branch. If work depends on unmerged work, merge that first.
- Delete after merging, locally and on origin.
- Rebase, then fast-forward. Rebase the topic branch onto the current
masterand fast-forwardmasterto it (git merge --ff-only). No merge commits, so history stays one readable line. Squash only when the branch's commits do not stand on their own. - Every commit on master stands alone: it builds, its tests pass, and its message says what changed and why in plain words. No em dashes, no AI attribution or session links, no co-author lines.
- Docs move with the code. A change that alters behavior updates its
living spec under
docs/in the same commit or the same merge. A design decision gets a dated Decision section in the spec it changes.
-
Targeted tests for every area touched pass. Never the full suite.
-
The end-to-end scripts for the areas touched pass:
Area touched Script Tool store, mint, close, reviews scripts/local_e2e_tool_economy.py,scripts/local_e2e_tool_security.pyJurisdiction resolution, switching, charter scripts/local_e2e_jurisdiction_switch.pyVentures, vault, service revenue scripts/local_e2e_venture_loop.pyServices market, inference across daemons scripts/local_e2e_cross_daemon_inference.pyRobot side, packs, worklog scripts/local_e2e_robot.py -
Secrets and generated files are never committed.
A change is a breaking upgrade when daemons on the old and new build would compute different epoch closes, proofs or charter readings, or when it needs a contract ABI that is not deployed yet.
- The commit message starts with
Breaking upgrade:and says what every daemon must do. - The epoch computation changes bump the supported epoch rules version
(
SUPPORTED_EPOCH_RULESinatn/config.py; the jurisdiction's Registry keyjurisdiction.autonet.epoch_rules), perdocs/multi_jurisdiction.mddecision 4. - Contracts land first. The ABI change is merged to the default
branch of
trustless-contracts(orcontracts/core/here) before the autonet change that calls it, and the autonet commit names the contracts commit it targets.
masteris pushed to origin when the owner says so. Anything that touches a chain is confirmed by the owner on local hardhat before it is pushed or deployed to a testnet.- A tag is cut only from a pushed
master.