ct
Breaks out of a patch loop by re-deriving the problem from first principles and naming the layer the defect lives in. Use when the same symptom has been patched twice, when the user says /ct, or when
SKILL.mdskills/ct/SKILL.md
GitHub我们已经在这个问题上来回改了好几轮了。补丁在累积,我怀疑我们在治标,不在治本。
停。先不要再提补丁。先做这些:
说出你学到了什么。 经过这几轮修改,你对这个问题的理解和一开始相比有了哪些变化?列具体事实,不要写印象。让你意外的点、以及你之前几次"以为搞定了"却被推翻的地方,都列出来。
量出本质难度。 用一句话写出这个问题真正不可约的难点是什么(本质张力 / 真正的用户需求,不引现有代码);再看现有实现里有多少东西并不在解这个张力。这个差额就是症状的体量。 差额越大,越说明问题不在某一行,而在结构。
定位结构性病因。 如果差额可观,它八成是这三种之一 —— 先点名是哪种,再谈层:
- 职责错层 —— 这个模块兼任了不属于它问题域的职责(如 ingress 里手写了一个 job runner)。
- 为未证实的需求提前优化 —— 为一个没有使用 / 负载证据的场景手写了整套机制;它既是最大复杂度源、也是最大 bug 源。
- 缺一层抽象 —— 某个职责没被抽成独立一层,被迫寄生在相邻层里。
判断缺陷在哪一层。 只选一个,用一段话说清为什么是它、不是别的:
- fix —— 这一层有 bug,周围都是对的
- redesign —— 这个模块的设计本身就不对
- refactor —— 早期埋下了错误的架构假设,已经在多个模块之间渗透
- rewrite —— 我们当初理解错了需求,现在的代码已经在挡路了
自检:如果按你这个诊断改完,第 2 步那个复杂度差额是会消失,还是只是换个地方? 如果只是挪走,你还停在症状上 —— 回第 3 步再挖一层。
给出匹配粒度的方案。 跟诊断对上。不要反射性地选最小补丁,也不要反射性地选全部重写。**我们还在开发阶段,没有向后兼容包袱,没有历史负担。**如果答案就是"删了重来",直接说。
我给了焦点就聚在那里;没给就针对我们刚才在做的东西。
确认诊断和方案前,不要动文件。