立项策划 brief 补回被工具面收窄连带切掉的原创性红线

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 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 03:10:34 +00:00
parent db740d8ae6
commit 4f2136c919
2 changed files with 38 additions and 0 deletions
@@ -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 不含多人、商城、服务器、开放世界、赛季、复杂社交、完整剧情或全量内容,除非用户明确改变范围。
@@ -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(