说人话落地:加每轮注入 + 英文硬核版整包纳入 + 第①段补写作口径

一、用户令(逐字)
「humanizer(英文那份) 也要纳入」「重点就是做到说人话就行了」「但是 content_marketing_agent 的会话生成的文档并没有说人话,还是我手动要求的」

二、根因(两处,都不是"没整合")
· **语气那一档只有指针、没有注入** ⇒ 实测没被读到(`SKILL.md` 必读表标题原写「三篇」而表里有 4 行,
  第 4 项=作业规矩整包,被顶在"必读"之外;已订正为「四类」)。
· **写文档的执行会话那条链上一句写作口径都没有** —— 产品规划技能里「反 AI 味」只出现在**第③段界面**
  (且指的是界面不是文字),**第①段出文档那节零口径** ⇒ 产物自然是 AI 味。

三、改法
1. **每轮注入**(照排版那条现成机制,⛔ 不改 `main()`):
   · `04-去AI味与说话方式.md` 顶部加 `<!-- VOICE-CORE -->` 紧凑块(≈450 字符:核心原则/四种高频 AI 味/交付前三问);
   · `reply-style-guard.py` 里**原地重定义** `_core`(`_core_reply = _core` 后用新 `_core` 包住它并追加语气块)
     ⇒ 注入正文自动多一段,排版那条**不受影响**。
2. **产出侧补口径**:`product-planning` 第①段(stage-discovery)在 1b 表后新增「写作口径」块 ——
   落笔前读 `humanizer-zh` 或本包 04,**定稿前过「交付前快速清单」**,并列出六种禁用 AI 味;**适用本段全部五份产出**。
3. **英文硬核版整包纳入**:原独立技能 `humanizer` **逐字**搬入本包 `references/humanizer-en/`(6 文件、
   md5 逐个一致):55 个模式 + 5 种语气档 + 0–100 AI 痕迹打分 + `--file` 就地改;
   在 `04 §9` 关系表与 `SKILL.md` 对应物段登记(冲突以本包会话场景版为先)。

四、验收
· 新增 `selftest.py::t_voice_core`(4 项);全量 **PASS 106 / FAIL 0**;manifest 70 → **76** 份、语法失败 0。
· 端到端喂真钩子:注入正文已含说人话块、排版块仍在。
· ⛔ 改的是钩子与技能目录(宿主直读)⇒ **不需要分发/重启**。
This commit is contained in:
admin committed 2026-10-07 22:00:13 +08:00
1 parent 7ec94b63d3
commit 2ed7766007
17 files changed
+1767 -199

No files matched your search

@@ -161,6 +161,46 @@ def _core(workdir):
return _extract(_read(p)), p
# ── 🔴 2026-10-07 「说人话」块(用户令逐字:「重点就是做到说人话就行了」)──────────────
# 为什么要它:语气那一档原先只有**指针**(必读表里一行)⇒ 实测没被读到(用户报障
# 「content_marketing_agent 的会话生成的文档并没有说人话,还是我手动要求的」)。
# ⇒ 照 `03`(排版)那条**每轮注入**的现成路子,把语气也送进每轮上下文。
# ⚠️ 与 `03` 分工:`03` 管「能不能被扫」(结构),本块管「像不像人话」(语气)。
# ⚠️ **只从包内取**;包内没有 ⇒ **静默不注入**(它是增强项,⛔ 不是结构契约,缺了不影响排版那条)。
VOICE_BEGIN = '<!-- VOICE-CORE:BEGIN'
VOICE_END = '<!-- VOICE-CORE:END -->'
VOICE_MAX_CHARS = 1100
def _voice_core():
"""取包内 `references/作业规矩/04-去AI味与说话方式.md` 的 VOICE-CORE 块。"""
_hooks = os.path.dirname(os.path.abspath(__file__))
_pkg = os.path.dirname(os.path.dirname(_hooks))
t = _read(os.path.join(_pkg, 'references', '作业规矩', '04-去AI味与说话方式.md'))
i = t.find(VOICE_BEGIN)
j = t.find(VOICE_END)
if i < 0 or j < 0 or j <= i:
return ''
body = t[t.find('\n', i) + 1:j].strip()
if len(body) > VOICE_MAX_CHARS:
body = body[:VOICE_MAX_CHARS].rstrip() + \
'\n…(超长已截断,全文见本包 `references/作业规矩/04-去AI味与说话方式.md`)'
return body
# 🔴 原实现改名留档;`_core` **重新定义**为「原实现 + 追加说人话块」
# ⇒ `main()` 一行都不用改(它只认 `_core`),注入正文自动多一段。
_core_reply = _core
def _core(workdir):
c, p = _core_reply(workdir)
v = _voice_core()
if c and v:
return c + '\n\n' + v, p
return (c or v), (p if c else '')
def _log(workdir, line):
try:
with io.open(os.path.join(workdir, LOG_REL), 'a', encoding='utf-8', newline='\n') as f: