# QA 巡检报告 · 投研看板 + 投研工作台（2026-07-16）

对 oaf.world 两个前端的**所有功能点击 / 执行 / 验证**，定位并改正不起作用的功能。

## 范围

- **投研看板** `index.html`（oaf.world/）：切片条（时间窗/主线/概念）、跨面板联动、下钻、⌘K 搜索、自选、布局自定义、对比、首页对话调研提问框。
- **投研工作台** `web/app.html`（/web/app）：14 个视图（dash / company / industry / sector / valuation / screener / satellite / chain / narrative / graph / chat / reports / calendar / agents）+ 公司页 7 个 tab + 一键调研 / 对比 / 议事厅 / 生成研报 / 深链等。

## 方法

1. **Playwright 全量错误巡检**（mock 后端跑全 JS）：遍历 14 视图 + 逐个点击 `[onclick]`/tab/建议控件，捕获 `pageerror`/`console.error`。→ 看板+工作台 **0 未捕获异常**。
2. **Playwright 行为验证**（断言输出出现，抓「点了没产出」的静默 no-op）：工作台 13 项 + 看板 6 项关键流程。→ 全绿（修复后）。
3. **真后端 curl**（api.oaf.world）：12 个 GET 端点全 200 有真数据；POST（thesis/council/earnings-recap/compare）；`/web/data/*.json` 静态数据新鲜度。

## 发现与修复

### 🔴 #1 护城河/多空 LLM 叙事全空（parse_ok=false）— 已修

- **现象**：生产 `/thesis`、`/ask`（单标的）返回 `parse_ok=false`、moat/bull/bear/verdict **全空**。而 `/earnings-recap`（单短文本）正常。公司页「基本面深度」与对话调研单标的答复只剩数字、没了叙事。
- **根因**：`LiteLLMClient.max_tokens=512` 太小。护城河多空的**中文结构化 JSON**（4 护城河+2看多+2看空+长 verdict，中文每字 1–2 token）超 512 → 响应被截断成**半截 JSON** → `_parse_json` 解析失败 → 降级空结构。拉 `narrative` 原文确认：是完整高质量 JSON，只是结尾被切在 verdict 中间。
- **修复**：`config.py` 加 `IR_LLM_MAX_TOKENS`（默认 **1600**），`build_llm` 传入，`LiteLLMClient` 默认 512→1600。离线单测（默认值/env 覆盖/传参）。rebuild 后生产实测 `/thesis` `parse_ok=true` + moat 3/bull 2/bear 2。⚠️ **需 ECS rebuild** 才在生产生效。
- **勘误**：初诊时曾疑 `/council` 也受影响（当时 curl 误查了 `members` 字段），复核实为字段名应为 **`verdicts`** —— 议事厅一直正常（rebuild 后实测 `parse_ok=true`、5 席「守拙/疾风/乌鸦/观星/司南」齐全、tally 正常），非坏功能。

### 🟠 #2 行业调研「⬇ 生成行业研报」占位 — 已修

- **现象**：按钮只弹 `toast('info','行业研报','即将支持导出')`，不生成任何东西（真·不起作用）。
- **修复**：新增 `genIndustryReport()`——用已缓存的行业聚合（板块估值/规模/coverage/成分股 + LLM 关键驱动）合成 markdown 研报 → 落报告库 → 进阅读页（可导出 PDF）。复用既有报告基建，不新增后端。数字来自 `/industry` 聚合、叙事只 LLM、缺数留白。Playwright 实测生成成功。

## 验证通过（无需改动）

| 面 | 功能点 | 结果 |
|---|---|---|
| 工作台 | 14 视图渲染 + 逐控件点击 | ✅ 0 异常 |
| 工作台 | 公司页 7 tab（概览/财务/财报/深度/估值/舆情/辩论） | ✅ 均渲染 |
| 工作台 | 对话调研（/ask）、⌘K 搜索（/search 合并） | ✅ 有产出 |
| 工作台 | 议事厅 council、横向对比 compare、一键调研 research | ✅ 有产出 |
| 工作台 | 筛选 screener、估值 valuation、日历 calendar、跨市场板块 sector | ✅ 渲染 |
| 工作台 | 「数据说明/来源/关于」信息按钮（弹 toast） | ✅ 本就是提示，非坏功能 |
| 看板 | 切片条（时间窗/主线）、聚焦、⌘K、首页提问框跳转 | ✅ 有响应 |
| 后端 | 12 GET 端点（quote/bars/financials/news/indices/industries/industry/peers/company-profile/search…） | ✅ 全 200 真数据 |
| 后端 | `/earnings-recap`、`/compare` | ✅ 正常 |
| 数据 | `/web/data/*.json`（satellite/screen/calendar/chain/narrative/industry 预热） | ✅ 均真实、含 generated 时间戳 |

## 备注

- 「叶先生 · 账户与偏好设置即将上线」为账户功能占位，超出投研范围，保留。
- #1 的 LLM 截断是**运行期配置问题**（非崩溃），前端一直诚实降级（显示确定性数字 + 标注叙事降级），故错误巡检抓不到，靠真后端 curl 才暴露——本次纳入修复。
