{
  "_comment": "灵枢写入审核策略（合规 + 纪律）。由 md_cg/audit.py:load_rulebook() 经 MDCG_POLICY_FILE 读取。forbidden=命中即 REJECT（禁止写入，对所有 content_kind 生效）；required=缺失即 REJECT（必需要素，默认对所有 kind 生效，可由 required_kinds 收窄到指定 kind）。两者全空则 text 类写入恒判 DEFER（'无规则不能假装合规'）。required 缺失时返回体如实列出全部缺失项并记入负记忆（rejected），补齐后重写即可——不是重试无用。",
  "_note": "本文件只放**高精度**模式——宁可漏报也不误伤正常记忆。长 hex（git SHA）等易误伤的模式刻意不收。`tk_[0-9a-f]{8,}` 是灵枢令牌 id 形态（2026-09-28 增，使用者裁定）：令牌 id 本身即凭据，正文里出现即视为凭据入库——此前一批归档实测有一条明文令牌正是因缺此模式而过了闸（仓库发版门禁 check_publish_artifact 早有同类 TOKEN_MDCG 规则，写入闸门此前没有），补上后「凭据不入库」在写入当刻才真正成立；不误伤 `tk_fake`/`tk_zzzz` 一类非 hex 哑值。required 当前收窄到 text 类（required_kinds=['text']）：六要素是「归档写入成文格式」的要求，work_wip 等过程性内容不受此约束，但 forbidden 仍对其生效。required_labels 与去空后的 required 一一对应，仅用于报错展示（写入返回的缺失清单），不影响判定；该键缺失或与 required 长度不一致时回落显示正则串本身。**形态口径（2026-09-28 收单点）**：必需正则 `^#\\s*<要素名>` **不要求冒号**——`# 生效条件：<值>` 与 `# 生效条件` 后换行接值两种形态都算已声明；检索面判据 `md_cg/nodefile.py::ccg_mark_present`（及其取值面 `ccg_field_value`）已与本文件**同一正则语义**。此前检索面要求冒号，致无冒号归档过闸后被判 BLINDSPOT（存量实测 88 件，收单点后复扫不一致 = 0）。另注：二级标题 `## <要素名>` 与缩进标题两侧**同判不认**——这是与正则一致的边界，非疏漏。**全形态令牌（2026-09-28 增，PR#44 复核时补）**：`mdcg1\\.[A-Za-z0-9._\\-]{20,}`—— 令牌是 `mdcg1.<role>.<id>.<secret>`（tokens.make_token）；只禁 id 段会让「id 命中而 role/密钥段落进负记忆」：负记忆脱敏按命中片段替换，掩掉 id 却留着密钥段。本条与发布门禁 `check_publish_artifact` 的 TOKEN_MDCG **同一口径**（写入闸门此前没有 = 两闸分叉）。注意：写入闸门**不做**发布闸那种占位符豁免（那是「红着等于没门禁」的取舍），故正文里连示例令牌也会被拒——写格式请用泛形 `mdcg1.<role>.<id>.<secret>`（尖括号不在字符类内，不命中）。调整规则只需改本文件，无需改代码。**受理面口径（2026-09-28 同日裁定「不认大写，统一只认小写」）**：`md_cg/tokens.py::parse_token` 对 role/token_id 拒收含大写者（不再 `role.lower()` 静默归一），故本表两条令牌规则**有意**保持窄形态（`[0-9a-f]`、不带 `(?i)`）——识别面宽是为了拦得住，受理面窄是为了说得准，两面组合后不存在「检测漏 + 受理收」的缝隙。若日后要把本表改成大小写不敏感，须先确认受理面仍拒大写，否则窄形态会变成误报源，而大写 hex id 反而成了可用凭据。守卫：`md_cg/test_token_lowercase_form.py`（36 断言，`--head-baseline` 红基线 11 红）。**同日补裁（三面口径）**：使用者裁定「已有测试把大写归一当预期行为。大写也转小写识别，以后写统一小写，现有的大写内容就不动了」——故**入参面**（角色/单元名 role=、as_unit=）继续允许大写并归一小写（凭据＝存量断言 `test_p46_unit_scope.py` 的 C2），**令牌字符串面**照旧拒大写（本表两条规则保持窄形态即以此成立），**写面**以后一律小写形态，**存量大写内容不迁移**；两者差异是有意的，G8 组把三面一并钉死，勿「统一」掉。　issue #82（2026-10-09 设计者裁定：禁表扩边界）：第 7 条由 (?i)\\b(...)\\s*[:=：]\\s*\\S{6,} 改为「英文侧保留 \\b、中文侧不加 \\b」并把值侧收紧为『含数字的连续凭据形态 token』——同时修两处：补漏（『我的密码：abc』因汉字间无词边界而漏）与减误伤（原式对『密码：三联体密码子…』这类中文知识会命中）；新增第 12 条覆盖『是/为/等于/is』形态。**#82.2（2026-10-09 二轮，DSH 端实施）：纯空格形态（『密码 X』）已收**——第 7 条分隔段由 `\\s*[:=：]\\s*` 扩为 `(?:\\s*[:=：]\\s*|[ \\t]+)`，即「横空白分隔」与「冒号/等号分隔」并列；刻意**不含换行**（换行分隔的跨行匹配在 markdown 语料里易误伤，守本文件「宁漏勿伤」取向）。值侧不变（仍要求含数字且尾长≥5 的 ASCII 凭据 token），故「密码 三联体密码子…」仍不误伤。存量复扫（1701 个受追踪文本文件）：第 7 条命中 11 → 12 处，新增 1 处且即本件守卫的残留自陈行，**语料误伤 0**。同族残留未收：第 5 条 `api_key` 的分隔段仍是强制的 `[:=]`，「api_key abc123…」形态仍漏——同源但属另一规则的边界扩面，待裁定，本笔不动。　issue #90（2026-10-09）：第 7/12 条英文侧的 \\b 在**下划线前缀**（db_password=）与**中文前缀**（数据库密码：）前不成立 ⇒ 改为 (?<![A-Za-z0-9])（只排除英文数字前缀，容许 _ 与汉字前缀）。",
  "forbidden": [
    "-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----",
    "-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]{0,8192}",
    "\\bsk-[A-Za-z0-9_\\-]{20,}",
    "\\bAKIA[0-9A-Z]{16}\\b",
    "\\bgh[pousr]_[A-Za-z0-9]{20,}\\b",
    "(?i)\\bapi[_-]?key\\s*[:=]\\s*[A-Za-z0-9_\\-]{16,}",
    "(?i)\\b(app[_-]?secret|appsecret|client[_-]?secret|secret[_-]?key|access[_-]?key)\\s*[:=]?\\s*[A-Za-z0-9]{16,}",
    "(?i)(?:(?<![A-Za-z0-9])(password|passwd|pwd)|(密码|口令))[ \\t]*[:=：]?[ \\t]*(?:是|为|等于|is)?[ \\t]*[:=：]?[ \\t]*[\"\\u201c\\u201d\\u300c\\u300d\\u2018\\u2019]?(?=[^\\s\"\\u201c\\u201d\\u300c\\u300d]*[0-9!@#$%^&*()_+\\-=\\[\\]{};:,.<>?/~`|\\\\])[^\\s\"\\u201c\\u201d\\u300c\\u300d]{6,}",
    "(?i)\\bBearer\\s+[A-Za-z0-9._\\-]{20,}",
    "[a-z][a-z0-9+.\\-]*://[^/\\s:@]+:[^/\\s@]+@",
    "\\btk_[0-9a-f]{8,}\\b",
    "mdcg1\\.[A-Za-z0-9._\\-]{20,}",
    "(?i)(?:(?<![A-Za-z0-9])(password|passwd|pwd)|(密码|口令))[\\s]*(?:是|为|等于|is)[ \\t]*[:=：]?[ \\t]*[\"\\u201c\\u201d\\u300c\\u300d\\u2018\\u2019]?(?=[^\\s\"\\u201c\\u201d\\u300c\\u300d]*[0-9!@#$%^&*()_+\\-=\\[\\]{};:,.<>?/~`|\\\\])[^\\s\"\\u201c\\u201d\\u300c\\u300d]{6,}"
  ],
  "required": [
    "(?m)^#\\s*功能名",
    "(?m)^#\\s*生效条件",
    "(?m)^#\\s*子功能",
    "(?m)^#\\s*执行",
    "(?m)^#\\s*验证方式",
    "(?m)^#\\s*不适用条件"
  ],
  "required_kinds": [
    "text"
  ],
  "required_labels": [
    "功能名",
    "生效条件",
    "子功能",
    "执行",
    "验证方式",
    "不适用条件"
  ]
}
