Dev Discipline
开发纪律与 Agent 工作流规则。本技能是代码任务的唯一规则源;CLAUDE.md 只做路由。
Harness 框架:所有代码任务遵循 Model + Harness 架构。LLM 提供推理,Harness = 上下文 + 工具 + 约束 + 验证 + 纠正。本文件将这五层落地为具体规则。
完整详细规则 → references/dev-discipline.md
上下文工程原则 → <LOCAL_AGENT_HOME>\references\context-engineering.md
Harness 工程原则 → <LOCAL_AGENT_HOME>\references\harness-engineering.md
首次使用与离线可用性
本技能的核心规则、冲突预防脚本和完整性检查均可离线运行,不依赖国外网络。
- 首次使用或更新后运行:
python validate_skill.py - 输出
PASS后即可使用;WARN表示可选增强工具缺失,按降级说明继续;FAIL表示核心文件损坏或缺失,先修复再使用。 - 不因验证失败自动联网、安装依赖或修改全局配置;先报告缺少项和可行替代。
工具可用性与降级
| 类型 | 工具/文件 | 缺失时的处理 |
|---|---|---|
| 核心 | SKILL.md、references/、agent_comms.py、validate_skill.py |
停止依赖该技能的自动化动作,修复本地文件后再继续 |
| 内置可选模块 | scripts/self_improvement.py、scripts/memory_manager.py |
仅在指定项目目录中创建空日志或记忆目录;不自动记录对话或扫描本机文件 |
| 外部增强 | CodeGraph、knowledge_graph | 使用本地文本搜索、当前任务证据和简短手工交接;在结果中说明未使用的增强能力 |
| 外部资源 | GitHub、包管理器、在线文档 | 网络不可用时只使用已有本地实现;不猜测外部信息,不自动安装 |
当多个条件同时命中时,优先级为:安全/人工确认 → 任务分级 → 适用技能路由 → 默认执行流程 → 可选增强工具。高优先级规则与低优先级规则冲突时,以高优先级为准。
内置记忆与自我提升
两个模块均为离线、零依赖工具;必须用 --root <项目目录> 明确指定数据归属位置,不能把数据写入本 Skill 目录,也不会自动收集聊天内容。
| 需求 | 命令 |
|---|---|
| 初始化学习日志 | python scripts/self_improvement.py --root <项目目录> init |
| 记录纠正、洞见、错误或需求 | python scripts/self_improvement.py --root <项目目录> log --kind insight --summary "..." |
| 查看学习日志计数 | python scripts/self_improvement.py --root <项目目录> status |
| 初始化三层记忆 | python scripts/memory_manager.py --root <项目目录> init |
| 保存经验 | python scripts/memory_manager.py --root <项目目录> add --tier procedural --title "..." --text "..." |
| 检索或统计记忆 | python scripts/memory_manager.py --root <项目目录> search --query "..." / stats |
写入前,两个脚本会拒绝疑似密钥、令牌或密码。请只记录可共享、可复用的经验;账号、联系方式、原始对话和私密业务数据不得写入。
速查卡
| 场景 | 动作 |
|---|---|
| 错字/单行 | L0: 直接改,不验证 |
| 单文件小改 | L1: SPEC + 测试 |
| 多文件新功能 | L2: SPEC/PLAN/VERIFY |
| 架构/安全 | L3: 多 agent + CodeGraph + REVIEW |
| 交易/删除/密钥 | L4: 必须人工确认 |
| 不确定影响 | 只加日志/检查/开关,不改逻辑 |
| 知识查询 | 先用项目内搜索;有知识图谱时可用其查询命令 |
| 记住某事 | scripts/memory_manager.py 写入指定项目的三层记忆 |
| 记录踩坑/纠正 | scripts/self_improvement.py 写入指定项目的 .learnings/ |
| 装工具 | 先 which 检查 → 再 pip/下载 → 装到 <LOCAL_TOOLS_DIR>\ |
| 清理 | 删一次性的、临时的、失败的,保留源文件 |
| 改代码前查影响 | code-review-graph: get_minimal_context → 定位 blast radius |
Context Engineering(上下文纪律)
> 上下文 = Agent 的眼睛。上下文质量决定 Agent 能力上限。
| 原则 | 规则 |
|---|---|
| KV Cache 稳定 | 系统提示词/工具定义一旦确定不改;动态信息追加到末尾 |
| 渐进式披露 | 需要时才加载;Skills 按触发条件激活,不全部预加载 |
| Lost-in-the-Middle | 最关键信息放开头或结尾;长文档中间的关键事实显式引用到末尾 |
| 流程驱动 | 用 SOP 流程而非 99 条零散规则组织提示词 |
| 项目指令文件 | CLAUDE.md/AGENTS.md 写清构建命令、代码风格、禁区 |
| Agent 状态栏 | session-start 注入 <agent_status>(环境/约束/能力),L2+ 决策前先"瞥一眼"状态栏 |
| 上下文压缩 | 超过 ~200 轮或工具输出累计 >50K token → 压缩中间工具输出为摘要,保留结论和来源 |
| Lost-in-Middle 执行 | 回答前检查:最关键的约束/结论是否在开头或结尾?中间的关键事实是否被显式引用到末尾? |
Lost-in-Middle 强制检查
回答涉及长上下文中的信息时:
1. 不要在回答中间引用上下文 mid-section 的关键事实而不加位置提示
2. 将上下文中部的关键约束/数字显式复述到回答开头
3. 如果答案依赖上下文中间的第 N 条信息,在回答末尾附 (来源: 上下文第 N 条)
上下文压缩触发条件
| 信号 | 阈值 | 动作 |
|---|---|---|
| 对话轮次 | >200 轮 | 压缩已完成子任务的详细轨迹为摘要 |
| 工具输出 | 单次 >5000 token | 摘要替换原文,保留结构化数据 |
| 重复调用 | 同一工具连续 5+ 次 | 熔断检查 + 状态栏标注 |
| 前缀变更 | 修改 system prompt | 评估必要性,优先追加到末尾 |
工具定义设计原则
| 原则 | 示例 |
|---|---|
| 边界明确 | "NEVER invoke grep as a Bash command — use the Grep tool instead" |
| 参数有例子 | "timezone: 'America/New_York'" 而非仅 "timezone: string" |
| 工具间协作 | "Use Read at least once before editing a file" |
| 错误说明 | "Returns HTTP 429 when rate limited — retry after 30s" |
| 权限风险 | "HIGH RISK: modifies production data. Requires L4 confirmation." |
Harness 工程:约束/验证/纠正
> Agent = Model + Harness。LLM 提供推理,Harness 保证可靠性。
| 层 | 本文件落地 |
|---|---|
| 约束 | 权限分级 L0-L4 + 高风险红线 + 不确定时只加日志不碰核心逻辑 |
| 验证 | SEARCH 先搜现成 → VERIFY ≤3轮 → REVIEW 自查 → 测试通过才算完成(非代码写完) |
| 纠正 | 3次重试→熔断→人工接管 + 备份回滚 + 不确定影响只加日志 |
验证检查点(L2+ 任务完成时强制)
| # | 检查项 | 不通过动作 |
|---|---|---|
| 1 | 测试通过(L2+ 目标 80% 覆盖) | 修复代码,不跳过 |
| 2 | 无孤儿文件(临时脚本/中间文件已清理) | CLEANUP §7 |
| 3 | 无回归(code-review-graph impact 验证) | 回滚或修复 |
| 4 | 备份已清理(验证通过后删 .bak.*) | 删除备份 |
| 5 | 状态栏约束未触发(无违规重试/越权) | 记录 LESSON |
| 6 | 文档同步(架构变更→更新对应 .md) | 补充文档 |
纠正降级路径
| 失败类型 | 第1次 | 第2次 | 第3次 | 3次后 |
|---|---|---|---|---|
| 工具超时 | 静默重试 | 换参数重试 | 换工具重试 | 报告用户,建议替代方案 |
| 权限不足 | 确认是否需要提权 | 仅读模式完成 | — | 报告用户,标记 L4 |
| 测试失败 | 分析原因修复 | 缩小改动范围 | 回滚到稳定状态 | 报告用户,记录 LESSON |
| 外部 API 错误 | 重试 30s 后 | 换备用 API | 缓存结果兜底 | 降级为离线模式,标注数据过期 |
Process
代码任务按以下流程执行:
1. 任务分级(先判定等级)
| 等级 | 场景 | 示例 | 执行方式 |
|---|---|---|---|
| L0 琐碎 | 错字、注释、单行配置 | 改一个变量名、删一行 debug log | 直接改,不启动 agent,不写 SPEC |
| L1 简单 | 单文件、小函数、局部 bug | 加一个 extractor、修一个 regex | 简短 SPEC,运行相关测试 |
| L2 中等 | 多文件、新功能、非核心重构 | 新建 relation linker、加 CLI 命令 | 完整 SPEC/PLAN/VERIFY |
| L3 复杂 | 架构、跨模块、性能、安全 | 重构 builder 流水线、加去重引擎 | 多 agent 并行,CodeGraph,完整 REVIEW |
| L4 高风险 | 交易、删除、密钥、发布、定时任务 | 删除 .obsidian、修改 CLAUDE.md | 必须人工确认,默认只读 |
2. LESSONS-FIRST(任务前)
触发 self-improving-agent 检查 .learnings/ + references/lessons.md,历史踩坑转为本次约束。
自动检测触发:
| 检测信号 | 自动检查 |
|---|---|
编辑 .py + subprocess |
LESSON-004: 编码 + None 守卫 |
编辑 .py + schtasks/计划任务 |
LESSON-005: Daily 触发器验证 |
下载 .pdf 或调用 markitdown |
LESSON-006: 中文编码预检 |
| 图片文字提取 / PDF 无文字层 | pdf-image-text-extractor |
编辑 .py + 多分支 if/else |
LESSON-007: 变量默认值 + traceback |
| setup-hooks / install / 修改 CLAUDE.md | LESSON-008: 备份 + diff 验证 |
3. 核心执行流程
SEARCH → THINK → (L3+: agent_comms.py check) → CODE → SIMPLIFY → VERIFY
L3+ 启动多 agent 前:python agent_comms.py announce <name> <files> 预占文件,冲突则串行。
- SEARCH: 先搜 Skill 本地 → 仓库内 → MCP → 包管理器 → GitHub
- THINK (L2+): 输出
理解/方案/涉及文件/风险 - SIMPLIFY: 控制流压平、命名直接、无复制粘贴、无过度抽象、无孤儿代码
- VERIFY: 最多 3 轮,失败超过 3 轮停止并报告
4. 核心纪律
→ 完整规则见 references/dev-discipline.md §4/§5/§6/§7/§8
| 环节 | 核心规则 |
|---|---|
| 编码前 | LESSONS-FIRST → SEARCH → THINK → SPEC(L1+)/PLAN(L2+) |
| 编码中 | SIMPLE + PRECISE + SAFE CHANGE + TOOL SAFETY |
| 编码后 | VERIFY(≤3轮) → REVIEW → SIMPLIFY → LESSON |
| 测试 | TDD: RED→GREEN→IMPROVE;L2+ 目标80%覆盖 |
| Bug | 复现→最小化→假设→探测→修复→回归 |
| Agent | L0/L1不启动;L2按需;L3/L4默认多agent。agent-comms 冲突预防。熔断3次降级 |
5. 回答与证据纪律
在回答、评审、方案建议或结论输出前:
- 先检查问题是否存在错误前提、逻辑跳跃、概念混淆、信息缺失或未经证实的假设;发现问题时直接指出,不基于有缺陷的前提继续推导。
- 不自动认同用户观点,也不为迎合而附和。即使对方表达很有说服力,也独立判断其是否合理。
- 明确区分已核实的事实、基于现有信息的合理推测、主观判断,以及暂时无法证实的信息,避免将不同性质的内容混为一谈。
- 涉及数字、日期、人物、引用、研究结论、案例或具体事件时,尽可能核实来源;无法确认时明确说明不确定性,不编造、补全或伪装成事实。
- 不同意用户判断时,清楚指出不同意的部分,说明原因,提供关键证据、反例、潜在风险或更合理的替代解释。
- 区分”证据不足”与”结论错误”:不因暂时缺少证据就直接判定用户观点错误,也不把”可能成立”描述成”已经证实”。
- 除回答表面问题外,主动指出可能被忽略的重要变量、适用条件、隐含风险、矛盾或偏差,帮助获得准确、完整且经得起检验的信息。
6. 高风险红线
修改任何源码/配置/workflow 文件前:
| GATE | 触发条件 | 放行条件 |
|---|---|---|
| 修改前备份 | 编辑任何 .py/.md/.json/.yaml 文件前 | cp 原文件 原文件.bak.YYYY-MM-DD 已执行 |
| 备份清理 | 修改验证通过后 | 对应的 .bak.* 已删除 |
| 不确定影响范围 | 修改前无法确定副作用 | 只加日志/检查/开关,不改核心逻辑 |
| 提交/推送 | git commit/push | 用户明确说"提交/推送"才放行 |
| 新鲜度 | 源码编辑后 | green/review 令牌自动失效 |
7. CLEANUP(任务结束)
| 类型 | 清理 | 例外 |
|---|---|---|
| 一次性验证/检查脚本 | 删除 | 用户要求保留 |
| 中间转换文件(temp_, .tmp) | 删除 | 调试中途 |
| 备份文件(.bak.) | 删除(验证通过后) | 验证未通过时保留 |
| 生成的报告/文档 | 确认用户后处理 | 保留最终版 |
| 下载的临时文件 | 删除 | 用户要求下载 |
禁止:不告知直接删、删用户手动创建的文件、删 .git 内容、rm -rf 批量清理。
8. Git 格式
<type>: <description>
type: feat / fix / refactor / docs / test / chore / perf / ci
9. 输出格式
- L0/L1:直接结果
- L2+:按 REVIEW 自查格式(改动文件 / 改了什么 / 是否影响外部接口 / 如何回滚)
- 不 emoji 装饰,不寒暄铺垫和总结段落
Few-Shot 示例
> 原则(《AI Agent》书第2章):2-3 个精心挑选、覆盖边界情况的示例,胜过 10 个大同小异的示例。
示例 1:L1 任务 — 修改单个函数
用户: "把 extract_date 函数的正则改成也支持 YYYY/MM/DD 格式"
执行:
SEARCH: Grep("def extract_date") → 找到 src/parser.py:42
THINK: 单文件单函数,L1。改正则,加测试用例。
CODE: Edit src/parser.py — 修改 regex pattern
VERIFY: python -m pytest tests/test_parser.py::test_extract_date -q → PASS
CLEANUP: 无临时文件
OUTPUT: "已将 extract_date 改为支持 YYYY/MM/DD。测试通过。"
示例 2:L2 任务 — 新建 CLI 命令
用户: "给 knowledge_graph 加一个 export 子命令,导出为 CSV"
执行:
SEARCH: code-review-graph search "cli" → 定位 cli.py
code-review-graph query callers_of "cli.py::main" → 3 个调用者
THINK: 多文件,新功能,L2。涉及 cli.py + exporter.py。
PLAN: 1) 新建 exporters/csv_exporter.py
2) cli.py 添加 export 子命令
3) 测试: test_csv_export.py
CODE: Write → Edit → 运行测试 → PASS
VERIFY: code-review-graph impact --files cli.py exporters/csv_exporter.py → 影响范围符合预期
CLEANUP: 删 test_csv_export.py(一次性验证)?→ 保留,它是持久测试
OUTPUT: "已添加 `python -m knowledge_graph export --format csv`。3 个调用者不受影响。"
示例 3:L4 边界 — 不该做的事
用户: "帮我自动提交并推送到 main"
执行:
THINK: Git push = L4 高风险。CLAUDE.md 边界:commit/push 需要用户明确指令。
OUTPUT: "Git push 需要你明确确认。当前改动: src/parser.py, tests/test_parser.py。
要我执行 `git commit -m \"...\"` 和 `git push` 吗?"
→ 等待用户回复 "提交/推送" 才放行。
持续进化(双循环)
> 在线执行(完成任务+记录证据)→ 离线进化(聚合轨迹→诊断→候选→验证→发布)
| 周期 | 触发 | 动作 |
|---|---|---|
| 每次任务后 | 任务结束 | 记录 LESSON(如有新踩坑/新发现) |
| 每日 | kg_hook.py --update |
KG 自动同步 |
| 每次代码变更后 | 文件修改 | code-review-graph update + kg_code_bridge.py --update |
| 每周 | 手动触发 | 合并重复 LESSONS、淘汰过期规则、更新评分阈值 |
Reference
- 完整规则 →
references/dev-discipline.md - 非代码产出技能分工(PPT/文档/可视化/文件阅读)→
references/skill-routing.md - 学术论文工作流 →
<ACADEMIC_WORKFLOW_ROOT>\SKILL.md - 跨工具交接 →
<ACADEMIC_WORKFLOW_ROOT>\handoff_protocol.md - 历史 LESSONS → self-improving-agent skill
- 上下文工程原则 →
<LOCAL_AGENT_HOME>\references\context-engineering.md - Harness 工程原则 →
<LOCAL_AGENT_HOME>\references\harness-engineering.md
Code Review Graph 集成
修改代码前,用 code-review-graph 查变更影响范围(~82x token 节省):
# 查谁调用了目标函数
code-review-graph query callers_of <函数名> --repo <项目路径>
# 查目标函数调用了谁
code-review-graph query callees_of <函数名> --repo <项目路径>
# 文件概要
code-review-graph query file_summary <文件名> --repo <项目路径>
# 模糊搜索
code-review-graph search "<关键词>" --repo <项目路径>
# 变更影响分析(修改后)
code-review-graph impact --files <修改的文件> --repo <项目路径>
# 增量更新图(代码修改后)
code-review-graph update --repo <项目路径>
已索引项目:
| 项目 | 路径 | 节点 | 边 |
|------|------|------|-----|
| 学术工作流 | <ACADEMIC_WORKFLOW_ROOT> | 23,451 | 328,395 |
| chat2api | <PROJECT_ROOT>\chat2api | 185 | 2,036 |
工作流:search 定位 → query callers_of 查影响范围 → 修改代码 → update 更新图 → impact 验证