跳转至

灵扬 (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 测试执行结果

54 passed in 0.82s
测试文件 用例数 覆盖模块
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_db L42-47)
  • ✅ WAL 模式(_get_db L36)
  • ✅ LIKE 注入已修(find() 使用参数化查询)
  • ✅ update() TOCTOU 已修(单连接读写)
  • ✅ import_targets_md() 脏数据过滤
  • ✅ chmod 失败日志已添加
  • ✅ --priority 类型 bug 已修(移除 type=int)
  • ✅ devto published 标志已修正

5.2 持续关注项

项目 风险等级 说明
f-string SQL P3 代码控制,但违反最佳实践
_db_permissions_set 无失败日志 P3 chmod 失败时无错误输出
contacts/ 目录安全 P4 已 gitignore,但需确保无历史泄露
GITHUB_TOKEN 明文环境变量 P4 标准做法,无替代方案

5.3 敏感文件检查

# 确认 contacts/ 已 gitignore
git ls-files contacts/  # (应无输出)

六、幻觉病例登记

依据议事厅 #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 需确认 核实发布状态

十、审计自评

本报告可能存在的偏差

  1. 行号引用: 本次审计所有行号基于 2026-04-07 最新代码(commit eeedaed)。如代码后续修改,行号可能失效。
  2. 发布稿件事实核查: 稿件中引用的 LingTerm 数据(如测试数量、覆盖率、白名单命令数)未与 ling-term-mcp 仓库实际状态交叉验证,需灵知审查确认。
  3. 安全性评估: 仅基于代码审查和静态分析,未进行渗透测试或 fuzzing。
  4. 审计报告幻觉风险: 依据议事厅 #14 洞察,本报告本身可能包含错误。已尽力避免,但需交叉审查验证。

审计方法局限性

  • 未使用 coverage.py 测量实际代码覆盖率
  • 未进行性能基准测试
  • 未验证 GITHUB_TOKEN 实际 API 限流行为
  • 未检查 git 历史中的敏感信息泄露

十一、下一步

  1. 提交灵克(代码再审)和灵知(文档再审)交叉审查
  2. 合并审查意见
  3. 幻觉病例上报灵妍
  4. 按优先级实施修复
  5. 严格测试通过
  6. 报灵依审查

审计报告生成时间: 2026-04-07 代码基准: commit eeedaed (2026-04-07 13:19:49 +0800) 测试基准: 54 passed in 0.82s Ruff 基准: 0 errors, 22 warnings