docs(governance): add GOVERNANCE.md release governance charter - #125
waterbro-8 wants to merge 7 commits into
Conversation
PeterGuy326
left a comment
There was a problem hiding this comment.
Blocking changes required before this governance charter can be treated as enforceable policy:
- The live
mainprotection hasenforce_admins.enabled: false; this PR currently statesenforce_admins: trueand that settings enforce the charter mechanically as present facts. Either land the separately authorized narrow setting change first, or describe this as a pending target and keep the live/enforced state explicit. No setting change is authorized by this PR. - Preserve every stronger live gate in the written baseline:
strict: true,require_last_push_approval: true,required_linear_history: true,required_conversation_resolution: true, plus force-push/deletion disabled. The full replacement PUT in #124 would accidentally disable/omit three of these; remove it from #124 and, if separately authorized, use onlyPOST .../protection/enforce_adminswith before/after field-for-field verification. - Remove every security-incident exception that permits disabling tag protection or moving/deleting/reusing a published tag. Published tags remain immutable evidence. Respond through an advisory, channel deprecation/yank where supported, a reviewed fix, and a new patch tag.
- Correct the history and terminology: #81 fixed the structurally unsatisfiable single-CODEOWNER setup; this is a follow-up admin-bypass gap. Prohibit admin bypass and merges without a current independent approval, rather than prohibiting the author from pressing the merge button after a valid independent approval. The recent-five evidence is #117/#115/#114/#108/#105 (not #93).
- Link this PR with
Refs #124so policy CI can identify the canonical issue, but do not mark #124 ready/closed until the owner decides enforce-admins and the two-versus-three CODEOWNER tradeoff. Add cross-references to AGENTS.md and docs/maintainers/releasing.md and describe this charter as additive.
The stable-tag ruleset already exists and must remain unchanged. I will re-review a corrected exact head; the current head 98126e69a1513b2852129aa0568779e65938fcdd is not approvable.
PeterGuy326
left a comment
There was a problem hiding this comment.
Re-review of exact head 4a16bd838dcf24461be52f1f256ee8f6d103a357: approved.
All five blockers from my review of 98126e69a1513b2852129aa0568779e65938fcdd are resolved:
- The charter now matches the separately applied live
enforce_admins: truestate. - It preserves every stronger gate: strict checks, last-push approval, linear history, conversation resolution, and force-push/deletion prohibitions.
- Security incidents have no tag-protection bypass; published tags remain immutable evidence.
- #81 history, recent-five evidence, admin-bypass terminology, and normal post-approval merge semantics are corrected.
- The PR references #124 R2 and is explicitly additive to AGENTS.md and the release policy.
Independent read-only final audit found no governance-content blocker. All 15 current checks pass. The live branch-protection object and tag ruleset 21888356 were also read back and match the document field-for-field.
Because I made the latest maintainer push, this review does not satisfy require_last_push_approval; @Bindy-lbb must independently approve this same exact head before a normal merge. No admin bypass is authorized.
PeterGuy326
left a comment
There was a problem hiding this comment.
Changes requested on exact head 4a16bd838dcf24461be52f1f256ee8f6d103a357.
The required CI from this head is historical, not merge-valid: the branch is behind current main, so strict up-to-date protection requires a new candidate and fresh exact-head checks.
More importantly, the charter and PR narrative still state that the repository chose to retain two CODEOWNERS. That is superseded by the canonical owner decision in #124 R3, which authorizes the bounded third-owner change in #132. Update the text to distinguish current/merged state from the approved #132 transition, preserve all existing protection and tag-authority boundaries, and avoid claiming that #125 changes roles or settings.
After #132 is normally merged (not bypassed), rebase or otherwise non-destructively synchronize #125 against that mainline, update its evidence to the resulting exact head, rerun required CI, and request independent review. If the author supplies the new head, I can review it; if I supply it, @Bindy-lbb must review instead.
|
One maintenance suggestion before this charter is finalized. The CODEOWNERS section hardcodes a snapshot that will drift The This means every future owner change (and #138 is already adding a third) requires a coordinated update to GOVERNANCE.md as well. If the two documents drift apart, readers won't know which one is authoritative — and the charter's own rule ("any addition is a governance change to this document, not a silent edit to CODEOWNERS") makes that drift look like a policy violation even when it's just a stale reference. Suggestion: reference the source of truth instead of duplicating it Replace the inline code block with a statement like:
Then keep the policy paragraph (non-author approval, availability rationale, addition requires a governance change) but drop the literal names. That way:
This also sidesteps the current blocker from the third review: the sentence "the maintainer decision is to keep these two owners" is already stale because #124 R3 authorized a third. Decoupling the reference from the policy would prevent this class of staleness from recurring. |
4a16bd8 to
1307fef
Compare
Refs bytefolk#124 The charter previously asserted a two-owner CODEOWNERS roster and a single tag ruleset. A third owner reached main through bytefolk#138 under the bytefolk#124 R3 decision, and refs/tags/v* is covered by a second active ruleset that also blocks creation. De-duplicate the roster against .github/CODEOWNERS, record both rulesets and what a gated tag creation means for the runbook, replace the exhaustive required-check claim with an observed-jobs enumeration, and refresh the R2 attribution to R4.
3c1fdff to
470babe
Compare
|
Author-side status update on the standing changes-requested review. This is not an approval, not a Head under review: The work is two commits, deliberately separated so the increment against the reviewed content is
Mapped to the five points from the review of
One question this branch does not answer, and should not paper over: under ruleset Two process notes: |
|
Read-back complete — all five blocking items verified in the diff: CODEOWNERS now references Decisions:
|
Read-back verified: all five blocking items addressed per the 2026-09-03 ledger. Unblocking for Bindy-lbb review; merge via normal squash flow.
|
Read-back of the sync step in the 2026-09-03 flow note (item 4, first step). Not a review, carries no approval or request-changes, and is not a merge, close, or review-request action. It exists because that step turns out to be already satisfied, and the reason this PR is still 1. Sync state: already on current
|
| read (live, at time of writing) | value |
|---|---|
main tip |
87d235b7cffeb9d9e49653760b5362c792366900, committed 2026-09-03T07:41:35Z — unchanged since |
this PR's base.sha |
87d235b7cffeb9d9e49653760b5362c792366900 — same commit |
compare/main...470babedf1 |
status=ahead, ahead_by=2, behind_by=0 |
| head tree vs main tree, blob-level | added exactly [GOVERNANCE.md], removed [], changed [] |
GOVERNANCE.md blob at head |
0650fcebb18899810957fd21993971c62b2fe497, 7828 bytes / 136 lines — byte-identical to the value recorded in the body's ledger |
There is therefore no rebase to perform at this moment, and the charter text has not moved, which is what item 3 asked for. No ref was touched by this check: pushing an empty "sync" would change only who last pushed, and the body already states that the last pusher should not also be the reviewer of that push.
The merge-time rule from the body still stands and is not closed by the above: if main advances before Bindy-lbb finishes, the head must be brought up to date one more time immediately before the squash merge, with fresh required CI on that exact head.
2. Required CI on this exact head: 15/15 success
GET /commits/470babedf1ef6522ebc9de40f02f944f5dba8fca/check-runs returns 16 records over 15 distinct job names (the 16th is a superseded round of Conventional title and linked issue on the same head; the current round is success). Taking the highest check_suite.id per name: suites 91410172427, 91410172748, 91411493014, all completed / success. statusCheckRollup is empty for this head — a known aggregation quirk on this repository, so the rollup is not the reading to trust here.
3. Why it is still blocked: the dismissal has not landed
The flow note said CHANGES_REQUESTED was dismissed. Two independent endpoints disagree:
| review id | author | state read now | submitted | head it reviewed |
|---|---|---|---|---|
5066232814 |
PeterGuy326 |
CHANGES_REQUESTED |
2026-08-31T12:08:11Z | 4a16bd838dcf24461be52f1f256ee8f6d103a357 |
5062515904 |
PeterGuy326 |
DISMISSED |
2026-08-31T01:36:07Z | 98126e69a1… |
5062950577 |
PeterGuy326 |
APPROVED |
2026-08-31T03:43:36Z | 1307fef739… |
GET /pulls/125/reviews and GraphQL pullRequest(number: 125) { reviewDecision } → CHANGES_REQUESTED agree. Because 5062515904 in the same response reads DISMISSED, this endpoint does surface dismissals on this repository — so 5066232814 is genuinely still in force, not a lagging projection.
Consequences worth stating plainly:
- Step 2 of the flow is the open item, not step 1. The sequence
rebase → dismissal → Bindy-lbb review → squash merge → closecannot be read in order from here: step 1 was already satisfied and is a no-op, while step 2 did not take effect. Dismissing5066232814is the reviewer's action; nobody else should substitute for it, and dismissing it on his behalf would be exactly the thing this charter is written to forbid. - After a successful dismissal,
reviewDecisionmay land on the 2026-08-31APPROVED, which was submitted against1307fef739— not this head. The charter's own rule is a current non-author CODEOWNER approval, so an approval on a stale head is not the gate this document describes.Bindy-lbbremains the pending requested reviewer; nothing here is a nudge to him. mergeable_state = blockedis consistent with both causes above. It cannot be decomposed further from here:GET /branches/main/protectionis 403 for this account (non-admin), so the configured gate set is Release governance gap: admin self-merge bypass and v0.1.0 tag churn (follow-up to #81) #124's carried read-back, not a fresh read.
4. Ledger drift in the body, flagged instead of edited
The body pins Base (current main tip) this branch is synchronized to: 87d235b7… and Head under review: 470babed…. Both are still literally true right now. This comment is where the state is re-read; the body has not been edited, so nothing is silently rewritten after the review that was performed against it.
5. What this check did and did not do
Did: read-only API calls (git/ref/heads/main, pulls/125, compare, check-runs, reviews via REST and GraphQL, git/trees of both heads, branches/main/protection).
Did not: push or rebase anything, edit GOVERNANCE.md, edit this PR's body, dismiss or un-disqualify any review, request a review, merge, close #125, act on #124, or touch #163 (the tag-creation path, which item 3 of the flow note moved to the repository-config side with its own owner).
Withdrawing at author's request: the five blocking items from this round were all addressed in d260021 + 470babe (CODEOWNERS reference, both rulesets recorded, required-checks labelled as observed, enforce_admins attributed as read-back, R2→R4 attribution). The intended withdrawal on 08-31 did not land on GitHub; this dismiss is that action. Refs #125.
PeterGuy326
left a comment
There was a problem hiding this comment.
Independent review: this is documentation-only governance text. It defers the CODEOWNERS roster to the source-of-truth file, records the tag rulesets as evidence rather than enforcement, and states the non-author review requirement without changing settings. Required CI is green and the branch contains current main. Approving for squash auto-merge.
Pull request was closed
|
Author-side post. Not a review, not an approval, carries no vote, does not ask to merge or close. I am the author of this PR, so nothing here counts as review evidence for it; the review this PR still needs is Raising this because of
My position as author, so One mechanical fact for whoever syncs this branch next, since For the record on CI, so nobody has to re-derive it: 17 check names on this head, 16 |
This PR cannot merge, and it is not a review problemRecording this so nobody waits on an approval that would not help.
Mechanism
codeql:
name: CodeQL (${{ matrix.language }})
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}This PR's head is When a matrix job is skipped by a job-level That context name matches none of the three required ones. The required contexts are therefore never satisfied — not "failing", but absent, which branch protection treats as pending forever. Confirmation by contrastSame-repo PRs in this repository report all four contexts normally. mem #165 and #188, both merged 2026-09-10: This PR's rollup contains one CodeQL entry, the literal What will not fix it
What will fix itThe guard is a defensible security choice: the Available resolutions, in rough order of how much they preserve the current security posture:
Option 1 is a mechanical fix the author or any maintainer can do. Options 2–4 are owner decisions that affect all twelve repositories, because Scope of the same trap, org-wideEvery open fork PR in a repository that requires a CodeQL context is permanently unmergeable:
Worth naming the consequence for external contributors specifically: I have not changed any branch protection, ruleset or workflow file, and I am not opening a PR against the template unilaterally — the same reasoning that made me leave |
|
Superseded by #204, which carries this charter onto a branch inside Why this pull request cannot merge, and it is not your fault. Its head branch lives in if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}Skipping CodeQL on a fork PR is correct — the job needs So no number of approvals makes this mergeable, and Confirmed by contrast. #204 is the same document on a same-repo branch, and within a One separate thing worth recording. The What changed in the content. The charter itself carries over, but four claims in its The likely source of the error is that the collection endpoint If you would rather own this yourself: you have write access, so you can push your Closing as superseded. |
…cted (#204) ## What this does Adds `GOVERNANCE.md`, the release governance charter for this repository: branch protection on `main`, `refs/tags/v*` immutability, the stricter bar for release-cut pull requests, the CODEOWNERS policy, and an incident runbook. It is additive. It does not change any workflow, setting, or rule, and it explicitly subordinates itself to live repository configuration. ## Why this is a new pull request rather than #125 #125 carries the same charter, but its head branch lives in a fork (`waterbro-8/mem`). `.github/workflows/bytefolk-security.yml:36` guards the `codeql` job with: ```yaml if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} ``` `codeql` needs `security-events: write` to upload SARIF, which GitHub does not grant to a `pull_request` run from a fork, so skipping it there is correct. The problem is what skipping produces. Because `codeql` is a matrix job skipped by a job-level `if:`, GitHub never expands the matrix and publishes the check run under the literal, un-interpolated name `CodeQL (${{ matrix.language }})` with conclusion `SKIPPED`. That name matches none of `CodeQL (go)`, `CodeQL (javascript-typescript)`, or `CodeQL (python)`, which `main` requires. Required contexts that are never reported are treated as pending forever. So #125 cannot merge at any number of approvals. `Update branch`, auto-merge, and re-running workflows all fail to change that. Re-pointing the work onto a branch inside `bytefolk/mem` is the only resolution that needs no policy change and grants no new permission, which is why this pull request exists. #125 should be closed as superseded by this one. ## What differs from #125's content The charter is otherwise the same document, but four claims in its Tag immutability and Incident runbook sections did not match the live configuration. They are corrected here. **1. "two active rulesets, neither of which has bypass actors" — false.** | Ruleset | Blocks | Bypass actors | | --- | --- | --- | | `21888356` Protect stable release tags | `update`, `deletion` | none | | `21899500` Restrict stable release tag creation | `creation` | repository role `admin` (`repositoryRoleDatabaseId` 5), `bypass_mode: always` | Read from `GET /repos/bytefolk/mem/rulesets/{id}`, and confirmed via GraphQL `RepositoryRulesetBypassActor.repositoryRoleName`, which returns the string `admin` directly rather than an id that has to be interpreted. The asymmetry is deliberate and is now stated as such: creation stays reachable so a release can always be cut, while published tags are immutable for every role including admin. Immutability is enforced by `21888356`, not by `21899500`. **2. "GitHub exposes no creation timestamp for rulesets" — false.** The individual ruleset endpoint returns `created_at` and `updated_at`, so the pair is orderable: `21888356` at `2026-08-31T00:34:47Z`, `21899500` at `2026-08-31T04:47:11Z` (updated 54 seconds later at `04:48:05Z`). The charter previously declined to say which rule came first on the strength of that incorrect premise. **3. "If no such path exists when a release is needed, that is a blocker" — a path exists.** A repository admin can cut a `v*` tag directly. `v0.1.1` demonstrates it: annotated tag object `c2ecc1c49ff8bbe13b9d7800bc910e4b7ac99b74` dereferences to commit `cc727db0bc72655f299166de1f60756f5c686cc7` and is tagged `2026-08-31T06:32:10Z`, one hour and forty-five minutes after `21899500` became active, by a repository admin. **4. Incident runbook step 4 repeated claim 1.** This is the one with operational consequences. As drafted, a maintainer working a compromised-release incident at 3am would have read that tag creation "has no bypass actors" and that a missing creation path "is escalated, not worked around" — and would have escalated a tag cut that a repository admin can simply perform. The step now says it is an admin action that requires no ruleset change, and that no ruleset change should be made in order to perform it. **Probable cause of the error, now recorded in the document.** The collection endpoint `GET /repos/{owner}/{repo}/rulesets` renders `bypass_actors` as `null` for every ruleset. A reader who trusts that rendering concludes no bypass actors exist anywhere. The corrected section names the per-ruleset endpoint explicitly so the mistake is harder to repeat. ## What was verified and left alone All nine branch-protection values the charter asserts were re-read from `GET /repos/bytefolk/mem/branches/main/protection` and are correct as written, so that section is unchanged: `enforce_admins: true` · `required_approving_review_count: 1` · `require_code_owner_reviews: true` · `dismiss_stale_reviews: true` · `require_last_push_approval: true` · `required_linear_history: true` · `required_conversation_resolution: true` · `allow_force_pushes: false` · `allow_deletions: false` · `bypass_pull_request_allowances: null` One sentence was added to that section to keep the two controls distinct: branch protection having no bypass actors is a separate fact from tag creation having an admin bypass, and conflating them is what makes claim 1 plausible on a first read. The required-check enumeration in that section is unchanged and remains explicitly hedged as "evidence of what runs, not a substitute for the configuration". It is dated 2026-09-03 and does not list `CodeQL (go)`, `CodeQL (javascript-typescript)`, `CodeQL (python)`, or `Dependency review`, all of which are in fact required on `main` today. The hedge already covers this, but a reviewer who wants the list refreshed should say so rather than let it stand as a near-miss. ## Attribution The charter's first commit (`d2600211`, aligning it with the enforced protections) and the `main`-sync merges are PeterGuy326's. The commit tracking the live CODEOWNERS policy and both tag rulesets (`470babed`, 2026-09-03) is waterbro-8's and is credited via `Co-authored-by`. The four corrections above are mine and are not attributed to waterbro-8. ## Checks - Docs-only. Adds one file, `GOVERNANCE.md`. No code, workflow, configuration, or dependency change, so no runtime behaviour is affected. - Title is Conventional and the body links `#124` and `#125` for `pr-policy`. - Head branch is inside `bytefolk/mem`, so `codeql` is not skipped and the three required CodeQL contexts will be reported normally. Refs #124 Refs #125 Co-authored-by: waterbro-8 <318569545+waterbro-8@users.noreply.github.com>
Refs #124
Consumed requirement revision: R4. (#124 is closed. R3 canonicalized the founder-approved
third code owner; R4 was the lifecycle correction. This supersedes the R2 revision previously
consumed by this body and by the charter.)
What this branch now contains
Two commits on top of the current
maintip87d235b7cffeb9d9e49653760b5362c792366900:d260021133b72d2e961cf7ad088330b5713565d8— rebase of the reviewed head4a16bd838dcf24461be52f1f256ee8f6d103a357(treeaac3f435d…). The 3-commit history,including one merge commit, collapsed to one;
GOVERNANCE.mdis untouched in this commit andstays blob
f04fe109…, byte for byte as reviewed. The previously reviewed head remainsfetchable by sha.
470babedf1ef6522ebc9de40f02f944f5dba8fca— a fast-forward on top of commit 1, not anamend, so the increment against the reviewed content is one file and nothing moved underneath
it. This is the commit that fixes the charter wording, pushed separately so a reviewer can read
it as the response to the standing review.
Both were performed by the pull request author's account (
waterbro-8) through the Git Data API(
POST /git/blobs→POST /git/trees→POST /git/commits→PATCH /git/refs), because gittransport is unavailable from the host that performed them. Commit 1 preserves the original author;
commit 2 is authored and committed by
waterbro-8.Synchronization is provisional, not a claim of readiness.
mainadvanced while this work wasin flight (
4cf4452ee3e0, itself merged at 06:32:06Z today, →87d235b7cfat 07:41:35Z, which addsa step to the existing
Webjob plus one new script and touches none of the files this charterlinks), so the branch was re-synchronized onto the newer tip.
strict: truemeans this recurs: thehead that is finally merged must be brought up to date one more time immediately before merge and
must have fresh required CI on that exact head. Whoever performs that last sync is the last pusher
and should not also be the reviewer of it.
Per the rule stated on this PR — whoever supplies the new head does not review it — the author
supplied this head, so the reviewer who requested changes can review it.
Bindy-lbbremains thepending requested reviewer. Nothing in this edit is a review request, an approval, a merge, or a
close of #124.
Problem
The v0.1.0 release exposed two governance gaps: stable tags were repeatedly recreated while
repairing a broken release workflow, and otherwise-valid
mainprotection did not apply toadministrators. Issue #81 had already solved the separate single-CODEOWNER problem; #124 records
the follow-up admin-enforcement decision and evidence, and its non-goals place the documentation
correction on this PR: "#125 remains a separate documentation candidate and must be corrected
independently to match the live configuration."
Goal and expected behavior
Add an additive
GOVERNANCE.mdcharter that:AGENTS.mdanddocs/maintainers/releasing.md;mainprotections it can evidence, including administrator enforcement, andsays which of those values an administrator must re-read rather than take from this document;
perform the normal merge after all gates pass;
gated tag creation means for the runbook;
.github/CODEOWNERSinstead ofduplicating it.
Non-goals: changing repository settings, CODEOWNERS, action pins, tags, releases, npm publication,
or runtime code. This PR changes no roles and no settings; GitHub's configuration stays the
mechanical source of enforcement.
Live state as re-read on 2026-09-03
.github/CODEOWNERSonmainreads* @PeterGuy326 @Bindy-lbb @waterbro-8, landed by chore(codeowners): add third independent reviewer #138 merged as4cf4452ee3e0on2026-09-03T06:32:06Z.
normally merged before synchronizing, the authorized third-owner change actually arrived through
chore(codeowners): add third independent reviewer #138. That precondition is satisfied in substance, by a different PR.
enforce_admins.enabled = trueis carried evidence, not re-run here.GET /repos/bytefolk/mem/branches/main/protectionreturns 403 forwaterbro-8(not an admin)and no branch ruleset exists to read instead. The read-back originates in Release governance gap: admin self-merge bypass and v0.1.0 tag churn (follow-up to #81) #124's R2 evidence.
21888356"Protect stable release tags" blocksupdateanddeletiononrefs/tags/v*;21899500"Restrict stable release tag creation"blocks
creationon the same pattern. Bothenforcement: active, no bypass actors.What commit 2 corrected in the charter
* @PeterGuy326 @Bindy-lbband asserted that keeping two owners was the maintainer decisionwith a third as "optional redundancy". It now states the rules (floor of two, non-author
approval, roster change is a governance action that grants review authority only) and points at
.github/CODEOWNERSas the source of truth. This also implements the maintenance suggestionleft on this PR on 2026-09-02: duplicating the roster guarantees drift between the two
documents.
governance change to this document, not a silent edit to CODEOWNERS" — read as if chore(codeowners): add third independent reviewer #138 had
violated policy, when it executed the R3-authorized change and this document was the lagging
half. The section now says that plainly, including that landing the wording as a follow-up
rather than in the same cycle "is the defect this section exists to close, not a precedent to
repeat".
it now names both, and states that tag creation on
refs/tags/v*is itself restricted, sothe
v0.1.1example and runbook step 4 must go through a permitted creation path, and a missingpath is escalated through a reviewed ruleset change rather than bypassed or worked around. The
document does not claim which ruleset predates the other, because GitHub exposes no ruleset
creation timestamp.
exhaustive strict set while 15 job names are observable on this repository. The bullet now states
the policy (all required checks pass on an up-to-date head), marks the authoritative list as
admin-readable, and presents the names as an observation dated 2026-09-03.
"the matching … tag ruleset" (singular) → the two rulesets; "approval from the other
CODEOWNER" → "another current CODEOWNER", which is what a three-owner roster needs; and the
intro now carries an explicit "settings are authoritative, a stale line here is a documentation
defect" clause.
Acceptance-criteria mapping
GOVERNANCE.mdintroduction, unchanged by commit 2.asserts about protection is either a Release governance gap: admin self-merge bypass and v0.1.0 tag churn (follow-up to #81) #124-recorded read-back or is explicitly marked as
admin-readable configuration that this document does not restate authoritatively.
consequence. One open question is left to a human, not papered over: under ruleset
21899500with no bypass actors, which path is actually permitted to create the next
v*tag. The chartersays it must be a permitted path and that a missing path is escalated; it does not invent one.
Branch protection on mainandRelease-cut pull requests.The release-cut section is unchanged by commit 2.
attribution corrected.
Configuration and validation ledger
maintip) this branch is synchronized to:87d235b7cffeb9d9e49653760b5362c792366900470babedf1ef6522ebc9de40f02f944f5dba8fca(tree598e3ce57ee9…)3c1fdff4968aaee78b44ad7dd3e934631a6ae7f4GOVERNANCE.mdblob:0650fcebb18899810957fd21993971c62b2fe497(136 lines, 7828 bytes),previously
f04fe109579e72af34986977a84dd1be1f3ae476gh api repos/bytefolk/mem/branches/main/protectionwaterbro-8; no branch ruleset alternativegh api repos/bytefolk/mem/rulesets, then each ruleset by idrefs/tags/v*rulesets (21888356update+delete,21899500creation), no bypass actors; both now recordedgit diff --check(no local git objects for these shas; git transport down on this host)GOVERNANCE.mdonly; increment touches only the charter{GOVERNANCE.md}; diff of head tree vs rebase tree is that one pathgh api repos/bytefolk/mem/contents/<path>?ref=mainfor every relative link the charter usesAGENTS.md=7144859e3,docs/maintainers/releasing.md=4af8c0b97,.github/CODEOWNERS= 3-owner lineGET /git/blobsvs local filegit hash-objectagrees); no trailing whitespace, no tabs, no conflict markers, terminates with newline; the four stale statements removedgit log -pstyle review of commit 2 against the previously reviewed headGOVERNANCE.mddiffers4cf4452ee3e0What V5 cannot check, stated so nobody reads it as stronger than it is: whether the enumerated
check jobs are the required set (V1 blocks that), and which creation path is permitted for
v*tags under ruleset
21899500(left open above rather than guessed).Fresh required CI on the exact up-to-date head must be green before review; results belong to the
Checks tab and this body deliberately does not freeze a transient check state.
Risk, limitations, and rollback
This PR changes documentation only. It does not itself mutate branch protection or the tag
rulesets; GitHub settings remain the mechanical source of enforcement, and drift must be corrected
without weakening the stronger rule. Remaining limitation: parts of the branch-protection baseline
are unreadable to non-administrators, so the charter flags them as records of a #124 read-back
instead of restating them as verifiable fact. Rollback of commit 2 alone is a normal revert of that
one commit and leaves the synchronized branch intact. Commit 1's only parent is the
maintip namedabove, so this branch contains no content beyond that base plus
GOVERNANCE.md.CHANGELOG
Not updated: this is an internal repository-governance charter with no runtime or user-facing
product behavior change.
Automated assistance
Codex assisted the maintainer with reconciling the charter against the live settings and validation
evidence, and the 2026-09-03 rebase, charter correction, and this body rewrite were executed by the
author's agent through the Git Data API. The human PR author and maintainers remain accountable; no
automated tool is an author or co-author.