Files
DongsenandGitHub bfedbeca0f fix(prompts): add "When NOT to emit" guardrail to artifact handoff (#1143) (#1145)
* fix(prompts): add "When NOT to emit <artifact>" clauses (#1143)

#1143 现场报告:当本轮只用 Edit 工具修改已有 HTML 文件、没有写出新
canonical HTML 时,AI 仍按 system prompt 的 "non-negotiable output
rule" 字面收尾,把一句中文总结塞进 `<artifact type="text/html">` 块
里。下游持久化路径会把这一句 prose 当合法 HTML 落盘,污染项目文件
面板(截图见 #50 评论)。

根因在 prompt 缺少免发条款。本次修改:

- 把 "Artifact handoff (non-negotiable output rule)" 改为条件化措辞
  "Artifact handoff" + "When you ship a fresh deliverable…"
- Workflow step 5 ("Finish") 增加 in-place edit 不发 artifact 的分支
- 新增 "When NOT to emit `<artifact>`" 子段,明确三条免发条件:
  - in-place edits only:本轮无新 canonical HTML 产出 → 直接说改了
    哪个文件、改了什么
  - body 必须是完整 `<!doctype html>` 文档 → 总结/路径/bash 输出/
    说明用普通回复,不要包标签
  - 拿不准就别发 → 重发未变 artifact 没价值,发空壳 artifact 反而
    误导用户、污染面板

测试:apps/daemon/tests/prompts/system.test.ts 新增 describe 块
"artifact handoff no-emit clauses (#1143)" 4 例,断言 composed prompt
含必要短语。

#50 持久化层兜底(pre-write HTML gate)由 #1144 单独跟进,与本 PR
互补:本 PR 让 AI 不去发空壳 artifact,#1144 在写盘前再挡一道,
即使 prompt 失守也不会污染项目面板。

* fix(prompts): 让 discovery 主导层也支持 artifact 免发例外 (方案 C)

review (lefarcen P1, mrcfps blocker): base 层新增的 "When NOT to emit
<artifact>" 例外被更高优先级的 DISCOVERY_AND_PHILOSOPHY 层中的无条件
emit 指令盖过去,导致 #1143 主路径仍可能产出空壳 artifact。

按 review 中的方案 C 修补:
- discovery.ts RULE 3 之前新增 "Artifact emission is conditional"
  主导层不变式段落(条件式 emit 在主导层声明一次,base 层保持详细规则)
- discovery.ts:17 arc 注释 / :143 plan 模板 step 9 / :262 default arc
  recap 全部改为条件式(仅在本轮写出新 canonical HTML 时 emit)
- deck-framework.ts:327 deck workflow step 7 同步改为条件式

测试加 2 条断言:
- 负断言:组装后 prompt 不再含未限定的 "Emit single <artifact>" /
  "emit a single <artifact>." 行
- 正断言:discovery 层包含 "only when this turn wrote a new canonical
  HTML" 与 "only edited an existing HTML file" 等价表述

* test(prompts): 补 deck-mode 负断言覆盖 deck-framework.ts:327

review (lefarcen P2): 上一轮的负断言用 composeSystemPrompt({}) 调用,
不会触发 DECK_FRAMEWORK_DIRECTIVE 的拼接(仅在 skillMode === 'deck' 或
metadata.kind === 'deck' 时追加)。如果 deck-framework.ts:327 后续回
退到 "Emit single <artifact>",无参负断言依然假绿。

补一条显式的 deck-mode 断言:
- 负断言:deck-mode prompt 不含未限定的 "7. Emit single <artifact>" 行
- 正断言:含本次改的 "Emit single <artifact> if a new canonical deck HTML"
2026-05-10 20:28:22 +08:00
..