提问规则审计 + 撤出本机生成的两份契约 + 「一律用肯定表述」落进注入面

用户 10-09 三条令:
①「那两份 不说具体 我怎么知道,看看会话提问的规则是否有缺陷」
②「A 方案」(撤出 session-mechanism/roots.env 与 references/manifest.md)
③「要用确定XXXX 这样的描述,避免 不要XXXXX 会导致上下文干扰的描述,除了经验沉淀和红线避坑外」
   +「不只是修改 创建生成时也需要遵守」

一、提问规则审计(三条缺陷,全部修掉)
1、判据用错了维度:旧措辞「⛔ 提问正文不许出现的:包名·环境变量·文件路径·commit/sha·表名/字段名·
   类名/函数名」是按**词性**一刀切,而同一段末尾又写「正文只留能决定下一步的内容」⇒ 两句自相矛盾。
   我按前半句执行、把要撤的文件名删成了「那两份」⇒ 待拍板项不可答。
   ✅ 改成按功能判:**少了这个标识,用户还能不能决定** —— 不能 ⇒ 写进正文;能 ⇒ 删、下沉技术附录。
2、同一判据散在 6 处、措辞各不同(违反本项目自己的「禁重复判定标准」):已收敛到同一句判据,
   并互相标注「改这里必须同批改」。
3、🔴 最隐蔽:**每轮注入的那份 ≠ 包内那份**。钩子 `_core()` 是三级回退,① **本工作区
   CODEBUDDY.md 的 `REPLY-CORE` 段**才是每轮注入的(包内那份只是换机器的兜底)。
   我先只改包内 ⇒ 注入的仍是旧条文,而"文件都改了、自测全绿",看不出来。
   ⇒ 两份都改 + 新增防漂移自测 `t_reply_core_same_source`(两份实质内容必须逐字一致)。

二、撤出两份「本机生成」的契约(用户选 A)
- `git rm --cached session-mechanism/roots.env` 与 `session-mechanism/references/manifest.md`
  —— **本地文件一律保留**(实测 624 B / 18 568 B 仍在)。
- 为什么必须撤:别的电脑取仓时「同名覆盖」会把它们换成**我们这台机器**的路径 ⇒ 那台机器的
  机制脚本去找不存在的目录。
- 新增入库样例 `session-mechanism/roots.env.example`(占位符,无本机路径)。
- `.gitignore`:加这两份的忽略行(⛔ 防 `git add -A` 捎回),并改掉原「刻意入库」那段注释。

三、「一律用肯定表述」写进注入面(原来只在 rules.md,注入面看不到)
- 口径:**写或改技能与规则文件时一律写"要什么、怎么做";新建、生成时同样适用**;
  例外=**以「经验沉淀」或「红线/避坑」为目的**的技能与规则(写法=正向目标 + 括号里的踩坑依据)。
- 落点:injected `REPLY-CORE` 段(工作区 + 包内,逐字一致)· `rules.md §9` ·
  `改包纪律.md` 新增第 5 条硬纪律(「二、四条」→「五条」)· `01-文档索引.md` 指针同步 ·
  把我在注入块里加的那段负向表述改成**正向主导**。

四、🔴 顺带抓到并修掉一个我自己造成的净变差
- 注入块有 **1400 字上限、且从开头截** ⇒ 我加条文把它顶过上限(1274 → 1414+)⇒
  尾部三条(变相征询禁止 / 不用征询句收尾 / 本工作区另有定稿)**静默消失**、不再注入。
- 修:上限 1400 → **2000**;并在 `t_reply_core_same_source` 里加断言 **块长 ≤ 上限** ——
  以后谁再顶破上限,自测直接报红,逼他"要么精简、要么显式抬上限"。
- 验证:`被截断=False`,尾部三条都回来了。

五、验证
- 全套自测 **PASS 109 / FAIL 0**;py 语法全绿;`install.py --manifest` 重算(78 份,语法失败 0)。
- 注入块实测:来源=工作区 CODEBUDDY.md,不截断,含「一律用肯定表述」「决定对象要点名到具体」
  「新建、生成时同样适用」。
This commit is contained in:
admin committed 2026-10-09 10:45:00 +08:00
1 parent 0204001a1b
commit 5004909267
12 files changed
+164 -219

No files matched your search

+55
View File
@@ -7612,5 +7612,60 @@ def t_blocked_goal_pauses_check():
return out
@case("🔴 回复排版块:**每轮注入的那份**与**包内那份**必须同源(⛔ 别改一处漏一处)")
def t_reply_core_same_source():
"""🔴 2026-10-09 立(本轮实测踩到)。
钩子 `reply-style-guard.py::_core()` 是**三级回退**:① **本工作区 `CODEBUDDY.md` 里
`<!-- REPLY-CORE:BEGIN…END -->` 标记之间那段 —— 每轮注入的就是它**;② 包内
`references/03-回复排版-核心块.md`(单包自包含时的兜底);③ 外部技能那份。
⇒ **两份都要改**。本轮只改了 ②,注入到上下文里的仍是旧条文 —— 而表面上「文件都改了、自测也全绿」,
根本查不出来。这就是「改一处漏一处」的同族,所以判据必须落在**两份一致**上。
✅ 只允许首行 `BEGIN` 的注释不同(一份写给工作区看、一份写兜底说明)。
"""
def _blk(t):
i = t.find("<!-- REPLY-CORE:BEGIN")
j = t.find("<!-- REPLY-CORE:END")
if i < 0 or j <= i:
return ""
return "\n".join(t[i:j].splitlines()[1:]).strip()
try:
a = _blk((WS / "CODEBUDDY.md").read_text(encoding="utf-8", errors="replace"))
except Exception:
a = ""
try:
b = _blk((HERE.parent / "references" / "03-回复排版-核心块.md")
.read_text(encoding="utf-8", errors="replace"))
except Exception:
b = ""
rows = [("包内那份标记块读得到(%d 字符)" % len(b), len(b) > 200)]
if not a:
rows.append(("本工作区没有该标记块 ⇒ 走包内兜底(跳过一致性比对)", True))
return rows
rows.append(("工作区那份标记块读得到(%d 字符)" % len(a), len(a) > 200))
rows.append(("两份**实质内容逐字一致**(⛔ 改一份漏一份=注入的仍是旧条文)", a == b))
rows.append(("两份都含「决定对象要点名到具体」(2026-10-09 修的那条判据)",
"决定对象要点名到具体" in a and "决定对象要点名到具体" in b))
rows.append(("两份都含「一律用肯定表述」(2026-10-09 用户令 · 此前只在 rules.md,注入面看不到)",
"一律用肯定表述" in a and "一律用肯定表述" in b))
# 🔴🔴 块长必须 ≤ 钩子的截断上限:本块**从开头截** ⇒ 超出的尾部是**静默消失**
# (本轮实测:块 1274 时全文注入;加到 1414+ ⇒ 「变相征询禁止」「不用征询句收尾」当场失效)。
try:
import importlib.util as _ilu
_sp = _ilu.spec_from_file_location("rsg_len", HERE / "hooks" / "reply-style-guard.py")
_mm = _ilu.module_from_spec(_sp)
_sp.loader.exec_module(_mm)
_cap = int(getattr(_mm, "MAX_CHARS", 0))
except Exception:
_cap = 0
_longest = max(len(a), len(b))
rows.append(("块长 ≤ 钩子截断上限(上限=%d,实测最长=%d)—— ⛔ 超了就是尾部规则静默失效"
% (_cap, _longest), _cap > 0 and _longest <= _cap))
return rows
if __name__ == "__main__":
sys.exit(main())