<!-- 文档分类: MGMT-RPT-017 | 阶段: 项目管理 | 原路径: docs/指南/项目矛盾审计-2026-05-21-r2.md -->
# 项目矛盾审计报告（第二轮） — 2026-05-21

> 第一轮审计同日完成，见 `PROJECT_CONTRADICTION_AUDIT_2026-05-21.md`。
> 本轮为深度扫描，覆盖版本号、require 路径、环境变量、依赖声明、Docker、路由超时等维度。

---

## 一、版本号矛盾（3 处）

| 文件 | 旧值 | 新值 | 说明 |
|------|------|------|------|
| `packages/sdk-python/pyproject.toml` | `1.0.0` | `0.1.26` | 全项目唯一一个版本号偏移的包 |
| `packages/khy-hello/package.json` peerDep | `@khy/plugin-sdk: ^1.0.0` | `^0.1.0` | peerDep 要求 >=1.0.0，但 plugin-sdk 实际版本 0.1.26，npm 7+ 安装报错 |
| `packages/khy-quant/package.json` peerDep | `@khy/plugin-sdk: ^1.0.0` | `^0.1.0` | 同上 |

---

## 二、断裂的 require 路径（9 处）

### 2.1 ai-backend/src/services/toolCalling.js（6 处）

ai-backend 的 `toolCalling.js` 从 backend 复制而来，大量引用 `../cli/`、`../models/`、`../services/resourceGuard` 等 ai-backend 中不存在的模块。

| 行号 | 原引用 | 修复方式 |
|------|--------|----------|
| ~46 | `require('../cli/handlers/data')` — handleQuote | try/catch 降级，返回"仅在主 CLI 中可用" |
| ~64 | `require('../cli/handlers/backtest')` — handleBacktestRun | 同上 |
| ~78 | `require('../cli/handlers/data')` — handleDataFetch | 同上 |
| ~92 | `require('../cli/symbolResolver')` — resolveSymbol | 同上 |
| ~108 | `require('../services/resourceGuard')` — withTimeout (execute_code) | 移除，改用 VM 内置 `{ timeout: 5000 }` |
| ~149 | `require('../services/resourceGuard')` — safeExec (shell_command) | 改用 `child_process.execSync` + 30s 超时 |

**strategy_list handler**（~206 行）：`require('../models')` 改为 `require('@khy/shared/models')`。

### 2.2 backend/src/services/gateway/aiGateway.js:539

```diff
- require('@khy/shared/src/services/cacheService')
+ require('@khy/shared/services/cacheService')
```

路径多了一级 `/src/`，不匹配 `@khy/shared` 的 exports map。被 try/catch 包裹后静默失败，导致 Redis health store 功能永远无法启用。

### 2.3 backend/src/routes/marketData.js:164

```diff
- const { importAllStocks, ... } = require('../../import-stock-data');
+ let importAllStocks, importSingleStock, STOCK_LIST;
+ try {
+   ({ importAllStocks, importSingleStock, STOCK_LIST } = require('../../import-stock-data'));
+ } catch {
+   return res.status(501).json({ success: false, message: 'import-stock-data 模块不可用...' });
+ }
```

`backend/import-stock-data.js` 文件不存在，调用 `/api/market-data/import` 时直接崩溃。改为 501 降级响应。

---

## 三、环境变量和配置默认值矛盾（5 处）

### 3.1 DB_RETRY 代码 fallback 与 .env.example 不一致

| 位置 | 旧值 | 新值 |
|------|------|------|
| `backend/server.js:1458` | `DB_RETRY_ATTEMPTS \|\| 10` | `\|\| 20` |
| `backend/server.js:1460` | `DB_RETRY_DELAY \|\| 3000` | `\|\| 8000` |

代码 fallback 与 `.env.example` 推荐值（20/8000）存在 2 倍差异。现已对齐。

### 3.2 Docker 密码默认值 `changeme` vs `.env.example` 的 `change-me`

| 变量 | docker-compose.yml 旧值 | 新值 |
|------|------------------------|------|
| `REDIS_PASSWORD` | `${REDIS_PASSWORD:-changeme}` | `${REDIS_PASSWORD:-change-me}` |
| `POSTGRES_PASSWORD` | `${POSTGRES_PASSWORD:-changeme}` | `${POSTGRES_PASSWORD:-change-me}` |

不一致导致：如果用户从 `.env.example` 复制配置但未设置密码，Redis/PostgreSQL 容器内密码与应用端不匹配，认证失败。

### 3.3 TRADING_AGENT_STOCK_TIMEOUT_MS fallback 不一致

| 位置 | 旧值 | 新值 |
|------|------|------|
| `backend/src/routes/tradingAgents.js:415` | `'10000'` | `'15000'` |

`packages/shared/src/config/env.js` 中 `applyEnvDefaults()` 设为 15000ms，但路由中 fallback 写了 10000ms。现已统一为 15000ms。

### 3.4 .env.example 缺少 8 个环境变量声明

补充了以下变量（注释形式，不影响默认行为）：

- `DEFAULT_ADMIN_PASSWORD` / `AI_MGMT_ADMIN_PASSWORD` — 管理员密码覆盖
- `KHY_ADMIN_PASSWORD` / `KHY_EXPORT_PASSWORD` — 系统级密码
- `CORS_ALLOWED_ORIGINS` / `AI_MGMT_CORS_ORIGINS` — CORS 配置
- `DB_RETRY_ATTEMPTS` / `DB_RETRY_DELAY` — 数据库重试参数

---

## 四、幽灵依赖修复（2 个 package.json）

### 4.1 ai-backend/package.json

**移除 6 个冗余依赖**（均由 `@khy/shared` 自行声明，ai-backend 通过 shared 间接获取）：
- `bcryptjs`、`better-sqlite3`、`pg`、`express-rate-limit`、`winston`、`winston-daily-rotate-file`

**移除 1 个未使用的可选依赖**：
- `@aws/codewhisperer-streaming-client` — 代码中从未 require

**添加 1 个缺失的 devDependency**：
- `nodemon: ^3.0.2` — `"dev": "nodemon server.js"` 脚本使用但未声明

### 4.2 backend/package.json

**移除 1 个未使用的可选依赖**：
- `@aws/codewhisperer-streaming-client` — 代码中从未 require

**添加 4 个缺失的 optionalDependencies**（代码中通过 try/catch 动态加载）：
- `glob: ^10.3.10` — `exploreTool.js` 使用
- `https-proxy-agent: ^7.0.4` — `kiroAdapter.js` 代理支持
- `node-pty: ^1.0.0` — `pty.js` 终端复用
- `string-width: ^5.1.2` — `formatters.js` CJK 字符宽度计算

---

## 五、路由超时矛盾（1 处）

| 路由 | 旧超时 | 新超时 | 说明 |
|------|--------|--------|------|
| `/api/ai-gateway` | 30s（默认） | 120s | 网关涉及大模型推理，30s 不够用。与 `/api/ai` 路由对齐 |

---

## 六、已识别但保留的问题

| 类别 | 数量 | 保留原因 |
|------|------|----------|
| Dead service modules | 21 个 | 可能是预留扩展点或未来功能，需项目负责人确认后再清理 |
| Dead route files (`news.js`, `ai.js`) | 2 个 | 可能作为本地 fallback 备用，被代理路由覆盖但未删除 |
| `frontend` vs `ai-frontend` 版本范围微差 | 4 个包 | semver 范围重叠，实际安装版本一致 |
| `DEFAULT_DATA_SOURCE` 不一致 (`akshare` vs `reliable`) | 1 处 | 现有部署使用 `akshare`，新安装使用 `reliable`，属有意行为差异 |
| `DB_TYPE` 默认值 (`auto` vs `sqlite`) | 1 处 | Docker 用 `sqlite` 确保隔离，代码用 `auto` 探测本地 PG，合理 |
| admin 密码兼容层 (`admin123.` vs `admin123`) | 1 处 | auth.js 中已有自动迁移逻辑，保持向后兼容 |

---

## 修改文件清单

```
packages/sdk-python/pyproject.toml          — 版本号 1.0.0 → 0.1.26
packages/khy-hello/package.json             — peerDep ^1.0.0 → ^0.1.0
packages/khy-quant/package.json             — peerDep ^1.0.0 → ^0.1.0
ai-backend/src/services/toolCalling.js      — 6 个断裂 require 修复
ai-backend/package.json                     — 移除 7 个冗余/未用依赖，添加 nodemon
backend/src/services/gateway/aiGateway.js   — @khy/shared 路径修正
backend/src/routes/marketData.js            — import-stock-data 降级处理
backend/server.js                           — DB_RETRY fallback 对齐 + ai-gateway 超时 120s
backend/src/routes/tradingAgents.js         — timeout fallback 10000 → 15000
backend/package.json                        — 移除 1 个未用依赖，添加 4 个缺失 optionalDeps
docker-compose.yml                          — 密码默认值 changeme → change-me
.env.example                                — 补充 8 个缺失环境变量声明
```
