--- name: skill-sandbox-expander description: 沙盘库系统化扩充 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` **验证状态**:🔵 待验证