From 4a8a6238de80d0fa1786b2014faf321eccec63b2 Mon Sep 17 00:00:00 2001 From: iceteaSA <171169159+iceteaSA@users.noreply.github.com> Date: Thu, 17 Sep 2026 20:16:27 +0200 Subject: [PATCH] gate: say what the floor ratchet actually defends The refusal text asserted that a branch forked before a raise lowers the floor silently and every gate still passes. Nothing verifies that sentence and it is wrong. Constructed both paths on a scratch clone: squash stale(610) onto master(616) -> floor 616, gate.sh not even staged fork-before-raise, edits floor line -> UU, conflict marker A squash applies the diff, not the branch's file contents, so master's raise survives; a branch that does touch the line conflicts loudly and GitHub refuses the merge. Neither is silent. What is silent is a human resolving that conflict by keeping their own side -- which happened on this repo an hour before #46 landed, by hand, and taking --ours on the floor line would have dropped the raise with nothing to catch it. The check also covers a plain hand-edit downward, on a branch or on master. A refusal message is read exactly when someone is confused and looking for an explanation, which is the worst place to keep a plausible wrong one. This says what the check defends and names both routes that reach it. Rendered by tripping the arm rather than read off the diff: GATE FAILED: floor ratchet: this tree's workspace floor is 600 but origin/master (408fc40) carries 618 -- a squash does NOT carry a stale floor onto master (the diff wins, and a branch that edits this line conflicts loudly), so the way a raise actually gets dropped is a human resolving that conflict with --ours, or a hand-edit here; re-measure on the merged tree, or set CK_GATE_FLOOR_LOWER_REASON --- scripts/gate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gate.sh b/scripts/gate.sh index b32c799..7d83b08 100755 --- a/scripts/gate.sh +++ b/scripts/gate.sh @@ -293,7 +293,7 @@ assert_floor_not_lowered() { printf 'this tree %s < %s %s — reason: %s\n' "$ours" "$target" "$theirs" "$CK_GATE_FLOOR_LOWER_REASON" return fi - fail "floor ratchet: this tree's workspace floor is $ours but $target ($target_sha) carries $theirs — a branch forked before a raise lowers it silently and every gate still passes; rebase and re-measure on the merged tree, or set CK_GATE_FLOOR_LOWER_REASON" + fail "floor ratchet: this tree's workspace floor is $ours but $target ($target_sha) carries $theirs — a squash does NOT carry a stale floor onto master (the diff wins, and a branch that edits this line conflicts loudly), so the way a raise actually gets dropped is a human resolving that conflict with --ours, or a hand-edit here; re-measure on the merged tree, or set CK_GATE_FLOOR_LOWER_REASON" return fi