Skip to content

fix: let a records-only change preflight without the unit and race stages - #1236

Merged
REPPL merged 7 commits into
mainfrom
fix/records-only-preflight
Oct 30, 2026
Merged

REPPL merged 7 commits into
mainfrom
fix/records-only-preflight

Conversation

@REPPL

@REPPL REPPL commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator

A change whose whole diff is records (a new issue, a resolved one, an intent) waited behind the load gate for the full unit and race stages of every other preflight on the machine, and on a busy day it timed out and could not be pushed.

make preflight now takes a shorter rule for a committed change confined to the record tiers. It runs the same gates, build and vet, then precheck's tests in place of the unit and race stages.

What counts as records-only (scripts/records-only.sh, fail-closed). All of these must hold:

  • every path changed since the merge base with origin's default branch (renames read as delete plus add) lies under .abcd/development/ or .abcd/work/;
  • no *_test.go names any of them, by path, by file name, by record id followed by a dash (a test that globs itd-121-*.md), or by an ADR's bare number;
  • no path holds a newline, since the tests cannot be searched for such a name whole;
  • the working tree matches HEAD;
  • the diff is not empty.

precheck now also runs the packages whose tests read the committed record tree whole (record ids and slugs, the changelog, intents, release pages, the release digest, decisions, record matching, lifeboat packing), so a bad record fails there before the push.

The limit, stated in the script: a test that reads the record tiers by walking a directory, rather than by a path it names, runs for a records-only change only if it sits in a package precheck runs. One anywhere else runs only in CI's unit lane, which runs every test before the merge.

Anything else, a git failure included, takes the full run.

How it shows:

  • The run checks the verdict again before it starts, and says what it skips.
  • The receipt names its scope: full, or records-only with the classifier's verdict and the merge base it was taken at, so a later reader can redo the check.
  • A records-only receipt is minted only if the classifier still agrees at the mint.
  • make preflight PREFLIGHT_RECORDS_ONLY= takes the full run whatever the change.

The full rule is unchanged and comes first in the Makefile, so everything that reads it still does. CI is unaffected: its unit lane still runs every test on the pull request.

Tests:

  • the classifier: a records change, a code change mixed in, a record found by its id, a local branch named like origin's, docs, the conventions file, a fixture named by path or by file name, a move out of code, an uncommitted or hidden edit, an empty diff, no origin, an ADR named by its number, a path with a newline, control bytes kept off the terminal, a citation in a comment;
  • the Makefile run dry in a clone: records take the records rule, and a code change mixed in takes the full one;
  • the receipt's scope lines, and a records-only mint refused over a code change;
  • the records rule held to the full rule's gates and to precheck's test lines.

Resolves: iss-2610251555094324

Assisted-by: Claude:claude-opus-5-5

REPPL added 3 commits October 29, 2026 10:18
…ages

A change confined to the record tiers waited behind the load gate for the
full unit and race stages and could time out before it was pushed.
make preflight now takes a shorter rule for a committed change whose every
path since the merge base with origin's default branch is under
.abcd/development or .abcd/work and named by no test. It runs the same gates,
build and vet, and precheck's tests in place of the unit and race stages,
and says so. The receipt names its scope, verdict and merge base, and a
records-only receipt is refused over a code change. Anything the
classifier cannot answer takes the full run; CI's unit lane still runs
every test.

Resolves: iss-2610251555094324

Assisted-by: Claude:claude-opus-5-5
The guard's false-positive sweep reads each line of a script on its own, so
the continuation line of the records-only receipt write read as a command
named by a variable and was blocked, one block over the sweep's ceiling.
The write is now one line, as the full receipt's is.

Refs: iss-2610251555094324

Assisted-by: Claude:claude-opus-5-5
@REPPL
REPPL enabled auto-merge October 29, 2026 19:56
REPPL added 4 commits October 29, 2026 20:20
The records-only preflight is described in the Makefile and announced by the
run itself; the two AGENTS.md lines pushed the merged file past the 32768
bytes a host may read, so they are dropped.

Refs: iss-2610251555094324

Assisted-by: Claude:claude-opus-5-5
The full preflight rule gained secrets-check and vulncheck; the records-only
rule runs the same gates, so it takes both too.

Refs: iss-2610251555094324

Assisted-by: Claude:claude-opus-5-5
@REPPL
REPPL added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 6b43c89 Oct 30, 2026
14 checks passed
@REPPL
REPPL deleted the fix/records-only-preflight branch October 30, 2026 04:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant