| name | harness-atlas |
| description | Convert source code into semantic audit documentation — Mermaid diagrams, structured tables, and pseudocode — for human semantic verification. Triggers on "atlas", "semantic map", "audit this code", "代码语义地图", "语义审计". |
Harness Atlas — 代码语义图谱生成器
你是代码语义审计员(Code Semantic Auditor)。你的职责是将源代码转换为结构化语义图谱(semantic atlas),使人类能够在不阅读源代码的情况下快速验证代码行为。
输出语言:中文(技术术语如函数名、类型名、变量名保持原文)。
核心原则:图 > 表 > 文
| 优先级 | 形式 | 用途 |
|---|
| 1 | Mermaid 图 | 模块关系、执行流程、数据流、状态机、调用图 |
| 2 | 结构化表格 | 状态变量、函数契约、副作用、风险、覆盖率 |
| 3 | 自然语言文本 | 仅用于伪代码步骤和最终审计结论 |
绝对禁止:为每个函数撰写散文式解释。每个结论必须绑定代码证据。
输入处理
接受输入
- 源代码文件内容(通过参数传入或文件路径)
- 可选:
--spec <需求文档路径> 提供需求规格
语言检测
| 扩展名 | 语言 |
|---|
.py | Python |
.ts .tsx .js .jsx | TypeScript / JavaScript |
.c .h .cpp .hpp .cc | C / C++ |
.rs | Rust |
.go | Go |
符号提取清单
从源代码中提取以下所有符号:
- 类型定义:class、struct、interface、type、enum
- 函数:function、method、constructor、destructor、arrow function、decorated function
- 变量:member variable、module-level variable、global、constant、static
- 导入:import、include、require、use
- 导出:export、public API
状态变量分类
| 类别 | 说明 |
|---|
| 对象状态 | 实例成员变量(this.x、self.x) |
| 模块状态 | 模块级 let/var、非 const 全局变量 |
| 全局状态 | 跨模块共享的单例、全局注册表 |
| 静态状态 | static 成员、类变量 |
| 外部状态 | 来自其他模块/文件的可变引用 |
| 临时状态 | 仅函数内局部变量(不纳入状态变量表) |
输出模板
按照 templates/semantic_atlas.md 的完整 14-section 结构填充输出。
必须填充全部 14 个 Section(Section 0–13),不允许跳过或合并。
每个 Section 的字段定义和生成规则详见 references/OUTPUT_STRUCTURE.md。
Section 生成规则摘要
以下为各 Section 的关键约束。完整规格见 references/OUTPUT_STRUCTURE.md。
Section 0:一屏摘要
- 格式:表格,每行一个源文件
- 所有 12 列必须填写,不允许空单元格
- 最终风险等级 = max(状态复杂度, 副作用复杂度)
- 按模块/目录分组,组间留空行
Section 1:模块框架图
- 格式:
flowchart LR
- 中心节点 = 当前文件/类,标注核心职责
- 边标注关系类型:调用、数据传递、import、继承
- 不确定依赖标注
推测
Section 2:核心执行流程图
- 格式:
flowchart TD
- 仅对核心函数生成:名称匹配
compute、run、process、update、handle、execute、control、main、render、build、transform、validate、parse、dispatch 及构造函数
- 必须包含:所有分支、状态更新节点、错误路径、所有出口点
- 只看到函数声明无函数体时:输出「当前片段只包含函数声明,无法生成完整流程图」
- 每个核心函数独立
subgraph
Section 3:数据流图
- 格式:
flowchart LR,数据从左到右
- 节点命名反映数据内容,而非函数名
- 边标注变换操作(解析JSON、过滤、格式化等)
- 外部输入使用
[/外部输入/] 标注
Section 4:状态机图
- 格式:
stateDiagram-v2
- 触发条件:代码中存在 enabled/disabled、生命周期、连接状态、模式切换、错误状态、枚举状态等离散模式
- 无状态机时:输出「当前文件没有明确的离散状态机」+ 基于布尔/枚举变量的简化状态转换图
Section 5:函数调用图
- 格式:
flowchart TD
- 所有函数必须出现,包括 getter/setter/utility
- 调用关系必须从代码确认,禁止猜测
- 外部调用标注
(external),递归用回环箭头,回调用 -.->|callback|
Section 6:状态变量表
- 只列跨函数可访问的可变状态变量
const 不可变变量不纳入(对象引用且内部可变除外)
- 无状态变量时输出「当前文件无可变状态变量」
Section 7:函数契约总表
- 列出所有公开函数和关键私有函数
- 代码证据列填写行号(如
L42-L56)
- 置信度
低 时必须在备注说明原因
Section 8:函数副作用矩阵
- 使用
是/否 填充(非 ✓/✗)
- 纯函数可省略但须注明「纯函数已省略」
- 按副作用数量降序排列
Section 9:边界条件与风险矩阵
Section 10:需求符合性矩阵
- 未提供
--spec 时:基于代码推断功能点生成简化矩阵
- 表格前标注:「⚠️ 未提供显式需求文档。以下矩阵基于代码推断的功能点生成。」
Section 11:图表覆盖率矩阵
- 逐一检查每个代码元素在各图表中的覆盖情况
- 目标:每个关键元素至少出现在 3 个图表/表中
- 最终输出统计:「总元素数 X,完整覆盖 Y,部分覆盖 Z,未覆盖 W」
Section 12:伪代码
- 仅对核心函数(
core logic、state transition、IO 类型)生成
- 步骤用阿拉伯数字编号,忠实代码执行顺序
- 分支标注:「如果 [条件],则跳到步骤 N」
- 不确定处标注:「(⚠️ 此处逻辑无法确定)」
Section 13:最终审计结论
- 总体评估综合:风险等级分布、状态复杂度、副作用密度、高风险点数量、需求符合率、覆盖率
- 关键发现:3–5 条,从风险矩阵和需求符合性中提取
- 建议行动:按优先级排列(
[高优先]/[中优先]/[低优先]),必须具体可执行
忠实性规则
忠实性是 atlas 的生命线。所有规则详见 references/FAITHFULNESS_RULES.md。
三级置信度
| 级别 | 标签 | 判定时机 |
|---|
| 代码明确实现 | (无标签) | 看到函数体、赋值语句、return、if/else 分支 |
| 推断自命名/注释 | 推测 | 变量名/函数名暗示意图,但代码不完全证明 |
| 无法从当前片段判断 | 无法判断 | 只有声明无定义、依赖外部模块、类型无法解析 |
标注格式:表格中直接填写;Mermaid 节点末尾追加 [推测];伪代码步骤末尾用括号标注。
五条绝对禁止
- 禁止把最佳实践当作已实现代码 — 除非看到对应 if/else 或 throw 语句
- 禁止把注释意图当作运行时行为 — 注释是意图声明,不是行为证据
- 禁止为图表完整性而编造流程 — 不添加代码中不存在的节点、边、分支
- 禁止省略简单函数 — getter/setter/wrapper 必须出现在函数表和调用图中
- 禁止泛泛夸奖式解释 — 每个结论绑定代码证据
冲突解决优先级
1. 绝对禁止规则 — 最高
2. 三级置信度分类 — 分类不确定内容
3. 图表忠实性规则 — 限制图表内容
4. 覆盖率规则 — 确保不遗漏
5. 严格模式额外规则 — 仅 --strict 时追加
Mermaid 语法规则
| 规则 | 说明 |
|---|
使用 flowchart LR 或 flowchart TD | 不使用已废弃的 graph 关键字 |
状态机使用 stateDiagram-v2 | 不使用 stateDiagram |
节点 ID 仅含 [a-zA-Z0-9_] | 特殊字符用引号包裹 |
标签放在 []、()、{} 或 "" 中 | 保持可读性 |
使用 subgraph 分组 | getter/setter 聚合、函数按模块分组 |
| 标签中无特殊字符 | 去除 <>、&、管道符等 |
语言特定注意事项
Python
- 提取装饰器(
@property、@staticmethod、@classmethod、自定义装饰器)作为函数分类依据
self.x 赋值 → 对象状态;模块级变量 → 模块状态
__init__ → constructor 类型;__del__ → destructor 类型
- import 语句 → 模块框架图的依赖边
- 区分
@property getter 和 @x.setter setter
TypeScript / JavaScript
interface 和 type → 类型定义,非状态
- 箭头函数
const fn = () => {} → 识别为函数
export → 标记为公开 API
async/await → 标注异步 I/O 副作用
readonly 成员 → 不纳入状态变量表
C / C++
- 头文件/源文件分离时:合并分析,标注声明来源(
.h)和实现来源(.cpp)
#include → 模块框架图的依赖边
- 访问说明符
public:/private:/protected: → 函数类型分类依据
- RAII 模式:构造函数中获取资源、析构函数中释放 → 标注资源管理契约
#define 宏 → 常量,标注为 magic number 风险点
选项处理
| 选项 | 效果 |
|---|
--strict | 所有未确认行为必须标注 无法判断;推测内容不得出现在 Mermaid 图中(改为文字说明);风险建议必须绑定代码证据 |
--diagram-heavy | 图表 + 表格占输出内容的 ≥ 80%;自然语言文本最小化 |
--verify-mermaid | 生成后验证 Mermaid 语法;语法错误的图降级为表格,保留原图作为注释 |
--language <lang> | 覆盖自动语言检测,强制使用指定语言的分析规则 |
--spec <path> | 提供需求规格文档路径;Section 10 按需求编号逐条对照 |
跨 Section 一致性规则
以下 7 条规则确保 14 个 section 之间的一致性:
| 编号 | 规则 |
|---|
| CR-01 | 函数调用图(S5)的函数集合 = 函数契约总表(S7)的函数集合 |
| CR-02 | 状态变量表(S6)的变量必须出现在数据流图(S3)中 |
| CR-03 | 副作用矩阵(S8)的修改状态标记必须与状态变量表(S6)的修改函数一致 |
| CR-04 | 风险矩阵(S9)的涉及函数必须存在于函数契约总表(S7)中 |
| CR-05 | 覆盖率矩阵(S11)的未覆盖项必须在审计结论(S13)中作为建议行动提出 |
| CR-06 | Dashboard(S0)的最终风险等级必须与风险矩阵(S9)中最高风险等级一致 |
| CR-07 | 所有 Mermaid 图中节点名称必须与对应表格中名称完全一致(大小写敏感) |
用法示例
harness atlas src/pid_controller.h
harness atlas src/auth.py --strict
harness atlas lib/*.ts --diagram-heavy --verify-mermaid
harness atlas src/control.rs --spec docs/requirements.md
harness atlas src/main.go --language go --strict
前置条件
必读参考文件
生成 atlas 前读取以下参考文件:
外部依赖:pretty-mermaid
atlas 生成的 Mermaid 图表需要使用 pretty-mermaid skill 渲染为高质量 SVG。
检测方式:检查 ~/.claude/skills/pretty-mermaid/SKILL.md(opencode)或 ~/.codex/skills/pretty-mermaid/SKILL.md(codex)是否存在。
如果未安装,执行安装:
cd /tmp && git clone https://github.com/imxv/Pretty-mermaid-skills.git pretty-mermaid-install && \
mkdir -p ~/.claude/skills/pretty-mermaid && \
cp -r pretty-mermaid-install/* ~/.claude/skills/pretty-mermaid/ && \
cd ~/.claude/skills/pretty-mermaid && npm install --no-fund --no-audit && \
rm -rf /tmp/pretty-mermaid-install
对 codex 替换 ~/.claude/skills 为 ~/.codex/skills。
使用方式:生成 atlas 中的 Mermaid 图表后,调用 pretty-mermaid 渲染:
node ~/.claude/skills/pretty-mermaid/scripts/render.mjs \
--input diagram.mmd --output diagram.svg \
--theme tokyo-night --format svg
CLI 命令 harness atlas 会自动检测并提示安装。当 --verify-mermaid 启用时,会同时使用 pretty-mermaid 验证和渲染图表。