小说地图构建(novel-map-builder)
把小说里散落在章节、对话、旁白、设定集中的地理信息,整理成可校验、可地图化、可复用的世界地图数据。
本技能的核心不是「画一张好看的图」,而是先建立可验证的空间事实体系,再交给下游去渲染。地图好不好看是第二位,方位是否自洽、成因是否成立才是第一位。
一、适用场景与触发条件
应当使用
| 场景 | 典型请求 |
|---|---|
| 单部作品地理梳理 | 「帮我整理《XX》的世界地图」「这本书的地理设定有哪些」 |
| 设定集/世界观文档结构化 | 「把这套世界观设定整理成可地图化的结构」 |
| 跨作品类型对比 | 「对比玄幻大陆型、废土型、无限流副本型的地图设计」 |
| 原创世界观搭建 | 「我要写一本小说,先把大陆、势力、禁地的地理逻辑搭起来」 |
| 地图/设定二创前置 | 「给同人地图 / 跑团模组准备地理数据」 |
| 设定矛盾排查 | 「这个世界的方位和气候是不是有矛盾」 |
| 翻译/引进作品 | 「把这部翻译小说的地理理一遍」「这本西方奇幻的大陆和王国怎么分布」 |
| 硬科幻/推理/历史 | 「《三体》的空间结构梳理成地图」「这本推理小说的城市与案发地关系」 |
| 儿童文学/绘本 | 「给这本童书做一张简单的地图,给孩子看」 |
| 同人/跑团前置 | 「给同人写地图」「跑团模组要一张可用的世界地图」 |
> 题材中立声明:《诡秘之主》示例与 guimi-map 实跑只是回归样本,不是模板。凡是只能从该作品反推出来的规则(如"灵界必须与现世重叠"),在文档中都标为可选或给出一般判据;不得把某个题材的设定当成普适地理规律。
不应当使用
- 只问某个地名「在哪一章出现」——这是检索任务,直接用 Grep/阅读。
- 只要求画一张插画风格地图——本技能可产出结构示意 SVG(
render_map.py),但不做插画级美术;插画需求转绘图流程。 - 没有任何文本依据,要求「凭空生成一个世界」——可转入原创世界构建流程,但必须把产出标记为原创设定,不得伪装成作品事实。
- 纯文本校对、错别字/标点检查——属校对任务,本技能不处理。
- 只要剧情摘要、人物关系、时间线——不涉及空间结构,走摘要/梳理流程。
- 只想查「某地名出现在哪一章」——属检索任务,直接搜原文。
触发词
小说地图、世界观地图、世界地图构建、梳理小说地理、做世界观地图、整理设定集里的地点、给同人写地图、地理设定抽取、地形体系、位面结构、地图化、设定集地理、世界观梳理、worldbuilding、fiction map。
二、五条核心原则
-
事实分层,永不混写。
每条地理结论都要标注证据等级:
-F1 原文事实:书中有明确描写或明确设定(可给章节/设定集位置)。
-F2 读者共识:百科、设定整理、读者广泛接受的归纳,原文未必有一句直述。
-F3 套路推断:基于类型惯例与文本线索的合理补全,必须显式标注,不得写成「原著设定」。
没有F3会寸步难行(多数小说不会写「本大陆位于北纬 30 度」),但把F3当F1是这类任务最大的失败。 -
先结构,后细节。
先定「世界由几层构成、每层有哪些大区、大区之间怎么连通」,再填城市与遗迹。顺序颠倒会导致后期大量返工。 -
成因必须可校验。
任何「为什么这里是这样」的解释,都要写成可被反驳的因果链:驱动因子 → 作用介质 → 作用机制 → 可观测地貌 → 剧情功能,并用「校验点」作为第六槽位。链上每一环都要有支撑,不能只写「因为灵气浓郁」。 -
地图是可计算的数据,不是形容词。
每个节点要有层级、方位、邻接、所属区域、通行方式。用「极北」「东境」这类相对方位词时,必须能落到统一的坐标系里。 -
宁缺勿造。
原文没写、套路也推不出的,标unknown并列出「需补证问题」,不要用地名填空。编造一个好听的地名,比留一个空字段危害大得多。
三、方法论骨架:五层抽取模型
L5 成因层 ← 地质 / 气候 / 超自然规则 / 历史灾变 / 人为工程
↑ 解释
L4 地点层 ← 圣地·遗迹·禁地·核心城市·要塞·秘境·灾变中心(节点)
↑ 聚合
L3 结构层 ← 地块分布·气候带·资源带·势力疆域·交通线·边界与隔绝
↑ 归类
L2 地形层 ← 地形族与亚型(高山/荒漠/海域/深渊/浮空/地下/位面裂隙/废土…)
↑ 抽取
L1 文本层 ← 章节描写·人物行程·对话·设定集·地图插图·作者访谈
- L1 → L2:把「描写」翻译成「地形类型」,解决同义异名(「黑雾之地」= 污染型禁地)。
- L2 → L3:把地形拼成空间结构,回答「世界怎么组织」。
- L3 → L4:在结构中定位功能节点,回答「哪里重要、为什么重要」。
- L4 → L5:为地貌与地点补成因,回答「为什么会长成这样」。
- 反向校验:L5 的成因必须能解释 L2/L3/L4 的观测特征;解释不了就说明推断错了或原文矛盾。
> 编号说明:上面的 L1–L5 是抽取步骤的五个抽象层;map.json 里的图层是
> L0 位面 → L1 大陆 → L2 区域 → L3 地点 → L4 街区。两套编号含义不同,不要混用。
术语映射层(展示名可换,字段与枚举不变)
不同题材用词差异很大,但数据结构是同一套。map.json 的字段名与枚举值固定不变,只允许在 map.md 的展示名上做映射;自定义词汇写进可选的 meta.term_profile(自由文本,如 "科幻/银河系")。
| 通用层 | 中文网文常见说法 | 西方奇幻 / 科幻常见说法 | 说明 |
|---|---|---|---|
| L0 位面 | 位面、诸天、境界、界 | plane / realm / dimension / universe | 世界级容器,不预设「灵气/灵界」存在 |
| L1 大陆 | 大陆、州、界域 | continent / planet / sector | 大尺度陆块或星球尺度板块 |
| L2 区域 | 国、域、州、海域 | kingdom / province / system | 行政或自然大区 |
| L3 地点 | 城、宗、秘境、遗迹 | city / site / station / colony | 可命名、可到达的具体位置 |
| L4 街区 | 城区、坊、殿 | district / quarter / deck | 城市或建筑内部单元 |
> 术语替换只影响可读性,不改变 node_type/terrain_type/evidence_level 的取值。本表覆盖不了的题材,用 T13(未归类)或 T14(星际空间/恒星系统,v1.4.0 新增)表达;仍归不了再用 node_type: unclassified,不要新造枚举。
四、工作流:快速路径与完整路径
A. 快速路径(3 步,首次使用 / 资料稀疏时)
| 步 | 动作 | 产出 | 完成判据 |
|---|---|---|---|
| Q1 圈范围 | 书名/版本/章节区间 + 一句话说清「要回答什么地理问题」 | 范围声明 | 四项齐全;缺则 🛑 STOP,先问用户 |
| Q2 抽 5–10 个关键地点 | 只取有原文锚点的地点,填 terrain_type / node_type / 粗坐标;区域 1–3 个 |
nodes[](5–10)+ regions[](1–3) |
每个地点有 source/basis,或明确标 inference |
| Q3 出最小地图 | 跑 map_lint.py,再跑 render_map.py,写 1 页 map.md |
map.json + map.md + SVG |
lint 退出码 0;SVG 有图例与免责声明 |
快速路径允许:只有 1 个图层(L2 或 L3)、causes: []、scenic_spots: []、edges 少于节点数。必须做:在 meta.scope 里写 quick,让下游知道这是最小地图而非全量。
升级到完整路径的时机:需要解释「为什么长成这样」(成因链)、需要跨层/跨位面/跨星系、需要把图发给第三方评审。
B. 完整路径(第 0–10 步,共 11 步)
| 步 | 名称 | 输入 | 动作 | 输出 | 注意事项 |
|---|---|---|---|---|---|
| 0 | 界定范围 | 作品名/文本/设定集、目标用途 | 明确「抽哪部、抽多大、给谁用」;确认是否含续作、番外、不同版本 | 范围声明(含版本、章节区间、排除项) | 不同版本地理可能冲突;连载版与实体版要分开记 |
| 1 | 建语料与索引 | 原文/设定资料 | 通读目录与设定集;建立「地名候选表」,记录首次出现位置与原文片段 | 地名候选表(名称/别名/出处/原文摘句) | 只记有出处的;同音异写先合并待定 |
| 2 | 地形归类 | 候选表 + 描写片段 | 按地形分类学归类到地形族/亚型;标注判别依据 | 地形清单(类型/亚型/判别证据/置信度) | 不为「凑类型」硬塞;不典型就写「本作不典型」 |
| 3 | 结构建模 | 地形清单 | 定层级(位面/大陆/区域/地点/建筑)、定大区、定连通方式、定边界机制 | 结构草图(层级树 + 区块 + 通道 + 边界) | 先画树再画图;跨层通道(传送门/界门)单独建边 |
| 4 | 地点定位 | 结构草图 + 候选表 | 筛出功能节点(圣地/遗迹/禁地/核心城市/要塞/秘境/灾变中心/城区),给功能标签与剧情作用 | 地点卡片(类型/所属/方位/功能/首现/关联事件) | 地点功能要写「对剧情做了什么」,不写「很重要」;城区用 district 并用 parent_node 挂到城市 |
| 5 | 风景打卡点 | 地点卡片 + 文本描写 | 按 05 的四问法筛点,抽取视觉/视点/时间/感官/民俗/可达/风险/叙事功能,按 S/A/B 评分 |
scenic_spots[](挂在既有节点上) |
渲染性描写标 descriptive_inference;不可达地点必须在 access 写明 |
| 6 | 成因推导 | 地点卡片 + 结构 | 按成因模板写五类成因因果链,逐环标证据等级 | 成因链(驱动/介质/机制/地貌/功能 + 校验点) | 一条链只允许一个主驱动因子;chain 固定 5 段,第六槽位写进 check_points |
| 7 | 结构化输出 | 以上全部 | 按输出模板生成 JSON + Markdown 地图说明 | map.json + map.md(可选 Mermaid 草图) |
坐标按 meta.coord_system 三选一:normalized_100(0–100)/ direction8(方位+距离档)/ grid(行列索引);一层内坐标体系必须统一 |
| 8 | 生成示意图 | map.json |
跑 scripts/render_map.py,按图层/区域分组、按类型/证据着色,并生成打卡点标记 |
<主题>-map.svg(可选 PNG) |
图必须带图例(含打卡点分级)、比例说明与坐标免责声明;标签/标记不得互相压盖 |
| 9 | 质量校验 | 输出物 | 跑校验清单;有脚本时跑 scripts/map_lint.py |
问题清单(严重/一般)+ 修订记录 | 红项必须清零才能交付;除红项外的问题必须写进 unresolved[](含 missing_evidence 与 where_to_look),不得只在口头说「待补证」 |
| 10 | 交付与留痕 | 校验后产物 | 输出地图数据、地图说明、示意图、未决问题清单、来源与置信度附录 | 交付包 | 未决问题要写清「缺什么证据、去哪里找」 |
命令速查(在技能根目录下执行,PowerShell 用 ; 不用 &&):
| 目的 | 命令 | 通过标准 |
|---|---|---|
| 普通校验 | python scripts/map_lint.py <map.json> |
退出码 0;红项 0 |
| 严格校验(交付前必跑) | python scripts/map_lint.py <map.json> --strict |
退出码 0;错误 0、警告 0 |
| 生成示意图 | python scripts/render_map.py <map.json> -o <out.svg> |
退出码 0;日志给出节点/区域/边/打卡点统计与 fallback 计数 |
| 文档—代码自检 | python scripts/check_consistency.py |
退出码 0;全部 PASS |
| 旧图兼容抽查 | 对旧 map.json 同时跑普通与 --strict |
缺 scenic_spots、旧 landmark 写法应通过 |
> 退出码非 0 时先读 [组号] 前缀定位规则(如 [B3] 层级越界、[D2] 证据缺依据),按 04 对应行修复后重跑,不得删规则绕过。
C. 资料稀疏时的降级(低置信度地图)
当作品只有零散地名、没有设定集、或地理描写几乎为零时,不要卡死,也不要编地名,按下面产出「低置信度地图」:
| 情形 | 产出要求 |
|---|---|
| 只有 3–5 个地名 | 只建这 3–5 个节点;regions 至少建 1 个「未划分区域」(evidence_level: unknown),节点必须能挂到区域,edges 只连原文明确提到的路线 |
| 没有任何方位描写 | 用 coord_system: direction8,节点写 direction + distance_rank(1 近/2 中/3 远),不要用 0–100 假装精确 |
| 有地名但归属不明 | 节点 region_id 不得留空:挂到最接近的上级区域,并把「所属区域未知」写入 unresolved[](missing_evidence) |
| 设定集与正文冲突 | 两条都记,evidence_level 分别标 fact/consensus,用 note 写冲突点,不擅自选一个 |
硬性要求:meta.scope 写明「低置信度」;map.md 开头声明「本图证据以 inference/unknown 为主,不可当作官方设定」;每个节点必须有 source 或 basis,写不出就进 unresolved[]。
D. 检查点(不得跳过)
| 位置 | 类型 | 必须确认 | 不通过怎么办 |
|---|---|---|---|
| 第 0 步结束后 | 🛑 STOP | 书名、版本、章节区间、交付用途四项已写进范围声明;连载/实体/番外冲突已单列 | 缺任何一项就先向用户确认,不得边抽边猜 |
| 第 3 步结束后 | 🔴 CHECKPOINT | 层级树(L0–L4)、大区划分、跨层通道、边界机制已冻结 | 未冻结不得进入第 4 步;地点归属一旦返工,后面全部重做 |
| 第 9 步结束后 | 🛑 STOP | map_lint.py --strict 退出码为 0;04 清单红项为 0;黄项全部写入 unresolved[] |
任一不满足不得进入第 10 步交付 |
E. 时间紧时的完整路径裁剪
只做 0 → 1 → 3 → 4 → 6 → 7 → 8 → 9:先给层级树 + 10~15 个关键节点 + 方位关系,成因只写最关键 3 条,打卡点可只留 2~3 个。不要跳过第 9 步——没有校验的地图数据,返工成本远高于补做。
五、事实分级与标注规范
四级证据(fact / consensus / inference / unknown)
| 等级 | 标记 | 定义 | 允许的表述 |
|---|---|---|---|
| F1 | fact |
原文/官方设定集明确写出 | 「原文设定:……」 |
| F2 | consensus |
百科、设定整理、读者共识归纳 | 「读者共识/设定整理通常认为……」 |
| F3 | inference |
由类型套路 + 文本线索推出 | 「推断(非原文):……」 |
| — | unknown |
无依据 | 「原文未交代,待补证」 |
标注三件套
- 每个节点/边/成因都带
evidence_level。 - 每条 F2/F3 结论附
basis(依据是什么:哪条描写、哪个类型惯例)。 - 交付物开头放一张置信度总表:F1 多少条、F2 多少条、F3 多少条、unknown 多少条。
判定口诀
- 能在原文找到句子 → F1。
- 只能找到「大家都这么说」 → F2。
- 只有「这类小说一般都这样」 → F3。
- 三者都没有 →
unknown,进未决清单。
六、输出物一览
| 产物 | 内容 | 用途 |
|---|---|---|
map.json |
层级、区域、节点、边、成因、风景打卡点、证据等级 | 喂给绘图/可视化/数据库 |
map.md |
人读版:世界概述、层级结构、区域表、地点卡片、打卡点、成因链、未决问题 | 评审、写作参考 |
<主题>-map.svg |
结构示意图:图层泳道/区域分组,节点形状按类型、颜色按证据等级、边按类型,打卡点按 S/A/B 标记 | 快速审图、汇报 |
map.mmd(可选) |
Mermaid 层级图/关系图 | 快速预览结构 |
sources.md |
来源清单与置信度说明 | 可追溯、可复核 |
> 标记模式语义(--markers):scenic(默认)只画打卡点,编号 S1/A2/B3 按分级独立计数;all 额外给"没有打卡点的节点"画一个空心圈,圈旁标 n{序号}(序号按节点在 nodes[] 中的先后顺序、只对当前出图可见节点递增,仅作图内对照,不是坐标、也不是打卡点编号);none 关闭全部标记。空心圈只说明该节点可锚定但暂无打卡内容,不要把它当成 B 级打卡点。
字段定义、坐标约定、图层分级、枚举值见 references/03-输出模板.md。
七、目录导航
| 文件 | 内容 | 何时读 |
|---|---|---|
references/01-抽取维度与地形分类学.md |
6 大类 38 个抽取维度;14 地形族(T0–T12 + T14 星际空间)+ T13 未归类逃生位 + 亚型 + 判别线索 | 第 2、3 步 |
references/02-成因推导模板.md |
五类成因、因果链模板、五问链检查、反事实检验 | 第 6 步 |
references/03-输出模板.md |
JSON Schema、图层/坐标/枚举、Markdown 模板 | 第 7 步 |
references/04-质量校验清单.md |
A–G 组检查清单(项数以该文件开头「合计」行为准,本处不重复计数) | 第 9 步 |
references/05-风景打卡点描述.md |
打卡点四问入选法、9 维抽取、写作模板、S/A/B 评分、证据衔接 | 第 5 步 |
references/00-调研来源与置信度.md |
案例库资料来源、版本差异、可信度边界 | 引用案例前 |
references/cases/01-东方玄幻与修真.md |
斗破苍穹、剑来、求魔、完美世界 | 找参照写法 |
references/cases/02-克苏鲁末世与灵异.md |
诡秘之主、天启预报、从红月开始、全球进化、灾厄纪元、神秘复苏 | 找参照写法 |
references/cases/03-星际与无限流.md |
超神机械师、轮回乐园、玩家凶猛、惊悚乐园、诸神愚戏 | 找参照写法 |
scripts/map_lint.py |
地图 JSON 结构校验(标准库,带日志;含 parent_node/overlap/成因链/打卡点规则) |
第 9 步 |
scripts/render_map.py |
从 map.json 生成 SVG 示意图(标准库;含打卡点标记与避让) |
第 8 步 |
examples/ |
可直接运行的示例地图 | 上手参考 |
八、输出骨架(精简版)
{
"meta": { "map_id": "...", "work": "...", "scope": "...", "version": "...", "coord_system": "normalized_100" },
"layers": [ { "layer_id": "L0", "name": "位面层", "parent": null } ],
"regions": [ { "region_id": "...", "name": "...", "layer_id": "L1", "terrain_type": "...", "parent_region": null } ],
"nodes": [ { "node_id": "...", "name": "...", "node_type": "capital|city|district|fortress|holy_site|ruin|forbidden_zone|secret_realm|catastrophe_center|hub|institution|landmark|unclassified",
"region_id": "...", "layer_id": "...", "parent_node": null, "x": 42, "y": 18, "direction": "north",
"function": "...", "evidence_level": "fact|consensus|inference|unknown", "basis": "..." } ],
"edges": [ { "edge_id": "...", "from": "...", "to": "...", "edge_type": "road|sea_route|portal|border|tributary|conflict|overlap|route_unknown",
"bidirectional": true, "cost_note": "...", "evidence_level": "..." } ],
"causes": [ { "cause_id": "...", "target": "...", "category": "geological|climatic|supernatural|catastrophic|engineered",
"chain": ["驱动因子", "作用介质", "作用机制", "可观测地貌", "剧情功能"], "evidence_level": "...", "check_points": ["..."] } ],
"scenic_spots": [ { "spot_id": "...", "name": "...", "node_id": "...", "grade": "S|A|B",
"viewpoint": "...", "best_time": "...", "visual_features": "...", "sensory": "...",
"atmosphere": "...", "access": "...", "risks": "...", "narrative_role": "...",
"tags": ["..."], "evidence_level": "...", "basis": "...", "descriptive_inference": true } ],
"unresolved": [ { "question": "...", "missing_evidence": "...", "where_to_look": "..." } ]
}
完整字段、枚举与约束见 references/03-输出模板.md。
九、常见失败模式(先看这五条)
| 失败 | 表现 | 后果 | 对策 |
|---|---|---|---|
| 造地名 | 为填补空白自创「寒霜岭」 | 污染设定、下游全错 | 空缺标 unknown,进未决清单 |
| 方位漂移 | 同一地点在不同章节被放进不同方位 | 地图无法闭合 | 建立唯一坐标表,全篇回填 |
| 成因套模板 | 凡特殊地貌都写「灵气浓郁」 | 解释力为零 | 用五问链,必须落到具体机制 |
| 层级混用 | 把副本世界当成主角所在大陆的一个城市 | 空间逻辑崩塌 | 层级树先定,跨层只走显式通道 |
| 过度推断 | 把 F3 写成「原著设定」 | 误导读者与二创 | 强制 evidence_level 字段 |
失败处理与降级(识别 → 降级 → 留痕)
遇到下列情况按表格执行,不得静默跳过,也不得为了"跑通"删掉检查项:
| 触发条件 | 降级动作 | 留痕位置 |
|---|---|---|
| 原文几乎没有地理描写 | 不造地名:只出层级骨架 + 3~5 个有据节点,其余写进未决清单 | unresolved[],severity: major |
打卡点找不到宿主节点(灵界、灰雾之上、梦境层等只有 regions 没有 nodes 的位面) |
先补该位面的承载节点(layer_id: L0,node_type 按语义取 secret_realm/landmark);证据不足补节点就不补,打卡点写进未决清单 |
节点表 + unresolved[];map_lint.py 会给出 G6 提示 |
旧版 map.json 没有 scenic_spots |
视为兼容:lint 跳过该区块,render 自动退化为无标记出图,不报错 | lint 日志「未提供 scenic_spots(按旧版结构兼容)」 |
旧 map.json 缺 meta 或 meta 字段不全 |
v1.2.1 起按结构错误处理([META]):补齐 map_id/work/scope/version/coord_system 后重跑;版本号确实查不到就写 unknown 并记入未决 |
lint 日志 + 校验记录 |
| 标记/标签压盖或空间不足 | 依次降级:--marker-labels id → --layer 局部出图 → 加大 --width → 减少打卡点条数 |
渲染日志 fallbacks/skipped 计数 + map.md 校验记录 |
| 当前图层过滤导致标记被跳过 | 不改数据:在统计里如实报 skipped,并说明这些点属于其他图层 |
渲染日志 + map.md |
| lint 报错且短期修不了(ID 重复、引用混乱) | 保留原文件副本,输出完整错误清单并按红项处理,不得删除规则来"通过" | 校验记录表 + unresolved[],severity: blocker |
脚本跑不起来(无 Python/解释器版本过低)或 map.json JSON 解析失败 |
先修环境或按报错行号修 JSON;确实无法运行脚本时,用 04 清单人工逐项核对,并在校验记录显式写「脚本未执行」,不得跳过校验直接交付 |
校验记录表 + unresolved[],severity: blocker |
十、快速调用示例
输入:用 novel-map-builder 梳理《诡秘之主》鲁恩王国及贝克兰德的地理结构,输出 JSON + 地图说明,重点解释贝克兰德雾霾与东区污染的成因。
输出要点:
1. 层级树:位面层(现实世界 / 灵界 / 灰雾之上)→ 大陆层(北大陆)→ 区域层(鲁恩王国、因蒂斯、费内波特…)→ 地点层(贝克兰德、廷根市、神弃之地…)。
2. 节点卡片:贝克兰德(首都 / 工业城邦)、东区(污染型下层区)、神弃之地(灾变中心 / 封印区)。
3. 打卡点:东区煤气灯街巷(S)、圣赛琳娜教堂穹顶(A)、拜亚姆港(A),标 descriptive_inference。
4. 成因链:工业革命 + 非凡特性聚集 + 教会管控 → 雾都气候与阶层空间分异 → 剧情功能(掩盖非凡事件、制造阶级压迫感)。
5. 证据等级:城市与方位 F1/F2;具体污染机制细节 F3 并标注。
6. 校验:方位一致、层级不越界、无编造地名、打卡点锚定有效。
7. 示意图:render_map.py 生成 SVG,带打卡点标记与分级图例。
十一、维护说明
- 新增案例:放入
references/cases/,按类型谱系分文件,不按作者或热度分。 - 修改分类学:同步更新
01的编号与03的terrain_type枚举,避免字段漂移。 - 计数只维护一处:校验项总数真值在
map_lint.py的CHECK_GROUP_COUNTS,04开头合计行由check_consistency.py比对;字段数真值在SCENIC_REQUIRED,03的字段表由同一脚本比对;SKILL.md不再重复写具体数字,避免改一处漏三处。 - 脚本改动后,用
examples/下示例与真实map.json回归(应退出码 0),再人为构造反例(parent_node缺失/成环、overlap单向、成因链 4 段、打卡点无宿主节点)验证能报错。 - 生成示意图后至少人工检查 F1–F5:图例完整、证据色一致、标签不压盖、免责声明存在、标记避让与归属正确。
- 版本升级时在
SKILL.mdfrontmatter 更新version,并在00-调研来源与置信度.md记录变更原因。 - 两个脚本各自独立运行(只用标准库、不互相 import),宁可保留少量重复也不拆共享模块:这样任一脚本可被单独复制到别的技能或项目里直接跑。重复逻辑的边界是「JSON 读取 + 证据计数」,其余不应复制。
- 计数一致性自检:改动枚举、检查项或字段表后,必须跑
python scripts/check_consistency.py(退出码 1 即说明文档与代码计数已经漂移)。真值来源只有两处:map_lint.py的常量/检查项登记表,与04开头的合计行;其余文档只写引用方式。