boardx / boardx/boardx-dev-template
fix(survey): p25 fast-follow — 错误脱敏 + 答题限流/TOCTOU(Qwen 保留,原「改 Claude」已作废)
- Dominant language
- TypeScript
- Stars
- 1
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
p25 survey 系统(#632)已合入 main(sha ccc3e09)。独立 review 结论:**无假 passing**(7/7 证据链真实、派生视图一致、迁移幂等),但有一批 fast-follow 必须补。按优先级:
## ~~P0 — AI 问卷报告改用 Claude~~ → ❌ **已作废(2026-07-17 人类推翻)**
> **仓库所有者 2026-07-17 拍板:「boardx 的应用端,默认使用 qwen,可以的」。**
> 这条**推翻了** 07-14 那条「产品 AI 统一 Claude 系」的结论。**Qwen 保留,不要改成 Claude。**
>
> 谁看到这条:**不要**动 `apps/web/lib/qwen.ts` / `packages/data/src/surveyAi.ts` / `ai-report/route.ts` 的 provider 选择,**不要**删 `DASHSCOPE_API_KEY`/`QWEN_API_KEY`。最新、最明确的指令覆盖早前结论。
>
> 相关:#668(把 `DEFAULT_AVA_MODEL_ID` 设为 `qwen3.7-max` + 新增 `qwenProvider`)据此获批。
> 待办:补一份 ADR 记录「为何应用端默认用 Qwen 而非 Claude」,否则下一个 agent 读到 07-14 的旧结论还会改回去——这正是本条被划掉的原因。
---
**以下各条与 provider 选择无关,全部仍然有效,必须做:**
## P0 — 🔴 对外错误泄漏(安全,必修)
- ~~`app/api/surveys/[id]/ai-report/route.ts:235` 顶层 catch 直接回 `String(err)`~~ → ✅ **已由 #669 修复**(现为 `{ error: "ai_report_failed" }` + `console.error` 落日志)。
- `app/api/surveys/ai/route.ts:102` 同类,`error.message` 外泄 → 通用文案。
> ⚠️ 行号订正(2026-07-17):是 **102** 行(`return NextResponse.json({ error: error.message ... })`),不是 100——**100 行是 `console.error(...)`,那恰恰是正确的服务端日志姿势,别去"修"它**。原文的 :100 是错的。
## P1 — 🟡 端点滥用防护
- AI 报告生成仅 `canViewSurvey` 且无限流:任意团队可见者可反复触发**付费 Qwen 调用**(成本/DoS)。提到 `canManageSurveyScope` + 加限流。**默认 Qwen 之后这条更重要,不是更不重要**——付费调用面没变。
- 匿名公开答题 `app/api/surveys/[id]/responses/route.ts:60,109` 无任何滥用防护(F03 notes 宣称有,实际只有 response_limit 计数)。至少加 per-IP 节流。
- `response_limit` check-then-insert 非原子(TOCTOU):并发提交可越上限。用事务 `SELECT … FOR UPDATE` 或 DB 约束。
## P2 — 🟢 测试与健壮性
- `lib/qwen.ts:28` 的 `JSON.parse` 无 try/catch → 非法 JSON 抛错冒泡成 502,补确定性降级。(Qwen 保留,所以这条落在 `qwen.ts` 本身。)
- e2e 补:匿名(无 cookie)提交负例(F03 声称免登录,现用例都已登录);AI session 跨用户 404 负例(survey-p25-007)。
- ui-signoff `confirmed_by: shenyangjun`(开发者自签自己模块 UI):建议此类自签补上级 coordinator/另一人类背书留痕(ADR-003 门禁独立性)。
## 回流
完工后按 agent-bootstrap 第 8 步,把 survey 域经验(公开答题安全/AI provider 接入)回流到对应 mod-* skill。
> ✅ **2026-07-17 更新**:`surveys/ai/route.ts:102`(error.message 外泄)与 `ai-report/route.ts:235`(String(err))两处 🔴 错误脱漏**均已由 #669 修复**;并新增 `check-error-leaks.mjs` 门控(括号平衡、跨行、放行 zod validation.message),全仓 0 泄漏。剩余项:AI 报告鉴权收口/限流、匿名答题限流、response_limit TOCTOU。
Contributor guide
No contributing guide indexed for this repository
Research direction
First separate the completed and obsolete items from the remaining checklist. Inspect app/api/surveys/ai/route.ts and app/api/surveys/[id]/responses/route.ts for error handling, authorization, rate limiting, and response_limit concurrency; review lib/qwen.ts and the survey-p25-007 e2e case for the robustness and cross-user scenarios. Done means the remaining abuse, TOCTOU, and failure-path cases are covered without changing the approved Qwen provider.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, database, security, testing-qa
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100