with one click
core-discipline
写/改任何代码前必读。约束 AI 避免造假 API、过度工程、大范围乱改。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
写/改任何代码前必读。约束 AI 避免造假 API、过度工程、大范围乱改。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
做 Cocos Creator 多机型/多分辨率适配时使用。Canvas、Widget、安全区。
Cocos Creator 用 AssetBundle 做分包/远程资源时使用。加载、释放、依赖、缓存。
优化 Cocos Creator 渲染性能时使用。合批、图集、动静分离、Label。
给 Cocos Creator 原生包做热更新时使用。version manifest、增量、校验、回滚。
写 Cocos Creator 动效/动画时使用。tween、Animation、Spine、性能与清理。
做 Cocos Creator 大量条目列表时使用。虚拟列表、节点复用。
| name | core-discipline |
| description | 写/改任何代码前必读。约束 AI 避免造假 API、过度工程、大范围乱改。 |
| category | discipline |
| tags | ["纪律","api","yagni"] |
规则: 只调用真实存在的库函数、类、字段——不确定就先查文档或读源码,禁止凭记忆编造。
为什么: AI 的训练数据存在截止日期,且会在不同库之间混淆接口。常见事故:把 pandas 的方法名张冠李戴到 polars,把 Node.js v16 已删除的 API 当作现行 API 调用,编造根本不存在的 requests.get(...).json_body 字段。这类代码在 review 时看起来合理,跑起来立刻抛 AttributeError / TypeError,且错误定位成本很高。
怎么做:
help()、IDE 补全、或直接读源码确认。print / console.log 或写一个小测试确认再用。# TODO: 请核实此 API 是否存在,不要默默造假。规则: 只改与当前任务直接相关的代码行,不顺手触碰无关部分。
为什么: AI 极容易在"顺手"时引入意外回归:重排 import 导致循环依赖,格式化改动污染 git blame,重命名变量破坏下游引用。改动面越大,reviewer 越难判断哪些变化是必要的,哪些是噪音,review 成本指数级上升。
怎么做:
规则: 只实现当前需求的最小方案,不预留"将来可能用到"的抽象或扩展点(YAGNI)。
为什么: AI 倾向于生成"通用"、"可扩展"的代码——Strategy 模式、插件系统、多层配置——即使需求只是"把这个数字加一"。这些提前抽象几乎从不被用到,却带来维护负担、理解成本,以及因过度复杂而埋下的 bug。
怎么做:
规则: 动手前列出关键假设;假设有歧义先问清楚,不闷头猜。
为什么: AI 在上下文不足时会悄悄做假设并写进代码:假设某字段不会为 null、假设列表非空、假设调用方已鉴权。这些假设在 happy path 下不报错,在边界场景下造成生产事故,且事后难以溯源(代码里看不到这个"决策"是在哪里做出的)。
怎么做:
假设:
- user.profile 在此处一定非 null(由上游鉴权中间件保证)
- items 列表至少有 1 条(调用方已校验)
assert / TypeScript 类型守卫 / Zod schema 在代码中显式检查。规则: 修改任何文件前先完整读一遍,理解现有约定再动手。
为什么: AI 经常在没读完文件的情况下就开始写代码,结果:重复定义已有的工具函数、违反项目既有的错误处理约定、用与周围代码不同的命名风格引入风格割裂。这些问题单独看不严重,积累起来会让代码库越来越难维护。
怎么做:
# 反例 — AI 凭记忆编造了 httpx 不存在的 .json_body 属性
import httpx
resp = httpx.get("https://api.example.com/data")
payload = resp.json_body # ❌ AttributeError: 'Response' object has no attribute 'json_body'
user_id = payload["id"]
# 正例 — 查过文档,使用真实存在的 .json() 方法
import httpx
resp = httpx.get("https://api.example.com/data")
payload = resp.json() # ✅ httpx.Response.json() 是真实 API
user_id = payload["id"]
# 需求:给用户名加前缀 "user_"
# 反例 — AI 预留了"将来可能需要不同策略"的扩展点
from abc import ABC, abstractmethod
class PrefixStrategy(ABC):
@abstractmethod
def apply(self, name: str) -> str: ...
class UserPrefixStrategy(PrefixStrategy):
def apply(self, name: str) -> str:
return f"user_{name}"
class PrefixFactory:
_registry: dict = {}
@classmethod
def register(cls, key: str, strategy: PrefixStrategy):
cls._registry[key] = strategy
@classmethod
def get(cls, key: str) -> PrefixStrategy:
return cls._registry[key]
PrefixFactory.register("user", UserPrefixStrategy())
def format_username(name: str, strategy_key: str = "user") -> str:
return PrefixFactory.get(strategy_key).apply(name) # ❌ 三层间接,零复用
# 正例 — 最小实现,直接满足需求
def format_username(name: str) -> str:
return f"user_{name}" # ✅ 清晰、可测、够用