Uh oh!
There was an error while loading. Please reload this page.
fix(2347): rfcs' develop cell gets a value that is true again - #330
fix(2347): rfcs' develop cell gets a value that is true again#330LukasWodka wants to merge 1 commit into
Conversation
Lukas protected `rfcs/develop` on 2026-08-25 -- 1 review, dismiss stale, no force-pushes, no deletions, `enforce_admins: false`, mirroring `rfcs/main`. Correct, and it stays. It also left this entry with no true value: `exempt` stale the instant the branch was protected. Measured live on develop, 2026-08-25: exit 1, one finding fleet-wide -- "protection.develop is `exempt` but develop exists and is protected by classic protection". `required` two findings, because the develop policy asserts `require_conversation_resolution: true` and the three `quality / *` contexts and the branch had neither -- and could not have had the contexts, because `rfcs` had no code-quality caller to report them. So the fix is three steps in the order this file's own header prescribes: producer, then protection, then the entry. rfcs#51 adds the caller on `main` (the branch the guard reads for a non-train repo) and its contexts report green; `rfcs/develop` is then armed by hand; this commit records the result. The middle step is a branch protection change and only Lukas can make it, which is why this lands as a DRAFT: merged before the arming, it would put the inventory ahead of reality and turn one finding into two. Also carried, because this change makes them false: - `code_quality_caller_missing` said THREE citations. Two remain, claude-skills and release-train, so the anchor stays defined. Its self-description was wrong twice before; the correction now says so and points at the grep rather than at itself. - rfcs' `prod` cell justified `required_checks: []` for the `quality / *` contexts on the producer being absent. That premise is gone. The narrower true statement -- not armed on `main`, UNDECIDED -- replaces it, so the empty list cannot be read as a structural impossibility. Refs backend#2347, backend#1415 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
LukasWodka
commented
Aug 25, 2026
Closing in favour of #332, which does the same job better. Not a preference call — two measured reasons: 1. This PR ships the defect #332 was held for. It tells the reader to derive the roster with: That is less anchored than the version @saadqbal rejected on #332, so it matches prose comments as well as real aliases and over-counts. A reader following it lands back on "three or four" — which is exactly the rotting count both PRs set out to remove. #332 now carries the anchored form ( 2. This PR's green is stale. Its #332 is also the fuller fix: it deletes the count outright rather than decrementing it, and files backend#2501 for the "should Nothing is lost. Both PRs flip the same two rows ( Worth recording why two PRs existed at all: the staleness was created by a branch-protection change — |
The bind
Lukas protected
rfcs/developon 2026-08-25 — 1 review, dismiss stale reviews,no force-pushes, no deletions,
enforce_admins: false, mirroringrfcs/main.That was right and it stays. It also left
rfcs.protection.developwith novalid value, because both of the two it can hold are false:
exempt(what is ondevelopnow)exemptbut develop exists and is protected by classic protection. The exemption is stale"requiredconversation resolution=False, policy wants True, anddoes not REQUIRE quality / gitleaks, quality / house-rules, quality / action-pinsMeasured, not inferred —
scripts/caller-drift.pyagainst the live org from anunmodified
developcheckout, 2026-08-25:The org audit is already red. It has not run since the protection change; it
will say this the next time it does.
Root cause
rfcshad no quality workflows at all — five kanban callers, and the onlycontexts a PR reported were
Cursor Bugbotandroute / route. Sixteen ofnineteen repos declare
code-quality.yml: required;rfcswas one of the ninebackend#1415measured as missing it, carried since ascode_quality_caller_missing. So thedeveloppolicy asserted three contextsthis repo had no producer for.
The three steps, in this file's own prescribed order
tracebloc/rfcs#51— adds.github/workflows/code-quality-caller.ymlonmain(the branchcaller-drift.pyreads for a non-train repo). Contextsconfirmed reporting green on that PR before this was opened.
rfcs/develop. Branch protection is a security setting; thissession did not touch it. The exact command is below.
Step 2 — the arming command, for Lukas
Not run by this session. One
PUT, becauserequired_conversation_resolutionhas no sub-resource endpoint and the full object replaces what is there — so
every field currently set is restated, not dropped. Values below are the live
read of
rfcs/developon 2026-08-25 plus exactly the two additions.Preconditions: rfcs#51 must be merged first — arming a context whose producer
is not on the branch leaves every PR pending forever (client#665). Verify after:
Expected: the three contexts,
strict:false,convo:true,reviews:1,dismiss:true,admins:false,force:false,del:false.What this PR changes
rfcs.protection.develop:exempt: *develop_unprotected_non_train→required, with the bind written down so the next reader does not have tore-derive why one edit could not fix it.
rfcs.callers.code-quality.yml:exempt: *code_quality_caller_missing→required # code-quality-caller.yml.Two things carried because this change makes them false:
claude-skillsandrelease-train(grep -n '\*code_quality_caller_missing'). Its text saidTHREE and named
rfcs; corrected to TWO. Not deleted: an anchor is only deadprose at zero citations, and this is not zero.
develop_unprotected_non_trainalso survives with 1 citation(
claude-skills).prodcell justifiedrequired_checks: []for thequality / *contexts on "the producer is absent". From rfcs#51 that is false. Replaced
with the narrower true statement — not armed on
main, UNDECIDED — so theempty list cannot be read as a structural impossibility.
prodis otherwiseuntouched; arming
mainis a separate decision nobody has taken.Test plan
python3 -c "import yaml; yaml.safe_load(...)"— parses; anchors resolvemake check— green, 95 passed / 0 failedpython3 scripts/reason-citations.py— 0 findings, no exemption went stale(26 citations / 124 reasons; the pre-edit baseline was 25 / 126)
scripts/caller-drift.pyagainst the live org on this branch — 3findings, all expected and all named above:
MISSING required caller for code-quality.yml on main(rfcs#51 unmerged),conversation resolution=False, anddoes not REQUIRE quality / gitleaks, quality / house-rules, quality / action-pins(Step 2 unapplied)Checklist
develop(.github's default)repo-inventory.ymlis a GUARDED file needing a greenaudit on its own head sha — which is unreachable until a human acts
Refs tracebloc/backend#2347, tracebloc/backend#1415, tracebloc/rfcs#51
Note
Medium Risk
Changes the guarded org contract for branch protection and required CI callers; wrong sequencing (inventory before caller merge or develop arming) can leave PRs blocked or audits red until external steps complete.
Overview
Updates
repo-inventory.ymlsorfcsmatches live org state afterdevelopwas protected andrfcs#51adds the code-quality caller—this file only records that outcome; armingdevelopand mergingrfcs#51must happen first for the audit to go green.rfcs.protection.developmoves fromexempt(develop_unprotected_non_train) torequired, with notes explaining why neither value was valid until the caller existed anddevelopwas armed with conversation resolution plus the threequality / *checks.rfcs.callers.code-quality.ymlflips fromexempttorequired, documentingcode-quality-caller.ymlonmainwithsoft-fail: falseandaction-pins-soft-fail: false.The shared
code_quality_caller_missinganchor text is corrected to two remaining citations (claude-skills,release-train) and warns that hand-maintained citation counts drift.rfcsprodcommentary is narrowed: emptyrequired_checksonmainis UNDECIDED (checks not armed), not “producer absent.”Reviewed by Cursor Bugbot for commit 63063db. Bugbot is set up for automated code reviews on this repo. Configure here.