skill-sandbox-expander

沙盘库系统化扩充 Skill。识别各域沙盘覆盖缺口,建议优先场景(优先级:缺失类型>跨域>边界>变体),严格两阶段生成(Phase 1 禁止读 SKILL.md → Phase 2 对照验证),将 status="draft" 补全为 "validated" 或 "gap-found",持续推进 100 沙盘目标。触发词:「扩充沙盘」「增加沙盘」「写更多沙盘」「沙盘库不够」「填充沙盘覆盖缺口」「把[域名]域的沙盘补到N个」「沙盘数量太少」「补全draft沙盘」「把草稿沙盘补完」「把所有草稿补完」「把draft补成完整版」。

沙盘库系统化扩充(skill-sandbox-expander)

关系类型:depends-on(依赖 DOMAIN-REGISTRY + NODE-IO-CONTRACTS + SANDBOX-FORMAT) 关系类型:triggers(Phase 2 读取各域 SKILL.md;结果被 skill-domain-health-check / skill-domain-self-optimizer 消费) 强绑定 Rule:R2 NO_FABRICATION / R3 READ_FIRST / R6 ARTIFACT_FIRST / R1 EVIDENCE_FIRST


核心设计约束(执行前必须理解)

全量搜索约束(P9? F-021)——与两阶段分离同等优先级

沙盘的目标不只是「入口宽度覆盖」(覆盖不同场景类型),还必须保证「链路深度完整性」:

  • 对每个入口:必须追踪完整的使用链路(一次闭环可能有 N 步,必须走完所有步)
  • 对每个分叉点:基于不同反馈会产生不同分支,所有主要分支都必须被覆盖(可以由多个沙盘共同覆盖一个入口的所有分支)
  • 一个沙盘 = 一个完整链路实例:描述某个入口在某种反馈路径下的完整走法,而不是只描述入口和出口
❌ 不合格的场景规划:「用户触发产品定义 → 产品经理输出产品定义文档」
✅ 合格的场景规划:
   场景A:用户触发产品定义,第一次问答后用户满意 → 关卡A → 关卡B → 开发
   场景B:用户触发产品定义,关卡A 发现设计漏洞 → 用户修改 → 重新过关卡A → 关卡B → 开发
   场景C:用户触发产品定义,关卡B 发现架构问题 → 回到技术架构师 → 修改 → 重过关卡B
   (三个沙盘合并覆盖「产品定义」入口的全量路径)

Step 3(场景建议)的全量搜索要求

  • 每个入口节点,首次覆盖时必须建议 2-3 个沙盘(覆盖主链路 + 主要分叉分支)
  • 已有沙盘的入口,检查现有沙盘是否已覆盖所有主分支,缺失的分支优先级高于全新入口

两阶段分离是本 Skill 最关键的第二约束

  • Phase 1(预想)= 只能读 DOMAIN-REGISTRY + NODE-IO-CONTRACTS + SANDBOX-FORMAT + 已有沙盘 frontmatter(前7行),禁止打开任何 .cursor/skills/*/SKILL.md 文件
  • Phase 2(实际验证)= 才可以读对应 SKILL.md 文件

违反这个约束 = Phase 1 被污染 = 沙盘失去验证价值。

节点→文件路径规则(Phase 2 使用):

  • 标准 Skill:.cursor/skills/[Skill目录名]/SKILL.md(目录名 = DOMAIN-REGISTRY Skill列的值)
  • 若文件不存在 → 记为「❌ 缺失节点」Gap,继续其他节点

执行模式判断(Step 1 开头执行)

IF 被其他 Skill 作为子任务调用(子任务模式):
  → 从调用方传入的参数中读取:域名 + 目标数量 + 模式
  → 参数格式:{ domain: "[域名]", count: [数量], mode: "新增" or "补全draft" }
  → 若 count > 20,自动截断为 20,并在输出中标注「已截断:原参数 count=[原值],上限为20」
  → 跳过所有「询问用户」和「等待用户确认」的交互步骤,直接执行
  → 跳过 auto-experience-hook 的 Step 3 任务日志写入(由主任务统一记录)

ELSE IF 用户意图为「补全已有 draft」(触发词包含「草稿」「draft」「补完」「补全」之一):
  → 直接进入模式:跳过 Step 3-4(Phase 1 生成),直接从 Step 5 开始执行
  → 先询问:「请指定域(产品开发/认知结构/公司运营/内容宣传/Skill体系/全部)」
  → 等用户确认后,Step 5 扫描目标域的所有 status="draft" 沙盘作为处理列表

ELSE(用户直接触发新增沙盘):
  → 执行 Step 1 的交互式询问流程

关于 skill-closure-verifier-meta 的关系澄清: verifier-meta Step 4 有自己的 inline Phase 2 逻辑(快速补全 draft 沙盘),与本 Skill 的 Phase 2 是两套独立实现,各自触发:

  • verifier-meta inline Phase 2:在全量验证运行中快速补全 draft 状态的沙盘
  • 本 Skill Phase 2(完整版):包含 Gap 证据链要求和质量门槛,用于系统化扩充 两套机制不互相调用,不造成覆盖冲突。

激活后立即执行

Step 1  确认扩充范围(直接触发模式执行;子任务模式跳过)
        
        询问用户:
        (1) 「请指定域:产品开发 / 认知结构 / 公司运营 / 内容宣传 / Skill体系 / 全部」
        (2) 「本次新增几个沙盘?(建议 5-10 个,单次不超过 20 个)」
        
        默认值:
        - 未指定域 → 「全部」
        - 未指定数量 → 5 个(全部域模式下:5 个总数,按缺口最大的域分配;单域模式下:5 个给该域)
        
        输出:确认的处理域列表 + 每域目标新增数量

Step 2  读取覆盖状态(R3 READ_FIRST — 建立事实基础再建议)
        
        并行读取:
        A. _内部总控/skill-system-design/DOMAIN-REGISTRY.md
           → 提取每个目标域的入口节点列表
        B. _内部总控/skill-system-design/SANDBOX-FORMAT.md
           → 确认合法 scenario-type 标签列表
        C. 对每个目标域,扫描 sandboxes/[域]/ 目录:
           → 列出所有已有沙盘文件名
           → 读取每个文件的 frontmatter(前7行),提取 scenario-type 字段
             ⚠️ 只读 frontmatter,不读 Phase 1/2 正文(避免提前了解 Skill 实现细节)
           → 统计各 scenario-type 出现次数
           → 找出最大沙盘序号 NNN(每个域独立计算,互不影响)
        
        输出(必须明确输出,不允许跳过):
        
        | 域 | 已有沙盘数 | 覆盖的 scenario-type | 缺失的 scenario-type | 下一序号 |
        |---|---|---|---|---|
        
        失败处理:
        - 若某域 sandboxes/[域]/ 目录不存在 → 标记为「目录缺失,跳过该域」
        - 若 DOMAIN-REGISTRY.md 不存在 → 停止执行,告知「基础文档缺失,无法继续」
        - 若 SANDBOX-FORMAT.md 不存在 → 停止执行,同上

Step 3  建议优先场景(⚠️ 此步骤仍禁止读任何 SKILL.md)
        
        基于 Step 2 覆盖状态报告,为每个目标域建议候选场景。
        
        优先级规则(与 description 字段一致,按以下顺序):
        P1:该域缺失的 scenario-type(完全没有覆盖的类型,效果最显著)
        P1b:已有入口的缺失分支(全量搜索要求:同一入口的不同反馈路径未被覆盖)
             ——分支缺失优先级 = 与 P1 同级,因为入口只有一个沙盘时深度不足
        P2:跨域触发场景(cross-domain),通常现有系统 Gap 密度最高
        P3:边界/异常场景(edge-case),最容易暴露隐藏 Gap
        P4:已有类型的变体场景
            ——变体定义:同一 scenario-type 但不同前置状态或触发时序
            (例:iteration 场景下「文档已有 v1」vs「文档不存在」是两个变体)
        
        ⚠️ 全量搜索检查(每个入口节点执行):
        对每个被建议场景的入口节点,额外输出:
        - 「该入口当前已有 N 个沙盘,覆盖了分支:[列出]」
        - 「该入口尚未覆盖的主要分支:[列出]」
        - 「本次建议覆盖其中哪个分支,以及是否需要同时建议覆盖其他未覆盖分支」
        
        对每个候选场景,输出:
        - 场景名称(简短)
        - 入口节点 ID(与 DOMAIN-REGISTRY 对应)
        - 场景描述(1-2 句话,不包含 Skill 实现细节)——必须包含「在什么反馈条件下走哪个分支」
        - scenario-type 标签
        - 选择理由
        - 与现有沙盘的本质区别(防止重复,必填)
        - 该入口分支覆盖进度(本次新增后:已覆盖N个分支/估计总分支M个)
        
        ⚠️ 强制确认(直接触发模式):
        列完候选场景后,询问用户:
        「以上是建议写的 N 个场景,是否全部采纳,或需要调整?」
        等待用户回复:
        - 「继续」「好的」「可以」「全采纳」→ 全部采纳,直接进入 Step 4
        - 「调整第N个」「去掉第N个」「换一个」→ 按用户意见修改对应场景后,重新输出修改后的完整清单,再次询问确认
        - 用户直接给出新场景描述 → 替换对应场景后,再次询问确认
        
        子任务模式:跳过确认,直接采纳全部候选场景。
        
        若某域所有 scenario-type 均已覆盖:
        → 说明「[域名]标准类型已全覆盖,建议写变体场景(见 P4 定义)」
        → 若仍需在该域新增 → 基于 P4 变体规则建议

Step 4  Phase 1 生成(⚠️ 此步骤禁止读 .cursor/skills/*/SKILL.md)
        
        ┌──────────────────────────────────────────────────────────┐
        │ ⚠️ 关键约束:Step 4 执行期间,禁止打开任何              │
        │   .cursor/skills/*/SKILL.md 文件。                       │
        │   仅允许读取:DOMAIN-REGISTRY / NODE-IO-CONTRACTS /      │
        │   SANDBOX-FORMAT(frontmatter读取已在Step2完成)         │
        │                                                          │
        │ ⚠️ context 污染防护:若 AI context 中已存有              │
        │   SKILL-INDEX 的内容(如被上游调用时读取过),           │
        │   生成 Phase 1 时必须显式声明:                         │
        │   「本预想不参考 SKILL-INDEX 中的 description 内容」    │
        │   Phase 2 完成后,额外检查:Phase 1 中是否有任何        │
        │   与 SKILL-INDEX description 字段字面一致的内容         │
        │                                                          │
        │   污染识别:Phase 1 出现「Step X 里有…」               │
        │   「根据 SKILL.md 的步骤…」或与 SKILL-INDEX            │
        │   description 字段高度一致的描述 = 已被污染            │
        │   处理:删除该文件,回到 Step 3 重选场景后重写          │
        └──────────────────────────────────────────────────────────┘
        
        处理范围:Step 2 确认的「目录存在」的域;跳过「目录缺失」的域。
        
        对每个确认的候选场景,按 Step 3 清单顺序执行(不并行,防止序号冲突):
        
        4.1  从 DOMAIN-REGISTRY.md 读取该场景涉及的节点和触发链路
        4.2  从 NODE-IO-CONTRACTS.md 读取相关节点的 I/O 契约
        4.3  生成 Phase 1 三要素(⚠️ v1.2新增:含用户视角预想和通过判定标准):
             - 预想触发链路(节点序列 + 每步触发条件)
             - 预想终态输出(具体产物 + 文件路径)
             - 自洽检查点(文档一致性要求)
             - 用户视角预想(4维度):
               ① 典型触发场景(用户在什么处境下触发这个Skill)
               ② 用户期望的响应(一句话,不是技术输出)
               ③ 用户最容易误触发的情形(触发词盲区)
               ④ 认知根确认(执行者需要哪个 L1/L1.5 文档)
        4.4  按 SANDBOX-FORMAT.md v1.2 写入沙盘文件:
             - 路径:_内部总控/skill-system-design/sandboxes/[域]/sandbox-[NNN].md
             - NNN = 该域 Step 2 确认的下一序号,每写完一个 +1
             - status = "draft"
             - Phase 1 包含:预想触发链路 + 分支覆盖声明 + 预想终态输出 + 自洽检查点 + 用户视角预想
             - Phase 2 包含以下占位结构(待 Phase 2 执行时填写):
               * 通过判定标准(pre-filled):「validated门槛:所有节点三项均✅且Gap为零」
               * 节点逐一验证表(行填「— (待 Phase 2 执行)」)
               * Gap 发现(含严重程度列:Critical/High/Medium)
               * 接受风险记录(默认「无接受风险项」)
             - 若目标文件已存在(序号冲突)→ NNN 自动 +1 再写
        
        每写完一个告知:「✅ sandbox-[ID] Phase 1 已写入(status: draft)」
        
        失败处理:
        - 入口节点在 DOMAIN-REGISTRY 中不存在 → 跳过该场景,报告「[节点名]未在节点图中找到」

Step 5  Phase 2 验证(⚠️ 此步骤才允许读 SKILL.md)
        
        处理列表确认:
        - 正常路径(Step 4 后执行):处理 Step 4 生成的所有 status="draft" 沙盘
        - 直接进入模式(用户说「把草稿补完」):扫描目标域 sandboxes/[域]/ 目录,
          收集所有 status="draft" 的沙盘文件作为处理列表
        
        对列表中每个沙盘文件,顺序执行:
        
        5.1  读取该沙盘的 Phase 1「预想触发链路」,列出涉及节点
        5.2  读取路径映射(见文档顶部规则):
             - 标准路径:.cursor/skills/[Skill目录名]/SKILL.md
             - 若文件不存在 → 记为 ❌,继续其他节点
        5.3  逐节点验证三项(每项必须有明确判断,不允许全部标 ✅ 而无说明):
             
             A. 触发了吗:
                → 读 Skill description 字段的触发词
                → ✅ 触发词明确匹配场景输入
                → ⚠️ 语义相近但不确定(说明不确定原因)
                → ❌ 触发词不匹配或 Skill 文件不存在
             
             B. 输出了吗:
                → 检查 Skill 激活步骤中是否有「写文件/追加/更新」等明确输出操作
                → ✅ 有明确输出步骤(含路径或格式)
                → ⚠️ 有输出但路径/格式模糊
                → ❌ 无明确输出步骤(或只在对话中回复)
             
             C. 触发下游了吗:
                → 检查 Skill 最后步骤中是否有「触发/调用/建议用户做X」等触发下游的语句
                → ✅ 有明确触发步骤
                → ⚠️ 有「建议」但为可选,非强制
                → ❌ 无任何触发下游步骤(终态节点除外)
        
        5.4  识别 Gap:
             对照 Phase 1 预想链路 vs Phase 2 实际验证,差异处 = Gap 候选
             
             每个 Gap 必须满足:
             - Gap 类型(缺节点 / 缺触发条件 / I-O不匹配 / 文档不自洽 / 边界盲区)
             - 证据引用:「[Skill名].SKILL.md [步骤N/description 字段] 中缺少/未定义[具体内容]」
             - 禁止「可能/也许/感觉」类模糊 Gap(R2 NO_FABRICATION)
        
        5.5  更新沙盘文件:
             - 替换 Phase 2 验证表格中的占位行
             - 填写 Gap 发现部分
             - 更新 status:无 Gap → "validated",有 Gap → "gap-found"
        
        每完成一个告知:「✅ sandbox-[ID] Phase 2 完成,status: [validated/gap-found]」
        
        失败处理:
        - 判断不确定某节点 → 标 ⚠️,备注说明不确定原因
        - 所有节点判断完毕发现「全部 ✅ 无任何 ⚠️/❌」→ 重新审查「触发下游了吗」(这项最常被忽略)

Step 6  输出覆盖缺口更新报告(内联输出,不写文件)
        
        格式:
        
        本次新增:[N] 个沙盘
        - validated(无 Gap):[X] 个
        - gap-found(有 Gap):[Y] 个,共发现 [M] 条 Gap
        
        | 域 | 更新前沙盘数 | 更新后沙盘数 | 新增覆盖的 scenario-type |
        |---|---|---|---|
        
        剩余覆盖缺口:
        [各域仍未覆盖的 scenario-type,距 20/域上限还差几个]
        
        本次发现的 Gap 摘要:
        | sandbox-ID | 节点 | Gap 类型 | 一句话描述 |
        |---|---|---|---|
        
        若本次有 gap-found 沙盘(Y > 0),将 Gap 摘要写入持久化文件:
        路径:_内部总控/skill-system-design/gap-summary-[域名]-YYYYMMDD.md
        格式:同上表,追加写入(文件已存在则追加,不覆盖)
        注:此文件供 skill-domain-self-optimizer 跨会话读取,弥补「内联输出仅当次有效」的限制

注意事项

  • Phase 1 污染的识别:若 Phase 1 中出现任何「Skill 实现步骤」的细节,立即认定为污染,删除重写
  • Phase 2 全 ✅ 预警:若某沙盘的 Phase 2 节点验证表格中 ⚠️/❌ 为零,强制重新检查「C. 触发下游了吗」——这是最常被标为 ✅ 而实际上是 ⚠️ 的一项
  • 序号独立于域:每个域独立计数,产品开发 PD-006 和认知结构 CS-006 互不干扰
  • 文件名格式:文件名为 sandbox-[NNN].md(纯数字,如 sandbox-006.md);沙盘内容 frontmatter 里的 sandbox-id 字段含域前缀(如 PD-006),两者不要混淆
  • 单次 5-10 个原则:超过 10 个时质量不可控,建议分多次执行

与其他 Skill 的关系

Skill关系
skill-closure-verifier-meta独立并行:verifier-meta 有自己的 inline Phase 2(快速版);本 Skill 是完整版 Phase 1+2,两套机制各自独立触发
skill-domain-health-check输出消费:本 Skill 新增的 gap-found 沙盘被 health-check Step 6 汇总
skill-domain-self-optimizer输出消费:本 Skill 的 Gap 摘要是 optimizer 的 Gap 证据库
DOMAIN-REGISTRY.md必须依赖(Phase 1 节点图来源)
NODE-IO-CONTRACTS.md必须依赖(Phase 1 I/O 来源)
SANDBOX-FORMAT.md必须依赖(文件格式规范)
skill-rule-修改规范区别:后者修改已有 Skill 文件,本 Skill 只创建新沙盘文件

常见失败模式

失败模式1:Phase 1 读了 SKILL.md(两阶段污染) → 识别:Phase 1 内容中出现「Step X 里有…」「根据 SKILL.md…」 → 处理:删除沙盘文件,重新执行 Step 4(不返回 Step 3 重选场景)

失败模式2:Phase 2 全 ✅ 无 Gap(走过场) → 识别:节点验证表格中 ⚠️/❌ 为零,且域内已有沙盘有 Gap 记录 → 处理:强制重新验证「C. 触发下游了吗」,通常这里有 ⚠️

失败模式3:沙盘场景雷同(换皮重复) → 识别:Step 3 候选场景没有「与现有沙盘的本质区别」说明 → 处理:Step 3 强制要求每个候选场景填「本质区别」(缺失则不通过)

失败模式4:沙盘 ID 跳号或重复 → 识别:Step 2 没有 Glob 扫描实际文件,用了记忆中的数量 → 处理:Step 2 必须扫描 sandboxes/[域]/ 目录文件列表,从文件名解析最大序号


变更记录

v1.0 — 2026-03-19 — 初始创建(关卡A修复后版本)

根因:沙盘库是全新工件类型,缺乏系统化扩充机制。AI 手动创建时容易违反 Phase 1 不读 SKILL.md 的核心约束,也无法系统识别覆盖缺口。

关卡A修复内容(来自 skill-simulator 🔴 问题):

  • 🔴-1:统一优先级体系为 P1>P2>P3>P4(description 字段 + Step 3 正文一致)
  • 🔴-2:加入「执行模式判断」(直接触发 vs 子任务调用,子任务模式跳过交互确认)
  • 🔴-3:在文档顶部明确「节点→文件路径规则」
  • 🟡-1:Step 2 明确只读 frontmatter 前7行,不读正文
  • 🟡-2:Step 5 开头增加「处理列表确认」(直接进入模式收集 draft 沙盘)
  • 🟡-3:明确「全部域模式下5个为总数,按缺口分配」
  • 🟡-4:在 Step 3 中定义「变体场景」
  • 🟡-5:Step 4 明确「按 Step 3 清单顺序执行」
  • 🔵-1:Step 4 开头明确「处理范围 = Step 2 确认的目录存在域」
  • 🔵-2:Step 2 明确「每个域独立计算序号」
  • 🔵-3:Step 2 明确「只读 frontmatter,避免间接污染」
  • 🔵-4:修正 2.4 依赖声明(SANDBOX-FORMAT 在 Step 2 读,非 Step 1)

验证状态:✅ 三关卡全部通过

v1.0.1 — 2026-03-19 — 关卡B修复(来自 skill-system-destroyer 审查)

关卡B修复内容

  • 🔴 C-1:澄清 verifier-meta 与本 Skill 的关系——两套独立实现,不互相调用,消除「承诺了调用但实际无」的声明矛盾
  • 🔴 C-2:子任务模式加入 count > 20 自动截断逻辑(上限20个)
  • 🟡 W-1:子任务模式跳过 auto-experience-hook 的任务日志(由主任务统一记录,防止日志膨胀)
  • 🟡 W-2:Step 6 Gap 摘要改为「内联 + 写持久化文件 gap-summary-*.md」,支持跨会话读取
  • 🟡 W-3:Phase 1 约束补充「context 污染防护」(SKILL-INDEX description 字段的隐性污染)

v1.0.3 — 2026-03-19 — 加入全量搜索原则(F-021/P9?)

根因:F-021原则(AI时代全量搜索)写入认知体系,当前Skill只关注「场景类型覆盖宽度」,不要求每个入口的完整链路深度和分支覆盖。

修改内容

  • 新增:「全量搜索约束」到「核心设计约束」段首——含示例说明合格vs不合格场景规划
  • 修改:Step 3 优先级规则 → 新增 P1b「已有入口的缺失分支」(与 P1 同级)
  • 新增:Step 3「全量搜索检查」——每个入口节点必须输出分支覆盖进度

验证结果

  • 正向验证:下次触发沙盘建议时,AI对已有入口应输出分支覆盖分析,而不只是建议新类型(待验证)
  • 负向验证:两阶段分离约束、Phase 2 验证逻辑不变

验证状态:🔵 待验证

v1.0.2 — 2026-03-19 — 关卡C修复(来自 verifier 验证)

关卡C修复内容(场景2失败引起必须修复):

  • ❌ 场景2 触发词缺失:在 description frontmatter 中新增「补全draft沙盘」「把草稿沙盘补完」「把所有草稿补完」「把draft补成完整版」
  • ❌ 场景2 直接进入模式未定义为顶层分支:在「执行模式判断」加入第三分支(ELSE IF 用户意图为补全草稿),路由到直接进入 Step 5
  • 🟡 场景1 Step 3 部分调整处理:补充「调整第N个/换一个」的修改后再次确认逻辑
  • 🟡 注意事项序号格式说明:明确区分文件名(纯数字)和 frontmatter sandbox-id(含域前缀)

v1.0.4 — 2026-03-24 — Step 4.3/4.4 加入 SANDBOX-FORMAT v1.2 新字段

根因:SANDBOX-FORMAT.md 升级至 v1.2(2026-03-24 cross-synthesis),新增了4个字段:用户视角预想(Phase 1)、通过判定标准(Phase 2 前置)、Gap严重程度分级(Critical/High/Medium)、接受风险记录。但 skill-sandbox-expander 在 Step 4 生成沙盘时仍使用旧模板,导致新格式规范是「死文档」。

修改内容

  • 修改:Step 4.3「生成 Phase 1 三要素」→ 新增「用户视角预想」(4维度)为第4个要素
  • 修改:Step 4.4「写入沙盘文件」→ 明确 Phase 1 包含用户视角预想;Phase 2 占位结构加入通过判定标准、Gap严重程度列、接受风险记录

备份路径history/SKILL_v1.0.3_20260324_before_v12fields.md

验证状态:🔵 待验证