Home / Projects / Orchestrata Ultimate / Decisions / ADR index / ADR-0100

ADR-0100: Model review and the Prolog gate run once per slice at hand-back and once per batch, not on every commit; the deterministic gates stay per commit

field value
Status Superseded — Superseded by ADR-0101 (accepted 2026-10-13 18:40 by ruling, verbatim: "agreed, next"; superseded the same evening because its Context described a hook chain git commit does not run, see ADR-0101)
Date 2026-10-13
Register factory (docs/adr, 4-digit ids)
Source docs/adr/0100-model-review-and-the-prolog-gate-run-once-per-slice-at-hand-back-and-once-per-batch-not-on-every-commit-the-deterministic-gates-stay-per-commit.md — permalink at c3752887b (unchanged on master since that commit)
Wiki register entry ADR-0100 (wiki status: Superseded)

← ADR-0099 · ADR-0101 →

The record

Status: Superseded by ADR-0101 (accepted 2026-10-13 18:40 by ruling, verbatim: "agreed, next"; superseded the same evening because its Context described a hook chain git commit does not run, see ADR-0101) · Date: 2026-10-13 · Amends the per-commit placement of two hooks in .pre-commit-config.yaml (unified-code-review, prolog-gate); keeps ADR-0001's enforcement boundary (committed worktree state is what is judged) by moving the judgement to the two points where a slice's committed state is final

Context

Every commit in orchestrata-ultimate runs fifteen pre-commit hooks. Thirteen are deterministic and fast (ruff format and check, mypy, architecture checker, Prolog boundary, doc-truth lint, undeclared-dependency check, generated-artifacts gate, type-hint ratchet, traces lint, requirement-id format, two pyright ratchets, RUL-007 attribution). Two are not:

Hook What it does Measured on 2026-10-13
unified-code-review (code-review.py) three model reviews of the diff the daemon-publish builder: "3 reviews, no blocking findings" per real commit; every builder today made WIP checkpoints with --no-verify to avoid paying it mid-slice and paid it once at the end
prolog-gate (scripts/gate.py run) the Key-Rule gate over the whole tree the sync-fix builder: "exceeded the 280 s limit and was killed"

The effect is that the per-commit boundary is bypassed for every intermediate commit and enforced once anyway, at the last commit of the slice, where it costs minutes on a builder's critical path and still reviews the whole slice diff. Since ADR-0036 (codetools) the integration proof is a batch gate run per master fast-forward; orchestrata's deploy/ship-merge-master.sh is its equivalent point.

Decision (proposed)

  1. Deterministic gates stay per commit: the thirteen fast hooks, plus the git sentinel and RUL-007, run on every commit as now; --no-verify remains forbidden for them (a builder that cannot pass them stops).
  2. Model review runs once per slice, at hand-back, on the slice's full diff against its merge base, by the coordinator's review step before ship-merge-master.sh; its findings go to the slice's builder (fix-in-slice) and its verdict line into the slice's iteration-log row. A slice is not shipped with an open blocking finding.
  3. The Prolog gate runs once per batch, on master after each fast-forward, by the ship script (or the batch gate when it lands for orchestrata), with its ledger row; a red gate bisects by the merge list as ADR-0036 rule 2 does.
  4. Nothing loosens for the judged state: what is reviewed and gated is still committed state (ADR-0001); what changes is when, from every checkpoint to the two points where the slice is final.

Alternatives rejected

Consequences

Provenance

Builder reports of 2026-10-13 (daemon-publish, sync-fix, MCP) quoted in Context; .pre-commit-config.yaml at master c6f7472ac; Mohamed, 2026-10-13: "think, what can we improve in the workflow" → "do the four mechanical ones, mint the two adrs". Drafted by the coordinating session.

Relations of ADR-0100

Rulings cited

Specs cited

None (or no spec page exists for the ones named).