with one click
canon
三省引擎(CMG)典则线 (Canon) — 规则生产库。v2.7.2 默认固化阈值10→3。纯静态规则层,不执行拦截、不存记忆。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
三省引擎(CMG)典则线 (Canon) — 规则生产库。v2.7.2 默认固化阈值10→3。纯静态规则层,不执行拦截、不存记忆。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Use when the user says "dashboard", "仪表盘", "!dashboard", or wants to view/manage Canon-Mnemonic-Guard rules, config, or companion skills. Launches a local web dashboard at localhost:8765 with rule browsing, config management, companion skill monitoring, trend charts, ZIP export, batch operations, and type conversion.
三省引擎 (CMG) — 取自「吾日三省吾身」。v5.6.0 +Dashboard v1.0.0 +Guard v4.8.3 +sentinel v1.4.0。三条核心线(Canon/Guard/Mnemonic) + 一条外观(CMG) + 两个插件(sentinel硬拦截/skill-autoload自启动)。对外 role:guard stage:pre_action。
三省引擎(Canon-Mnemonic-Guard)护栏线 (Guard) — 规则执行器。读取 Canon 规则库,执行五层前置拦截。Hermes 平台搭配 cmg-guard 插件实现内核级硬拦截,其他平台靠 Skill 层自觉。v4.8.3 文档精简。
三省引擎(CMG)忆存线 (Mnemonic) — 状态记忆层。v3.5.3 默认固化阈值10→3。纯记忆状态层,不生产规则不执行拦截。
| name | canon |
| description | 三省引擎(CMG)典则线 (Canon) — 规则生产库。v2.7.2 默认固化阈值10→3。纯静态规则层,不执行拦截、不存记忆。 |
| version | 2.7.2 |
| role | producer |
| stage | system_anchor |
| dependencies | [] |
| min_hermes_version | any |
| platforms | ["linux","macos","windows"] |
| author | L1veSong |
| license | MIT |
| metadata | {"hermes":{"tags":["cmg","canon","rules","self-reflection"],"related_skills":["guard","mnemonic","canon-mnemonic-guard"]}} |
角色: producer (规则生产锚点) | 阶段: system_anchor (系统锚点层)
三省引擎(CMG)典则线。从 CMG v5.0.2 物理拆分独立。不执行拦截、不存记忆——只生产规则。
~/.hermes/self-reflection/
├── errors.jsonl # 原始错误记录 (永久追加)
├── patterns.json # 匹配模式库 (去重压缩)
├── state.json # 跨会话状态
├── rules/ # Obsidian 结构化规则目录
│ ├── _index.md # 自动索引 + wikilinks 表格
│ ├── ban/ # 禁止项
│ ├── gap/ # 缺失项
│ └── lazy/ # 偷懒项
├── config.json # 用户配置
└── checklists/ # 防偷懒清单
| 版本 | 变更 |
|---|---|
| v2.7.2 | +默认固化阈值10→3 |
| v2.7.1 | +P2补全: 草稿快速通道(接收Mnemonic同会话推送) + 与Mnemonic v3.5.1联动 |
| v2.7.0 | +误报自动降级(连续否决≥3次→降soft) + 规则有效期(!remember --expires 7d) |
| v2.6.0 | +规则分级(hard/soft/monitor) + 修正模板(correction_template) + 用户纠正级别调整 + level_history追踪 |
| v2.5.1 | +推荐列表自动扫描: config.json recommendations + !scan-recommendations + plugins 扫描源 |
| v2.5.0 | +C1 定时扫盘: 加载时检查距上次扫盘天数,超阈值自动触发 |
| v2.4.1 | 护栏逻辑剥离至 guard-spec.md,CMG v5.1.0 四包制分装 |
| v2.4.0 | +规则效果评分 +角色声明制 +简化触发词 +导入导出 |
| v2.3.1 | +规则冲突检测与自动裁决 |
| v2.3.0 | +依赖解耦(RuleReader接口+7适配器) +可配置扫描源 +模式切换 |
| v2.2.9 | +首次真实扫盘提取+固化执行 |
| v2.2.3 | +角色声明制(废除数字优先级) |
| v2.2.0 | +扫盘提取 |
| v2.0.0 | Obsidian 结构化 rules/ 目录 |
读取 ~/.hermes/self-reflection/config.json。如不存在,使用默认值(含 auto_scan_interval_days: 7)。
优先加载 rules/ 目录(结构化规则),降级加载 rules.permanent.md(v1 兼容)。
读取 ~/.hermes/self-reflection/state.json,核心字段:
{
"last_solidify_at": "ISO8601",
"last_scan_at": "ISO8601",
"errors_since_solidify": 5,
"sessions_since_start": 12,
"last_activation": "ISO8601"
}
last_scan_at 记录上次扫盘时间(v2.5.0 新增)。
比较 errors_since_solidify 与 auto_solidify_threshold。
触发条件: 每次 Canon 加载时自动执行。
执行步骤:
1. 读取 state.json → 获取 last_scan_at
2. 计算距上次扫盘的天数
3. 读取 config.json → auto_scan_interval_days(默认 7)
4. 如果 距上次扫盘 ≥ auto_scan_interval_days → 触发扫盘
- 执行「扫盘提取」章节的完整流程(扫描 SOUL.md / Obsidian / Memory / Skill)
- 更新 state.json: last_scan_at = now()
- 输出: "定时扫盘完成。距上次 {N} 天。发现 {M} 条准则 → 待用户确认导入。"
5. 如果未到阈值 → 跳过
- 输出: "距上次扫盘 {N} 天(阈值 {D} 天),跳过定时扫盘。"
降级: state.json 缺失或 last_scan_at 不存在 → 视同上一次从未扫盘,首次加载时自动触发。
触发条件: 每次 Canon 加载时自动执行(在 C1 扫盘之后)。
执行步骤:
1. 读取 SOUL.md → 搜索 [CMG v{x}.{y}.{z}] 标记
2. 检测结果:
✅ 标记存在 + 版本匹配 → 静默通过
⚠️ 标记存在 + 版本过旧 → 输出: "CMG 已升级到 v{x},SOUL.md 激活标记仍为 v{old}。更新?[Y/N]"
❌ 标记不存在 → 输出: "SOUL.md 未找到激活标记,护栏未自动生效。重新写入?[Y/N]"
3. 如果 C1 扫盘触发(距上次扫盘超阈值):
- 扫盘流程自动包含推荐列表扫描
- 检查 config.json → recommendations.items[] 逐项
- 新检测到的已安装推荐 → 提示启用
4. 如果 C1 扫盘未触发(未到阈值):
- 跳过推荐扫描(避免每次对话都扫)
- 用户可用 !scan-recommendations 手动触发
推荐扫描输出格式(扫盘时自动包含):
📋 推荐列表(自动扫描):
✅ 8 个已就绪
⚠️ 1 个待配置: plur(已安装但未启用 → 输入 !scan-recommendations 配置)
❌ 0 个未安装
激活标记丢失的恢复流程:
⚠️ SOUL.md 中未找到 CMG 激活标记。
护栏规则当前未自动生效。
原因可能:
1. 你手动删除了 SOUL.md 中的 [CMG v...] 行
2. SOUL.md 被其他工具覆盖
3. 这是首次在新设备上使用 CMG
是否重新写入激活标记?
[Y] 恢复 — 重新写入 [CMG v5.5.2] 加载 canon-mnemonic-guard 护栏规则
[N] 跳过 — 护栏保持停用,下次扫盘再提醒
选择 [Y/n]:
注意: 激活标记丢失≠CMG 损坏。规则库、配置、推荐列表全部在 ~/.hermes/self-reflection/ 中完整保留。丢失的只是 SOUL.md 中的一行触发器。
首次安装: 安装时执行初始扫盘 → 写入 last_scan_at。后续按阈值周期触发。
读取 checklists/ 下 config.json 中启用的 YAML 文件。
必须输出: "Canon v2.7.2 已激活。{N} 条规则({ban}/{gap}/{lazy})。距上次扫盘 {D} 天。定时扫盘: {on/off}(间隔 {X} 天)。"
任何表达「记录错误行为 + 希望未来避免」的语句触发。三步走:生成规则 → 写入 rules/ → 更新 patterns.json。
新规则写入前扫描同类型规则。跨类型检测(ban↔gap↔lazy)已启用。冲突时 clarify 四选一裁决。
v2.6.0 新增。所有规则必须标注级别,Guard 根据级别决定拦截策略。
| 级别 | 拦截行为 | 重试策略 | 设置方式 | 适用场景 |
|---|---|---|---|---|
| hard | 立即拦截 | 自动重试直到修正 | !remember --hard | 数学错误、安全违规、API错用 |
| soft | 提醒后放行 | 提醒1次,不重试 | !remember --soft(默认) | 启发式建议、可协商规则 |
| monitor | 不拦截 | 纯计数+报告 | !monitor | 观察性规则、实验性规则 |
---
type: ban
id: rule_xxx
level: hard # ← v2.6.0 新增:hard / soft / monitor
correction_template: "具体修正方向" # ← v2.6.0 新增
---
每条 hard 规则必须配置。Guard 拦截后注入此模板到 RetryLoop,告诉 AI 怎么改。
格式要求:
示例:
# 好:具体可执行
correction_template: "所有 OCR 坐标必须除以 2。请将你输出的所有坐标数值全部除以 2 后再输出。"
# 好:给出替换方案
correction_template: "禁止 pyautogui.hotkey('cmd','v')。请替换为 osascript keystroke 'v' using command down。"
# 差:只说了违规没说怎么改
correction_template: "不要用 pyautogui hotkey。"
# 差:太长了
correction_template: "关于 pyautogui 的 hotkey 功能,在 macOS 环境下,由于系统权限和输入法限制,Cmd 修饰键有概率丢失..."
未配置的 hard 规则: Guard 使用通用回退——"你的回答违反了规则:{rule_name}。请遵守该规则重新生成。"
用户纠正某规则 → 该规则提升一级: monitor→soft, soft→hard
hard 不再升级(已是最高)
当前会话内强化、跨会话恢复原级(除非再次纠正)
规则 frontmatter 新增字段追踪级别变化:
level_history:
- {from: soft, to: hard, reason: "用户纠正", date: "2026-05-23"}
!remember 增强!remember "禁止xxx" → 默认 soft
!remember --hard "禁止xxx" → hard
!remember --soft "注意xxx" → soft(冗余,但明确)
!monitor "观察xxx" → monitor
命中率/误报率/最后命中/创建日期四指标。误报率>30%标记待调整,180天未命中提示过期。
v2.7.0 新增。 规则不再永久锁定在 high 级别。用户连续否决/忽略某规则达到阈值 → 自动降级。
降级规则:
hard 规则被用户连续否决(说「这不是错误」「放行」)≥ 3 次 → 自动降为 soft
soft 规则被用户连续否决 ≥ 5 次 → 自动降为 monitor
monitor 规则被用户连续否决 ≥ 10 次 → 标记「待移除」,下次扫盘提示删除
降级后观察期 7 天:期间无再次违规 → 维持新级别
观察期内再次违规 → 恢复原级别
降级日志: rules/ frontmatter 新增 downgrade_history 字段追踪降级事件。
v2.7.0 新增。 不是所有规则都永久生效。临时规则到期自动失效。
用法:
!remember --expires 7d "论文提交前检查格式" → 7天后自动失效
!remember --expires 30d "项目A的特殊约束" → 30天后
!remember --expires never "禁止虚构幻觉" → 永久(默认)
到期行为: 规则到期后自动从 rules/ 移至 rules/.expired/ 归档目录。下次扫盘时提示:「{N} 条规则已过期,是否清理?」
frontmatter 新增字段:
expires_at: "2026-06-01T00:00:00Z" # ISO8601,到期时间
expired_action: "archive" # archive=归档 / delete=删除
adaptive 模式根据用户纠正频率动态调整(高频→5,正常→10,低频→20),可切换为 fixed。
!export → rules/ + state.json + patterns.json → ZIP。!import <path> → 逐条冲突检测 → 确认导入。
扫描 SOUL.md / Obsidian 铁则库 / Memory / 其他 Skill 中的准则类内容。过滤规则:含「禁止/必须/规则/铁则/HARD-GATE」的准则类提取,纯偏好/闲聊/日志跳过。
扫盘不再是一次性的。每次 Canon 加载时检查 last_scan_at,超过 auto_scan_interval_days(config.json 中 auto_scan_interval_days,默认 7 天)自动触发扫盘。新增规则源(如新安装的 Skill、Obsidian 新增的铁则)会自动纳入。
扫盘中自动执行推荐检测(v2.5.1 新增): 扫盘流程自动包含推荐列表扫描——检查 config.json 的 recommendations.items[],对每个推荐项验证是否已安装、是否已配置。未配置的已安装项 → 提示用户启用。
用户说「扫盘」/「扫描规则」/「提取准则」→ 立即执行扫盘,不受阈值限制。执行后更新 last_scan_at。
触发词: !scan-recommendations 或「扫描推荐」/「检查推荐列表」
独立于规则扫盘。只扫描 config.json 的 recommendations.items[],不扫规则源。
执行流程:
1. 读取 config.json → recommendations.items[]
2. 逐项检测安装状态:
- type=skill: 检查 detection_path 文件是否存在
- type=plugin: 检查 pip entry points (detection_group + detection_name)
- type=mcp_server: 检查 detection_path 文件是否存在
3. 逐项检测配置状态:
- skill: 检查 skill 是否在 Hermes 已安装列表中
- plugin: 检查 config.yaml plugins.enabled 是否包含
- mcp_server: 检查 ~/.hermes/config.yaml 是否有对应 provider
4. 分类输出:
- ✅ 已安装+已配置: N 个(正常)
- ⚠️ 已安装+未配置: N 个 → 逐一询问用户是否启用
- ❌ 未安装: N 个
5. 用户确认启用 → 自动配置(skill: 无需操作已可用; plugin: 写入 config.yaml; mcp: 写入 custom scan source)
6. 更新 recommendations.items[].configured = true
7. 更新 recommendations.last_scan
自动询问格式:
⚠️ 发现已安装但未配置的推荐工具:
1. verify-before-completion (护栏增强)
→ Guard 拦截「声称完成但未验证」后自动调用
启用? [Y] 是 [N] 跳过
2. rtk-rewrite (成本优化)
→ 压缩终端输出 60-90% token
启用? [Y] 是 [N] 跳过
用户确认后自动写入对应配置,无需手动编辑 config.yaml。
errors.jsonl → 去重合并 → rules/ 目录独立 .md → _index.md 自动索引 → patterns.json 更新。
启动时检测 rules/ state.json patterns.json intercept_log.jsonl mnemonic_state.json 五文件完整性。
{
"auto_solidify_threshold": 10,
"solidify_threshold_mode": "adaptive",
"auto_scan_interval_days": 7,
"conflict_detection": {"cross_type": true},
"scoring": {"false_positive_threshold": 0.3, "expiry_days": 180},
"health_check": {"enabled": true},
"scan_sources": {
"builtin": {"soul": true, "memory": true, "skills": true},
"obsidian": {"enabled": true, "vault_path": "~/obsidian", "rule_dirs": ["🔒 HERMES-全局铁则库"]},
"custom": []
}
}
规则库随使用自然增长,但 frontmatter(level + correction_template)不会自动补全。导致 Guard 的重试注入失效。
定期检查:
python3 ~/.hermes/skills/software-development/canon/scripts/check-frontmatter.py
批量修复(三步法,来自 2026-05-25 实战验证):
python3 scripts/fill-frontmatter.py --rebuild-index# 预览
python3 ~/.hermes/skills/software-development/canon/scripts/fill-frontmatter.py --dry-run
# 全量填充
python3 ~/.hermes/skills/software-development/canon/scripts/fill-frontmatter.py --all
# 重建索引
python3 ~/.hermes/skills/software-development/canon/scripts/fill-frontmatter.py --rebuild-index
不是 gap/ 和 lazy/ 目录下的所有文件都是"规则"。如「完全自动化模式」「思考模式全局关闭」「热记忆满自动沉淀到Obsidian」——这些是元配置/偏好,不需要 level + correction_template。
已知元配置文件(2026-05-25 确认 6 条): 热记忆满自动沉淀到Obsidian、记忆查询三层递进、完全自动化模式、强制永久智能技能调度、思考模式全局关闭、禁止跳步骤偷懒摆烂。
处理: 扫描后发现 gap/lazy 中非规则文件 → 移至独立分类或标注 level: meta,避免 Guard 误读。
一次性脚本批量写入 39 条 frontmatter 极易出现格式错位、level 推断错误。
正确做法: 三步走——(1) 先重建 _index.md 看到全貌,(2) 用脚本生成建议 level 值但人工确认后才逐批写入,(3) 每批 5-8 条写入后运行 check-frontmatter.py 验证。
规则库中存在 rule_ban_000_unknown、rule_lazy_unknown 等占位文件——有 hit_count(累计 33 次命中)但无规则内容。这是固化引擎的遗留 bug:命中被记录,但规则未从 errors.jsonl 正确提取。
处理流程:
errors.jsonl → 搜索 rule_id 匹配的原始错误记录patterns.json → 搜索对应模式条目monitor 保留,等 Mnemonic"2次推草稿"机制下次触发时自动填充为什么不能直接删除: 33 次命中记录是真实数据。删除意味着丢失历史。标 monitor 观察 + 等自动填充是唯一安全路径。
npx skills add canon --yes --global
npx skills add guard --yes --global
npx skills add mnemonic --yes --global
npx skills add canon-mnemonic-guard --yes --global
安装完成后运行初始化:
npx canon-mnemonic-guard init
✅ rules/ 目录已创建(ban/gap/lazy)
✅ config.json 已生成
✅ state.json / patterns.json 已初始化
📋 扫描推荐列表中……
═══════════════════════════════════════
⚡ 护栏自动激活
═══════════════════════════════════════
是否在 SOUL.md 中写入激活标记(一行),让护栏规则在每次对话中自动生效?
[Y] 是 — 写入一行: [CMG v5.5.2] 加载 canon-mnemonic-guard 护栏规则
[N] 否 — 跳过,用 !scan 手动触发
选择 [Y/n]:
选 Y: 在 SOUL.md 末尾追加一行激活标记。Hermes 读取 SOUL.md 时看到这行 → 自动加载 CMG 技能 → Guard 护栏在每次对话中生效。
选 N: 规则仅在 rules/ 目录中。用户手动 /skill canon-mnemonic-guard 或 /skill guard 触发。
[CMG v5.5.2] 加载 canon-mnemonic-guard 护栏规则
这是 SOUL.md 中普通的一行文本。你可以随时手动删除——删掉后护栏不再自动生效。下一次扫盘时会检测到缺失并提醒。
每次扫盘(C1 定时或 !scan 手动)都会检查 SOUL.md 中是否存在 [CMG v 开头的激活行:
| 检测结果 | 行为 |
|---|---|
| ✅ 标记存在且版本匹配 | 正常,静默通过 |
| ⚠️ 标记存在但版本过旧 | 提示升级:「CMG 已升级到 v{x},SOUL.md 中激活标记仍为 v{old}。更新?[Y/N]」 |
| ❌ 标记不存在 | 提示缺失:「SOUL.md 中未找到 CMG 激活标记,护栏规则未自动生效。重新注入?[Y/N]」 |
用户选 Y → 自动更新/写入标记。选 N → 保持当前状态。