Repository navigation
Model the GitHub ruleset as a converged .dag authority: desired ruleset -> apply -> READ BACK -> verify, following gunbc.repo_local_git_config's binding pattern, so 'witnesses is the one required context' stops being a hand-maintained web setting invisible to the tree - #9449
gunbai-bot[bot] wants to merge 3 commits into
Conversation
….dag authority DESIGN's Building & checks bullet states, as the fact the whole two-lane split turns on, that this repository's `passing CI` ruleset is active, carries no bypass actors, and names exactly ONE required status check -- `witnesses`. Until now that sentence was the only place the fact lived on our side of the boundary. Nothing declared it, nothing read it back, and nothing in the tree went red if it changed: specification without execution, at the outermost boundary the project has. `extdeps.github.rulesets` models the upstream interface -- rulesets, enforcement, targets, rule types, bypass standing, and the whole-ruleset PUT -- and nothing about what this repository wants. `gunbc.repo_ruleset` owns the policy and follows `gunbc.repo_local_git_config`'s binding pattern exactly: desired -> observe -> reconcile -> apply -> READ BACK -> verify, with convergence claimed only from the post-apply read and never from the apply's own 200. The §3 win is that the required context's name is IMPORTED from `gunbc.witness_floor_workflow` `witness_floor_workflow_job_id` -- the row the emitted workflow names its aggregation job with -- so renaming the job can no longer leave the ruleset naming a context nothing publishes, which is the failure that shows up as a check stuck pending rather than red. Every observation and verdict is typed rather than a Bool: three ways a read can fail (status refusal / transport refusal / undecodable body, never collapsed into an empty ruleset), three states for the status-check rule (absent / exactly these / more than one, so "no rule" and "no contexts" cannot render alike), and fourteen named divergences. Ownership is Owned rather than Ensured -- the opposite of repo_local_git_config's choice -- because "witnesses is the ONE required context" is a claim about the roster, so an extra context must plan a removal rather than be refused. EXECUTED, not typechecked. `verify` runs green against the live ruleset, and RED with a planted extra desired context (`required context missing: a-context-nothing-publishes`, exit 1). All ten witness bodies execute true, including a positive control that a desired-shaped observation diverges in nothing. `converge` was NOT executed: it writes to GitHub and the live ruleset already converges, so there was nothing to apply. NOT CLAIMED: neither entry point is enrolled in CI. `verify` is a route somebody runs, so the class climbs from unobservable to *mitigatable* -- drift is detectable, not detected. Enrolling it as a required phase is a separate change under its own operator agreement, and is named as this row's next-rung trigger. The DESIGN bullet and two notes in `gunbc.witness_floor_workflow` said the ruleset is not a `.dag` fact. It is one now, so those are corrected in place rather than left as knowingly-false recitals -- while keeping what did not change: a converged authority actuates and detects, it does not gate, so the aggregation job's window argument stands untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
review 56496, and it is right. `bypass_divergences` matched `BypassNever`
and collapsed everything else into one `_` arm emitting a single static
sentence -- total over the type and blind one level down, the exact
pattern the rest of this module is written to avoid.
Three facts sat under that wildcard with three different remedies.
`pull_requests_only` and `always` are real, DIFFERENT bypass grants, and
which one it is decides which role to revoke. `UnrecognizedBypassStanding`
is not a permissive ruleset at all -- it means GitHub's vocabulary moved
and this module's reading is no longer established, whose remedy is to
extend the parser. Its `raw` payload was discarded, which is the only
thing that says what to extend the parser WITH.
So: `RulesetBypassStandingUnrecognized { raw }` is its own divergence, the
two grants are named arms carrying the observed label the way the
neighbouring `RulesetEnforcementDrift` / `RulesetTargetDrift` arms already
did, and `ruleset_bypass_standing_wire_label` lands beside the other
wire-label projections in extdeps rather than being spelled here.
MUTATION RECEIPT, because the existing witness did not catch this and it
is worth recording why. `w_RED_a_reader_that_may_bypass_is_a_divergence`
COUNTED divergences, and a wildcard defeats counting -- it stayed true
under both shapes. The new
`w_RED_the_three_non_never_bypass_standings_render_differently`
DISCRIMINATES: executed against the pre-fix collapsed form it returns
false, against the split form true. All 11 witness bodies execute true on
the fixed tree; live `verify` still exits 0 against the real ruleset.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…t to land #9404 merged at 13:15:42Z. The three files it added -- gunbc.repo_ruleset, extdeps.github.rulesets and the witness module -- are on main and are BYTE-IDENTICAL to this branch's copies. Because the merge was a squash, the branch kept its own two commits, which is the only reason GitHub renders a diff for #9449 at all. The real content delta ran the other way: main was 25 commits ahead, so was 125 files and 17,238 deletions -- src/v2/std/effect_reach.dag, src/v2/workflow/required_floor.dag, src/v2/std/text.dag and others. Merging that PR would have DELETED 25 commits of landed work from main. The conflict was the symptom; a rebase would have preserved the hazard rather than removing it. So this merge resolves every path to main. That is not picking a side over authority-derived bytes: main's content is a strict superset of this branch's here, since this branch's own contribution is already in it unchanged. The check is exact rather than argued -- the resulting tree is identical to origin/main, whole-tree, so #9449's diff is now empty and it can neither revert anything nor land anything. DESIGN.md reached the generated-artifact merge driver, which correctly REFUSED rather than answering true. Its regeneration recipe is the right remedy when both sides carry distinct authority-derived content; it does not apply when one side is a subset of the other and the result is proven equal to main byte-for-byte. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Conflict resolved by merging This branch had no content left to land. #9404 merged at 13:15:42Z; this PR was opened ~10 minutes later from the same branch. Its three files — The real delta ran the other way. So every path resolves to
Recommendation: close this PR as a duplicate of the merged #9404. I have left it in draft rather than closing it, since it is bot-created and closing it is yours to call. It is now empty, so it is harmless either way. (One clause of the merge commit message was eaten by shell backtick substitution — the numbers in it are correct; the missing fragment is the — sent from wise-swift-875 |
|
Investigated. There is no fix to push, and I recommend against a re-run. The check did not fail — the run was cancelled. Run 33092943293 has Nothing in this PR can be the cause, and that is checkable rather than argued: the PR is 0 files / +0 / −0. Its tree was made identical to Two observations from the run worth recording, neither actionable here: the floor heartbeat before cancellation showed Why I am not re-running either. The floor lane costs ~50 minutes of runner time, and The standing recommendation is unchanged and now firmer: close this PR as a duplicate of the merged #9404. The branch has already drifted 16 commits behind — sent from wise-swift-875 |
Auto-opened by session-dashboard for session
wise-swift-875.Pushing to
session/wise-swift-875advances this PR.Worker attestation
Before flipping this PR to ready for review, confirm each item:
npm test,cargo test) and the result.Closes #Ndirective.Summary
TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.
Test plan