Agent Skill · 证据驱动 · MIT

先证明,再删除

Code Janitor 是一个统一的 Agent Skill,做两件事:普通代码简化,和 AI 修改防回退层清理。它不追求"删得多"——它关心一次改动能否减少团队今后必须持续保持一致的概念和义务。

01

选定目标:普通简化,还是 AI 防回退层清理——不混批

02

只读审计,为每个候选建立证明记录

03

授权后才动手,分层验证并给出撤销路径

复杂的软件结构经过证据验证后,收敛为更小、更清晰的系统

复杂的软件结构经过证据验证后,收敛为更小、更清晰的系统。

两种目标

一次只扫一个目标。

两个目标共享消费者分析、边界证明和分层验证流程,但必须先选择,不在同一批次中混淆删除边界。

objective 1

普通代码简化

识别并安全移除偶然复杂度,同时保护仍然有效的行为、边界与兼容性。

处理
死代码、重复状态、失主抽象
冗余 API 与不必要的分层
过期兼容层与过度工程
不处理
仅做格式化、普通代码审查
性能调优
objective 2

AI 防回退层清理

处理 AI 修改过程中产生的防回退层:先选择类别,再证明并移除维护性负担。

处理
为保护 AI 改动而加的测试
构建 / 部署 / CI 守卫
静态扫描脚本与清单
不处理
仍保护真实业务、API 的代码
安全、数据、部署边界的守卫
为什么静态检查不够

lint 给的是线索,不是证明。

"没人调用"不等于"可以删"。Code Janitor 会继续追踪这些表面,再决定删除、合并、保留,还是标记为暂时无法判断。

runtime

运行时消费者

从入口出发,穿过配置、注册、分发,追踪到真正的运行路径。

dynamic

动态注册与插件

反射、插件表、字符串引用——编译器看不见的可达性。

persisted

持久化格式

存储表示、迁移与回放:删掉一个字段,旧数据可能读不回。

public

公共接口

包边界、wire 格式与外部消费者,仓库内搜不到他们。

history

历史决策

ADR、RFC 与架构约束仍然有效时,设计就不是冗余。

verify

验证边界

哪个最小验证能揭示错误删除?答不上来,就不动手。

证明记录

每个候选,一份证明。

九个字段,把"我觉得可以删"变成可复核的证据。证明不完备,候选就留在原地。

proof-record.mdsurvey · broad
Candidate     要移除或合并的确切契约、表示或层
Burden        它制造的概念、同步、发布或测试成本
Reachability  生产 / 非生产 / 动态 / 外部 / 持久化消费者
Rationale     它为何存在,那个理由今天是否还成立
Cut           受影响的声明、实现、分支、产物、文档、依赖
Consequence   放弃哪些可观察能力或兼容性
Confidence    证据强度、不确定性、爆炸半径、可逆性
Proof         能暴露错误删除的最小检查
Net effect    移除的维护概念 − 新引入的迁移或替代机制

删除代码行只是结果。真正的收益,是删除一个需要长期维护的事实、状态、契约或概念。高价值的猜测,排不过一个小的、已证明的删除。

它会谨慎对待

这些边界,它绕着走。

公共 API 与插件注册

动态加载、注册表条目、对外发布的接口。

数据格式与迁移

持久化表示、回放、向后兼容路径。

授权与输入校验

隔离、凭据、数据丢失防护——安全代码不是防回退层。

并发与生命周期

取消、清理、所有权:让系统归于静默的代码。

生成文件与外部消费者

共享资源、vendor 代码、仓库外的引用方。

仍然有效的 ADR

历史决策记录仍在管辖的设计,不是待删的债务。

发现真实消费者、边界尚未查清,或者简化只是把复杂度搬到别处时,它会建议保留——而不是为了输出结果强行删除。

验证记录

不是口号,是跑过的场景。

973
个文件的生产仓库(Python + TypeScript)完成全库分区审计,工作区保持干净
143/143
前端测试在防回退清理后全绿,另加 6 项 API 冒烟检查通过
29
个防回退用例被安全移除,后端失败分布与已知基线一致
14
个候选专属 CSS 类在共享样式表中被逐成员证明,文件本身保留

Change、Broad、Integration、Decision-record、共享产物边界与 AI 防回退清理六类场景的完整记录,见 docs/validation.md。一次小范围测试通过,不会被包装成完整的运行时或用户验收。

使用

像跟同事说话一样调用它。

目标不明确时,Skill 会先询问,不会直接删除代码。

审计 · 不改文件

使用 $code-janitor 审计这个仓库,列出最安全、收益最高的简化候选。不要修改文件。

调查 · 具体问题

使用 $code-janitor 判断这些 readiness 标志是在表达不同的生命周期保证,还是重复状态。

修改 · 已证明的简化

使用 $code-janitor 删除一个高置信度的偶然复杂度来源。保留仍然有效的契约,完成验证,并给出操作回执和撤销路径。

整合 · 别的分支的发现

使用 $code-janitor 复核并整合这个 PR 中的简化建议。保留证据,不保留候选数量。

安装

一个包,七个 harness。

目录必须叫 code-janitor。选你的平台,复制一条命令。

Codex$ git clone https://github.com/zhouyuanxinand/code-janitor.git ~/.codex/skills/code-janitor
Claude Code$ git clone https://github.com/zhouyuanxinand/code-janitor.git ~/.claude/skills/code-janitor
Cursor$ git clone https://github.com/zhouyuanxinand/code-janitor.git .agents/skills/code-janitor
GitHub Copilot$ git clone https://github.com/zhouyuanxinand/code-janitor.git .github/skills/code-janitor
Cline$ git clone https://github.com/zhouyuanxinand/code-janitor.git .cline/skills/code-janitor
Gemini CLI$ git clone https://github.com/zhouyuanxinand/code-janitor.git .gemini/skills/code-janitor
OpenCode$ git clone https://github.com/zhouyuanxinand/code-janitor.git .opencode/skills/code-janitor

安装后按平台刷新 Skill 目录。作用域、发现规则与旧 $simplify-codebase 入口的迁移说明,见仓库的 docs/harness-compatibility.md