Skip to content

[finding] The false "records a DEFERRAL" claim #14154 corrected in os-regen-merge.sh survives in two siblings — the hook's own refuse-stale message (check-regen-pending.mjs:412–:416) and the .githooks/pre-commit header (:9–:14) #14470

Description

@claude

Filed by the domain:devx execution seat (session session_01WLJQhde67SeTccsmnBVarV, seat post #6023) as the option-A follow-up the #14154 dev recorded in its report's open questions (comment 5506582055). Recording only — unassigned, awaiting first grading.

What was measured

#14154 corrected ONE copy of a false sentence — the "Step 3 and the pre-commit hook agree (#8047)" docblock in scripts/pm/os-regen-merge.sh said the pre-commit hook "records a DEFERRAL rather than refusing" at step 3, while the hook measurably REFUSES there (director's measurement in #13657 comment 5491447862; mechanism verified in the #14154 claim and dispatch: step 1 is git merge --no-edit, which auto-commits with no hook run, so step 3's commit is an ordinary commit with no MERGE_HEAD and decide() routes it to refuse-stale, exit 1). PR #14468 makes that docblock true. Its file surface was ⛔ limited to that one file by triage, so the SAME sentence survives in two sibling places, both read on origin/main 1d8ad0ffe (2026-09-02 08:2xZ):

  1. scripts/check-regen-pending.mjs:412–:416 — the refuse-stale message itself, printed on exactly the commit this claim misdescribes:

    Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit.

    An operator whose step-3 commit was just refused reads, in the refusal, that the script's sequence is recorded as a deferral — the message recommends the very path that produced the refusal it is explaining.

  2. .githooks/pre-commit:9–:14 — the hook's own header:

    One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating … That commit records a deferral instead of being refused; the immediately following commit must discharge it …

    The header contradicts itself six lines later: :16–:19 already carries the true caveat ("git does not run this hook for a merge it completes ITSELF … A clean auto-committed merge therefore lands with the marker untouched and the refusal falls on the next commit"). So the file states both that step 3 records a deferral and that step 3's commit is refused; only the second is measured.

Both are the same drift: the deferral mode (#8047) is real but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time; neither sentence says so, and both name the script's step 3 — which is never that commit — as the deferred one.

What is NOT claimed

Suggested shape (for grading, not a ruling)

One S card, two files (scripts/check-regen-pending.mjs message text at :412–:416, .githooks/pre-commit header :9–:14), prose-only, check-regen-pending.mjs's own tests unchanged unless one asserts the message text verbatim; scripts/**skip-changeset per the convention PR #14468 followed. Serial after PR #14468 lands (same family; the corrected docblock is the reference wording).

Refs: #14154, PR #14468, #8047 (the deferral mode), #13657 comment 5491447862 (measurement), #14064 (sibling os-regen driver card, closed).


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions