blob: 8f140275ee5993da234a4126e6c4050f704207e2 [file] [view]
# AGENTS.md — build-support
Operational rules for the architecture/hygiene gates in this directory (the
`check-*.sh` / `check-*.py` scripts wired into FE `mvn validate` and BE
configure). These scripts fail other people's builds — treat them as
production code with a stricter bar than the code they guard.
## Gate maintenance discipline
- **Zero false positives, non-negotiable.** A per-commit gate must be
deterministic, pure-text, and second-level. Anything heuristic
(nm audits, closure sweeps, wall-clock trends) belongs in offline reports,
never in the configure/validate path. One false positive burns more trust
than ten missed regressions.
- **Fail loud, never silently skip.** A missing tool, a table entry pointing
at a renamed file, a sentinel nobody references any more — each is an
error with a message, not a silent pass (precedents:
`doris_skip_unity_inclusion` in `be/CMakeLists.txt`, the missing-python3
branch of `check-build-hygiene.sh`, the missing-header errors in
`check-header-deps.py`).
- **Every failure message carries three parts**: the violation, the
*mechanism* (why this edge/entry is expensive — model:
`check-header-deps.py`'s reason/chain/fix form), and a concrete fix path
the reader can act on without opening the script.
- **Escape hatches are tables in the script, not flags.** Budgets,
whitelists, exception sets and `ALLOW` lists live next to the rules so a
deliberate change is a one-line reviewed diff in the same commit. Do not
add bypass environment variables or config files.
- **Rebaselining budgets**: forward closure budgets carry zero slack (bump =
explicit, justified edit); reverse reach baselines carry +10% and are
re-measured on the audit cadence with `check-header-deps.py --budget`.
## Changing a gate script
- Any behavior change to a `check-*` script requires updating its self-test
in `build-support/tests/` (red/green injection form: every seeded
violation turns red with the fix path in the message, restoring turns it
green) and running `bash build-support/tests/run.sh` all of it, since
the entry scripts aggregate.
- The BE hygiene self-tests briefly mutate working-tree files (backed up and
restored by EXIT traps): do not run them concurrently with a
build/configure of the same tree, and do not "fix" them by pointing at
fixtures the gate tables name real headers on purpose.
- Keep scripts portable: bash 3.2 (macOS), BSD *and* GNU userland in
particular `sed -i` needs the `-i.bak` + `rm` form. Python: stdlib only,
no third-party imports.
- Performance envelope: the combined configure gate is ~1s today; keep any
addition within a low single-digit second budget, with zero build
dependency (no compiler, no compile_commands.json).