目标
【枢轴卡】把 gate 的审判逻辑上移到 PR 改不动的地方:用 org ruleset 的 required workflows 规则,把 gate 指向中心仓 CI-Workflows 的固定 ref。完成这一步,C1 的 owner-merge 才具备取消的前提;不做这一步,人类瓶颈永远在。
背景(源自 #81 §3.3——"整件事的枢轴")
pull_request 事件使用包含 PR 变更的 workflow 定义。所以一个 PR 可以把 gate.yml 里的 adr-required、gitleaks、断言逻辑掏空,保留 job 名叫 gate,required check 照样绿。现在唯一防线是 .github/ 属于 C1 → owner-merge(人)——这正是要去掉的人。#81 给出 A/B 两案,采用 A(推荐) :org ruleset required workflows 指向中心仓固定 ref,审判逻辑来源不再是被审仓库自身。(已有雏形:hygiene 已钉 commit hash 复用 CI-Workflows,本卡是把整个 gate 上移这一思路的完成态。)
涉及文件
org ruleset(新增或改造:required workflows 规则,指向 Cloudbird-Software/CI-Workflows 的 gate workflow @ 固定 commit)
CI-Workflows/.github/workflows/(新增组织级 gate workflow:聚合 hygiene + P2 各门,作为 required workflow 本体)
各业务仓本地 .github/workflows/gate.yml(退役或降级为非 required 的快捷反馈)
governance/rulesets/(ruleset 定义落盘)+ governance/expected-state.json(对账:required workflow 的 repo、path、ref 三者全部钉死)
governance/GOVERNANCE.yaml(BP-2 的 platform 声明更新)
执行步骤
在 CI-Workflows 构建组织级 gate workflow(workflow_call 形态之外,需满足 required workflows 的规则约束:单一文件、固定 ref),聚合现有全部检查 + P2 新增各门。
新增 org ruleset:required workflows 规则,repository 选择器覆盖全部受管仓,workflow 指向 CI-Workflows 的 gate @ 固定 commit SHA。
与原 main-protection 的 required_status_checks(context: gate)并存运行一段观察期,确认等价后退役本地 gate 的 required 地位。
expected-state 对账:required workflow 的 repo/path/ref、ruleset 启用状态、bypass actors 全部进对账。
升级 CI-Workflows 的 gate 变更流程:改 gate = 改信任根,CI-Workflows 仓本身的 gate 变更保护(该仓的 C1 属性)在本卡内一并声明。
验收标准
攻击测试通过 :PR 掏空本地 gate.yml 后仍被拦(见 T1)。
required workflow 从中心仓固定 ref 执行,各仓 PR 的 required check 正常上报。
ref 漂移(有人改 ruleset 指向别的 ref/仓)被 drift-check 检出。
观察期内新旧两轨判定一致率 100%。
测试方法(预先指定)
T1 自我削弱攻击测试(核心中的核心,负向) :
在测试仓开 PR:把本地 .github/workflows/gate.yml 的断言逻辑全部删除,只留一个名叫 gate、永远 exit 0 的 job(模拟 agent 自我削弱)。
断言:该 PR 的 required 判定由中心仓固定 ref 的 gate 执行——本地掏空版本不被采信;PR 因真实检查(hygiene/adr-required 等照常运行)被正确判定;若该 PR 同时含违规内容(如 C1 无 ADR),必须红。
若 PR 能绿着合并——本卡失败,回滚并回报 自动合并计划 #81 。
T2 ref 钉死验证(负向) :
断言 ruleset 中 required workflow 的 ref 为完整 commit SHA(非 tag/branch)。
手动在 org ruleset UI 把 ref 改成别的值 → 触发 drift-check → 断言报漂移开 issue;apply 还原后 issue 关闭。
T3 双轨一致性(观察期) :
新旧两轨并行期间,对连续 ≥10 个真实 PR 比对两侧判定结论,断言 100% 一致;任一不一致必须定位原因后才允许退役旧轨。
T4 中心仓保护(负向) :向 CI-Workflows 开 PR 修改 gate workflow → 断言该仓自身 required 检查 + C1 保护生效(治理仓属性),普通 agent 身份无法直接合并。
依赖
P1-3(aggregator 严格断言——上移后的 gate 必须携带该语义)
P2-6(自动 revert 已就位——枢轴切换出事时有事后兜底)
建议在 P2 各门稳定后执行;它是 P3-2(取消 C1 owner-merge)的硬前提
目标
【枢轴卡】把 gate 的审判逻辑上移到 PR 改不动的地方:用 org ruleset 的 required workflows 规则,把 gate 指向中心仓
CI-Workflows的固定 ref。完成这一步,C1 的 owner-merge 才具备取消的前提;不做这一步,人类瓶颈永远在。背景(源自 #81 §3.3——"整件事的枢轴")
pull_request事件使用包含 PR 变更的 workflow 定义。所以一个 PR 可以把gate.yml里的 adr-required、gitleaks、断言逻辑掏空,保留 job 名叫gate,required check 照样绿。现在唯一防线是.github/属于 C1 → owner-merge(人)——这正是要去掉的人。#81 给出 A/B 两案,采用 A(推荐):org ruleset required workflows 指向中心仓固定 ref,审判逻辑来源不再是被审仓库自身。(已有雏形:hygiene 已钉 commit hash 复用 CI-Workflows,本卡是把整个 gate 上移这一思路的完成态。)涉及文件
Cloudbird-Software/CI-Workflows的 gate workflow @ 固定 commit)CI-Workflows/.github/workflows/(新增组织级 gate workflow:聚合 hygiene + P2 各门,作为 required workflow 本体).github/workflows/gate.yml(退役或降级为非 required 的快捷反馈)governance/rulesets/(ruleset 定义落盘)+governance/expected-state.json(对账:required workflow 的 repo、path、ref 三者全部钉死)governance/GOVERNANCE.yaml(BP-2 的 platform 声明更新)执行步骤
workflow_call形态之外,需满足 required workflows 的规则约束:单一文件、固定 ref),聚合现有全部检查 + P2 新增各门。main-protection的 required_status_checks(context: gate)并存运行一段观察期,确认等价后退役本地 gate 的 required 地位。验收标准
测试方法(预先指定)
T1 自我削弱攻击测试(核心中的核心,负向):
.github/workflows/gate.yml的断言逻辑全部删除,只留一个名叫gate、永远 exit 0 的 job(模拟 agent 自我削弱)。T2 ref 钉死验证(负向):
T3 双轨一致性(观察期):
T4 中心仓保护(负向):向 CI-Workflows 开 PR 修改 gate workflow → 断言该仓自身 required 检查 + C1 保护生效(治理仓属性),普通 agent 身份无法直接合并。
依赖