# 森林AI MVP 最终验证与视觉审计

审计日期：2026-07-21

## 结论

本轮对统一版 MVP 做了后端、Web、桌面壳和响应式页面的全量验证。核心验证命令均以 0 退出；Docker 探测因本机没有 Docker CLI 而失败。最终截图逐张打开检查，未发现裁切、错误页、加载中画面或横向溢出。PostgreSQL 实时连接测试未运行，不能据此宣称数据库集成环境已验收。

截图是本地审计产物，保存在 `apps/web_v1/test-results/`，由 Git 忽略，不随本文档提交。

## 证据视口与页面

| 视口 | 本地截图 | 检查结果 |
| --- | --- | --- |
| 1440×1024 | `login-react-acro.png` | 两栏登录卡完整，服务器地址、连接状态、账号、密码和登录动作清楚可见 |
| 1440×1024 | `workbench-react-acro-light.png` | 项目轨道与主内容对齐，无常驻项目频道侧栏或右侧检查器 |
| 1440×1024 | `project-react-acro-light.png` | 96px 项目轨道、248px 频道侧栏和主内容连续铺满视口 |
| 1440×1024 | `project-tasks.png` | 真实标签、空状态与创建入口可见，不再显示固定进度 |
| 1440×1024 | `project-ai-controlled.png` | 会话列表、受控创建入口和“不会自动生成正式对象”说明可见 |
| 1440×1024 | `project-inbox-confirmed.png` | 收集内容、分析建议、选择项、确认结果和不可重复写入状态可见 |
| 390×844 | `login-react-acro-mobile.png` | 单栏布局，无水平裁切；首屏下方内容可纵向滚动 |
| 390×844 | `project-react-acro-mobile.png` | 默认关闭导航后主内容可访问；标题正常横排、URL 位于视口内，指标以 2×2 排列 |
| 390×844 | `project-navigation-mobile.png` | 项目抽屉、遮罩与关闭路径可见 |
| 390×844 | `channel-navigation-mobile.png` | 频道抽屉、最近会话与关闭路径可见 |
| 390×844 | `project-inbox-confirmed-mobile.png` | Inbox 列表和详情按单列重排，无横向溢出 |

视觉脚本在桌面切换到移动视口后，会等待项目轨道与频道侧栏真正进入隐藏状态再采集项目主内容，避免把 160ms 收起动画的中间帧误当成最终证据。

## 与初始审计的对比

对照本地 Git ignored 证据 `apps/web_v1/test-results/audit-current/01-login.png` 至 `05-tasks.png`。这些截图不随仓库提交；其审计结论由已跟踪的[统一设计规格“现状审计”章节](superpowers/specs/2026-07-21-senlinai-mvp-unification-design.md#2-现状审计)记录：

- 登录页由会裁切右栏的三栏卡片改为完整双栏；`森林Agent`、`SenlinAI`、`AI Agent` 已统一为“森林AI / AI 助手”，字母占位图形替换为正式图标。
- 工作台与项目页移除了升级、支付、固定存储空间、`AI 空闲`、`实时接口` 和固定 `进度 60%` 等无真实依据的状态。
- 项目页取消常驻右侧检查器，布局边界变为项目轨道、频道侧栏和主内容三段连续结构；项目强调色集中在横幅和小型标记。
- 任务页从静态示例卡片改为后端工作区数据驱动的标签、计数和空状态。
- 390px 项目页不再是桌面布局左侧切片；主内容默认可见，项目与频道分别通过顶部按钮打开抽屉。
- 390px 项目概览标题保持正常横排，项目 URL 保持在容器内并可在必要时省略，四项指标使用 2×2 网格并保持标签、数值和说明横向可读。
- Inbox 和 AI 页面明确保留“分析/受控会话 → 用户确认 → 正式对象”的边界，不把 AI 输出表现为已经自动执行。

## 核心交互与安全边界

本轮视觉回归不仅截图，还覆盖下列交互状态：

- 登录连接检查、提交和工作台落地。
- 项目/任务/笔记关键词搜索；较慢的旧响应不能覆盖较新的结果。
- 被授权的外部任务或笔记只打开受限预览，不加载或切换到无所有权的项目工作区；未知结果类型不伪造项目导航。
- 项目设置更新包含写入中状态、成功刷新和中文失败提示。
- Inbox 分析只读取服务端保存的建议；确认只发送勾选的建议 identity。网络结果不确定时冻结选择并复用原请求安全重试，确定性 400、409 冲突和写入后刷新失败分别处理。
- AI 会话创建只发送标题和项目上下文；同项目乱序 GET、跨项目延迟 POST 和项目切换后的加载失败不会污染当前项目状态。
- 探索数据源、自定义频道/外链、升级支付、窗口停靠和自主 Agent 等范围外能力不呈现为可成功执行的控件。

后端全量测试和静态检查通过，但本审计不以截图推断完整的认证、数据库或 WCAG 合规。真实 bearer token 生命周期、PostgreSQL 行为、完整键盘顺序、焦点可见性、对比度和屏幕阅读器名称仍应分别在集成环境和人工辅助技术检查中复核。

## 剩余限制

- PostgreSQL 测试带 `integration` build tag，未带 tag 时不会被编译。当前 `DATABASE_DSN` 与 `DATABASE_URL` 均未配置，因此本轮未运行 tagged live check；在隔离测试库配置其一后，应运行 `go test -tags=integration ./internal/models -run TestPostgresPing -v`。缺少两个变量时该测试会失败，而不是跳过。
- 当前环境未安装 Docker CLI，未执行 Compose 启动、数据库初始化或容器内端到端检查。
- Web 构建成功，但主 JavaScript chunk 约 663 kB、主 CSS chunk 约 592 kB，Vite 报告大于 500 kB 的体积警告；这是性能优化项，不阻塞 MVP 正确性验收。
- 桌面壳构建成功；Windows 链接器输出了导入库创建信息并被 Rust 记录为一条 linker warning，没有构建错误。
- 390×844 登录首屏为了保留品牌说明，登录按钮位于首屏下方，需要纵向滚动；页面无水平裁切，仍可完成登录。
- 截图只能证明采集状态下的视觉结果，不能替代真实网络、慢设备、缩放、键盘和辅助技术测试。

## 仓库卫生

提交前检查确认没有被 Git 跟踪的 `dist`、`target`、`test-results`、日志、数据库、私钥、证书或真实 `.env` 文件。截图、Web 构建目录、Tauri 构建目录和 `.superpowers/` 报告均由忽略规则覆盖；控制器已有的 `.superpowers/sdd/progress.md` 修改未纳入本提交。
