From 4f2136c919f67d5b9f6db8e65f83ee6967a2de68 Mon Sep 17 00:00:00 2001 From: Linghong Date: Fri, 21 Aug 2026 03:10:34 +0000 Subject: [PATCH] =?UTF-8?q?=E7=AB=8B=E9=A1=B9=E7=AD=96=E5=88=92=20brief=20?= =?UTF-8?q?=E8=A1=A5=E5=9B=9E=E8=A2=AB=E5=B7=A5=E5=85=B7=E9=9D=A2=E6=94=B6?= =?UTF-8?q?=E7=AA=84=E8=BF=9E=E5=B8=A6=E5=88=87=E6=8E=89=E7=9A=84=E5=8E=9F?= =?UTF-8?q?=E5=88=9B=E6=80=A7=E7=BA=A2=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit common.md 的原创性条款(2026-07-27 `427a8c151` 为做游戏链路引入, 2026-08-03 `e2b5056af` 抽进 common.md,两者都早于本分支)随 $base 分发给 每个专业 Agent。策划子 Agent 在 M1A-2 改成 exact allowlist 后走专用小 prompt、不拼 $base,该条款随之丢失。 不拼 $base 是对的——common.md 大量内容讲写文件、跑命令、起预览、再委派, 策划子 Agent 一个都没有,塞进去会让广告工具面与文字合同打架(理由已记在 game_creator_project_planning_tool_plan_system_prompt 的注释里)。但原创性 不属于工具面,是内容约束,跟着一起被切是连带损伤。 后果是缺口而非退化:GDD 是整条产线的上游,策划稿里落进受保护名称,下游做 游戏的 Agent 即便个个守规也已经晚了。实测中原创性由用户需求原文自带,产品 侧没有任何一层兜底。 补进 roles/project-planning.md,措辞按本 Agent 实际产出收敛(GDD 正文、决定 台账、原型验证项、targetUsers.referenceGames),不涉及它无权写的代码与图片。 回归断言的是「策划子 Agent 实际收到的完整 prompt」而非某一层,将来若把 common.md 拆成工具面与内容红线两段再正常合成同样成立;并以 common.md 原文 作对照基线,那边被改写时一并报警。已变异验证。 Co-Authored-By: Claude Opus 5 --- .../prompts/runtime/roles/project-planning.md | 1 + .../src-tauri/src/agent/prompt.rs | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md index df797b2d2..bb22f4704 100644 --- a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md @@ -15,6 +15,7 @@ ## 低幻觉与 GDD 约束 +- 用户描述玩法类型、机制或“像某款游戏”时,不代表授权复刻该游戏。游戏名称、世界观、角色与单位名、阵营、资源、界面术语和视觉语言必须原创;不得沿用、翻译或近似改写现有游戏的专有名称、Logo、标志性布局与受保护视觉语言,也不得把它们写进 GDD 正文、决定台账或原型验证项。用户提到的相似作品只能作为抽象品类参考,`targetUsers.referenceGames` 同样不得填入受保护名称。你的工具面窄,但内容红线不因此放宽——GDD 是整条产线的上游。 - A、B 或自由填写得到的用户决定标 `confirmed`;用户选择“需要原型验证”标 `prototype_pending`;只有未提问、由你按默认建议填写的字段才标 `default_pending`,其 `answerSource=default`、`round=0`。不要把用户选择的 B 当成默认项。 - 用户在后续自由填写中推翻已确认决定时,保留用户答案原文,紧接被推翻的决定注明“已被第 N 轮回答推翻,以后者为准”,并在新决定 topic 中写明关系;不得改写、拆分或搬动原文。 - 只定义一个完整可玩闭环。MVP 不含多人、商城、服务器、开放世界、赛季、复杂社交、完整剧情或全量内容,除非用户明确改变范围。 diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs index 84546ac3e..e928ecef8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs @@ -927,6 +927,43 @@ mod tests { } } + #[test] + /// `common.md` 的原创性红线随 `$base` 分发给做游戏链路的每个专业 Agent,但 + /// 策划子 Agent 走 exact allowlist 的专用小 prompt、不拼 `$base`(理由见 + /// `game_creator_project_planning_tool_plan_system_prompt` 的注释),该条款 + /// 因此在 M1A-2 收窄工具面时被连带切掉——工具面窄是对的,内容红线跟着一起 + /// 消失不是。GDD 是整条产线的上游:策划稿里落进受保护名称,下游做游戏的 + /// Agent 即便个个守规也已经晚了。断言的是「策划子 Agent 实际收到的完整 + /// prompt」,不限定由哪一层提供,将来若把 common.md 拆成工具面与内容红线 + /// 两段再正常合成,这条同样成立。 + #[test] + fn project_planning_prompt_keeps_the_originality_red_line_common_md_carries() { + assert!( + required_runtime_prompt_section("common").contains("不代表授权复刻现有游戏"), + "common.md 的原创性红线是本断言的对照基线;它若被改写,必须一并复核策划 brief" + ); + let mut delivered = game_creator_agent_runtime_tool_plan_system_prompt_for_agent( + GAME_CREATOR_PROJECT_PLANNING_AGENT_ID, + "", + ); + delivered.push_str("\n\n"); + delivered.push_str(&game_creator_agent_runtime_role_overlay_prompt( + GAME_CREATOR_PROJECT_PLANNING_AGENT_ID, + None, + )); + for required in [ + "不代表授权复刻", + "必须原创", + "受保护视觉语言", + "referenceGames", + ] { + assert!( + delivered.contains(required), + "策划子 Agent 收到的 prompt 缺少原创性约束:{required}" + ); + } + } + #[test] fn project_planning_role_brief_is_isolated_to_its_manifest_overlay() { let planning = game_creator_agent_runtime_role_overlay_prompt(