Skip to content

refusals name the rule, not a guess — every gate refusal carries "Nothing was pushed." whole - #122

Merged
munchist merged 4 commits into
mainfrom
aflow/refusals-name-the-rule
Oct 16, 2026
Merged

munchist merged 4 commits into
mainfrom
aflow/refusals-name-the-rule

Conversation

@munchist

Copy link
Copy Markdown
Contributor

Fix round on the refusal-wording change (appending to commit f57450a on aflow/refusals-name-the-rule).

The folder's checks failed on the last commit: the rewritten check_failed refusal broke the invariant that every gate refusal carries the exact sentence "Nothing was pushed." as its own sentence (expectRefused in pushCheckReceipt.test.ts ~183, and the new pushGateRefusals census, agree on it).

The check_failed message (checkReceipt.ts ~250) keeps "Nothing was pushed." whole as its own sentence and says the rest after it — the commit the checks failed on will not start passing; commission the fix onto the branch and publish again, the publication runs the checks on what it sends. Every rewritten refusal in scanReceipt.ts and checkReceipt.ts carries the sentence, so the census and expectRefused pass over every member. No test is loosened; nothing else changes.

…ists

Two refusal wordings in the host executor named what they should not
and withheld what they should.

The continueFrom refusal (harnessHandlers.ts ~581, after
ownedSession returns nothing) guessed expiry or an executor restart;
both guesses were wrong in the observed case and the wording sent the
diagnosis there. The comment above it is right that the answer must be
the one a session that never existed would get — naming the session as
another run's confirms it exists. The refusal now states the rule
without confirming anything: a kept session is owned by the run that
made it, every commission is a new run, so a continueFrom can only
name a session this same run made, and a session from any other run is
refused as if it did not exist. A session this run made that expired
or was lost to a restart is a different refusal.

The gate's scanAgain (scanReceipt.ts ~184) and checkAgain
(checkReceipt.ts ~181) told the reader to run host.commit.scan or
host.commit.check and push with the receipt — operations the
publication machinery holds and the Helmsman, the only agent that
reads the refusal, is refused promotion of (out_of_scope). The remedy
that exists is the publication: it scans and checks what it sends.
Both refusals now say to publish the branch again as it stands, the
way the other_range refusal in the same file already does, and name
neither operation.

The structured refusal codes are unchanged. Tests state each property:
the continueFrom refusal for a session another run owns states the
ownership rule and offers neither expiry nor restart as a guess; no
gate refusal names host.commit.scan or host.commit.check.
The continueFrom refusal states the ownership rule — a kept session is
owned by the run that made it, every commission is a new run — and the
two ways a session this run made stops being held: idle past the hour,
or an executor restart. It confirms nothing about the particular ref.

The gate's re-scan and re-check refusals name the remedy that exists —
publish the branch again as it stands — and the check_failed refusal
names commissioning the fix onto the branch and publishing again; none
names host.commit.scan or host.commit.check, operations the Helmsman is
refused promotion of. The refusal census in pushGateRefusals.test.ts is
derived from a Record over the refusal unions so a member left out fails
the type-check. Structured refusal codes unchanged.
…whole

The check_failed refusal keeps the invariant sentence as its own and
says the rest after it: the commit the checks failed on will not start
passing — commission the fix onto the branch and publish again, the
publication runs the checks on what it sends.
…on ends, drop the check_failed prediction, and assert the whole sentence in the census

Fix round 2 on the refusal wordings (PR #122).

(a) The continueFrom refusal names the withdrawal of the folder's grant (index.ts ~446/~653, harnessHandlers.ts ~518/~1203) and the failed checkout re-preparation (~681) alongside the idle hour and the restart, and words the list as the ways a kept session ends; the test header says the same.

(b) The check_failed refusal drops "That commit will not start passing" — the gate cannot know it; the rule stays: a commit is pushed only once its checks pass on it; commission the fix onto the branch and publish again.

(c) The census asserts the whole sentence "Nothing was pushed." for every refusal it reaches, in one place.
@munchist
munchist merged commit 502cbcd into main Oct 16, 2026
3 checks passed
@munchist
munchist deleted the aflow/refusals-name-the-rule branch October 16, 2026 21:50
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