From c3818bffaf717f147f27f9e377316515e5723030 Mon Sep 17 00:00:00 2001 From: "Shin@HOME" Date: Sun, 3 May 2026 22:18:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8A=80=E8=83=BD=E8=87=AA?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .opencode/canonical-manifest.json | 5 +- .opencode/data/changelog/changelog-full.md | 23 -- .../data/changelog/changelog-headlines.md | 1 - .opencode/data/changelog/changelog-recent.md | 8 +- .opencode/phase/current.json | 3 +- .../skills/epee-orchestrator/registry.md | 8 + .opencode/skills/game-design/SKILL.md | 4 +- .opencode/skills/skill-tester/SKILL.md | 206 ++++++++++++++++++ .opencode/skills/skill-tester/judge-prompt.md | 87 ++++++++ .../skill-tester/test-cases/dev-changelog.md | 102 +++++++++ .../skill-tester/test-cases/game-design.md | 148 +++++++++++++ .../skill-tester/test-cases/phase-guard.md | 119 ++++++++++ .../skill-tester/test-cases/qa-quality.md | 79 +++++++ 13 files changed, 756 insertions(+), 37 deletions(-) create mode 100644 .opencode/skills/skill-tester/SKILL.md create mode 100644 .opencode/skills/skill-tester/judge-prompt.md create mode 100644 .opencode/skills/skill-tester/test-cases/dev-changelog.md create mode 100644 .opencode/skills/skill-tester/test-cases/game-design.md create mode 100644 .opencode/skills/skill-tester/test-cases/phase-guard.md create mode 100644 .opencode/skills/skill-tester/test-cases/qa-quality.md diff --git a/.opencode/canonical-manifest.json b/.opencode/canonical-manifest.json index 47bb3f1..890ea36 100644 --- a/.opencode/canonical-manifest.json +++ b/.opencode/canonical-manifest.json @@ -20,7 +20,8 @@ ".opencode/skills/problem-distillery/", ".opencode/skills/profile-memory/", ".opencode/skills/spec-docs/", - ".opencode/skills/game-design/" + ".opencode/skills/game-design/", + ".opencode/skills/skill-tester/" ], "template_data_files": [ ".opencode/data/changelog/changelog-full.md", @@ -49,7 +50,7 @@ "cleanup_delete_patterns": [ { "pattern": ".opencode/*.log", "note": "调试日志" }, { "pattern": ".opencode/_init-backup/", "note": "上一轮冲突备份残留" }, - { "pattern": ".opencode/_gitignore-preview", "note": "阶段 5.5 临时预览文件" } + { "pattern": ".opencode/skills/skill-tester/reports/*.md", "note": "测试报告(运行时产物)" } ], "sentinel": ".opencode/.init-done" } diff --git a/.opencode/data/changelog/changelog-full.md b/.opencode/data/changelog/changelog-full.md index 3b2afa3..74f4796 100644 --- a/.opencode/data/changelog/changelog-full.md +++ b/.opencode/data/changelog/changelog-full.md @@ -4,27 +4,4 @@ ## 记录 -### [CL-20260503-2105] 2026-05-03 21:05 — 实现游戏设计全流程辅助系统(阶段注入 + game-design Skill) -- **tags**: phase-system, game-design, skill-creation, architecture, infra -- **affected_files**: - - AGENTS.md - - .opencode/skills/(9个 SKILL.md,含新增 game-design 与 8个现有修改) - - .opencode/skills/game-design/templates/(5个新增模板文件) - - .opencode/skills/game-design/prompts/(2个新增 sub-agent 提示文件) - - .opencode/phase/(current.json + 7个设计阶段数据文件,新增) - - .opencode/skills/epee-orchestrator/registry.md - - .opencode/canonical-manifest.json -- **what**: 实现基于阶段(phase)的项目工作流系统 + game-design Skill。AGENTS.md 新增"阶段检查"块作为启动序列最高优先级;8 个现有 Skill 追加 `phases: ["all"]`;新增 game-design Skill(`phases: ["design"]`)实现创意概念→参考分析→多轮问答→设计大纲全链路。 -- **why**: Skill 增多导致上下文膨胀;设计阶段缺少结构化工具。阶段机制按需注入,game-design Skill 将非结构化的游戏设计讨论编码为可追踪、可恢复的结构化工作流。 -- **decisions**: - - 阶段隔离采用"Skill 入口守卫"模式(每个 SKILL.md 加载后首个动作验证 phase),配合"立即+下次"双重切换机制 - - Hallucination 三级防御:置信度标注(确认/推断/推测)+ 来源 URL 锚定 + 局限性声明 - - 五维一致性审查作为步骤 4→5 强制停留点 - - 不可逆决策三级标记(🔴不可逆/🟠高成本回退/🟢可回退)+ 强制确认 - - 问答质量预防+反馈双循环 - - 状态管理事务化(in_progress 标记 + checkpoint 恢复) - - SKILL.md 主干分支分离(主文件 ~110 行 + 7 个独立模板按需加载) - - Devil's Advocate 语气约束("挑战前提"非"质疑") -- **notes**: game-design 仅 design 阶段可加载;跨会话恢复依赖 state.json;设计大纲在开发阶段自动注入;qa-quality-report 项目本地存储;canonical-manifest.json 新增 template_phase_files 分组 - diff --git a/.opencode/data/changelog/changelog-headlines.md b/.opencode/data/changelog/changelog-headlines.md index fe76dec..db2c893 100644 --- a/.opencode/data/changelog/changelog-headlines.md +++ b/.opencode/data/changelog/changelog-headlines.md @@ -2,5 +2,4 @@ 最近 ~50 次改动的一句话概要,按时间倒序排列。每次会话自动注入上下文。 -- [CL-20260503-2105] 实现阶段注入系统与 game-design Skill:新增 phase 机制区分设计/开发阶段,实现五步游戏设计全流程辅助(参考分析→多轮问答→一致性审查→设计大纲),含 Hallucination 三级防御与事务化状态管理 diff --git a/.opencode/data/changelog/changelog-recent.md b/.opencode/data/changelog/changelog-recent.md index a1fa911..a8b4c2f 100644 --- a/.opencode/data/changelog/changelog-recent.md +++ b/.opencode/data/changelog/changelog-recent.md @@ -3,10 +3,4 @@ 最近 ~10 次改动的摘要记录,按时间倒序排列。 当 Agent 检测到当前任务与近期改动相关时自动读取。 -### [CL-20260503-2105] 2026-05-03 — 实现游戏设计全流程辅助系统(阶段注入 + game-design Skill) -- **tags**: phase-system, game-design, skill-creation, architecture -- **affected_files**: AGENTS.md, 9个 SKILL.md(修改8个+新增1个), 7个模板/提示文件, phase/ 目录结构, registry.md, canonical-manifest.json -- **summary**: - 新增阶段(phase)系统:通过 current.json 控制项目处于设计/开发/QA/量化阶段,AGENTS.md 启动时读取并约束 Skill 加载。8 个现有 Skill 标记 phases: ["all"],新增 game-design Skill 标记 phases: ["design"]。 - game-design Skill 实现五步游戏设计工作流:参考游戏发现→并行 sub-agent 反拆 GDD+社群分析→Devil's Advocate 前提挑战→3轮×5题初步问答→3+轮深度问答→输出含 VISTA 框架的设计大纲。 - 内建 Hallucination 三级防御、五维一致性审查、不可逆决策标记、问答质量双循环、事务化状态管理。 + diff --git a/.opencode/phase/current.json b/.opencode/phase/current.json index 809eb74..dfe4c0d 100644 --- a/.opencode/phase/current.json +++ b/.opencode/phase/current.json @@ -1,6 +1,5 @@ { "phase": "design", - "switched_at": "2026-05-03T20:57:00+08:00", - "switched_by": "init", + "switched_at": null, "previous_phase": null } diff --git a/.opencode/skills/epee-orchestrator/registry.md b/.opencode/skills/epee-orchestrator/registry.md index c0d897a..8c1259e 100644 --- a/.opencode/skills/epee-orchestrator/registry.md +++ b/.opencode/skills/epee-orchestrator/registry.md @@ -84,3 +84,11 @@ - **输出**: `.opencode/phase/data/design/` 下的 state.json、concept.md、reference-analysis/*.md、qa-initial/*.md、qa-deep/*.md、design-outline.md、qa-quality-report.md - **路径**: .opencode/skills/game-design/SKILL.md - **备注**: 仅 `phases: ["design"]`;内建 Hallucination 三级防御(置信度标注+来源锚定+局限性声明)、一致性审查(5 维度矛盾检测)、不可逆决策标记、问答质量预防+反馈双循环、事务化状态管理;支持跨会话恢复 + +### skill-tester +- **类型**: 基础设施 +- **能力**: SKILL 体系自动化回归测试工具 — 基于 LLM-as-Judge 模式模拟 Agent 行为并评分,验证 Skill 的阶段守卫、规则遵循、输出格式等维度,支持单 Skill 测试和全量回归 +- **触发场景**: "测试Skill"、"测试 [Skill名]"、"回归测试"、"skill test"、"跑测试"、"测试覆盖率" +- **输出**: skill-tester/reports/ 下的测试报告、每个用例的评分 JSON +- **路径**: .opencode/skills/skill-tester/SKILL.md +- **备注**: `phases: ["all"]`;测试分两层——Layer 1 静态文件合规检查(未来实现)、Layer 2 LLM-as-Judge 行为测试(本 Skill 实现);不测试 opencode 的 Skill 加载机制本身,仅测试 SKILL.md 中的指令逻辑 diff --git a/.opencode/skills/game-design/SKILL.md b/.opencode/skills/game-design/SKILL.md index 161b050..50d747f 100644 --- a/.opencode/skills/game-design/SKILL.md +++ b/.opencode/skills/game-design/SKILL.md @@ -10,10 +10,10 @@ description: >- **本 Skill 加载后的首个强制动作:** 1. 读取 `.opencode/phase/current.json` -2. 若 `phase` 值不在本 Skill 的 `phases` 列表中: +2. 若 `phases` 不包含 `"all"` 且当前 `phase` 值不在 `phases` 列表中: - 立即中止,输出:"当前阶段为 [phase],game-design Skill 不可用。请切换到设计阶段。" - 不得执行本 Skill 的任何后续流程 -3. 若 `phase` 匹配:继续执行 +3. 否则:继续执行 --- diff --git a/.opencode/skills/skill-tester/SKILL.md b/.opencode/skills/skill-tester/SKILL.md new file mode 100644 index 0000000..68ae8af --- /dev/null +++ b/.opencode/skills/skill-tester/SKILL.md @@ -0,0 +1,206 @@ +--- +name: skill-tester +phases: ["all"] +description: >- + SKILL 体系自动化测试工具。通过 LLM-as-Judge 模式对 SKILL.md 的行为逻辑进行回归测试, + 验证阶段守卫、规则遵循、输出格式等维度。触发关键词:"测试Skill"、"测试 [skill名]"、 + "回归测试"、"skill test"、"跑测试"。 +--- + +# 相位守卫(Phase Guard) + +**本 Skill 加载后的首个强制动作:** +1. 读取 `.opencode/phase/current.json` +2. 若 `phases` 不包含 `"all"` 且当前 `phase` 值不在 `phases` 列表中: + - 立即中止,输出:"当前阶段为 [phase],skill-tester Skill 不可用。" + - 不得执行本 Skill 的任何后续流程 +3. 否则:继续执行 + +--- + +# 概述 + +skill-tester 是元层测试工具,通过 LLM-as-Judge 模式验证 SKILL.md 的行为逻辑。 +**核心原理**:将 SKILL.md 内容 + 模拟用户输入注入 sub-agent,观察其输出是否符合预期, +再用另一个 sub-agent 作为裁判评分。 + +**不测试什么**:opencode 的 Skill 加载机制本身(那是 opencode 的责任)。 +**测试什么**:SKILL.md 中的指令逻辑——当 LLM 忠实执行这些指令时,产生正确的行为。 + +--- + +# 操作 A:测试单个 Skill + +## 触发 + +用户说"测试 [Skill 名称]"、如 "测试 game-design"、"测试 dev-changelog"。 + +## 流程 + +``` +1. 读取目标 Skill 的 SKILL.md +2. 读取 .opencode/skills/skill-tester/test-cases/ 下匹配该 Skill 的测试用例 +3. 列出测试用例清单,询问用户确认 +4. 用户确认后,逐一执行 +5. 汇总报告 +``` + +## 步骤 3:测试用例预览 + +``` +Agent 输出: +"找到 [N] 个针对 [Skill名] 的测试用例: + +| # | ID | 场景 | 严重度 | +|---|-----|------|--------| +| 1 | phase-guard-001 | 非匹配阶段拒绝加载 | critical | +| 2 | ... | ... | ... | + +预计消耗约 [估算token] tokens。是否全部执行?(y/n/选择特定用例)" +``` + +## 步骤 4:单用例执行 + +### 4.1 构造模拟 Sub-agent + +将以下内容组装为一个 prompt,通过 Task tool(sub-agent type = general)执行: + +``` +你正在模拟一个 opencode agent,该 agent 刚刚加载了以下 Skill: + +--- +[目标 SKILL.md 的完整内容] +--- + +**当前会话上下文:** +- 当前阶段 (phase):[test_case.phase] +- 用户消息:"[test_case.user_message]" +- state.json 状态:[test_case.state](如适用) + +**你的任务**:严格按照上述 Skill 中的指令行事。 +你拥有所有 opencode agent 的工具(bash/read/write/edit/...)。 + +用户说了:"[test_case.user_message]" + +请输出你的响应。只输出你作为 agent 会输出的内容。 +注意: +- 如果是 phase guard 测试,第一个行为应该是检查阶段并可能中止 +- 如果 Skill 要求写文件,输出你打算写什么以及写到哪个文件(但不要实际写) +- 如果 Skill 有强制规则(如 Hallucination 防御),务必遵守 +``` + +### 4.2 执行并收集输出 + +``` +Agent 调用 Task tool → 等待 sub-agent 完成 → 收集其文本输出 +``` + +### 4.3 Judge 评估 + +将模拟 sub-agent 的输出 + 预期行为 + 评分标准传给 Judge sub-agent。 + +Judge 的详细指令见 [judge-prompt.md](judge-prompt.md)。 + +调用方式: +``` +Agent 调用 Task tool,prompt 为 judge-prompt.md 的内容(已填充变量)→ 等待完成 +``` + +### 4.4 记录结果 + +```json +{ + "test_id": "phase-guard-001", + "skill": "game-design", + "timestamp": "...", + "scores": { + "behavior_match": 5, + "output_clarity": 4, + "rule_compliance": 5 + }, + "overall": 4.7, + "judge_feedback": "Agent 正确识别了阶段不匹配..." +} +``` + +## 步骤 5:汇总报告 + +``` +Agent 输出(Markdown): + +## 测试报告:[Skill 名称] + +**执行时间**:[timestamp] +**测试用例数**:[total] | 通过:[pass] | 失败:[fail] | 跳过:[skip] + +| # | ID | 场景 | 行为 | 清晰度 | 合规 | 总分 | 状态 | +|---|-----|------|------|--------|------|------|------| +| 1 | phase-guard-001 | 阶段拒绝 | 5 | 4 | 5 | 4.7 | ✅ | +| 2 | ... | ... | ... | ... | ... | ... | ❌ | + +### 失败用例详情 +#### [ID] — [场景] +- **预期**:[expected 描述] +- **实际**:[agent 实际输出摘要] +- **裁判反馈**:[judge 的具体反馈] +- **建议**:[改进建议] +``` + +--- + +# 操作 B:回归测试(全部 Skill) + +## 触发 + +用户说"回归测试"、"跑全部测试"、"test all skills"。 + +## 流程 + +``` +1. 读取 test-cases/ 下所有测试用例 +2. 按 Skill 分组展示 +3. 询问用户确认(因为消耗较大) +4. 按 Skill 逐一执行(每个 Skill 内部用例并行执行) +5. 汇总全部报告 +``` + +## 执行策略 + +- 同一 Skill 内的多个用例可以**并行执行**(无状态依赖) +- 不同 Skill 之间**顺序执行**(避免混淆) +- 单个用例超时 60 秒 +- 如有用例执行失败(sub-agent 错误),标记为 ERROR 而非 FAIL + +--- + +# 操作 C:查看历史报告 + +## 触发 + +用户说"查看测试报告"、"上次测试结果"。 + +## 流程 + +读取 `.opencode/skills/skill-tester/reports/` 下最新报告,展示摘要。 + +--- + +# 评分标准说明 + +每个测试用例在 3 个维度上评分(1-5): + +| 维度 | 含义 | 5 分标准 | +|------|------|---------| +| **行为匹配 (behavior_match)** | Agent 的输出行为是否符合预期 | 核心决策(如加载/拒绝加载)完全正确 | +| **输出清晰度 (output_clarity)** | 输出是否清晰、无歧义 | 信息完整、结构清楚、用户可直接理解 | +| **规则合规 (rule_compliance)** | 是否遵守了 SKILL.md 中的强制规则 | 所有强制检查点均已执行 | + +**通过标准**:总分 >= 4.0(即平均每维度 >= 4.0)。 +**警告标准**:3.0 <= 总分 < 4.0。 +**失败标准**:总分 < 3.0。 + +--- + +# 自迭代日志 + +本节记录使用本 Skill 过程中发现的必要检查项。 diff --git a/.opencode/skills/skill-tester/judge-prompt.md b/.opencode/skills/skill-tester/judge-prompt.md new file mode 100644 index 0000000..a253cc1 --- /dev/null +++ b/.opencode/skills/skill-tester/judge-prompt.md @@ -0,0 +1,87 @@ +# Judge 评估提示模板 + +你是一个 SKILL 行为评估裁判(Skill Behavior Judge)。你的任务是评估一个 opencode agent +在特定场景下的输出是否达到了预期行为标准。 + +## 评估输入 + +### 场景背景 +- **被测 Skill**:[skill_name] +- **测试场景**:[scenario_description] +- **当前阶段 (phase)**:[phase] + +### 用户消息 +``` +[user_message] +``` + +### 预期行为 +[expected_behavior] + +### Agent 实际输出 +``` +[agent_output] +``` + +--- + +## 评估规则 + +### 你必须逐项评分(1-5 分) + +#### 维度 1:行为匹配 (behavior_match) +Agent 的核心行为决策是否符合预期? +- 5:核心决策完全正确,无任何偏差 +- 4:核心决策正确,但有 1 处不影响结果的偏差 +- 3:核心决策部分正确,但有 1 处需要注意的偏差 +- 2:核心决策错误 +- 1:完全不符合预期 + +#### 维度 2:输出清晰度 (output_clarity) +Agent 的输出是否清晰、准确、无歧义? +- 5:信息完整、语气恰当、用户可直接理解 +- 4:信息完整,但表达略有冗余 +- 3:信息基本完整,但有关键细节不清晰 +- 2:信息缺失或容易引起误解 +- 1:输出混乱、无法理解 + +#### 维度 3:规则合规 (rule_compliance) +(仅当被测 Skill 有强制规则时使用。如果没有,此项与行为匹配合并评分。) +Agent 是否遵守了 SKILL.md 中的强制规则? +- 5:所有强制检查点均已正确执行 +- 4:主要规则遵守,但跳过了一个非关键检查 +- 3:遵守了部分规则,漏掉了关键检查 +- 2:大部分规则被忽略 +- 1:完全无视规则 + +--- + +## 输出格式 + +你必须严格按照以下格式输出评估结果: + +```json +{ + "scores": { + "behavior_match": <1-5>, + "output_clarity": <1-5>, + "rule_compliance": <1-5> + }, + "overall": <1-5 的平均值,保留 1 位小数>, + "passed": , + "specific_findings": { + "matched": ["<具体符合预期的地方>", "..."], + "missed": ["<未达到预期的具体问题>", "..."], + "surprising": ["<意料之外但可能是好的行为>", "..."] + }, + "improvement_suggestions": "<如果未通过,给出具体的改进建议;如果通过,留空字符串>", + "confidence": "" +} +``` + +## 重要提醒 + +1. **客观评分**:你评估的是 Agent 输出与预期行为的匹配度,不是输出本身的"质量" +2. **关注关键行为**:对核心决策点(加载/拒绝、中止/继续)的评估权重大于措辞细节 +3. **允许合理的上下文适应**:如果 Agent 输出与预期有差异但是是因为模拟场景缺失真实上下文,不算偏差 +4. **标注低置信度**:如果某个判断你不太确定,在 confidence 中标注并在 specific_findings 中说明原因 diff --git a/.opencode/skills/skill-tester/test-cases/dev-changelog.md b/.opencode/skills/skill-tester/test-cases/dev-changelog.md new file mode 100644 index 0000000..01c2207 --- /dev/null +++ b/.opencode/skills/skill-tester/test-cases/dev-changelog.md @@ -0,0 +1,102 @@ +--- +id: changelog-001 +skill: dev-changelog +severity: high +--- + +# 场景 +代码改动后,Agent 自动写入三层开发日志。 + +## 模拟参数 +- **phase**: "development" +- **user_message**: (无用户消息,这是被动触发场景。假设 Agent 刚完成代码改动。) + +## 上下文 +``` +你是一个 opencode agent。你刚完成了一次代码改动(修改了 src/main.py,添加了一个新函数)。 +按照 dev-changelog Skill 的规则,你需要自动写入三层开发日志。 + +dev-changelog Skill 要求: +1. 生成锚点 ID (CL-YYYYMMDD-HHMM) +2. 写入 L1 (changelog-full.md)、L2 (changelog-recent.md)、L3 (changelog-headlines.md) +3. L1 包含 tags, affected_files, what, why, decisions, notes 字段 +4. L2 包含 tags, affected_files, summary 字段 +5. L3 是一句话概要(不超过 80 字) +6. 在回复末尾附 "- [已记录到开发日志]" + +请模拟你想要写入三层日志的具体内容。输出格式为: + +### L1 条目 +[你打算写入 L1 的完整内容] + +### L2 条目 +[你打算写入 L2 的完整内容] + +### L3 条目 +[你打算写入 L3 的完整内容] + +结束语:[你的回复结尾] +``` + +## 预期行为 + +### L1 条目 +- 包含 tags 字段 +- 包含 affected_files 字段(含具体文件路径) +- 包含 what 字段(做了什么) +- 包含 why 字段(为什么这样做) +- 包含 decisions 字段(关键决策) +- 包含 notes 字段(注意事项) + +### L2 条目 +- 包含 tags 字段 +- 包含 affected_files 字段 +- 包含 summary 字段(3-5 行摘要) + +### L3 条目 +- 以 `- [CL-` 开头 +- 一句话概要,不超过 80 字 +- 包含锚点 ID + +### 结束语 +- 包含"- [已记录到开发日志]" + +## Judge 备注 +- 重点检查 L3 的字数约束(不超过 80 字) +- 重点检查结束语是否包含"- [已记录到开发日志]" +- 重点检查 L1 是否包含所有必需字段 + +--- + +--- +id: changelog-002 +skill: dev-changelog +severity: medium +--- + +# 场景 +三层日志的滚动窗口维护——写入后 L3 超过 50 条时移除最旧条目。 + +## 模拟参数 +- **phase**: "development" + +## 上下文 +``` +你正在执行 dev-changelog Skill 的操作 A(记录写入)。 +当前 L3 (changelog-headlines.md) 已经有 50 条记录,马上就要超过 50 条上限。 + +按照 dev-changelog Skill 的 L3 滚动窗口维护规则: +"写入新条目后,检查总行数:> 50 条:移除文件底部(最旧的)条目,直到恰好 50 条" + +请描述你在写入 L3 后会做什么操作。 +``` + +## 预期行为 +1. 在写入新条目后检查 L3 条目数 +2. 发现超过 50 条 +3. 描述"从文件底部移除最旧的条目" +4. 不会说"从顶部移除"或"随机移除" + +## Judge 备注 +- 核心判断:是否理解"底部 = 最旧" +- 次要件:是否主动执行了"数清条目"这个步骤 diff --git a/.opencode/skills/skill-tester/test-cases/game-design.md b/.opencode/skills/skill-tester/test-cases/game-design.md new file mode 100644 index 0000000..ec7f67c --- /dev/null +++ b/.opencode/skills/skill-tester/test-cases/game-design.md @@ -0,0 +1,148 @@ +--- +id: gamedesign-001 +skill: game-design +severity: critical +--- + +# 场景 +步骤 4 初步问答中,Agent 生成的问题必须通过非引导性检查。 + +## 模拟参数 +- **phase**: "design" +- **user_message**: (无用户消息,这是被动规则遵循测试) + +## 上下文 +``` +你是一个 opencode agent,正在执行 game-design Skill 的步骤 4(初步问答)。 +你即将生成第一轮的 5 个问题。 + +按照 game-design Skill 的规则 6(问题质量约束),所有问题必须满足: +1. 非引导性:不暗示"正确答案" +2. 选项完备性:无法覆盖时须含"自定义回答"选项 +3. 可回答性:用户不需要专业知识就能回答 +4. 来源标注:问题基于步骤 3 的哪条分析?置信度如何? + +并且每道题末尾固定包含: +- "我还没想好" +- "这个问题不好" +- "没有我要的回答(请自定义)" + +假设步骤 3 的调研已经完成。参考游戏是 Slay the Spire。 +用户概念是:roguelike 卡牌游戏,偏向策略深度。 + +请生成第一轮的 5 个问题(第一轮方向:核心体验与差异化)。 +每道题输出格式: +Q[编号]: [问题原文] +选项: +- A. [选项] +- B. [选项] +... +- [固定尾部选项] +来源: [步骤3分析来源] [置信度] +``` + +## 预期行为 + +### 每个问题必须满足 +1. 末尾固定包含三个选项:"我还没想好"、"这个问题不好"、"没有我要的回答(请自定义)" +2. 每个问题标注来源(来源:步骤3/GDD逆向/社群分析/... [置信度]) +3. 问题文本中不包含引导性表述("你是否也认同xxx?" = 不合格) + +### 引导性表述检测示例 +- ❌ "你是否也认为高难度是核心体验?"(暗示倾向) +- ❌ "既然参考游戏是回合制,你的游戏应该也是回合制对吧?"(基于参考暗示) +- ✅ "你对游戏难度的偏好是?"(中性) +- ✅ "战斗系统的实时性你倾向于?"(中性) + +## Judge 备注 +- 核心判断:所有 5 道题是否都包含了三个固定尾部选项 +- 次要判断:是否存在引导性表述 +- 关键判断:是否标注了每道题的来源 + +--- + +--- +id: gamedesign-002 +skill: game-design +severity: critical +--- + +# 场景 +Hallucination 防御——基于 [推测] 的问题必须转为确认性提问。 + +## 模拟参数 +- **phase**: "design" + +## 上下文 +``` +你是一个 opencode agent,正在执行 game-design Skill 的步骤 4(初步问答)。 + +你有一条步骤 3 的 GDD 逆向分析结论: +[推测] Slay the Spire 的卡牌掉落概率可能使用了伪随机分布(PRD), +这使得玩家不会连续多回合拿不到好牌。这是 Agent 的推测,未找到设计文档佐证。 + +按照 game-design Skill 的规则 1.4(置信度驱动的提问降级): +"基于 [推测] → 不得直接用于提问,必须先转为确认性问题" + +注意:你不能直接把这条 [推测] 作为问题前提来提问(比如"你喜欢 PRD 机制吗?")。 +你必须把它转为确认性问题(比如"有分析认为参考游戏可能使用了 PRD 机制来控制卡牌掉落体验, +你对这个机制的看法是?")。 + +请生成一个关于卡牌掉落/随机性的问题。 +``` + +## 预期行为 +1. 问题中没有把 [推测] 当作事实来假设 +2. 问题中明确标注了"这是推测"或"有分析认为可能" +3. 问题以确认/询问态度呈现,而非以既定事实呈现 + +## Judge 备注 +- 核心判断:Agent 是否识别到 [推测] 标签并降级提问方式 +- 关键检查:问题中不能出现"既然参考游戏用了 PRD"这类将推测当事实的表述 + +--- + +--- +id: gamedesign-003 +skill: game-design +severity: high +--- + +# 场景 +一致性审查——Agent 需要在步骤 4 完成后识别用户回答中的逻辑矛盾。 + +## 模拟参数 +- **phase**: "design" + +## 上下文 +``` +你是一个 opencode agent,正在执行 game-design Skill 的一致性审查(步骤 4→5 之间的强制停留点)。 + +以下是步骤 4 中用户的两个回答: + +回答 A(步骤 4 第 1 轮 Q2 — 关于难度偏好): +用户选择了"高难度,类似于魂系游戏的挑战感" + +回答 B(步骤 4 第 2 轮 Q1 — 关于目标受众): +用户选择了"轻度玩家,希望上手门槛低" + +按照 game-design Skill 的规则 2(一致性审查),你需要检测 5 个维度: +- 逻辑矛盾:回答 A 蕴含 C,回答 B 蕴含非 C +- 语义冲突:不同回答对同一概念给出不一致的值 +- 隐性依赖:回答依赖了未被确认的前提 +- 模糊逃避:用户 2+ 次回避同一方向 +- 边界缺失:给出了范围但未界定边界条件 + +请分析上述两个回答,输出一致性审查结论。 +``` + +## 预期行为 +1. Agent 应识别出"高难度"与"轻度玩家"之间的逻辑矛盾 +2. 在审查报告中标注为"硬矛盾" +3. 建议用户在进入步骤 5 之前对此进行确认 +4. 列出涉及的回答(步骤4 第1轮 Q2、步骤4 第2轮 Q1) + +## Judge 备注 +- 核心判断:是否识别出了逻辑矛盾 +- 次要判断:是否给出了合理的确认建议 +- 关键检查:矛盾类型标注是否准确(应为"逻辑矛盾"而非"语义冲突") diff --git a/.opencode/skills/skill-tester/test-cases/phase-guard.md b/.opencode/skills/skill-tester/test-cases/phase-guard.md new file mode 100644 index 0000000..3a818f6 --- /dev/null +++ b/.opencode/skills/skill-tester/test-cases/phase-guard.md @@ -0,0 +1,119 @@ +--- +id: phase-guard-001 +skill: game-design +severity: critical + +test_id: phase-guard-001 +skill: game-design +scenario: 用户在 development 阶段尝试触发 game-design Skill +--- + +# 场景 +用户在 development 阶段说"帮我设计一个卡牌游戏",此时应该触发 game-design 的相位守卫, +Agent 应拒绝加载该 Skill。 + +## 模拟参数 +- **phase**: "development" +- **user_message**: "帮我设计一个卡牌游戏" + +## 预期行为 +1. Agent 应检查 current.json 的 phase 值 +2. 发现 phase = "development",而 game-design 的 phases = ["design"] +3. 立即中止,不执行 game-design 的任何后续流程 +4. 输出应包含以下关键信息: + - 当前阶段为 development + - game-design Skill 不可用 + - 建议切换到设计阶段 + +## 预期输出关键词 +- "当前阶段" 或 "development" +- "不可用" 或 "不支持" 或 "无法加载" +- "切换到" 或 "设计阶段" + +## 不应出现的行为 +- 开始进行游戏设计问答 +- 询问参考游戏 +- 加载任何设计相关模板 +- 创建 state.json 或设计阶段数据文件 + +## Judge 备注 +- 这是相位守卫的否定场景测试(应拒绝加载) +- 行为匹配的核心:Agent 是否拒绝执行游戏设计工作流 +- 关键决策点:Agent 输出中是否包含了中止信号 + +--- + +--- +id: phase-guard-002 +skill: game-design +severity: critical + +test_id: phase-guard-002 +skill: game-design +scenario: 用户在 design 阶段正常触发 game-design Skill +--- + +# 场景 +用户在 design 阶段说"我想做一个 roguelike 卡牌游戏",此时应该正常加载 game-design Skill +并开始工作流。 + +## 模拟参数 +- **phase**: "design" +- **user_message**: "我想做一个融合了杀戮尖塔和炉石传说的 roguelike 卡牌游戏" + +## 预期行为 +1. Agent 应检查 current.json 的 phase 值 +2. 发现 phase = "design",game-design 的 phases = ["design"],匹配通过 +3. 开始执行 game-design 工作流: + - 读取 state.json + - 进入 SEEKING_REFERENCE 或直接进入 ANALYZING_REFERENCE(因为提到了明确参考游戏) +4. 输出应包含游戏设计相关的引导 + +## 预期输出特征 +- 不应出现"不可用"、"不支持"等拒绝信息 +- 应出现游戏设计相关引导: + - 询问更多细节 或 + - 确认参考游戏并开始分析 或 + - 开始游戏设计工作流 + +## 不应出现的行为 +- 拒绝加载 +- 提示切换阶段 +- 完全忽略用户的游戏设计请求 + +## Judge 备注 +- 这是相位守卫的肯定场景测试(应允许加载) +- 核心判断:Agent 是否开始执行游戏设计工作流而非拒绝 +- 不需要验证完整工作流,只需确认"准入"环节通过 + +--- + +--- +id: phase-guard-003 +skill: dev-changelog +severity: high + +test_id: phase-guard-003 +skill: dev-changelog +scenario: dev-changelog 在 design 阶段也应可用(phases: ["all"]) +--- + +# 场景 +dev-changelog 的 phases 是 ["all"],在 design 阶段应正常可用。 + +## 模拟参数 +- **phase**: "design" +- **user_message**: "帮我记录一下最近改了什么" + +## 预期行为 +1. Agent 应检查 phases,发现 ["all"] 匹配任何阶段 +2. 正常加载 dev-changelog Skill +3. 执行开发日志相关操作 + +## 预期输出特征 +- 不出现阶段不匹配的拒绝信息 +- 出现开发日志相关的操作(读取 changelog 文件 或 提示写入日志) + +## Judge 备注 +- 验证 phases: ["all"] 的正确性 +- 核心判断:基础设施 Skill 在所有阶段都应可用 diff --git a/.opencode/skills/skill-tester/test-cases/qa-quality.md b/.opencode/skills/skill-tester/test-cases/qa-quality.md new file mode 100644 index 0000000..ad8d756 --- /dev/null +++ b/.opencode/skills/skill-tester/test-cases/qa-quality.md @@ -0,0 +1,79 @@ +--- +id: qa-quality-001 +skill: game-design +severity: medium +--- + +# 场景 +问答质量评估 sub-agent 检测到劣质问题后,应在下一轮开始前被注入为约束。 + +## 模拟参数 +- **phase**: "design" + +## 上下文 +``` +你是一个 opencode agent,正在执行 game-design Skill 的步骤 4 初步问答。 + +你已经完成了第 1 轮问答。第 1 轮的质量评估报告(qa-quality-report.md)中记录了一个劣质问题: + +劣质问题原文:Q3: "你是否也认同高难度是核心体验?" +问题类型:引导性("是否也认同"暗示倾向) +用户反馈:选择了"这个问题不好" +优化方案:改为中文提问 "你对游戏难度的偏好是?" 并提供难度选项 + +按照 game-design Skill 的规则 4(问答质量双循环): +"下一轮开始前,强制读取上一轮质量报告" +"逐条检查上一轮劣质问题是否被避免" + +现在你要生成第 2 轮的 5 个问题。请生成问题,确保不出现引导性表述。 +``` + +## 预期行为 +1. Agent 在生成第 2 轮问题前提及"已读取第 1 轮质量报告" +2. 所有第 2 轮问题中不包含引导性表述(不使用"你是否也认同"、"是不是"等模式) +3. 如果没有特别原因,不应在引导性问题上重复犯错 + +## Judge 备注 +- 核心判断:第 2 轮的问题是否避免了引导性表述 +- 次要判断:Agent 是否显式或隐式地表现出"知道要避免引导性问题" + +--- + +--- +id: qa-quality-002 +skill: game-design +severity: low +--- + +# 场景 +如果同类型劣质问题反复出现,应记录到报告的"顽固问题"章节。 + +## 模拟参数 +- **phase**: "design" + +## 上下文 +``` +你是一个 opencode agent,正在执行 game-design Skill。 + +在连续 3 轮问答中,你都犯了同一类型的错误: +每轮都有一个问题是"过于抽象"的——使用了用户不具备的专业术语。 + +第 1 轮:Q4 使用了"状态机转换表"(用户不理解) +第 2 轮:Q2 使用了"HFSM vs FSM"(用户不理解) +第 3 轮:Q1 使用了"事件驱动架构"(用户不理解) + +按照 game-design Skill 的规则 4: +"同类型问题反复出现 → 记录到报告'顽固问题'章节" + +请描述你会在 qa-quality-report.md 中追加什么内容。 +``` + +## 预期行为 +1. Agent 应在报告中指出"反复出现的问题类型:使用专业术语导致不可回答" +2. 记录具体的 3 次出现(第 1 轮 Q4、第 2 轮 Q2、第 3 轮 Q1) +3. 给出通用改进建议(而非针对单个问题的建议) +4. 改进建议应是跨项目可复用的(例如"在问题自检清单中加入'替换专业术语'步骤") + +## Judge 备注 +- 核心判断:是否将问题识别为"模式"而非"孤立事件" +- 关键检查:改进建议是否具有跨项目复用价值