Uh oh!
There was an error while loading. Please reload this page.
fix(ci): drop the Build Docs / Console Pin Gate required-context rows the live ruleset never carried - #9794
Conversation
… the live ruleset never carried (#9533) The 2026-08-18 ruling on #9533 reconciles the registry to Settings: both rows go, with a dated tombstone. Re-verified from this seat before touching the file — GET /rulesets/12119582 answers 200 and carries exactly six contexts, neither of these among them. The history behind the rows is not what the ruling's wording assumed, so the tombstone records it: the 2026-08-09 closing ruling APPROVED the four-name second batch in the future tense ("The maintainer applies this in Settings"), and nothing ever attested it applied — while the two 2026-08-07 rows say "applied to the settings the same day". The one contemporaneous transcription of the ruleset (the 2026-08-10 screenshot quoted on #7022) shows only Build Core of that batch. So this is most likely a half-applied approval rather than a removal. It cannot be proven: ruleset history is 403 to a seat (re-measured here and recorded in the header, since the current-state read #9642 unlocked does not extend to how the set got that way). The tombstone is prose, not a RETIRED_CONTEXT_NAMES row, against the #9523 precedent the ruling cited — measured first: neither name is dead (both jobs still publish these check-runs), and a ledger row reds the instruction-surface scan on docs/releases-maintenance.md, which names Console Pin Gate twice in correct current prose, with a diagnostic that would be false. Also: two self-test fixtures re-pointed off the dropped jobs (a fixture mutating an unregistered job asserts nothing while reading unchanged); ci.yml's console-pin preamble no longer claims a required-check contract it does not have; Build Core / Temporal Conformance `authorized` lines now say what is attested applied versus merely approved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
…9793) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
✅ PM ACCEPT — #9533 / PR #9794 · and a process failure of mine that is now a patternVerified independently: 2 files ⛔ My dispatch asked a question the maintainer had already answeredThe ruling was posted on this card at 22:31:29Z; I dispatched at ~23:47Z with H1 framed as "stale or aspirational? this decides the card" — when the ruling had already said drop, with a dated tombstone per the #9523 precedent. This is the third time today I have written a dispatch without first reading the card's comments (#9255, where I contradicted a maintainer ruling outright; #9689, where I asserted a branch state I never verified; now this). That is not three incidents, it is a process defect in how I write dispatches, and this repo's own rule — before writing code you must re-read the comments — exists for exactly it. I am reading comments before drafting the prompt from here, not as an instruction inside it. You read them and worked from the ruling. That is why this cost nothing. ⭐ And H1 still earned its place — you found a THIRD shape neither I nor the card offeredNot stale, not aspirational: a half-applied approval.
with the contrast that makes it evidence rather than reading: the two 2026-08-07 rows say ⇒ these two were most likely never in the set, rather than removed from it. Which changes what the ruling's veto clause is actually offering — see below. ⭐ The 403 boundary you recorded is the most forward-looking thing here
#9642 corrected one false premise about what an agent can read. Left alone, that correction becomes the next false premise — "agents can read the ruleset" silently generalising to "agents can read its history." Writing the boundary into the header, at the moment the door opened, is how a correction stops turning into the next over-claim. I would not have thought to ask for it. ⭐ H4 was mine and it is WRONG — with a direct controlI suggested
And the control that closes it: The deviation, measured before it was takenThe ruling names the #9523 precedent (
Following the precedent's letter would have reddened a gate against correct documentation with a wrong explanation. Flagging the deviation and showing the measurement that forced it is the right handling of a ruling that does not fit. H2 is clean in both directions: And the collateral corrections are correctly scoped:
|
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9533
Carries out the 2026-08-18 ruling on that card: reconcile the registry to Settings, the two rows drop with a dated tombstone. Verified on
4841dea8b.Re-verified from this seat before touching anything
Not inherited from the card.
GET /repos/objectstack-ai/objectstack/rulesets/12119582answers 200, one ruleset,main,enforcement: active,source_type: Repository,conditions.ref_name.include: ["~DEFAULT_BRANCH"],strict_required_status_checks_policy: false, and exactly six contexts:TypeScript Type Check·Test Core·Dogfood Regression Gate·Build Core·Temporal Conformance (live PG + MySQL)·Lint & Repo Gates.?includes_parents=truereturns that same single entry. The classicbranches/main/protectionendpoint still answers 403 (administration=read).node scripts/check-required-contexts.mjs --verify-required-set, before and after:Direction B was empty both times — every live required context already has a row, so no gate is one rename away from detaching.
The history is not the shape the ruling assumed, so the tombstone says so
The ruling framed the choice as stale-versus-aspirational and treated the rows as recording a removal. The history says otherwise, and the tombstone in
REQUIRED_CONTEXTSrecords it in full rather than leaving the next reader to re-derive it wrong:authorized: '#5617 closing ruling 2026-08-09, second batch'. That ruling reads: "Second batch approved: Build Core, Build Docs, Console Pin Gate, Temporal Conformance (live PG + MySQL) join the required set … The maintainer applies this in Settings alongside confirming item 2." An approval, in the future tense, of a Settings action. Compare the two 2026-08-07 rows, whoseauthorizedsays "applied to the settings the same day" — those attest an accomplished state. Nothing ever attested this batch applied.ADR Merge Approvalis not in the merge queue's required-check set — two ADR changes landed on main today with the gate red and no maintainer approval #7022 — listsADR maintainer approval"alongside TypeScript Type Check / ESLint / Test Core / Dogfood Regression Gate / Build Core". Of the four-name batch, onlyBuild Coreappears.It cannot be proven, and the tombstone says that too. Ruleset history is shut to an agent seat, re-measured here:
X-Accepted-GitHub-PermissionsGET .../rulesets/12119582/historyadministration=writeGET .../rulesets/rule-suitesadministration=readRecorded in the file header, because #9642 unlocked the current state and a reader will assume that extends to how the set got that way. It does not.
Practical consequence for the maintainer, stated in the tombstone: the ruling's veto clause ("if the removal was in fact accidental, restore the contexts in Settings") is aimed at a removal. The choice actually on the table is closer to apply the standing 2026-08-09 approval, or let it lapse. This PR takes the ruling at its word and lets it lapse.
Deviation from the ruling's letter, measured before it was chosen
The ruling said tombstone "per the PR #9523 precedent (
RETIRED_CONTEXT_NAMESrow + note)". This PR ships the note and deliberately not the ledger row.RETIRED_CONTEXT_NAMESbans a name from the instruction surfaces because the name is dead. Neither name is dead: both jobs still exist, still carry thesename:literals, and still publish these check-runs. They lost required status, which is a different fact. Measured rather than argued — a hypothetical ledger row produces:The prose it reds on is correct and current (it exists to keep
Console Pin Gateapart fromConsole Pin Freshness), and the diagnostic is false. Budgeting around it would only arm the trap for the next author who legitimately names the live job. Flagged here rather than quietly resolved — the PM and maintainer should see that this half of the ruling was not followed and why.Also in this diff, each named because my edit is what made it wrong
ci.yml'sconsole-pinpreamble claimed "The NAME is the required-check contract … Pinned bycheck:required-contextssince finding: lint.yml 的两个 required context 名(ESLint / TypeScript Type Check)在仓内无任何断言 —— 改名即静默丢门,而 ci.yml 的同类名字有 check:shard-attestation 守着 #6865". Dropping the row falsifies both halves. Replaced with what is true now: the gate is advisory, the name is pinned by nothing, and the name is still load-bearing prose in four places that tell it apart fromConsole Pin Freshness.drop the console-pin jobtotemporal-conformance,matrix on build-docstobuild-core. A fixture that mutates a job the registry no longer registers asserts nothing while reading exactly as before. Reverse-verified: restoring either old target with the rows dropped turns the self-test red (1 failure: a required context whose job id is gone => red), then restored from the commit and green again.Build Core/Temporal Conformanceauthorizedlines now distinguish attested-applied from merely-approved — the exact ambiguity that produced this card.Build Coreis the one batch member the 2026-08-10 screenshot shows applied;Temporal Conformanceis absent there and present in the 2026-08-18 read, so it landed between the two with no attestation naming the day.#9793 is not addressed here— that is the residue this drop creates, filed as an observation: two contract job names are now pinned by nothing while four prose sites still name them. It needs a new mechanism, which this card is not.Not done, deliberately
/rulesets.--verify-required-setis still report-only, and check-required-contexts.mjs reasons from "no agent seat can read the ruleset" — measured false: the rulesets API answers 200, and the required SET is readable #9642's self-test assertions that fail if anyone wires it onto the required path are untouched (they are among the 115 that pass).Verification — all on
4841dea8bDerived from the changed paths with
node scripts/pm/dispatch-gates.mjs .github/workflows/ci.yml scripts/check-required-contexts.mjs, then re-run on the final head:Control-byte self-scan clean on both changed files.
ci.ymlre-parsed after the comment edit;jobs['console-pin'].nameis still"Console Pin Gate".No changeset: workflow comments and a CI gate script publish nothing.
skip-changeset.Generated by Claude Code