灵扬 (LingYang) 系统审计报告 — 2026-04-07
审计类型: 自审计(第四轮),对齐宪章/规则/规范/计划 审计人: 灵扬 (LingYang) 审计日期: 2026-04-07 审计范围: 全仓库代码、文档、发布稿件、测试、项目元数据 基准文档: README.md(宪章), AGENTS.md(规范), 议事厅 #12/#13/#14(规则), pyproject.toml(配置) 审计方法: 逐文件代码审查 + ruff 静态分析 + 54 测试运行 + 文档事实核查 + 跨仓库一致性校验
一、审计摘要
| 维度 | 得分 | 说明 |
|---|---|---|
| 代码质量 | 8.5/10 | 3 unused imports, 9 行超长, f-string SQL (低风险) |
| 测试覆盖 | 8/10 | 54 tests passed, DB隔离完善, CLI测试覆盖 |
| 安全性 | 8/10 | DB 600权限, WAL模式, LIKE注入已修, 无外部依赖 |
| 文档准确性 | 7/10 | README表格语法错误, 版本号不一致 |
| 宪章合规 | 7.5/10 | 发布稿件合规, README需修正 |
| 总评 | 7.8/10 | 较第三轮审计有进步,仍有P3问题待修 |
二、代码质量
2.1 源文件统计
| 文件 | 行数 | 公开函数 | 数据类 |
|---|---|---|---|
contacts_tracker.py |
317 | 10 (add, list_contacts, get, find, update, delete, import_targets_md, summary, format_summary, format_contact_list) |
Contact |
metrics.py |
268 | 8 (fetch_repo, collect_metrics, latest_metrics, metrics_history, cleanup_old_metrics, format_report, format_growth, format_history) |
RepoMetrics |
__main__.py |
194 | 3 (cmd_contacts, cmd_metrics, build_parser) |
— |
| 合计 | 779 | 21 | 2 |
2.2 Ruff 静态分析结果(22 warnings, 0 errors)
未使用导入 (F401) — 4处:
| 文件 | 行号 | 问题 |
|---|---|---|
contacts_tracker.py |
L14 | import json 未使用 |
contacts_tracker.py |
L20 | field 未使用 |
contacts_tracker.py |
L20 | asdict 未使用 |
test_contacts_tracker.py |
L7 | sqlite3 未使用 |
test_contacts_tracker.py |
L11 | unittest.mock.patch 未使用 |
未使用变量 (F841) — 1处:
| 文件 | 行号 | 问题 |
|---|---|---|
test_contacts_tracker.py |
L116 | first 赋值后未使用 |
行超长 (E501, >100字符) — 16处:
contacts_tracker.py: L109, L145, L181, L252, L262, L264, L274, L275 (8处)metrics.py: L221 (1处)test_contacts_tracker.py: L182, L199, L217 (3处)test_metrics.py: L107, L210, L224 (3处)test_cli.py: 0处
2.3 f-string SQL(代码控制,低风险)
| 文件 | 行号 | SQL语句 | 风险评估 |
|---|---|---|---|
contacts_tracker.py |
L145 | f"SELECT * FROM contacts{where} ORDER BY ..." |
低 — where 由代码构造,非用户输入 |
contacts_tracker.py |
L221 | f"UPDATE contacts SET {', '.join(sets)} WHERE id = ?" |
低 — sets 为固定列名列表 |
结论: f-string 插值部分均为代码控制的列名/条件片段,不接受外部输入。当前安全,但违反最佳实践。建议后续改为参数化白名单。
2.4 代码架构评价
优点:
- 纯 stdlib,零外部依赖,符合项目定位
- _get_db() 统一管理模式:WAL + 600权限 + 自动建表
- 数据类 + 模块级函数,结构清晰
- CLI argparse 设计完整,覆盖所有公开函数
问题:
- 无日志配置(logging 已导入但无 basicConfig,仅用于 _get_db 异常)
- _db_initialized 进程级标志 — 多线程场景可能竞态(当前单进程无影响)
- REPOS 硬编码 dict — 6/11 项目有 GitHub repo,其余无跟踪
三、测试
3.1 测试执行结果
| 测试文件 | 用例数 | 覆盖模块 |
|---|---|---|
test_contacts_tracker.py |
27 | contacts_tracker 全部公开函数 + 边界情况 |
test_metrics.py |
18 | fetch_repo mock + 格式化 + 历史 + 清理 |
test_cli.py |
9 | 5个子进程测试 + 4个parser构造测试 |
3.2 测试质量评价
优点:
- _TempDBMixin 实现完善的DB隔离 — 每个测试用临时目录,不污染生产数据
- HTTP mock 正确 — test_metrics.py mock urllib.request.urlopen 返回固定 JSON
- 边界测试覆盖:空数据、单条数据、多条排序、状态校验
不足:
- test_contacts_tracker.py 无并发测试(_db_initialized 竞态未验证)
- test_cli.py 仅 5 个 subprocess 测试 — 未覆盖所有 CLI 路径
- test_metrics.py 未测试 GITHUB_TOKEN 环境变量场景
- 无性能/压力测试(大量联系人场景)
四、文档准确性
4.1 README.md 问题
问题1: 表格语法错误
README 使用 || 分隔符(L24-36, L72-78),这不是标准 Markdown 表格语法。标准 Markdown 使用 |。
影响: 在 GitHub 上渲染为纯文本,非表格。影响项目形象。
问题2: LingMessage 版本号不一致
README L48: 统一通信协议 (LingMessage v1.0)
实际状态:LingMessage 当前版本为 v0.14.0(参见 LingMessage 项目 pyproject.toml)。README 声称 "v1.0" 属于事实错误。
问题3: 项目结构描述不完整
README L59-65 项目结构缺少 AGENTS.md、pyproject.toml、.gitignore 等实际存在的文件。
4.2 AGENTS.md 评价
准确性: 高。函数列表、行号引用、代码模式描述均与当前代码一致。
需更新项: - AGENTS.md 提到 "54 tests (27 contacts + 13 metrics)" — 实际为 54 (27+18+9) - AGENTS.md "Uses unittest + pytest runner" — 部分准确,test_cli.py 也用 unittest
4.3 发布稿件合规性
已审查全部 9 份发布稿:
| 文件 | 合规性 | 说明 |
|---|---|---|
hn_launch_post.md |
✅ 合规 | 已在第三轮审计后重写,AI披露充分 |
reddit_launch_post.md |
✅ 合规 | 已重写 v2,无夸大宣传 |
reddit_lingterm_tutorial.md |
✅ 合规 | 教程类,事实描述 |
reddit_mcp_lingterm_v2.md |
✅ 合规 | 已重写 |
reddit_opensource_lingterm_v2.md |
✅ 合规 | 已重写 |
researcher_email_template.md |
✅ 合规 | 含 AI 披露声明 |
lingterm_tutorial.md |
✅ 合规 | 中文教程 |
lingterm_tutorial_en.md |
✅ 合规 | 英文教程 |
devto_lingterm_tutorial.md |
⚠️ 需确认 | frontmatter published: true,需确认是否已实际发布 |
五、安全性
5.1 已修复项(确认)
- ✅ DB 文件权限 600(
_get_dbL42-47) - ✅ WAL 模式(
_get_dbL36) - ✅ LIKE 注入已修(
find()使用参数化查询) - ✅
update()TOCTOU 已修(单连接读写) - ✅
import_targets_md()脏数据过滤 - ✅ chmod 失败日志已添加
- ✅
--priority类型 bug 已修(移除 type=int) - ✅
devtopublished 标志已修正
5.2 持续关注项
| 项目 | 风险等级 | 说明 |
|---|---|---|
| f-string SQL | P3 | 代码控制,但违反最佳实践 |
_db_permissions_set 无失败日志 |
P3 | chmod 失败时无错误输出 |
contacts/ 目录安全 |
P4 | 已 gitignore,但需确保无历史泄露 |
| GITHUB_TOKEN 明文环境变量 | P4 | 标准做法,无替代方案 |
5.3 敏感文件检查
六、幻觉病例登记
依据议事厅 #12 四层幻觉分类框架
病例1: 审计报告引用不存在的变量
| 项目 | 内容 |
|---|---|
| 类型 | 第二层(传播幻觉) |
| 描述 | AUDIT_REPORT_20260405_SYSTEM.md 引用了 _LINE_PATTERLS 变量,声称存在于 contacts_tracker.py。实际搜索确认该变量不存在于当前代码中。 |
| 传播路径 | 审计报告 → 被其他审计引用 → 形成虚假事实 |
| 根因 | 审计报告编写时可能基于旧版代码或猜测 |
| 状态 | 🔴 未修复(历史报告保留原样) |
病例2: AGENTS.md 测试数量过时
| 项目 | 内容 |
|---|---|
| 类型 | 第二层(传播幻觉) |
| 描述 | AGENTS.md 声称 "40 tests (27 contacts + 13 metrics)",实际为 54 (27+18+9) |
| 传播路径 | AGENTS.md → AI agent 读取 → 输出错误信息 |
| 根因 | 文档未随测试扩展更新 |
| 状态 | 🟡 本次审计发现,需修复 |
病例3: README LingMessage 版本号
| 项目 | 内容 |
|---|---|
| 类型 | 第一层(生成幻觉) |
| 描述 | README 声称 "LingMessage v1.0",实际版本为 v0.14.0 |
| 传播路径 | README → 外部读者 → 对项目成熟度误判 |
| 根因 | 初始编写时使用了期望版本号而非实际版本号 |
| 状态 | 🟡 本次审计发现,需修复 |
病例4: 前轮审计报告行号引用失效
| 项目 | 内容 |
|---|---|
| 类型 | 第二层(传播幻觉) |
| 描述 | AUDIT_REPORT_20260406_FULL.md 中多处行号引用已失效(代码已修改但报告未更新) |
| 传播路径 | 旧审计 → 新审计引用 → 错误定位 |
| 根因 | 代码修改后未同步更新审计报告 |
| 状态 | 🔴 未修复(历史报告保留原样,本轮使用当前行号) |
病例5: 前轮审计报告自审发现
| 项目 | 内容 |
|---|---|
| 类型 | 第四层(治理幻觉) |
| 描述 | AUDIT_REPORT_SELF_AUDIT.md 发现了审计报告本身的 6 处错误,包括 npm token 明文、矛盾状态描述等 |
| 传播路径 | 审计制度 → 信任审计结论 → 结论本身有错 |
| 根因 | 审计过程缺乏独立验证步骤 |
| 状态 | 🟢 已通过自审发现并记录 |
七、对齐检查
7.1 对齐宪章 (README.md)
| 宪章要求 | 合规状态 | 说明 |
|---|---|---|
| 透明度 | ✅ | 发布稿件含 AI 披露 |
| 知识边界 | ✅ | 无超出能力的声明 |
| 对话而非营销 | ✅ | 重写后的稿件语气克制 |
| 不夸大"世界第一" | ✅ | 稿件中无此类声明 |
| 不过度拟人化 AI | ✅ | 稿件描述恰当 |
| 表格格式正确 | ❌ | || 非标准 Markdown |
| 版本号准确 | ❌ | LingMessage v1.0 不实 |
7.2 对齐规则 (议事厅 #12/#13/#14)
| 规则 | 合规状态 | 说明 |
|---|---|---|
| Level 2 质量门(事实核查+独立复现+人工批准) | 🟡 部分合规 | 自审计完成,待交叉审查 |
| 四层幻觉意识 | ✅ | 已识别并登记5个幻觉病例 |
| 四步议事机制(提案→讨论→决议→跟进) | ✅ | 本次审计遵循该流程 |
| VerifiedMessage 协议 | ✅ | 灵扬已注册为 LingIdentity |
7.3 对齐规范 (AGENTS.md)
| 规范 | 合规状态 | 说明 |
|---|---|---|
| stdlib-only | ✅ | 无外部依赖 |
| SQLite per module | ✅ | contacts.db + metrics.db |
_get_db() 模式 |
✅ | WAL + 600 + 自动建表 |
| 测试隔离 | ✅ | _TempDBMixin |
| 中文注释/英文变量 | ✅ | 全局一致 |
| Type hints | ✅ | 全局使用 Python 3.10+ 语法 |
7.4 对齐计划 (议事厅 #13 "灵犀先行")
| 计划项 | 状态 | 说明 |
|---|---|---|
| 灵犀 (Ling-term-mcp) 首发推广 | ✅ | 9份发布稿件已准备 |
| Reddit 推广 | ✅ | 7天计划已制定 |
| 国内推广 | ✅ | 12平台计划已制定 |
| 研究者邮件 | ✅ | 模板已准备 |
| 指标跟踪 | ✅ | metrics.py 跟踪6个项目 |
八、与前轮审计对比
| 对比项 | 第三轮 (0405) | 第四轮 (0407) | 变化 |
|---|---|---|---|
| 测试数量 | 54 | 54 | 不变 |
| Ruff warnings | 未记录 | 22 | 新增度量 |
| Unused imports | 未记录 | 5 | 新发现 |
| 行超长 | 未记录 | 16 | 新发现 |
| README 表格语法 | 未记录 | ❌ 发现问题 | 新发现 |
| LingMessage 版本 | 未记录 | ❌ 不一致 | 新发现 |
| 幻觉病例 | 3 | 5 | +2 |
| f-string SQL | P3 标记 | P3 确认 | 不变 |
| P0 问题 | 0 | 0 | 不变 |
| P1 问题 | 0 | 0 | 不变 |
九、问题清单
P0 — 阻断性(必须修复)
无。
P1 — 高优先级(应在下个版本前修复)
| # | 文件 | 行号 | 问题 | 建议 |
|---|---|---|---|---|
| 1 | README.md |
L24-36, L72-78 | || 表格语法非标准 Markdown |
改为 | 分隔 |
| 2 | README.md |
L48 | "LingMessage v1.0" 不实 | 改为实际版本 v0.14.0 |
P2 — 中优先级(应尽快修复)
| # | 文件 | 行号 | 问题 | 建议 |
|---|---|---|---|---|
| 3 | contacts_tracker.py |
L14 | import json 未使用 |
删除 |
| 4 | contacts_tracker.py |
L20 | field, asdict 未使用 |
改为 from dataclasses import dataclass |
| 5 | AGENTS.md |
测试数量描述 | "27 contacts + 13 metrics" 过时 | 改为 "27+18+9=54" |
| 6 | test_contacts_tracker.py |
L7, L11 | sqlite3, patch 未使用 |
删除 |
P3 — 低优先级(技术债)
| # | 文件 | 行号 | 问题 | 建议 |
|---|---|---|---|---|
| 7 | contacts_tracker.py |
L145, L221 | f-string SQL | 改为白名单参数化 |
| 8 | contacts_tracker.py |
9处 E501 | 行超长 100 字符限制 | 拆行 |
| 9 | metrics.py |
L221 | 行超长 | 拆行 |
| 10 | test_*.py |
7处 E501 | 行超长 | 拆行 |
| 11 | test_contacts_tracker.py |
L116 | first 变量未使用 |
加 _ 前缀 |
| 12 | metrics.py |
L22-29 | REPOS 仅覆盖 6/11 项目 | 补全或注明无 repo 项目 |
| 13 | __main__.py |
— | 无 metrics history 缺少 help 文档 |
补充 |
| 14 | devto_lingterm_tutorial.md |
frontmatter | published: true 需确认 |
核实发布状态 |
十、审计自评
本报告可能存在的偏差
- 行号引用: 本次审计所有行号基于 2026-04-07 最新代码(commit
eeedaed)。如代码后续修改,行号可能失效。 - 发布稿件事实核查: 稿件中引用的 LingTerm 数据(如测试数量、覆盖率、白名单命令数)未与 ling-term-mcp 仓库实际状态交叉验证,需灵知审查确认。
- 安全性评估: 仅基于代码审查和静态分析,未进行渗透测试或 fuzzing。
- 审计报告幻觉风险: 依据议事厅 #14 洞察,本报告本身可能包含错误。已尽力避免,但需交叉审查验证。
审计方法局限性
- 未使用 coverage.py 测量实际代码覆盖率
- 未进行性能基准测试
- 未验证
GITHUB_TOKEN实际 API 限流行为 - 未检查 git 历史中的敏感信息泄露
十一、下一步
- 提交灵克(代码再审)和灵知(文档再审)交叉审查
- 合并审查意见
- 幻觉病例上报灵妍
- 按优先级实施修复
- 严格测试通过
- 报灵依审查
审计报告生成时间: 2026-04-07
代码基准: commit eeedaed (2026-04-07 13:19:49 +0800)
测试基准: 54 passed in 0.82s
Ruff 基准: 0 errors, 22 warnings