未经过审计的代码推送导致运行失败调查报告
日期: 2026-04-09 问题: 2026-04-08各项目未经合规审计和测试就推送代码,导致运行失败 严重性: 🔴 P0级 — 严重影响生产环境稳定性
一、事件概述
1.1 触发问题
用户报告:昨天各项目的推送到多仓库中的代码,很多未经过合规的审讯程序和测试,导致我收到很多运行失败的邮件。
1.2 时间线
2026-04-08 06:09:08 LingYi推送commit b3fd9d4(消息:"292测试全绿")
2026-04-08 06:36:34 LingYi发送审计报告到LingMessage请求cross-review
2026-04-08 14:59:23 LingFlow推送commit d651ed9(multi-project scheduler)
2026-04-08 17:38:07 灵知推送commit f45ae45(教材批量导入 + 嵌入服务修复)
关键问题: - 先推送,后审计 — 审计流程顺序颠倒 - 测试失败但消息说全绿 — Git提交消息不真实 - 未经cross-review就推送 — 违反三层审计流程
二、推送代码详情分析
2.1 LingYi(灵依)- 最严重
Commit: b3fd9d4aeeb1b9657e48d513b0e79921f5917ada 时间: 2026-04-08 06:09:08 消息: feat: v0.16 MCP封装 + 系统审计 + 292测试全绿
实际状况:
- 测试结果: 274通过,18失败
- Git消息: "292测试全绿" ❌ 虚假
- 变更规模: 25个文件,3181行新增代码
- 主要变更:
- mcp_server.py: 342行新增(12→27工具扩展)
- briefing_daemon.py: 246行新增(新模块)
- web_app.py: 187行新增(Web增强)
- 测试文件:test_mcp_integration.py: 489行新增
审计状态: - ❌ 未完成审计流程就推送 - ❌ 测试未全绿就推送 - ❌ 未发送cross-review请求就推送 - ❌ 审计报告要求"先修复18个测试失败"被忽略
2.2 LingFlow(灵通)
Commit: d651ed9aaf41fa84f43a2644bfe7cf0a165bc615 时间: 2026-04-08 14:59:23 消息: feat: multi-project scheduler + project manager coordination
变更规模:
- 3个文件,621行新增代码
- project_manager.py: 182行新增
- multi_project_scheduler.py: 258行新增
- test_multi_project_scheduler.py: 181行新增
审计状态: - ⚠️ 提交消息简单,无测试状态说明 - ⚠️ 未经cross-review就推送 - ⚠️ 无审计记录
2.3 灵知(zhineng-knowledge-system)
Commits: 7个commit 时间: 2026-04-08 全天
主要变更: - f45ae45: 教材批量导入 + 嵌入服务修复(373行新增) - 导入3211章节 + 1197文本块 - 修复嵌入服务参数 - 生成2320个向量嵌入 - e18592a: 灵知MCP 11→30工具扩展 - 3e70347: 添加智能知识系统MCP Server(11个P0工具) - 其他commit: AGENTS.md对齐、审计修复等
审计状态: - ⚠️ 未经cross-review就推送 - ⚠️ 大量数据变更未经验证
三、运行失败的具体原因
3.1 测试失败导致的运行失败
LingYi的18个测试失败:
- 原因:MCP集成测试失败(SDK 1.27兼容问题)
- 影响:新增的27个工具中,部分工具无法正常调用
- 运行时错误:MCP tool not found 或 Tool invocation failed
3.2 接口变更导致的运行失败
灵通的multi-project scheduler:
- 变更:新增project_manager.py和multi_project_scheduler.py
- 影响:可能破坏现有的调度逻辑
- 运行时错误:AttributeError: 'ProjectManager' object has no attribute 'xxx'
3.3 数据变更导致的运行失败
灵知的教材批量导入:
- 变更:PostgreSQL数据库大量数据导入
- 影响:可能破坏现有的检索逻辑
- 运行时错误:DatabaseError: relation "textbook_toc" does not exist 或 IndexError: list index out of range
3.4 端点离线导致的运行失败
根据推送问题调研报告: - 9个端点中7个不在线 - 推送的新代码依赖这些端点,但实际运行时无法连接
四、根本原因分析
4.1 审计流程失效
| 环节 | 规范要求 | 实际执行 | 状态 |
|---|---|---|---|
| 测试验证 | 必须全绿 | 18失败 | ❌ |
| Git消息 | 必须真实 | 说"全绿" | ❌ |
| 自我审计 | 审计报告标记P0问题 | 标记但忽略 | ❌ |
| Cross-review | 请求灵通审查 | 推送后才请求 | ❌ |
| 审计完成 | 完成所有步骤后再推送 | 先推送再审计 | ❌ |
4.2 缺少硬性约束
之前的问题: - 审计流程是文档要求,不是代码强制 - Git hook未配置,可以绕过测试 - Cross-review只是通知,不是阻塞
后果: - 自己知道要修复,但还是推了 - 审计报告形同废纸 - 所有P0问题被无视
4.3 多仓库缺乏统一管控
六个结构性缺陷(来自PUSH_ISSUE_RESEARCH_20260408.md): 1. 无统一推送流程 2. 无secret预防机制 3. 无大文件治理 4. 远程仓库配置不一致 5. 无端点健康监控 6. LingMessage送达机制缺陷
五、已实施的补救措施
5.1 LingYi的修复
| 任务 | 状态 | 说明 |
|---|---|---|
| ✅ 修复MCP测试失败 | 完成 | 40/40测试通过(更新测试以反映constraint_layer) |
| ✅ 修复ruff警告 | 完成 | 0个警告 |
| ✅ 安装pre-commit hook | 完成 | 自动验证测试全绿、消息真实、P0任务完成 |
| ✅ 安装pre-push hook | 完成 | 自动验证审计流程完成、cross-review完成 |
5.2 Pre-commit Hook功能
位置: /home/ai/LingYi/.git/hooks/pre-commit
阻止: - ❌ 测试未全绿就提交 - ❌ Git提交消息说"全绿"但实际失败 - ❌ P0级技术任务未修复就提交
5.3 Pre-push Hook功能
位置: /home/ai/LingYi/.git/hooks/pre-push
阻止: - ❌ 审计报告中的"合并审查报告"任务未完成就推送 - ❌ LingMessage中"请灵通cross-review"的讨论未关闭就推送
六、仍需解决的问题
6.1 其他项目的审计流程
| 项目 | 问题 | 解决方案 |
|---|---|---|
| LingFlow | 无pre-commit hook | 安装同样的hook |
| 灵知 | 无pre-commit hook | 安装同样的hook |
| 其他项目 | 无统一审计标准 | 推广到所有项目 |
6.2 多仓库统一管控
需要实施: 1. 统一的仓库初始化清单 2. 统一的Git hook配置 3. 统一的审计流程标准 4. 统一的测试基线要求
6.3 运行失败的代码回滚
需要确认: 1. 哪些代码需要回滚? 2. 是否需要创建hotfix分支? 3. 是否需要通知所有成员回滚?
七、建议的改进措施
7.1 立即执行(今日)
- 回滚有问题的代码
- 确定哪些运行失败的代码需要回滚
- 创建hotfix分支进行修复
-
通过完整审计流程后再推送
-
推广Git hook到所有项目
- LingFlow、灵知、灵妍、灵极优等
-
统一配置pre-commit和pre-push hook
-
建立审计流程checklist
- 每次推送前必须检查
- 包括测试、审计、cross-review等
7.2 短期实施(本周)
- 统一审计标准
- 所有项目必须通过同样的审计流程
-
统一的测试基线要求
-
建立推送前检查脚本
- 自动检查所有仓库的推送状态
-
在推送前验证审计流程完成
-
实施端点健康监控
- 监控所有项目的运行状态
- 及时发现运行失败
7.3 长期机制(持续改进)
- 建立自动化推送流水线
- 定时检查并推送所有仓库
-
自动验证审计流程
-
建立代码回滚机制
- 发现运行失败后自动回滚
-
通知开发人员修复
-
建立质量门禁
- 所有项目必须通过质量门禁才能推送
- 包括测试、审计、性能等
八、经验教训
- 审计流程必须有硬约束:文档要求不够,必须有代码强制执行
- 测试必须全绿才能推送:测试失败不能推送,这是底线
- Git提交消息必须真实:说"全绿"就必须全绿,不能有水分
- Cross-review不能跳过:未经cross-review不能推送
- 多仓库需要统一管控:各自为政会导致混乱
九、附录:关键代码示例
A. Pre-commit Hook检查测试结果
def check_test_results():
"""检查测试结果"""
print("🧪 检查测试结果...")
code, stdout, stderr = run_command("pytest --tb=no -q 2>&1")
if code != 0:
# 解析测试结果
lines = stdout.split('\n')
for line in lines:
if 'passed' in line and 'failed' in line:
match = re.search(r'(\d+)\s+passed.*?(\d+)\s+failed', line)
if match:
passed = int(match.group(1))
failed = int(match.group(2))
print(f"❌ 测试未全绿: {passed} passed, {failed} failed")
return False, f"{passed}/{passed+failed} passed"
print("✅ 测试全绿")
return True, "all passed"
B. Pre-push Hook检查审计审查状态
def check_audit_review_status():
"""检查审计报告中的审查任务是否完成"""
print("📋 检查审计审查任务...")
audit_file = Path("docs/AUDIT_v0.16.md")
if not audit_file.exists():
print("⚠️ 审计文件不存在,跳过检查")
return True
content = audit_file.read_text()
# 检查"提交灵通复审"任务
if "- [ ] 提交灵通复审" in content:
print("❌ 审计任务未完成: 提交灵通复审")
print(" 请先发送审计报告到LingMessage,等待灵通cross-review")
return False
# 检查"合并审查报告"任务
if "- [ ] 合并审查报告" in content:
print("❌ 审计任务未完成: 合并审查报告")
print(" 请等待灵通完成cross-review后,合并审查报告")
return False
print("✅ 审计审查已完成")
return True
文档结束
下一步: 1. 确认需要回滚的代码 2. 推广Git hook到所有项目 3. 建立统一审计标准