Skip to content

fix(gates): exempt GitHub-integrated PR merges from master direct-push audit - #171

Merged
ROM4n2 merged 1 commit into
masterfrom
fix/master-scope-gate-squash-merge
Oct 20, 2026
Merged

ROM4n2 merged 1 commit into
masterfrom
fix/master-scope-gate-squash-merge

Conversation

@ROM4n2

@ROM4n2 ROM4n2 commented Oct 20, 2026

Copy link
Copy Markdown
Owner

目标

修复 tools/check_master_commit_scope.py(Master Direct-Push Scope Gate)将 GitHub 的 squash 和 rebase PR 合并误判为人工直推的缺陷,并在 master 上保持严格防御。

根因与实测数据

  1. _list_commits 使用 --no-merges --first-parent 划定直推范围。该规则仅能识别多父的 merge-commit 型合并;而 GitHub squash/rebase 合并生成的是单父提交,因而被划入直推审查对象,导致 refactor(rd): converge cards.js module state into cd-state.js #165 / fix(probe): stop the fabricated vm error after a static-layer failure #166 合并后 master push 触发门禁判红(因为 PR 全量文件集不在白名单中)。
  2. 实测 master 1315 条历史提交:
    • committer == "GitHub <noreply@github.com>":共 180 条(154 条多父 merge,26 条单父 squash/rebase)。其中 24 条无 (#NNN) 标题后缀(Dependabot 依赖升级)。若按标题正则判会漏掉 24/26 = 92%。
    • committer == 人类:1135 条(1113 条单父直推审查对象,22 条多父 merge)。人类单父中标题以 Merge 开头者为 0。

修法设计

  1. 引入 _is_github_integrated(committer_name, committer_email) 纯谓词(name 精确匹配 "GitHub",email 忽略大小写匹配 "noreply@github.com"),识别 GitHub 代写合并;
  2. 在 _commit_meta 中通过单次 git log -1 --format=%s%x00%cn%x00%ce%x00%P 提取元数据,大声打印豁免原因;
  3. 封死单父伪造路径:要求 _is_merge_subject(subject) and is_merge_commit(≥2 父才认 merge 标题),防范单父提交伪造 Merge pull request #... 标题绕过检查。

TDD 与四重变异证明

  1. tests/test_ci_hardening.py 新增 6 条测试,66 passed。
  2. 四重变异自证:
    • M1(删 github_integrated 豁免)⇒ A/B 变红;
    • M2(退回只看 subject 忽略 is_merge_commit)⇒ D(单父伪造 merge 标题)变红;
    • M3(放宽接受任意 committer)⇒ C(人类违规直推)变红;
    • M4(收窄要求 subject 带 (#NNN))⇒ B(Dependabot)变红。
  3. 真实历史回溯:

门禁与文档

  • 全量 2519 collected(2517 passed + 2 skipped);
  • 六道机械闸全 exit 0;
  • ruff check . 全绿;
  • mypy --strict delector tools 与 mypy tests 0 错误;
  • WORKMEMORY/PROJECT_OVERVIEW.md 待办第 7 条闭环,基线更新;
  • WORKMEMORY/work.log 追加规范 DONE 事件;
  • 4 个改动文件全部 UTF-8 CRLF 0 lone LF。

@ROM4n2
ROM4n2 merged commit bfb66ad into master Oct 20, 2026
9 checks passed
@ROM4n2
ROM4n2 deleted the fix/master-scope-gate-squash-merge branch October 21, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant