games-development-ai/.agents/skills/prompt-governance.md
lili e16c7e833d docs(agents): 蒸馏内部狗粮上线/W-AXIS R1 收口踩坑经验
prompt-governance §11 稳定门在 M3 下 flaky 与治法(anyTerms 同义词补全治本+格式硬约束+几何退避;actor cohort 聚合比 judge 宽松)
gen-path-parity §6.2 跨语言契约版本接缝(Python 切 acceptance/3 必同步升 Node runner /3 否则真浏览器整拒)
staging-ops §2 commit 在途 M 触发 pre-commit 版本漂移闸处置(机械对齐 registry 匹配 frontmatter)+§4 长任务前台串行+孤儿独立复核
ai-development-protocol §4.2 关键 hash 一律主代理独立重算(扩 commit-hash 自验到产物/基线 hash)
均补到既有文件无新建,带本会话实证行号
2026-07-25 19:27:05 -07:00

183 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: prompt-governance
description: "当新增或修改生命周期 prompt、搭建 Prompt Registry 与四道闸 eval 门禁、或对接人在环节点时使用:prompt 即第 8 类契约,contracts/prompts 版本化单一事实源与治理流程(段A版本闸+段B真模型闸 CI 已接)。"
---
# Prompt 工程治理手册prompt-governance
> 蒸馏来源:执行版 [`../../docs/architecture/架构/生成引擎/prompt治理.md`](../../docs/architecture/架构/生成引擎/prompt治理.md)HJ-PROMPT-GOV-EXEC-001
> 适用:新增/修改任何生命周期 prompt安全/意图/模板/生成/素材/质量/修复/元信息八阶段,及 tier2 富游戏线)、搭建 Prompt Registry 与 eval 门禁、对接人在环HITL节点。
> 配套:契约先行见 [`./contract-first-development.md`](./contract-first-development.md)AI 生成链路见 [`./agentic-amodel-generation.md`](./agentic-amodel-generation.md);运行时/Cocos 见 [`./runtime-and-multichannel.md`](./runtime-and-multichannel.md);选型见 [`../knowledge/tech-decisions.md`](../knowledge/tech-decisions.md) §1.1;降级红线见 [`../rules/security-and-reliability.md`](../rules/security-and-reliability.md)。
>
> **⚠️ 引擎上下文纠偏2026-06-12**:本手册**核心理念Prompt 即第 8 契约 / Registry / eval 门禁 / HITL现行有效不变**;但下文凡以 **Dify / OpenGame** 为注入目标/引擎载体的描述均按现行裁决改读——**Dify/OpenGame=降级远期未部署**C2/HJ-GEN-001Tier1 生成主线=**new-api 网关 + agent 写码于插件库**(引擎=LittleJS 增强发行版agentic 编排基建=**AgentScope 2.x**HJ-AGI-001。"模板填充"措辞按模板哲学终裁更新玩法模板层废除。Cocos-MCPTier2/3仍现行有效。
>
> **⚠️ 现行化重写2026-07-05**§1§3 已按现行 `registry.yaml`(阶段编号目录重构 + 头部消费面三态对账)与 W-PCI 后口径整块重写——目录树、加载器类名(`PromptResourceLoader`)、两条 live 生成线(便宜档 cheap-worker / tier2 AgentScope形态均改为现行事实此前散在正文的划线改读不再需要、随句清理。上条 2026-06-12 记的「Cocos-MCP 仍现行有效」本次一并修正Cocos-MCP 降为 3D 与渠道导出的人在环工具,非 live 生成形态。
---
## 核心理念Prompt 即第 8 类契约资产
所有 prompt 进 git `contracts/prompts/` **单一事实源**,与 Day-0 七契约同级,在 `registry.yaml` 按条目登记id / version / stage / owner / file / desc / eval各配 Golden eval 集与硬约束。**运行时按注册条目正文加载注入、不在引擎/编排内核里内嵌**——便宜档由 cheap-worker 读、tier2 由 AgentScope gen-worker 读、后端模板策划由 `PromptResourceLoader` 读,延续"能力增强放壳层、不动内核"的纪律。
> 为什么必须治理:多条生成线(便宜档 / tier2 / 后端模板策划)使 prompt 数量与形态膨胀;无单一事实源 → 跨链路无法统一治理、改动无法回归验证。
---
## 1. Registry 目录结构
Prompt 按生成链路阶段编号归档,`registry.yaml` 作索引(唯一事实源),`eval/` 放各条 Golden 集,同级还摆着三个治理脚本:
```
contracts/prompts/
├── registry.yaml # 注册表(索引):每条 prompt 的 id / version / stage / owner / file / desc / eval
├── README.md # 目录说明 + registry 一致性 CI 门说明
├── check_registry.py # CI 门:registry.yaml 各条 version 与对应 .md frontmatter version 对齐
├── check_version_bump.py # 段 A 离线版本闸:改正文必升 version(见 §6)
├── eval_gate.py # 段 B 真模型闸:对 live 条目跑四道闸、真调 M3(见 §6)
├── 01-safety/ # Prompt 安全/注入检测
├── 02-intent/ # 意图解析
├── 03-template/ # 模板匹配
├── 04-config/ # 生成主线:cheap-system(便宜档主 prompt) + 各品类 -designer(模板策划/编码)
├── 05-asset/ # 素材生成(ComfyUI 引导)
├── 06-quality/ # 质量评估
├── 07-fix/ # 失败修复/重生成
├── 08-meta/ # 标题/简介/封面文案
├── 09-tier2-richgame/ # tier2 富游戏自治生成线的 8 条 prompt(AgentScope 多 agent)
└── eval/<id>/ # 每条 prompt 的 Golden eval 集(inputs.jsonl / labels.jsonl / baseline.json / runs/)
```
0108 是按生成链路顺序保留的阶段槽,眼下真正落有条目的是 `01-safety``04-config`(生成主线含便宜档)、`06-quality``07-fix`agent 闭环批跑遗留),加上 `09-tier2-richgame`tier2 八条);其余为规划槽、暂无 prompt。
每条 prompt 在 `registry.yaml` 登记一条索引,字段固定为 id / version / stage / owner / file / desc / eval没有 engine / tier——生成线归属由 stage 与消费方代码决定,不写进注册表。摘一条现行 live 条目为例:
```yaml
- id: safety.prompt-check # 唯一 id = 阶段域.角色
version: 1.0.0 # 语义化版本;改正文必升(段 A 版本闸强制)
stage: "01-safety" # 阶段编号目录(01-safety…08-meta / 09-tier2-richgame)
owner: WS2 # 唯一负责工位
file: 01-safety/prompt-safety-check.md # 正文文件(其 frontmatter 至少含 id+version)
desc: 创作者 Prompt 安全/注入检测(生成链路第 1 节点)
eval: eval/safety.prompt-check/ # Golden eval 集(四道闸:Schema/成功率/回归diff/成本延迟)
```
注册表是索引与对账基准prompt 正文另存于 `file` 指向的 .md各带一份 frontmatter至少 id 与 version`check_registry.py` 逐条比对两侧 version 防漂移)。有的正文还内嵌 output_schema / hard_constraints如 safety或 tier / engine 注记(如 tier2 各条),那是正文自己的元信息,注册表条目只认上述七字段。
---
## 2. 加载 / 注入机制
三条生成线各有自己的加载器,共同纪律是按 `file` 指向的正文加载、best-effort 回落进程内内置原文、绝不因 prompt 读取失败中断生成:
- **后端模板策划 prompt`04-config` 各品类 `-designer`** 由 game-module-aigc 的 `PromptResourceLoader` 加载。构建期 maven-resources-plugin 把 contracts 下的 prompt 与 schema 快照进 `classpath:wanxiang-contracts/`jar 内只是构建时快照git `contracts/` 仍是唯一事实源);启动逐模板自检,任一缺失或形态非法即整体 `ready=false` 自禁用,执行器 tick 首检不认领任务、不崩 app。渲染只做 `{{input.xxx}}` 替换加残留占位符检测version 仅作可追溯日志,不做 registry 对账——那是 CI 四道闸的职责Java 不复制治理逻辑。配了 `aigc.prompts.dir` / `AIGC_PROMPTS_DIR` 外置目录后每 60s 热取,运营改完 prompt 无需重启即生效读失败保留上次、classpath 快照永久兜底。
- **便宜档 cheap-worker** 由 `cheap_roles.py``_load_system_prompt()` 运行时读 `04-config/cheap-system.md` 正文,读不到、脏或缺文件即回落进程内 `_SYSTEM_PROMPT`
- **tier2 富游戏 gen-worker** 由 `roles.py``worker/prompts.py``prompts.load` 运行时读 `09-tier2-richgame/` 下八条正文,读不到或脏即回落 roles.py 内置原文。
版本一致性由 `check_registry.py` 守门:逐条比对 registry 的 version 与对应 .md frontmatter 的 version不一致即拒绝合入`PromptResourceLoader` 构建期快照版本与注册表宣称漂移、审计失真),已挂 pre-commit 与服务端 `contract-gates.yml`
> 改 prompt = 改 git 正文加升 version → PR → eval 门禁 → 合入 → 下次构建或热取自动携带新版。
---
## 3. 两条 live 生成线的 prompt 形态
现行 runtime 只有两条生成线在跑prompt 形态、加载器与失败回落各管一摊:
| 维度 | 便宜档 cheap-worker | tier2 富游戏 AgentScope 多 agent |
|---|---|---|
| 主 prompt | 单条 `config.cheap-system` | `tier2.*` 八条leader + 四工作室专家 + 兜底 `design-system` + 单写 `writer` + 软检 `player` |
| 范式 | A-model 一个 agent 写 LittleJS `src/` 源工程(入口契约 + 插件 + 红线 + 输入契约 + 完成判据) | AgentScope 2.0.2 ReAct 两阶段:阶段 1 工作室多 agent 出设计稿 → 阶段 2 单写 ReAct 写 Phaser 源码 + L3 视觉软检玩家 |
| AI 参与深度 | 轻便宜档插件库承重、AI 少写) | 重(自治多轮、有状态工具编排) |
| 归属目录 | `04-config/cheap-system.md` | `09-tier2-richgame/`(八文件) |
| 消费方 | `cheap_roles.py` `_load_system_prompt()` | `roles.py``worker/prompts.py` `prompts.load` |
| 失败回落 | 回落 `cheap_roles._SYSTEM_PROMPT` | 回落 roles.py 内置原文 |
> **Cocos-MCP 不是 live 生成形态**:它降为 3D 与渠道导出的人在环工具(人工在编辑器里操作),不进 MVP 生成 runtime也不在本治理的形态对照内。素材生成链ComfyUI 引导,归 `05-asset/`)另走各自门禁。
---
## 4. 新增一条 Prompt操作步骤
1. 在对应阶段编号目录建 prompt 正文 .md写 frontmatter至少 id + version归属写 ownerstage 与注册表一致)。
2. 有输出约束的(如 `04-config` 各品类模板策划)绑定 `contracts/templates/<id>.schema.json`;纯 system prompt`cheap-system` / tier2 各条)无外置输出 schema。
3. 写硬约束块 + guardrails注入检测/Schema 校验/资源引用校验)。
4. 建 Golden eval 集 `eval/<id>/``inputs.jsonl`(核心样本)+ `labels.jsonl`(期望标注)+ `baseline.json`(基线快照,`--update-baseline` 建,闸 3/4 据此判增量);每次跑的台账 append-only 落 `runs/`
5.`registry.yaml` 登记条目id/version/stage/owner/file/desc/eval
6. 提 PR → eval 门禁绿 + 人工抽检 → 合入 → 部署同步。
## 5. 修改一条 Prompt 并验证效果(操作步骤)
1. 改 prompt 文件,**version 必须 bump**(语义化)。
2. PR 触发 eval跑绑定的 Golden 集 → 四道闸比对(见 §6
3. 全绿 + 人工抽检 K 条 → 合入;任一红 → 阻断 PR + 给 diff 报告。
4. 合入后**灰度新版本** → 观察 telemetry 行为指标(完玩/重玩率)→ 全量或一键回滚version 切换)。
> 常用 prompt 预留**参数槽**:运营改参数(如难度/时长)不改结构,免 PR改结构才走 PR+eval。
---
## 6. Eval 轻量门禁(四道闸)
| 闸 | 判定 | 来源 |
|---|---|---|
| ① Schema 通过率 | 输出符合 output_schema 的比例 ≥ 阈值 | 评审版 §4.4 |
| ② 生成成功率 | 可运行 + 质量通过 ≥ **80%** | MVP 验收线 |
| ③ Golden 回归 | 与 `baseline.json` 关键字段 diff防退化 | 泛化自 T-AGC-08 |
| ④ 成本/延迟 | token/耗时不劣化 | 评审版 §4.4 |
四闸全绿 → 人工抽检 K 条(主观质量/可玩性)→ 合入。
**怎么跑2026-07-04 已接成 CIW-PCI**:四道闸按成本分两段落地。**段 A 离线版本闸**`contracts/prompts/check_version_bump.py`)兜闸 0「改正文必升 version」——相对基线剔除 frontmatter version 行后比正文,正文变而 version 没升即 exit 1`.githooks/pre-commit``.gitea/workflows/contract-gates.yml` 服务端门,每次提交自动跑、秒级零成本。**段 B 真模型闸**`contracts/prompts/eval_gate.py --id <id>``--changed --base <ref>`)跑闸 1~4对改动的 prompt 拿其金标集真调 MiniMax-M3经 new-api、thinking 关、key 从 env 读、`ProxyHandler({})` 绕系统代理)判定;`.gitea/workflows/prompt-eval.yml` 手动 `workflow_dispatch` 触发,单跑预算硬上限 ≤¥5。**只焊 live 面**:接门前先查 [`registry.yaml`](../../contracts/prompts/registry.yaml) 头部消费面三态对账——非 livefossil/batch-relic条目 SKIP 豁免、live 但无金标集 fail-closed绝不假绿别把门焊在已下架的化石 prompt 上白花钱。调用失败(网关 500/限流)排除出判定分母、建议复跑(不阻塞、不误判 prompt。台账 append-only 落 `eval/<id>/runs/`,回归基线 `eval/<id>/baseline.json``--update-baseline` 建,闸 3/4 据此判增量)。**可玩性 MVP 不自动评分**(结构校验测不了"好玩"),靠人工抽检 + 上线后行为指标反哺下一轮。
---
## 7. HITL 人在环节点
- **创作者C 端·每次生成)**:输入一句话/选 IP 附件 → 任务链进度可中断 → 预览试玩 → 接受/带修改重生成 → 锁风强度 → 对白调试 → 发布前检查 → AI 诊断一键迭代。P-CRT-01/04/05/08/09、P-LIC-04/05、P-PUB-03、P-OPS-03/04
- **运营B 端·Prompt 生命周期)**:提 PR 改 prompt → eval 门禁+人工抽检批准 → 模板库策展 → 人工复核队列T-CMP-05→ 新版灰度+回滚。
---
## 8. 测试脚本生成T-AGC-09
aigc 新增**无状态原子**:输入 GameConfig → 输出可玩性测试脚本(启动/输入响应/边界);由 **runtime 编译流水线执行**为入库门禁的一环。其 prompt 若落地归质量评估阶段 `06-quality/`。(现行可玩性判定实走生成线九门真玩 harness本条 T-AGC-09 独立测试脚本 prompt 尚未落地。)不新增模块。
---
## 9. 降级铁律
| 失败点 | 降级 |
|---|---|
| prompt 加载失败(缺 id/version | 回退**内置默认 prompt** + 告警,不中断生成 |
| LLM 不可用 | 退化为确定性 Fallback 生成器(确定性兜底产出,~~模板填充~~措辞已更新,见 [`../rules/security-and-reliability.md`](../rules/security-and-reliability.md) §5.2 |
| tier2 / 便宜档 prompt 正文热取读到脏或缺失 | 回落进程内内置原文roles.py 原文 / `cheap_roles._SYSTEM_PROMPT` / classpath 快照best-effort 绝不中断生成 |
| eval CI 跑不通LLM 限流) | 标记 skip + 人工兜底审,不阻塞紧急修复 |
---
## 10. 常见坑
| 坑 | 排查 / 应对 |
|---|---|
| 改了 prompt 没 bump version | CI 卡version 未变拒绝合入(防静默覆盖) |
| Golden 集过拟合 | 样本要覆盖典型+边界bad case 增量补;勿只放"好跑"的样本 |
| registry 与运行时不同步 | 部署强制版本校验DB 镜像只读;改 prompt 必同步 registry.yamlcommit 在途 M 触发 pre-commit 版本漂移闸的处置见 [`staging-ops.md`](./staging-ops.md) §2 |
| tier2 多 agent prompt 当单次文生代码写 | 它是 AgentScope ReAct 多步有状态编排(工作室设计→单写→软检);改一条只改对应 `09-tier2-richgame/*.md` 正文加升 version不改 Python |
| 把 CI 门焊在化石 prompt 上白花钱 | 段 B 真模型闸只焊 live 面;接门前先查 registry 头部消费面三态对账,非 livefossil/batch-relicSKIP 豁免、live 无金标 fail-closed先用代码坐实「谁真被 live 路径喂 LLM」再决定跑不跑 |
| 单条模型调用失败当成 prompt 退化拦 | 网关 500/限流是基础设施问题,从判定分母排除 + 建议复跑(多数失败才判人工兜底),别让偶发抖动误判 prompt 质量 |
| 运营绕过 eval 直接改 DB | DB 是 git 只读镜像,无写入路径;改 prompt 唯一入口=PR |
| prompt 注入攻击 | guardrails 内置 injection-detect + 输出 Schema 校验,与内容安全双层链路同治理 |
---
## 11. 稳定门在 MiniMax-M3 下的 flaky 与治法2026-07 W-AXIS R1 实证)
段 B 真模型闸之上actor/judge 类 prompt 还叠了一道**稳定门**防单轮侥幸过。judge 要同一请求连续三轮金标全净(`MIN_STABLE_RUNS=3``eval_gate.py:114`;双 judge 各自 6/6、actor 至少 4/5`:12`再加第四轮复跑确认actor 走 cohort 聚合(`evaluate_repeat_stability``:2827`),三轮里 `correct_total≥12` 且每键 `≥2/3``:2884-2885`)。这套门在 MiniMax-M3 下很 flaky——judge-b 跑到第 33 轮才出一个三连净,单轮全净率只有 3545%。
flaky 根因分三层,治法各不同,别混着调:
- **① 金标白名单同义词覆盖不全(主因,治本=补同义词)**。labels 的 `anyTerms`/`requiredConcepts` 是自由文本白名单(`eval_gate.py:1873-1886`M3 常用的近义表达落在白名单外就被判错:净利↔利润/净收益、零单↔0单汉字「零」≠数字「0」、通关↔胜利、time-over/end-state↔game over、缺少证据↔缺证、cannot↔不能、`open shop``open-shop`(连字符差)、`no proving evidence``no evidence`(非连续子串)。补这些进 `requiredConcepts` 同义组**不是放松标准**是让金标覆盖合法的同义表达flaky 的主要来源由此消掉。
- **② 格式类失败(正文加硬约束可消除)**。JSON 尾部多游离 `]`、problems 缺硬证引用、obligation id 笔误(如 sim-business 误写成 sem-business。在 prompt 正文加硬约束即掉:输出 JSON 配平自检、obligation id 逐字复制不得改写、problems 逐条带硬证引用、summary 全引用、反事实视觉判定(文本说营收为正但画面还在开店前 → 判 contradicted不得 accept
- **③ 视觉误判(正文约束仅边际改善)**。把 GAME OVER 帧读成通关、漏 event 引用,属模型读图能力,正文加约束只能边际改善,治不了本。
做法:正文强化格式约束 + 补 `anyTerms` 同义词 + 几何退避等其收敛闭合,**不降阈值、不 cherry-pick 净轮**。actor 判据本就比 judge 宽cohort 聚合而非单轮全净闭合相对容易judge 单轮全净门最硬,补同义词后才收敛。