You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 91669b1
Browse filesBrowse the repository at this point in the historyBrowse files
feat(pm): the relay requests review from every GOVERNED_APPROVERS account on a Tier H pull, and CODEOWNERS routes every Tier H surface to both
A seat-driven Tier H pull is opened draft and stays draft until the approval, and GitHub
requests a code owner only at ready_for_review (measured on this repository's own Tier H
pulls: the CODEOWNERS request arrived one second after the ready flip, never at the draft
create). CODEOWNERS listed docs/adr/ -> @hotlong alone, and SKILL.md's "request review from
both approvers" was prose no op performed. So an approver waited on a pull nobody told him
about.
- fleet-write/ops.mjs: pr_create and pr_ready carry governedReview; governedReviewRequests
spells the two conditional writes (requested_reviewers, issue-assignees); pr_ready spends
issues for the assignee fallback.
- fleet-write/execute.mjs: after a governedReview row lands, read the pull's whole file list
(every page, a cap that reds as a truncated subset), classify through the register
(governedPathsIn + landingTierOf, scoped to payload.repo), and on a Tier H hit request
every GOVERNED_APPROVERS account not already requested, assigned or holding a submitted
review; the pull's own author is assigned instead (a request naming it is a 422). Tier S,
ungoverned and covered pulls send nothing and say so; an unreadable list, pull or review
list, a truncated walk or a refused write is a FAILED action, never a quiet skip.
Self-test: a new battery of 29 cases; fixtures of the pr ops now declare the files read.
- fleet-write/validate.mjs: pins the two rows, the two endpoints against the refused families,
and the three alsoSpends rows.
- .github/CODEOWNERS: every Tier H register row and the enforcement chain route to
@os-zhuang@hotlong; the header names GOVERNED_APPROVERS as the list it mirrors.
- check-governed-queue-guard.mjs: codeownersMirrorVerdict reads the file and the self-test
reds when a Tier H row is missing, an owner set drifts from the constant, or a Tier S row
is routed (a pin inside an existing self-test, no new gate).
- pm-dispatch SKILL.md step 3 and rest-channel.md point at the op (net 0 lines each).
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M82feuetLzrCiBz41BJb7L
problems.push(`Tier H row \`${surface.id}\` (${surface.glob}) has no CODEOWNERS line at \`${pattern}\` — a pull touching it summons nobody when opened ready`);
687
+
continue;
688
+
}
689
+
if(!sameOwners(row.owners))problems.push(`CODEOWNERS line ${row.line} \`${pattern}\` names ${row.owners.join(' ')||'nobody'}, not every GOVERNED_APPROVERS account (${wanted.join(' ')}) — a Tier H pull then waits on an approver who is never asked`);
if(tierS)problems.push(`CODEOWNERS line ${row.line} routes \`${row.pattern}\`, a Tier S row (\`${tierS.id}\`) that lands on a seat's review of record — a code-owner request there asks the maintainer for a landing that is not his`);
695
+
elseif(!sameOwners(row.owners))problems.push(`CODEOWNERS line ${row.line} \`${row.pattern}\` (an enforcement-chain row) names ${row.owners.join(' ')||'nobody'}, not every GOVERNED_APPROVERS account (${wanted.join(' ')})`);
696
+
}
697
+
if(!/GOVERNED_APPROVERS/.test(String(text??'')))problems.push('the file never names `GOVERNED_APPROVERS` — its header must say which constant the owner list mirrors');
0 commit comments