短上下文工程化第 2 期:Skill 规则单源化 + 规则预筛¶
分支文档快照 · 同步于 2026-09-09 · 来源:
feat/evidence-projection@91a7d1c· 原路径:docs/project/current/PENDING-short-context-eng-phase2.md。正文描述的是该分支的方案或进展,合入与验收状态以当前看板为准。状态:待执行 前置:PR #8(evidence-projection)合入 develop 关联 issue:待开(
[sql-dis-opt] 短上下文工程化第 2 期) 目标分支:feat/IK?-short-context-eng-phase2(issue 编号回填)
一、背景¶
OpenCode 端到端测试(0730 载荷 replay)证明:投影单独做完峰值仍达 98K,超过 50K 限制。
| 阶段 | 投影前 | 投影后 | 50K 内能否跑完 |
|---|---|---|---|
| baseline + table_ctx | 54K | 36K | ✅ |
| 规则匹配 + 子技能加载 | 66K | 53K | ❌ |
| 全流程完成 | 卡死 | 98K | ❌ |
投影已把脚本 stdout 从约 40K 压到约 6K,剩余瓶颈是:
sql-distributed/SKILL.md本体 30K,一次性进入上下文- 六个 Skill 合计 75.6K,路由、验收、投影和安全规则大量重复
- 步骤 7 默认同时加载 generation + dml + ddl
pending_rules_1.md32K 全量读入- 单会话多轮工具调用持续累积
关键判断:仅把主文件拆成 SKILL.md + references/ 不会自动省 token;如果后续仍读取全部 references,输入总量不变。本期必须减少实际加载的正文,并用加载记录和 effective input 验证。
第 2 期目标:通过“规则单源化 + 条件加载 + 规则预筛”,把完整流程峰值压到 50K 以内。
二、实施阶段¶
阶段 0:前置(已完成)¶
- ✅ PR #8(evidence-projection)落地
- ✅ OpenCode replay 验证(产物在
.tmp/message-replay-0730/session.json)
阶段 1:Skill 规则单源化 + 条件加载¶
目标:真正减少进入会话的 Skill 正文,不创建会在正常路径中被重新全量读取的 references。
1.1 当前重复¶
- 主 Skill 与
skill-analysis重复描述 DML / DDL 路由 - 主 Skill 与
optimization-review重复描述四态验收 - 投影消费、分片键缺失、索引作用域、高风险改写等规则在 3–5 处复述
- generation、dml、ddl 含重复 CLI、依赖说明和父流程字段枚举
1.2 改造方案¶
- 主 Skill 实际删减
- 只保留:工作流状态转移、命令骨架、环境/超时/回滚等不可丢失的安全底线
- 删除:长 JSON 示例、字段枚举、重复 CLI、常见错误、子 Skill 已拥有的领域规则
- 目标:
sql-distributed/SKILL.md≤ 5K bytes - 投影成为门禁的唯一事实源
baseline_facts/table_ctx_facts/execute_facts输出当前 case 的blocked_decisions、claim_constraints、known_unknowns- 补充紧凑字段:
routing_hint.skills[]、max_status、recommended_action - Skill 只保留“不得违反投影门禁”,不再复述所有分支条件
- 禁止步骤 7 默认三连加载
必加载:sql-distributed-optimization-generation routing_hint 含 dml → 加载 sql-distributed-dml-rewrite routing_hint 含 ddl → 加载 sql-distributed-ddl-index 未选中的子 Skill 禁止加载 - 路由与验收分别只保留一个权威实现
- 路由优先使用投影
routing_hint;若保留skill-analysis,压到 ≤1.5K,主 Skill 不再复述 - 默认验收使用主流程 +
execute_facts;optimization-review仅用于显式独立审查,不进入默认路径 - 子 Skill 只保留不可机械化的领域策略
- generation ≤ 8K:输出契约、生成阶段安全底线
- dml-rewrite ≤ 3.5K:结构改写启发式
- ddl-index ≤ 6K:索引列序、作用域和冗余判断
- 删除父流程 CLI、依赖表、投影字段枚举和重复硬规则
1.3 Token 收益¶
正常路径注入的 Skill 正文预计从约 67.7K bytes 降到最坏约 24K bytes:
main 5K + route 1.5K + generation 8K + dml 3.5K + ddl 6K
这是正文删除和条件加载产生的收益,不依赖 agent “不要读 references”的自律。
commit:refactor(sql-dis-opt): 规则单源化并按路由加载子技能
验收:
- 主 Skill ≤ 5K bytes;六个 Skill 合计 ≤ 45K bytes
- 步骤 7 禁止默认三连加载,未命中的 dml / ddl 无加载记录
- main 与 review 的验收、main 与 skill-analysis 的路由不再双写
- replay 生成阶段 effective input:both 路由 ≤ 55K,单路由 ≤ 50K
-
scripts/test_evidence_projection.py仍通过
阶段 2:规则匹配预筛 + 来源 SQL 拆分¶
目标:把 pending_rules_1.md(32K)从“全量加载”改为“预筛 + 命中后加载”。
具体逻辑细节待定:本节只锁定方向与边界(拆分规则文件 + 预筛 + 命中后加载正文)。特征抽取字段、匹配算法、索引 schema、脚本拆分方式、漏命中/过召回兜底等均未定稿;实施前另开设计确认,不以本节示例为最终契约。
- 拆分规则文件(目录形态示意,可调整)
skills/rule-match/rules/ ├── _index.json ← 触发特征索引(字段/体量待定) ├── P-001.md ├── ... └── P-012.md - 预筛能力(脚本名、接口、算法待定;下表仅为占位)
- 从原 SQL 提取可匹配特征
- 对照索引返回候选规则 ID
- 未命中时不得全量加载全部 pending 规则正文
- 更新
rule-match/SKILL.md - 先预筛,再只读取命中条目
- 默认禁止加载全部 pending 规则正文
commit(题目可随最终设计微调):
refactor(rule-match): 拆分 pending 规则为单条目文件feat(rule-match): 新增规则特征预筛
验收(硬目标;具体 case 断言待逻辑定稿后补):
- 正常路径不默认全量加载全部 pending 规则正文
- rule-match 阶段 token 明显下降(目标约 ≤3K,以定稿后实测为准)
- 逻辑定稿后补齐:代表性正例/反例回归,覆盖漏命中与过召回策略
阶段 3:工作流集成¶
目标:把投影、条件加载和规则预筛串成可验证的短上下文路径。
- 主流程更新
- 步骤 5.5:预筛后只读命中规则(预筛实现待阶段 2 定稿)
- 步骤 6:读取
routing_hint,未选中的子 Skill 禁止加载 - 步骤 7:generation 必载,dml / ddl 条件加载
- 步骤 4/5/9/10:只消费 stdout facts 与当前 case 的门禁字段
- 新增
scripts/test_short_context_workflow.py - 用
.tmp/token-sim-0730/离线跑完整工作流 - 断言每阶段 stdout 是投影
- 断言无全量规则库读取、无默认三连 Skill 加载
- 统计实际加载文件和累计字节,阻止“搬文件但总输入不变”
commit:feat(sql-dis-opt): 集成短上下文条件加载工作流
阶段 4:端到端验证¶
目标:在 OpenCode replay 模式下跑完整 0730 case,证明峰值进入 50K。
- 切到最新代码,注入
SQLOPT_REPLAY_DIR短路 opencode run跑完整 10 步- 导出 session,统计每轮 effective input
- 对比第 1 期(98K)和第 2 期目标(≤50K)
commit:test(sql-dis-opt): 验证第 2 期短上下文工作流
验收:
- 单轮 effective input 峰值 ≤50K
- 完整 10 步无中断
- 加载记录符合 route:无未选中的 Skill / 规则条目
- 测试数据入仓(
.tmp/phase2-replay-0730/session.json)
非范围¶
- 子技能合并、precheck 并入 execute 等执行语义重构
- 依赖
/compact才能跑完;本期先证明条件加载本身的收益 comparison_mode=full正确性修复- 将创造性 SQL 改写下沉为脚本
三、风险¶
| 风险 | 缓解 |
|---|---|
| 删除重复正文时误删安全底线 | 建立“安全底线唯一归属”清单;回归 env/timeout/rollback/shard-key 场景 |
routing_hint 错选导致漏加载子 Skill |
多信号或不确定时返回 both;为 dml/ddl/both 建 golden cases |
| 预筛漏命中 / 过召回 | 逻辑定稿后补正反例回归;不确定时偏向少读正文而非全量加载 |
| agent 无视 route 继续全量加载 | 主 Skill 明令禁止;测试解析 session 的 Skill/Read 记录 |
| 阶段 1 both 路由仍略高于 50K | 阶段 2 规则预筛叠加后再做最终验收,不用 references 搬运兜底 |
| 全流程仍超 50K | 阶段 4 失败后另议上下文隔离子任务或显式 compact,不在本期静默扩范围 |
七、执行顺序¶
- 人:开 Gitee issue
- 人:PR #8 合入 develop
- Claude:从 develop 创建 phase2 分支
- Claude:阶段 1(规则单源化 + 条件加载)→ commit
- Claude:阶段 2(规则预筛)→ commit
- Claude:阶段 3(工作流集成)→ commit
- Claude:阶段 4(端到端验证)→ commit + 测试数据
- 人:review PR → 合入 develop
- Claude:给 develop 打 tag
short-context-eng-v1