version-guard: label-free local mode, first in gates and unconditional in core - #233
Merged
Conversation
…l in core pr mode no-ops without PR_NUMBER, so neither a pre-push 'just gates' nor a direct-push CI run ever asked the tear question — #232 shipped a protocol tear that only a pull_request run could catch. local mode runs the label-free tree checks with no GitHub context: lockstep agreement, monotonicity against a locally-derivable last cut (git tags, jsr.io fallback), and the protocol byte-identity tear check (shared with publish mode's implementation; network failure is a named FAIL, never a silent skip), plus an advisory reminder for modified conventions goldens (labels are PR-side intent, unenforceable locally).
lannbot
enabled auto-merge
August 23, 2026 02:17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Closes the gap #232 exposed: the protocol-tear check lived only in
prmode, which no-ops without PR_NUMBER — so a pre-pushjust gatesnever asked the question, and a direct push to main would have carried a tear until cut time.New
check.ts localmode — no PR context, no labels, no event payload:runtimelatest as fallback, loud SKIP when neither answers (fatal when it can answer)publishmode's check, so they cannot drift); network failure is a named FAIL with the incident history, never a silent skipbreaking/protocolorconventions-fix— labels are PR-side intent, local can only warnWiring:
version-guard-localrecipe runs first injust gatesand as an unconditionalgha::corestep (push runs are now covered;version-guard-prstill adds the label-aware checks on pull_request runs). AGENTS.md enforcement-points note updated (three → four).Gates
just test-version-guard50/50 (10 new local-mode cases incl. network-error and advisory semantics);just version-guard-localpasses on this tree (protocol 0.2.2 pending, lockstep 0.5.0 > v0.4.0 via local tag).