mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 16:37:34 +00:00
ci: add Identity Guard rejecting AI-assistant commit attribution
起因:blockchain_guide 上曾有一个 claude/novel-content-extraction-r0wys3 分支,4 个提交的 author 和 committer 都是 Claude <noreply@anthropic.com> (内容还是与本书无关的小说抓取脚本)。分支已删除,但暴露出一个缺口: 既有的 .git/hooks/commit-msg 只查提交信息里的 Co-authored-by 尾注, 查不到身份字段;而且本地钩子不随仓库分发,那 4 个提交来自云端会话, 根本不经过本地钩子。 因此把闸门放到服务端:本工作流在 push 与 pull_request 上扫描本次新增 提交的 author/committer 身份与 Co-authored-by 尾注,命中即失败。 本地另配 pre-commit(拦当前身份)与 pre-push(拦 cherry-pick/rebase 带进来的外来提交)作为纵深防御,二者不入库。 判定刻意收窄,避免误伤本仓库群里大量讨论 Claude/Codex 的正文: 只检查身份字段与行首锚定的 Co-authored-by 尾注,绝不扫描自由文本; 姓名要求全等("Claude Dubois" 这样的真人不受影响),邮箱按厂商域名 (含子域)匹配,并覆盖 claude[bot] 这类 GitHub App 身份。 已验证: - 用被删分支的真实 4 个提交做回归,push / pull_request / 新建分支 三种到达形态全部拦下; - 全部 14 个仓库的完整历史(5,715 个提交,含 docker_practice 1,591 个多人历史与 claude_guide 339 个满是 Claude 的提交)零误报; - dependabot 的 Co-authored-by、真人 Claude Dubois、正文提到 co-authored-by 但非尾注的提交,均正确放行; - 范围解析不出来时 fail closed,只有确实没有 head 提交(删分支)才放行; - tags-ignore 避免发布 tag 触发一次重复的全量审计。
This commit is contained in:
@@ -375,7 +375,7 @@ class WorkflowSecurityTests(unittest.TestCase):
|
||||
if line.strip() and not line.lstrip().startswith("#")
|
||||
}
|
||||
self.assertNotIn("package-lock.json", ignored)
|
||||
self.assertTrue(all("npm ci" in path.read_text(encoding="utf-8") for path in self.workflows() if path.name != "check-link.yml" and path.name != "dependabot-automerge.yml"))
|
||||
self.assertTrue(all("npm ci" in path.read_text(encoding="utf-8") for path in self.workflows() if path.name not in {"check-link.yml", "dependabot-automerge.yml", "identity-guard.yaml"}))
|
||||
|
||||
def test_artifacts_are_smoke_tested_and_html_failures_are_not_silent(self):
|
||||
verifier = ROOT / "tools" / "verify_artifacts.py"
|
||||
|
||||
Reference in New Issue
Block a user