iroha924/mumei

GitHub: iroha924/mumei

mumei 是一个 Claude Code 质量强制执行框架,通过 OS 级 Hooks 防止 AI agent 通过削弱测试或抑制错误来伪造构建通过。

Stars: 2 | Forks: 1

# mumei [![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/iroha924/mumei/actions/workflows/ci.yml) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/iroha924/mumei/badge)](https://scorecard.dev/viewer/?uri=github.com/iroha924/mumei) [![SLSA Level 3](https://img.shields.io/badge/SLSA-level_3-green?logo=slsa)](https://slsa.dev/spec/v1.0/levels#build-l3) [![Sigstore signed](https://img.shields.io/badge/sigstore-signed-blue?logo=sigstore)](https://www.sigstore.dev) [![Dependabot](https://img.shields.io/badge/Dependabot-enabled-brightgreen?logo=dependabot)](https://github.com/iroha924/mumei/network/updates) **mumei 是一个专为 Claude Code 打造的质量强制执行框架。** 构建成功了。测试通过了。 ……但它们是真的通过了,还是 agent 让它们通过的?CI 无法区分 这些情况。mumei 可以: - 它按照 `HEAD` 的定义重新运行测试,而不是按照你的工作树 - 它冻结了不允许 agent 调整的测试 - 它通过读取 diff 来发现那些用绿灯换取红灯的举动 一个被删除的测试。一个被抑制的类型错误。一个昨天还不存在的 `continue-on-error`。 一个悄无声息地从发布 tarball 中遗漏的文件。 这些检查位于 OS 边界的 Hooks 中,因此 agent 的意图被视为 不受信任的输入:标准是被_强制执行_的,而不是在 prompt 中建议它可以选择 忽略的内容。 然而,强制执行并不是单一的事情,mumei 在表面上就说明了这一点:那些_重新测量_的关卡(从干净的 `HEAD` 重新运行测试、真正的扫描器、真正的 `git archive`)能够抵御想要越过它们的 agent;mumei 记录自身进度的文件是一条审计轨迹,而不是一堵墙。哪个是哪个,以及这对你的部署方式意味着什么,在 [什么能守住,什么守不住](#what-holds-and-what-does-not)中进行了详细说明。 _无名管家:它默默服务,不揽功劳,坚守底线 —— “恐怕那样不行。”_ [日本語版 README](./README.ja.md) ## 为什么是现在 随着 coding agent 接管越来越多的编写工作,瓶颈也随之转移 — 从生成代码转移到审查代码、验证代码,以及判断“完成”的 含义。mumei 就是为这种转变而构建的:它将这些检查固定在 OS 边界上, 因此即使代码到达的速度超过了任何人阅读它的速度,它们也能守住。([当 AI 构建自身时](https://www.anthropic.com/institute/recursive-self-improvement)) 这种转变现在有了一个名字 — _loop engineering_:设计在无人值守的情况下运行 agent 的循环。但无人值守的循环也会导致无人值守的错误,而这正是 mumei 守护的边界。 ## 为什么选择 mumei 一条 `CLAUDE.md` 规则、一个系统 prompt、一句“请先运行测试”——这些都是 建议,而一个在压力下能力强大的 agent 会绕过建议。mumei 将你关心的标准从 prompt 中移出,并放置在 OS 边界上。 在那里,一个 Hook 会检查改变项目状态的工具调用 —— 编辑、提交、推送、 计划转换 —— 并拒绝那些破坏不变量的调用。 确定性检测器、多样化的审查视角、要求提供证据的裁决 — 这些都是目前的筹码,而且有几个优秀的工具做得很好。 **没有其他工具会问构建是否被_制造_为通过的。** 官方的 `/code-review` 在设计上排除了测试覆盖率。这个差距正是 mumei 承担的工作。 它_强制执行_而不是要求去做的四件事: - **是框架,而不是聊天。** Phases、Waves、提交、推送和整个 审查 pipeline 都由 Hooks 确定性地驱动 —— agent 无法 通过 prompt 绕过它们。唯一的逃生舱是一个单一的、显式的 `MUMEI_BYPASS=1` —— 一个你刻意设置的 env var,也是 mumei 唯一不会让 agent 替你设置的东西:将它写入 Claude Code 的设置中会被 拒绝,并且以该变量激活状态开始的会话在打开时会说明这一点。 - **测试无法被 agent 悄悄削弱。** 在提交时,测试会在干净的 `HEAD` 工作树中重新运行,因此在你工作树中的造假手段没有任何影响。 Golden files 在被读取前会从 `HEAD` 恢复。Property tests 是盲写的 — 仅根据 spec 和 signature,而无需查看 implementation — 然后被冻结。并且 diff 本身会被读取,以发现那些用绿灯换取红灯的举动。 - **Spec 驱动开发,如果你需要的话。** 许多工具能_生成_ spec; mumei 让 agent _按照它去构建_ — 需求 → 设计 → 任务(每一个都 独立审查)→ 一次审批关卡 → 逐 Wave 实现。 跳过一个 phase 或提交一个损坏的 Wave 会被物理拦截。它是 三种接入方式之一,而不是过路关卡:`/mumei:review` 运行相同的审查 引擎和相同的检测器来对抗你当前的 diff,**没有 `.mumei`,没有 状态,没有仪式**,并且计划载体包装了 Claude Code 自己的计划模式 。带来你自己的流程;保留强制执行力。 - **有根据的审查,而不是凭感觉。** 确定性检测器(CVE / secret / type / test / SAST)首先运行,并为一项多视角审查_奠定基础_ — 在全新的上下文中进行安全和对抗性审查。然后,针对每个发现问题的验证器会将 没有根据的发现降级为 advisory,因此误报永远不会导致合并被错误拦截。裁决控制着推送,并且它总是会指出人类仍然需要手动检查什么。 ## 安装 从社区市场安装: ``` /plugin marketplace add anthropics/claude-plugins-community /plugin install mumei@claude-community /reload-plugins ``` 或者从自托管市场跟踪最新版本: ``` /plugin marketplace add iroha924/mumei /plugin install mumei@mumei /reload-plugins ``` 安装后,运行一次性的项目内设置: ``` /mumei:kindle ``` 卸载:`/plugin uninstall mumei@claude-community`(如果你是从自托管市场安装的,请使用 `mumei@mumei`;你项目中的 `.mumei/` 目录将保持原样)。 前置条件:用于 review-phase 检测器的 `semgrep` + `osv-scanner`。安装命令请参见 [docs/getting-started.md → 前置条件](./docs/getting-started.md#prerequisites)。 ## 工作流
mumei workflow
## mumei 强制执行的内容 上面提到的三大支柱,详细说明如下: - **是框架,而不是 prompt** — 每一个 phase / Wave / 提交 / 推送关卡都在工具调用边界被强制执行;agent 无法通过 prompt 绕过它。 - **受保护的状态** — `.mumei/` 状态、review verdicts 和 reviewer-execution 轨迹对 agent 是禁止访问的,无论是在 Edit/Write 路由还是在常见的 Bash 路由上(规则 S1/S2,M1/M2);只有框架能写入它们。关于这实际上能达到多大程度,请参阅 [什么能守住,什么守不住](#what-holds-and-what-does-not)。 - **测试完整性检测** — 一次通过的构建无法告诉你的一件事是,这次构建是否是被动过手脚才通过的。mumei 按照 `HEAD` 的定义重新运行测试,冻结盲写的 property tests,并报告那些删除测试、抑制类型错误或从发布的 tarball 中丢弃文件的 diff。 - **不会错误拦截的关卡** — CVE / secret / type-error / failing-test 将裁决固定为 `MAJOR_ISSUES`;嘈杂的 SAST 会通过一个裁决关卡,仅在确认后才拦截,因此误报永远不会导致合并被错误拦截。缺失的工具会被 warn-skip,而不是致命错误。 - **防篡改验证** — 提交时,测试会在干净的 `HEAD` worktree 中重新运行,因此未提交的造假手段(篡改的 `conftest.py`、被 monkeypatch 的 reporter、被编辑的 bytecode)无法伪造通过。 - **Agent 无法钻空子的测试** — 不变属性是盲写的,仅从 spec 和 signature 而不看 implementation,然后被冻结,因此测试无法通过调整去迎合有缺陷的 implementation。按 AC 选择性启用。 - **多视角审查** — 在全新的上下文中进行独立的需求 / 设计 / 任务审查,然后基于 diff 进行安全和对抗性审查(非对称上下文,而非模型轮换),并且针对每个发现的问题,验证器会将没有根据的发现降级为 advisory。 - **对其能力上限保持诚实** — 每一个裁决都带有盲点免责声明,并准确指出需要人工审查的内容;mumei 从不声称能取代人工审查。 - **基于 Wave 的提交** — 1 Wave = 1 次提交。Hooks 会将 diff 与每个任务的 `_Files:_` 进行交叉检查,以阻止虚假完成。 - **已签名的、可证明的发布** — Sigstore 无密钥签名,SLSA Level 3,CycloneDX SBOM。请参见 [docs/getting-started.md → 安全与供应链](./docs/getting-started.md#security--supply-chain)。 - **无名管家姿态** — mumei 默默服务,不揽功劳:在你主动选择启用之前零副作用(没有 `.mumei/current` → 每个 Hook 都是空操作),没有主动发言,事实形式的裁决,没有 telemetry。 ## 什么能守住,什么守不住 mumei 的关卡有两种强度。它们之间的界限不是本地与 CI 之间的区别。 而在于**关卡是测量了答案本身,还是相信了 mumei 写入的文件**。 ### 重新测量的关卡(强) 这些关卡从不轻信 agent。 - **从 `HEAD` 重新运行测试。** 在提交时,mumei 会构建一个干净的 worktree 并在那里运行测试。篡改过的 `conftest.py` 或存在于你工作树中被 monkeypatch 的 reporter 都不会产生任何影响。Golden files 会首先从 `HEAD` 恢复。 工具关卡和 Stage 0 检测器执行的是真正的二进制文件。 - **tarball 和 diff 是被读取的,而不是被报告的。** `lint-distribution-shape` 运行真正的 `git archive` 并将其内容与真实的文件列表进行比较。 `lint-gate-weakening` 直接读取 diff 本身,寻找被删除的测试或被抑制的类型错误。 - **造假意味着必须提交造假代码。** 要击败上述任何一项,你都必须提交执行此操作的代码,而这会落入 diff 中,被人看到。 ### GitHub 端的关卡(强,但你必须手动开启) 分支保护 —— 要求来自非作者 code owner 的批准、 `enforce_admins`、`require_last_push_approval` —— 是持有你 shell 的 agent 无法触及的唯一控制措施。 它不是深度防御。它是**承重墙**。必需的状态检查 只是运行存储库(`scripts/lint-all.sh`、`tests/`)中的脚本。一个 范围限定为 `Contents: write` 的 token 可以将 lint 重写为 `exit 0`,然后必需的检查 就会变绿。代码树内部的任何东西都无法弥补这个漏洞,因为 代码树内部的所有东西都在树中。只有阅读 diff 的人类才能做到。 ### mumei 记录自身进度的文件(弱) `state.json`、任务复选框、review verdicts、`cost-log.jsonl`。这些不是 测量结果。它们是 **mumei 关于自身进度的自我声明**。 Hooks 拒绝了针对它们所有的 Edit/Write 路由和常见的 Bash 写入路由(规则 S1/S2,M1/M2)。这将伪造文件的行为从意外变成了 一种明显奇怪的举动。它并没有关上大门:Bash 守卫读取的是它接收到 的命令字符串,而一个命令可以隐藏它写入的位置。 因此,请将这些视为**一条记录,而不是一堵墙**。 ### 你无法通过编码绕过的前提条件 mumei 的预防性保证其前提是**agent 运行在某个你的凭证 无法触及的地方**。 在你机器上拥有你已认证的 `gh` 的 agent,并不会绕过 审批关卡。它**满足**了关卡 —— 因为对 GitHub 而言,使用你的凭证 做出的批准就是你的批准。 如果没有这种分离,mumei 就会从预防退化为记录。在 这种退化中存活下来的,是上面那些重新测量的关卡。这就是为什么我们不 会放弃它们。 ## 扎根于研究的设计 mumei 的强制执行模型源于最近关于 agent 可靠性和 审查精度的工作,而不是凭直觉。一些承重的研究结果(给出了 arXiv ID 供你查阅): - 强大的 agent 会选择性地忽略 prompt 层面的规则,因此强制执行必须存在于一个硬边界上 —— mumei 的 Hooks。("Formal Policy Enforcement for Real-World Agentic Systems", arXiv 2602.16708; "Willful Disobedience", arXiv 2603.23806) - Agent 会漏掉自己大部分的错误,因此 reviewer 必须在全新的上下文中运行,并且永远不能自我审查。("Self-Correction Bench", arXiv 2507.02778) - 原始的 SAST 噪音很大;当 LLM 对_结构化的_检测器发现进行裁决,而不是进行冷时,精准度会急剧上升 —— 这就是 mumei 的 class-aware detector → validator 关卡。("ZeroFalse", arXiv 2510.02534) - 几个不同的审查视角胜过一群相同的 agent,因此 mumei 使用非对称上下文的 reviewer,而不是投票委员会。("Understanding Agent Scaling in LLM-Based Multi-Agent Systems via Diversity", arXiv 2602.03794) 这些为设计提供了依据;mumei 并未声明拥有上述论文的任何结果,而且 —— 正如下一节明确指出的那样 —— 从不声称能取代人工审查。 ## 命令 | Command | Description | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/mumei:kindle` | 一次性项目内设置。创建 `.mumei/`,提议在 `CLAUDE.md` 中添加内容并带有 diff 预览。 | | `/mumei:glean ` | 可选的 pre-spec 问答循环(最多 3 轮 × 5 个问题)。输出保存至 `.mumei/scratch/.md`。 | | `/mumei:compose [feature]` | 针对新功能的载体选择器(用于完整 SDD 的 `spec` 或用于 Claude plan-mode 包装器的 `plan`);自动恢复现有功能。Spec 载体:clarification → requirements → design → tasks(每个最多自动审查 3 次)→ 单次批准 → Wave-by-Wave → review。 | | `/mumei:peruse` | Plan-vehicle 审查 pipeline。运行 Stage 0 检测器 + security-reviewer + adversarial-reviewer + 每个问题的验证器,对当前的 diff 进行审查(一旦 `pending_review=true` 即开始,当最后一个 `TaskCompleted` 匹配 `task_created_count` 时设置)。 | | `/mumei:review [base] [spec]` | 通过共享引擎(检测器 → reviewers → 裁决关卡 → fail-open 裁决),对 `git diff $(git merge-base HEAD)`(PR-pushed + 未提交的更改)进行独立的一次性审查。在没有 mumei 功能的情况下也能工作;零副作用(无状态、ledger、memory 或提交)。可选的 spec 文件可启用 `spec-compliance-reviewer`。 | | `/mumei:shelve ` | 将一个 `done` 功能移动到 `.mumei/archive///`。自动检测载体(specs/ 或 plans/)并携带 `scratch/.md` 作为 `scratch.md`。 | | `/mumei:muse ` | 生成 `muse.md`,总结 AC 计数、Wave 计数、review iter 模式、fix-spiral 检测、token 成本、cache 命中率和已归档(或即将归档)功能的 hook 触发情况明细。只读;仅限用户调用。 | | `/mumei:attest ` | 详细的可靠性视图 —— 最近 10 次试验的 pass^3 以及来自 `reliability-log.jsonl` 的最后 10 次试验行表格。只读;仅限用户调用。 | | `/mumei:glance [feature]` | 单行可靠性摘要(` \| pass^3: (n=, window=10, k=3)`)。无参数形式会读取 `.mumei/current`。只读;仅限用户调用。 | ## `mumei` 不是什么 - 不是人工审查的替代品。该 pipeline 会浮现出有根据的发现,并指出其盲点;由人类来做决定。它起到关卡的作用;它不保证正确性。 - 不是 CI/CD 工具。Hooks 仅在 Claude Code 内部运行。 - 不是代码审查服务。Reviewers 通过你的 Claude Code 订阅在本地运行。 - 不是 SDD 适配器。mumei 有自己固执的 spec 格式。 - 不是多工具。不支持 Cursor / Codex / Aider。物理强制执行层是 Claude Code Hooks。 - 不是存储系统。状态是纯文件。没有 DB,也没有 MCP server。 ## 配套工具 - **基于框架的审查工作流** — 便携式可重用的 GitHub Actions 工作流,通过四个视角(正确性 / 安全性 / 可操作性 / 可维护性)驱动 Claude reviewer,并以 semgrep + osv-scanner 输出为基础,具备偏见中和和对能力上限的诚实声明。任何存储库都可以用一行 `uses:` 采用它;参见 **[docs/review-adoption.md](./docs/review-adoption.md)**。独立于插件本身。 ## 文档 - **[docs/getting-started.md](./docs/getting-started.md)** — 详细的长篇说明:两种载体、工作流、spec 和 tasks 格式、前置条件、项目布局、hook 规则、故障排除。 - **[ARCHITECTURE.md](./ARCHITECTURE.md)** — runtime 结构、分布情况、完整的强制执行表、reviewer pipeline、基于文件的状态模型。 - **[docs/operations-playbook.md](./docs/operations-playbook.md)** — 运行 mumei 的实用指南(主动执行 `/compact`、subagent 成本、prompt 缓存、字节精确工具、`MUMEI_BYPASS=1` 纪律)。 - **[SECURITY.md](./SECURITY.md)** + **[docs/security-policy.md](./docs/security-policy.md)** + **[docs/threat-model.md](./docs/threat-model.md)** + **[PRIVACY.md](./PRIVACY.md)** — 供应链验证、威胁模型、隐私。 ## License MIT
标签:AI编程助手, Git Hooks, SOC Prime, 开发工具