ADR:采用两层 GitHub ruleset
Status: Superseded on 2026-07-17
Date: 2026-07-17
Owner:
@retaintive/trusted-mergers
⚠️ 2026-07-17 后续决策
本 ADR 保留最初 rollout 的历史,不再描述当前 policy。团队确认所有需要人工 review 的 repo 都应 dismiss stale approvals,因此删除了重复的 Production review gate,改为:
Default branch baseline覆盖全部 repo。Senior review gate覆盖除docs外的 repo,要求trusted-mergersapproval,并 dismiss stale approvals。governance_tier保留给未来真正的 production-only deployment / release 要求。- Org-wide PR template 已通过新的 public
.githubrepo 上线;旧 automation history 已迁到 private、archived 的github-automation-private。 - 当前规范以 GitHub 组织治理与仓库基线 为准。
Context
2026-07-17 rollout 前 live audit 确认:Retaintive 有 12 个 active private repositories,当时 org-level ruleset 为 0。只有 3 个 active repo 有 active repo-level ruleset,另外 9 个 default branch 没有 ruleset 或 classic branch protection。现有 ruleset 的命名、approval、checks 和 bypass 也不一致。
如果继续只靠 repo-level 配置,新 repo 仍可能在创建后没有保护。另一方面,把同一 approval、CI context、CODEOWNERS 和 bot bypass 一次性强加给所有 repo,会让没有 reviewer/CI 的 repo 无法工作,或扩大 automation 权限。
Considered options
Option A:继续逐 repo 管理
优点是灵活,不改变现有结构。缺点是容易 drift,新 repo 默认没有保护,需要长期维护重复设置。
Option B:一条严格 org ruleset 覆盖所有 repo
优点是集中。缺点是 approval、CI、owner 和 automation 需求并不统一;一个不存在的 required check 就能让 repo 无法 merge。
Option C:两层 ruleset
第一层覆盖所有 repo 的最低安全底座;第二层只覆盖真正开发和上线的 repo。Repo-specific checks、CODEOWNERS mapping、environment 和 bot bypass 保留在 repo。
Decision
选择 Option C。
- 创建 org baseline,target 全部 repositories 的
~DEFAULT_BRANCH:PR required、0 approval、resolve review threads、block deletion、block force push。 - 用
governance_tier=production选择 Tier 2:1 approval、dismiss stale approvals;CODEOWNER approval 等 owner mapping 有效后再开启。 - Required status checks 保持 repo-specific;未来可增加跨语言通用的 org required workflow。
- Bypass 遵循最小范围:Tier 1 不设置 bypass;Tier 2 只允许
trusted-mergers通过 PR bypass production approval gate。 - Org rule 先
evaluate,复核 Rule Insights 后再单独批准active。 - 只有 org rule 已生效后,才清理重复 repo-level ruleset。
首批 Tier 2 repositories:callytics-infrastructure、agent-plugins、market-lead-tracking。traceplane 和 fork botmux 保持 baseline。
2026-07-17 implementation:
Default branch baseline(ID19114672)已 active,target~ALLrepositories 的~DEFAULT_BRANCH,无 bypass。- Required custom property
governance_tier已创建,defaultbaseline,允许值为baseline、production、exception。 Production review gate(ID19115958)已 active,targetgovernance_tier=production,要求 1 approval、dismiss stale approvals、resolve review threads;Teamtrusted-mergers(ID18332203)具有pull_requestmode bypass。- Required checks 保持 repo-level:infra 沿用既有 CI gate;
agent-plugins要求validate;market-lead-tracking要求Detect Changes和CI Checks。
Consequences
正面影响:
- 新 repo 不再默认裸奔。
botmux使用master也能由~DEFAULT_BRANCH自动匹配。- 低活动 repo 不因缺 reviewer 或 CI 被永久卡住。
- Production repo 的 review 和 CI 可以更严格,但不会扩大 bot 权限。
trusted-mergers可以在 production repo 中保留 PR 记录并 bypass approval gate;Tier 1 和 repo-level required checks 仍独立生效。- Ruleset targeting 不再依赖长期维护 repo name 清单。
成本与限制:
- 必须持续维护 custom property values。
trusted-mergers目前只对callytics-infrastructure有显式write,不能立即作为其他 repo 的有效 CODEOWNER。- Required check name 变化必须与 repo ruleset 同步。
- Org ruleset 已 active;repo-level duplicate cleanup 完成前会短期双重覆盖。
Explicitly not decided here
- 既有 repo-level bypass actors 是否继续保留。
botmux是否从masterrename 为main。callytics-infrastructuredisabledProtectionruleset 是否删除。- 已归档 common 发布链留下的
retaintive-schema-broadcasterApp 和 orphan workflow 何时清理。 - PR template 采用 managed copy、scaffolder 还是未来 public
.githubfallback。 - Team description 是否更新,或是否把 code ownership 与 trusted merge authority 拆成两个 teams。
这些项目在对应 change proposal 中展示 live evidence 后逐项批准。
Revisit triggers
- GitHub plan 或 ruleset capability 变化。
- Repo 数量或团队规模显著变化。
- Required workflow 可以稳定替代多套 repo-specific policy check。
- Bypass 事件表明当前角色或范围过宽。
- Tier 2 repo 长期无法获得有效 reviewer/owner。