Working in nullcpy/rvb. Read docs/ai-context.md before
making a change — it is the full brief. The rules below are the ones that cause
damage when broken.
mainis pure code.configs/andstate/are gitignored materialisations of thedatabranch;temp/,build/,build.json,build.mdare scratch. Nevergit add -A, never commit those paths.- Human config is published, not committed:
bash .github/scripts/push_data_configs.sh "<msg>".fetch_data_branch.shoverwrites localconfigs/— publish before fetching or lose edits. - A field nobody named is not yours to write. A default that asserts a value
(
${X:-false},-n "", an invented title) is a bug here, not a convenience. Reject an unrecognised value loudly instead of guessing (docs/decisions/0001). - Wire formats are frozen: asset filename grammar,
module.propupdateJsonpaths on theupdatebranch, manifest schema keys,data.jsonkeys, branch names. Add a key or bump a version; never reinterpret an existing one. .github/scripts/naming.pyis the only implementation of filename/architecture parsing. The website'srebuild_catalog.pyimports it through a sparse clone ofmain(RVB_NAMING_DIR) — do not add a copy there, and do not move the file's path without updating that clone step. Keep the module stdlib-only. (docs/decisions/0006)- Shell:
set -euo pipefail; a[ … ] && var=xchain whose last command may not run will abort a step before$GITHUB_OUTPUTis written — useifblocks; never call a cache-writing function from inside$( ); patch-name quoting happens only injoin_args. - Fail loud on branch reads, manifest merges and archive sanity (no "start
from empty" fallbacks). Fail soft per app, per notification. Adding
|| trueto a metadata path is a regression. - Verify before claiming done:
bash .github/traces/trace_runner.sh verifyfor anything touchingscripts/build.sh/scripts/utils.sh; a stubbed-binary harness intemp/for CI scripts (absence assertions need a negative control). - Commits: Conventional Commits, one logical step per commit, body explains
why. Do not push, merge, release, or open a PR unless asked — a push to
mainchanges the next scheduled run. .gitattributesmandates LF for.sh .py .yml .json .toml .trace; CRLF in a script breaks execution and trace goldens.
When a change alters behaviour that a document owns, update it in the same commit: engine stages → docs/build-engine.md; workflow order or gating → docs/ci-pipelines.md; branches, releases and file names → docs/storage-and-branches.md; anything the website reads → docs/website-contract.md; TOML keys → CONFIG.md.