Files
cmroubao/docs/08-interaction-checklist.md
T

317 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 交互清单
> 本文把 P0 用户故事转换成可实现、可测试的 Web 和 Android 行为。页面入口见
> [路由](routes.md),接口字段见 [API](api.md)。
## 交互总表
| ID | 用户故事 | 页面/组件 | 触发 | 预期结果 | 优先级 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
| IX-001 | US-007 | 管理 Web 登录 | 提交账号密码 | 建立管理会话或显示通用错误 | P0 | 已定 |
| IX-002 | US-001 | 新建任务表单 | 填写并提交 | 创建 `PENDING` 任务 | P0 | 已定 |
| IX-003 | US-002 | 任务列表/详情 | 打开、刷新、取消 | 查看最新状态、证据和允许动作 | P0 | 已定 |
| IX-004 | US-007 | App 登录/设备绑定 | 登录或会话恢复 | 建立人员+设备身份 | P0 | T-206 已实现 |
| IX-005 | US-003 | App 任务页 | 点击“获取任务” | 就绪检查后领取一条任务或显示原因 | P0 | T-206 已实现 |
| IX-006 | US-004 | App 执行页 | 确认开始/自动步骤 | 显示步骤并有界执行搜索与候选判断 | P0 | 已定 |
| IX-007 | US-005 | App 候选确认 | 接受/拒绝/转人工 | 停止自动化并回传人员结论 | P0 | 已定 |
| IX-008 | US-006 | App/管理端错误状态 | 自动失败、取消、重试上传 | 显示结构化原因和恢复动作 | P0 | 已定 |
| IX-009 | US-008 | App 候选理由/管理端决策详情 | 接受、拒绝、改选或修正 | 保存逐候选结构化人工标签 | P1 | T-208 已实现 |
| IX-010 | US-009 | App 独立执行设置/同步状态 | 配置模式、离线执行或补报 | 授权内独立执行并可审计同步 | P0 | T-206 离线控制已实现,结果补报待 T-207 |
## IX-001 管理 Web 登录
- 页面:`/login`
- 角色:采购管理员
- 前置条件:种子管理账号已建立。
- 服务依赖:管理会话创建。
- 关联原型:[管理登录](design/admin-login.html)(T-202)。
**正常路径**
1. 用户输入账号和密码并提交。
2. 提交期间按钮禁用并显示进度,密码不回显。
3. 成功后进入原目标页或 `/tasks`。
**状态与异常**
- 默认:账号框自动聚焦;密码可切换显示但默认隐藏。
- 校验:空字段在字段附近提示;服务端仍执行完整校验。
- 失败:统一显示“账号或密码不正确”,不暴露账号是否存在。
- 网络错误:保留账号,清空密码,允许重试。
- 会话过期:跳转登录并保留安全的返回路径。
**可访问性**
- 标签与输入框显式关联;错误摘要可被读屏感知。
- Enter 提交;焦点移到首个错误字段。
## IX-002 创建采购任务
- 页面:`/tasks/new`
- 角色:采购管理员
- 服务依赖:`POST /api/v1/assets`、`POST /api/v1/tasks`
- 关联原型:[新建任务](design/admin-task-create.html)(T-202)。
**正常路径**
1. 输入标题、SKU、描述、数量、可选商品总预算并选择一张图片。
2. 浏览器展示图片预览、文件名和大小。
3. 提交期间锁定重复提交并显示“正在创建”。
4. 成功后进入任务详情,显示编号和 `PENDING`。
**状态与异常**
- 标题和 SKU 必填,描述可空;数量默认 1,只接受正整数。
- 商品总预算为空表示不设置上限;填写时表示当前任务全部数量的商品金额上限。
- 图片类型、大小或解码失败时在图片控件旁提示。
- 上传成功但创建失败时重用已上传 asset,不重复上传。
- 网络状态不确定时使用幂等键查询结果,不直接再创建。
- 离开含未提交内容的表单时提示确认。
**可访问性与小屏**
- 字段错误使用文本说明,不只使用颜色。
- 图片选择有可访问名称;预览提供来源文件名。
- 小屏下表单单列,提交按钮不遮挡最后一个字段。
## IX-003 查看任务与证据
- 页面:`/tasks`、`/tasks/{id}`
- 角色:采购管理员
- 服务依赖:任务列表、详情、取消和资产读取 API。
- 关联原型:[任务列表](design/admin-task-list.html)、
[任务详情](design/admin-task-detail.html)(T-202)。
**正常路径**
1. 列表按最近创建时间展示编号、标题、状态、设备和更新时间。
2. 进入详情查看原始输入、状态时间线、AI 派生结果、候选和证据。
3. 仅 `PENDING`/允许状态展示取消命令,取消前二次确认。
**状态与异常**
- 加载:保留页面框架和筛选条件,显示明确进度。
- 空状态:说明还没有任务并提供“新建任务”入口。
- 失败:保留上一次内容但标明可能过期,提供重试。
- 权限不足/不存在:分别处理,但都不泄露任务内容。
- 截图加载失败:显示占位和重试,不影响其他证据查看。
- `SUCCEEDED` 详情必须醒目展示“验证完成,未提交订单”。
**可访问性**
- 状态同时使用文字,不只用颜色。
- 时间线使用有序列表语义;图片有描述性替代文本。
- 列表在窄屏转换为可扫描行,不使用水平溢出遮挡操作。
## IX-004 App 登录与设备绑定
- 页面:Android“登录/设备绑定”
- 角色:采购执行员
- 服务依赖:`POST /api/v1/auth/token`、设备心跳。
- 关联原型:[App 登录](design/android-login.html)、
[设备设置](design/android-settings.html)(T-202)。
**正常路径**
1. 用户输入采购账号并确认后端已预授权的当前设备身份。
2. 成功后令牌存入 Android 安全存储,进入任务页。
3. App 上报版本和就绪能力,不上传敏感设备内容。
**状态与异常**
- 账号或设备被禁用:解释联系管理员,不反复重试。
- 未预授权、token 错误或已绑定其他采购员的设备不能在 App 中“重新登记”,联系
管理员重新预置。
- 网络错误:保留非敏感账号字段,密码清空。
- 会话恢复失败:退出到登录页;活跃任务先查询服务端再决定状态。
- 退出登录:有运行任务时禁止直接退出,先安全停止。T-204 只实现服务端 token
签发和验证;本地清除与服务端撤销接入属于 T-206。
**可访问性**
- 支持系统字体缩放;输入与错误不重叠。
- 软键盘不遮挡提交按钮,返回键不会静默丢失运行状态。
## IX-005 手动获取任务
- 页面:Android“任务”
- 角色:采购执行员
- 服务依赖:设备预检、`POST /api/v1/tasks/claim-next`
- 关联原型:[任务主页](design/android-task-home.html)、
[任务预览](design/android-task-preview.html)、
[设备设置](design/android-settings.html)(T-202)。
**正常路径**
1. 页面显示无障碍、拼多多、网络和当前任务的就绪状态。
2. 全部就绪时“获取任务”可用;点击后立即禁用防重复。
3. 成功后展示任务预览和“开始采购”,此时状态为 `CLAIMED`。
**状态与异常**
- 无任务:显示安静的空状态和手动刷新,不循环弹错。
- 权限缺失:提供打开对应系统设置的命令。
- 已有任务:显示“继续任务”,不再领取。
- 请求超时:保留请求前已安全保存的 claim token/幂等 key,先用同一请求重放并通过
heartbeat 对比服务端活跃任务,再允许生成新请求。
- 租约到期:预览页提示任务已释放,返回任务页。
**可访问性**
- 就绪状态使用图标加文字;系统设置命令有明确名称。
- 主要控件满足 Android 最小触控区域,加载不改变控件尺寸。
## IX-006 执行采购任务
- 页面:Android“任务执行”及拼多多前台
- 角色:采购执行员
- 服务依赖:start、heartbeat、App 本地 AI、event API 和 Android 自动化。
- 关联原型:[任务预览](design/android-task-preview.html)、
[任务执行](design/android-task-running.html)(T-202)。
**正常路径**
1. 用户检查原始需求并点击“开始采购”。
2. App 启动前台服务,进入预检并显示当前步骤。
3. 解析需求,打开拼多多,搜索并检查最多 5 个候选。
4. 每一步上报事件;找到结果后进入 `WAITING_CONFIRMATION`。
**状态与异常**
- 运行中禁止第二次开始;持续通知提供“返回任务”和“停止”。
- App 切换到拼多多时,通知是回到执行页的稳定入口。
- 用户请求停止后进入“正在安全停止”,不立即在动作中间销毁状态。
- 进程重启时查询任务和 execution;无法证明可安全恢复则标记失败。
- 验证码、风控、登录、支付和未知页面立即停止,不展示“自动继续”。
- AI 超时最多按配置重试;输出无效或低置信度转人工。
- 候选商品价乘以任务数量达到总预算上限校验失败,或运费/优惠导致总价无法确认时,
不能进入接受状态。
**可访问性与反馈**
- 当前步骤使用文字和进度列表,不显示虚假百分比。
- 错误、暂停和等待人工使用不同语义,不只依赖颜色。
- 通知操作名称明确;动态更新通过适度的 live region/无障碍播报。
## IX-007 人工确认候选
- 页面:Android“候选确认”
- 角色:采购执行员
- 服务依赖:`POST /api/v1/tasks/{id}/complete`
- 关联原型:[候选确认](design/android-candidate-confirm.html)、
[任务结果](design/android-task-result.html)(T-202)。
**正常路径**
1. 展示原始需求、候选标题/价格、匹配项、缺失项和证据截图。
2. 用户选择“接受候选”“拒绝候选”或“需人工处理”。
3. 每种选择要求确认并填写简短人工原因;这满足 T-207 第一版审计,不冒充结构化
优化标签。
4. 结果幂等回传,页面显示“验证完成,未提交订单”。
**状态与异常**
- 没有候选时只允许确认“无匹配”或“需人工处理”。
- 存在商品总价超预算、最终商品金额无法确认或关键属性未知时禁用“接受候选”并
说明原因。
- 回传超时:保留选择和原因,查询最终状态后再重试。
- 返回键不能恢复自动点击;等待确认一旦到达就是硬停止点。
- 所有结果都写入 `order_submitted=false`。
**可访问性**
- 候选信息按标题、价格、匹配和风险分组。
- 确认对话框默认焦点在取消;破坏性/拒绝动作不能与接受动作混淆。
## IX-008 失败、取消和恢复
- 页面:Android“任务执行/结果”、Web 任务详情
- 角色:采购执行员、采购管理员
- 服务依赖:fail、event、asset API。
- 关联原型:[管理任务详情](design/admin-task-detail.html)、
[App 任务执行](design/android-task-running.html)、
[App 任务结果](design/android-task-result.html)(T-202)。
**正常路径**
1. 系统停止动作,保存失败步骤和错误类别。
2. App 显示发生了什么、是否已停止和建议下一步。
3. 证据上传成功后,管理详情显示相同结论。
**状态与异常**
- 上传失败:本地加密/受控保留待传证据,显示“结果待同步”。
- 取消:说明不会自动恢复;服务端终态后清理前台服务。
- 可恢复设备问题:只提供“修复后重新领取/新建尝试”,不原地猜测继续。
- 安全错误 `SAFETY_*` 不允许自动重试。
- 清理本地证据仅在服务端确认接收或超过明确保留策略后发生。
**验收证据**
- 每类错误至少有一个自动化或 fake 测试。
- 验证码/未知页/支付边界至少在受控环境各验证一次安全停止。
## IX-009 结构化候选理由
- 页面:Android“候选确认”、管理 Web“任务详情/候选决策”。
- 角色:采购执行员、采购管理员/优化人员。
- 前置条件:T-207 第一版流程和 T-208 reason schema 已完成。
- 服务依赖:已实现的 T-208 幂等 human review API。
**正常路径**
1. 用户选择接受项、逐项拒绝、改选或全部无匹配。
2. 每个决定至少选择一个结构化理由,并明确一个主要理由;备注默认可选。
3. 选择“其他”时显示 4-200 字备注输入;没有预算时不显示预算类理由。
4. 改选时先确认原推荐项拒绝理由,再确认替代项选择理由。
5. 全部拒绝时逐候选确认;允许勾选多个候选后显式批量应用相同理由。
6. 提交后显示人工结论、模型判断和系统推荐三个独立区块,不合并文案。
**状态与异常**
- 模型理由可以只读展示,但不得预选为人工理由。
- 网络失败保留本地草稿和独立幂等 key;查询服务端后决定是否重放。
- 修改已提交结论时明确提示“创建修订版本”,不能覆盖原记录。
- 理由码失效或与任务不适用时由服务端拒绝并要求重新选择。
**可访问性**
- 理由使用 checkbox/radio 和明确 label,不依赖颜色;主要理由可用单选控件指定。
- 批量应用前显示候选数量和标题摘要,默认不选中。
## IX-010 App 独立执行与同步
- 页面:Android“设备设置”“任务执行”和“结果同步”。
- 角色:采购执行员。
- 前置条件:设备已绑定;后台任务已领取。
- 服务依赖:T-206 有限离线授权;T-207 Keystore provider 配置和加密 outbox。
**正常路径**
1. 设置页选择 `MANUAL_FIRST` 或 `AI_ASSISTED`。AI 模式复用 Roubao 现有 provider、
model、Base URL 和 Key 配置,Key 默认隐藏。
2. 开始后台任务时固定本次 execution 的模式及非秘密 provenance;任务 payload 不能
改写本地 provider 设置。
3. 管理后端断开时,执行页显示“离线执行”、服务端授权截止时间和待同步项目数;授权
内继续本地 workflow。
4. 恢复连接后先同步任务归属和取消状态,再按依赖顺序幂等上传事件、证据和终态结果。
**状态与异常**
- 旧明文 Key 迁移失败或 Keystore 不可用:禁用真实 VLM 调用,允许用户显式改用
`MANUAL_FIRST`,不能静默切换。
- 远程 provider 非 HTTPS、发生重定向或输出无效:停止 AI 分支并转人工,不影响已有
outbox 和任务证据。
- 离线授权剩余 5 分钟时持续显示警告;到期时在安全检查点停止,不提供“继续离线”。
- 离线期间无法保证即时接收管理取消;恢复连接后收到取消必须先停止再上传。
- 结果补报失败保留加密本地记录和原幂等 key;不能恢复终态后的自动化。
- App 可以显示 provider 名称和模型,但不得回显 Key、Authorization 或完整敏感 URL。
## 通用交互约束
- Web 和 App 的所有提交都防重复,网络超时后以服务端状态为准。
- 状态名称使用用户可理解中文,同时保留稳定机器状态码。
- 不在 UI 暴露模型密钥、设备令牌、内部堆栈或文件绝对路径。
- 字体放大、窄屏、软键盘和系统返回操作下,主要命令和错误不能被遮挡。
- P0 页面实现前按 [`design/README.md`](design/README.md) 生成低保真原型并人工确认。