消息与规则
第3章 · 笔记 3
笔记 3
技能 SKILL.md 中的历史相关内容分三类处理(判定须读上下文,不能机械计数):
有意指针(📎 已移出至 wiki/xxx / 📌 历史内容详见 wiki/xxx) · B2 指针化遗留的导航标记,非噪音 · 保留;多行同目标指针合并为一行总指针(瘦身)
约束型历史警示(「信鸽已废弃,权威源是看板」「XX已取消/永久删除」类) · 对执行有约束意义,删除会导致误用废弃通道 · 永远保留,不按噪音清
真正的无意义残留(无导航价值、无约束意义的历史叙述) · 特征词(已废弃/旧版/曾用)命中但无上述两类价值 · 移出到 wiki 对应页 + 留指针
- 防复发:B2 是一次性工程,未建立「新历史不再混入技能」的常态约束。技能中新增内容默认只写当前有效执行骨架;需要沉淀历史/案例时直接写入 wiki(concepts/ 对应页),技能只留 📌 历史内容详见 wiki/xxx 一行指针。
- 流水页豁免:踩坑记录/log/需求池等 append-only 文档天然含历史,不适用本原则(见第 5 节)。
- 判定铁律:特征词统计必须甄别上下文(2026-08-25 教训)——「已移出至」指针和「信鸽已废弃」警示被机械计数为噪音,会把成功的改造误判为缺陷。
- 技能 frontmatter status 铺路(2026-08-25):技能 SKILL.md frontmatter 同样建议带 status: active 字段,与页面状态机(第 1 节)对齐,为 P3 状态机降权铺路。已落地于技能编写惯例模板 hermes-agent-skill-authoring 的 peer-matched shape;Hermes validator(skill_manager_tool.py::_validate_frontmatter)忽略未知字段,无副作用。不实施源码级 status 过滤/降权(方案 C 已否决,正生偏好「配置/内置能力优先不改源码」)。
### 9. 跨载体真源分派(记忆 / 知识库 / 看板 / 技能 / 现场)
来源:2026-09-29 正生问「Mnemosyne 知识图谱与 Wiki 是否重复建设」引出,乾婆实测后固化。第 6 节解决「页面之间不复制」,本节解决「同一事实在不同载体间的归属」。
现场实态 · 进程 / 配置 / 数据库 / 文件 · 工具直查 · 秒级
看板 · 任务状态与流转 · dispatcher / 乾婆 · 分钟级
技能 · 可复用做法(方法真相源) · 代理按需加载 · 慢
本知识库 · 经确认的结构化知识(知识真相源) · 人 + 代理 · 人工
Mnemosyne · 对话过程痕迹、偏好槽位 · 召回注入 · 实时
系统现在是什么样 · 现场实态(读配置 / 查库 / 看进程)
为什么这么定 · 本知识库(决策清单 / 项目页)
对话记忆(episodic) · ⚠️ 只能依赖「当时确实说过」 · 内容是否仍成立由时间决定,非记忆保证
偏好槽位(canonical) · ✅ 可依赖 · 单槽位设计,新值自动覆盖旧值
图谱三元组 · ❌ 不可作真相源 · 注解类统一在 annotations(活表,关联召回在读);triples 自 2026-08-02 停写、已于 2026-09-29 经批准清空——删前双向差集实测证明是零信息损失的过期副本
本知识库 / 技能 · ✅ 可依赖 · 人工维护 + 巡检;技能为宪法级
🔴 现场查验判据:结论会驱动行动(改系统 / 派任务 / 向正生下判断)→ 必须现场查验;仅需「知道来龙去脉」→ 记忆够用。
1. 一个事实一个真源,别处只放指针(如 MEMORY 条目写「详见某技能」)
3. 过时用失效标注(superseded_by / status: superseded),不删除、不复制
⚠️ 命名误导提醒:「Mnemosyne 知识图谱」是记忆的索引表,与本知识库不是同类。勿因名字含「知识」而把它当第二知识源维护。
- 🔴 建页流程铁律(2026-08-14 乾婆决策选项 B 固化):新建页面必须用 ~/.hermes/scripts/wiki-new-page.py 脚本,禁止裸 write_file 直接写 .md。脚本一条命令完成 frontmatter 模板 + 入索引 + log 追加 + 建链检查(断链/出链≥2),从源头根治「新建页面 → 缺元数据/缺索引」的反复模式(8/10、8/13、8/14 连续三天)。用法见 知识库运维体系.md 工具说明「wiki-new-page.py」。
- 🔴 引用前查 status 纪律(t_cf452d9a,2026-09-06 深度分析三.2 固化):新建/新改 active 页时,「关联页面」区或正文引用其他文档前,必须确认目标页 status——引用 superseded/archived 页时行尾必须带状态标注((⛔ 已废弃,superseded) / (📦 已归档)),否则 T7 conflict-check 报「active引用非active」。wiki-new-page.py 已内置建页时点检测(口径与 T7 一致:历史沿革区之后不查、代码围栏/行内码不查、带标注行豁免),检出即提示标注模板;历史叙述区内的旧引用无需标注(本就是历史)。
- 每个页面以 YAML frontmatter 开头(见下方)
- 使用 wikilinks 在页面间建立链接(每个页面至少 2 个出站链接)
- 🔴 wiki frontmatter version 写入方铁律(2026-09-26 t_59f86a63):写条目 / 维护页面时不动 frontmatter version(不填、不改、不凭印象填版本号),只写正文——该字段由 check_kb_staleness.py 每日按 hermes --version 实测值统一维护。细则与例外见下方「version 字段」章;也可用检索串 不动 frontmatter version 定位本约定全部落点。
- 🔴 交付声明同步铁律(2026-09-11,D5 闸门实测固化):看板任务 run metadata 的 changed_files 里声明改过的 wiki 页,会被验收联动闸门(D5:auto_accept.py::_check_wiki_sync → check_delivery_wiki_sync.py)交叉验证——判据只看 frontmatter updated 是否 ≥ 任务开始日期,与文件 mtime 无关。改了正文但漏刷 updated,任务被拦「声明更新但目标页未实际更新」,每次交付都会被拦。自查:python3 ~/.hermes/scripts/check_delivery_wiki_sync.py --task-id t_xxx --json(verdict: ok = 通过)。
- 🔴 顶部写入 frontmatter 感知铁律(2026-09-06,R-0906-08 根治 t_e8686dcf):往 log.md/踩坑记录/决策清单等流水文档「顶部插入新条目」时,禁止锚定文件首行 --- 或从文件第 1 行前写入——条目会落进 frontmatter 起始/结束分隔符之间破坏 YAML 解析(2026-09-06 20:30 实证)。必须用统一子命令 python3 ~/.hermes/scripts/wiki_log_archive.py log-append "条目"(frontmatter 感知:自动定位结束 --- 插到正文区顶部 + 刷新 updated + 自动备份;--doc 踩坑记录/--path 其他.md 指定目标;--dry-run 预览)。脚本/代理手写插入逻辑时同样必须先定位 frontmatter 结束分隔符再插入。🔴 并发写保护(2026-09-16 t_d6dbdf1e):log-append 写入已具备 flock + CAS + 原子替换(同一入口并发不丢条目;锁外写入者被 CAS 拦下、冲突二次不符 [FAIL] exit 1 零覆盖);仍不要绕过该入口直写流水文档——直写既不受锁保护,还会把正在持锁的写入者的 CAS 打回重试。
- 按时间倒序排列:所有按日期累积条目的文件(log.md、巡检报告、变更日志等),新条目排在最前,旧条目排在最后。方便查阅最新记录。
- 🔴 物理隔离铁律(2026-08-10 正生确立):~/wiki/ 目录 = 知识库本体。所有知识库内容必须在 ~/wiki/ 下;所有不进知识库的内容(临时调研、购物调研、一次性分析、工作文件等)一律存放 wiki 之外(如 ~/.hermes/reports/<业务>/),禁止放入 wiki 的任何子目录。判断依据 = 内容是否进知识库,而非是否值得保存。隔离靠物理位置,不靠巡检排除规则。非知识库数据不维护、不进索引。
- 🔴 改前备份落点铁律(2026-09-26 t_afd51a8e 收口):wiki 页面的改前备份一律落 wiki 树外——统一走 python3 ~/.hermes/scripts/safe_backup.py <页> <tag>(落集中区 ~/.hermes/backups/,自带保留策略);脚本自带的版本归档走页面同目录 .versions/。禁止在 ~/wiki/ 内生成任何 *.bak* / .orig / .old——孤儿扫描只认 .md 后缀,树内备份不在任何检测面、只会无限累积(2026-09-25 实测 17 个,09-26 复查仍余 9 个)。原子写豁免(2026-10-10 t_efc89f2f 收敛):.tmp/.temp 精确结尾且非备份家族 = 「写临时文件 + os.replace/rename」通用原子写模式的中间文件,非备份形态,放行(含 mkstemp 的 .<name>.XXXX.tmp);备份家族优先于豁免——x.bak.tmp 这类「备份的临时件」仍拦。判据:find ~/wiki -name "*.bak*" -not -path "*/.versions/*" 输出应恒为 0(现存 9 条为 2026-09-26 前的历史残留,处置见看板 t_afd51a8e)。形态禁令覆盖一切写入方式(2026-10-02 t_fa622971 收口):不限 cp 命令——脚本内 shutil.copy / shutil.copy2 / 文件名拼接任意后缀(.bak、.bak-*、.bak_*、.bak.*、.pre_*、裸 .bak 等)都在禁内,worker 现写的临时脚本(kb_sync 类知识库同步脚本)同受约束;标准写法只有一种——python3 ~/.hermes/scripts/safe_backup.py <文件> <tag> 或脚本自带 .versions/ 归档。基准后违规实证:t_0824ae34 的 kb_sync_t0824ae34.py:19(.bak-sync-*)、t_ef187537(.pre_*.bak)、t_099d91e6 时段(.bak_<ts>)等 16 条,归属清单见 /Users/mac/.hermes/kanban/deliverables/t_fa622971_wiki备份写侧根治.md。机械拦截层(2026-10-09 t_7361185c,文本层之外的执行层):10-09 复发实证文本约束是概率性遵守(t_0363db04 body 已含铁律仍被 execute_code 自写 copy 绕过),故下沉两层机械防线——① L1 写入口拦截 ~/.hermes/scripts/wiki_write_guard.py(sitecustomize 装入 Hermes venv 与 miniforge3 双解释器):Python 一切写入口(open / os.open / os.rename / replace / link / symlink,覆盖 shutil.copy* 与 pathlib 写)命中「树内备份形态」即抛 PermissionError 并疏导到 safe_backup.py,取证日志 ~/.hermes/logs/wiki_write_guard.log;判据含「同目录现有文件名 + 任意附加后缀」前缀判定——后缀叫什么都兜住(后缀枚举永远追不上任意命名,实测 wiki 树零合法前缀对=零误伤);② L2 每分钟 sweep(wiki_residue_sweep.py → safe_backup.py --sweep-wiki,cron 全局每分钟):兜住 shell cp 等绕过 Python 层的形态,树内残留 ≤60 秒自动迁出留档至 ~/.hermes/backups/wiki_residue_auto_<日期>/(mv 非删,JSONL 取证 ~/.hermes/logs/wiki_residue_sweep.jsonl)。紧急逃生口 WIKI_GUARD_DISABLE=1(仅限紧急、事后登记)。本条文语义不变,机械层是执行层兜底。脚本入口层统一挂载(2026-10-12 t_fcc4b1d3):此前铁律只落在建卡提示文本上、靠执行侧自觉,而 wiki 写入有相当一部分走脚本入口(cron / no_agent / 交付环节),入口本身不备份 ⇒ 经口改动稳定缺快照。现 25 个 Python 入口 + 2 个 shell 入口(共 44 个写入点)统一挂 safe_backup.py(薄封装 ~/.hermes/scripts/wiki_prewrite_backup.py,目标存在才备份、失败可见不阻断,WIKI_PREWRITE_BACKUP=0 可临时关闭);清单与豁免理由见 ~/.hermes/kanban/deliverables/t_fcc4b1d3_wiki写入入口改前备份挂载报告.md。
status: active # 页面状态机(2026-08-25;2026-09-26 增 draft):active/draft/superseded/archived,默认 active
type: entity · concept · comparison · query · summary · project · report · meta
maintenance: weekly # 维护频率(2026-08-26 元数据矩阵 v1):daily/weekly/monthly/quarterly,默认 weekly,active 内容页/指针页必填,词表不含 none
tags: [tag1, tag2] # tags 受控白名单(17 词)见「元数据矩阵 v1」章节
related_skills: [skill-name-1, skill-name-2] # 可选 — 关联技能(技能目录名),B3 互挂