缺陷 #10
open专家名片附件上传/删除携带公开平台字段被拒绝及保存失败回滚
0%
Description
用户报告专家详情名片/身份证上传失败,出现 public_platforms 请通过公开平台管理入口修改。与普通编辑缺陷 #6 根因相关,但触发入口为附件上传与删除;本任务独立记录该遗漏入口修复。候选 projects/ndb/frontend 分支 feature/configure-expert-public-permissions 未提交工作区;范围:通用创建/更新请求隔离公开平台字段,附件最小请求、失败恢复、连续操作序列化。仅本地自动化与受控 mock 浏览器测试;不访问生产或真实 OSS,不提交不部署。逐条 QA 结果、截图说明及限制追加后续 journal。
RA Updated by Redmine Admin 23 days ago
QA 测试结果 - 第 1 轮 - 2026-10-19 Asia/Shanghai¶
- 项目:NDB;缺陷 #10;QA:独立 bounded web_qa。
- 环境:本地 Node 聚焦测试 + http://127.0.0.1:8897 组件 harness(真实 ImageUpload/antdv-next/实际附件回调/API模块;后端、OSS和PM身份完全mock)。这不是完整CRM或真实服务端端到端。
- 候选:projects/ndb/frontend,feature/configure-expert-public-permissions,HEAD 2165f83615f54709822ef51b48eab1cfb4b56292 及本轮未提交修复。
- 前置:仅合成数据;无凭据、真实后端/OSS、生产写入或部署。
- 汇总:Pass 42 / Fail 0 / Blocked 1 / Skipped 0。
- 证据目录:outputs/candidate-attachments-20261019/;单元test实际运行 node --test 四个聚焦文件及publicExpertProfile.test.mjs。
| 编号 | 用例 | 层级 | 预期 | 实际 | 状态 | 证据 |
|---|---|---|---|---|---|---|
| WEB-ATT-UNIT-001 | addCandidate filters platform configuration (disabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-002 | editCandidate filters platform configuration (disabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-003 | addCandidate filters platform configuration (WECHAT_MINI_APP) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-004 | editCandidate filters platform configuration (WECHAT_MINI_APP) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-005 | addCandidate filters platform configuration (AI_EXPERT) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-006 | editCandidate filters platform configuration (AI_EXPERT) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-007 | addCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-008 | editCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-009 | failed upload is removed from the visible list | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-010 | failed removal restores the saved attachment | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-011 | thrown save errors restore the visible list | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-012 | saved list updates preserve another in-flight upload | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-013 | an upload is not duplicated when its save updates props | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-014 | another completed upload cannot resurrect a pending removal | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-015 | done sends only attachments and commits after success | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-016 | done preserves saved state after business failure | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-017 | done preserves saved state after network failure | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-018 | removed sends only attachments and commits after success | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-019 | removed preserves saved state after business failure | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-020 | removed preserves saved state after network failure | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-021 | concurrent uploads and removal are serialized without losing attachments | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-022 | failed save does not poison subsequent operations | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-023 | queued callback cannot write to a newly loaded candidate | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-024 | an upload event retains its original status if the widget mutates the file | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-025 | edit excludes platform fields (0 enabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-026 | edit excludes platform fields (1 enabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-027 | create excludes platform fields (0 enabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-028 | create excludes platform fields (1 enabled) | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-unit.tap |
| WEB-ATT-UNIT-029 | platform toggles preserve the other platform's permission | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-030 | AI-only confirmed draft can publish and names the selected platform | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-031 | status label distinguishes platform, draft, future publication, and visible publication | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-032 | newer candidate load wins when an older response arrives later | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-033 | candidate switch invalidates an in-flight write and its final state | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-034 | canceling publication after save keeps the confirmed draft without publishing | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-UNIT-035 | 409 refreshes platform state but preserves the user's draft input | 本地源码聚焦测试 | 断言全部通过 | Pass;该独立用例通过 | Pass | qa-public-profile.tap |
| WEB-ATT-BROWSER-001 | 组件上传成功 | ego-browser真实组件/本地mock | 文件真实input选择后OSS mock成功;仅保存附件 | 成功提示且保存列表 old/upload;请求仅property.file_list | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-002 | 组件删除成功 | ego-browser真实组件/本地mock | 删除后保存成功并从列表消失 | upload条目从本地与mock服务端列表移除 | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-003 | 上传保存失败回滚 | ego-browser真实组件/本地mock | 业务失败后移除未保存卡片,保留原文件 | 错误提示;最终DOM 1卡片且原附件保留 | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-004 | 删除保存失败恢复 | ego-browser真实组件/本地mock | 删除失败后原卡片恢复 | 错误提示;最终DOM 1卡片且原附件保留 | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-005 | 连续附件操作序列化 | ego-browser真实组件/本地mock | 同时回调互不覆盖且至多1请求在途 | old/a/b最终均保留;maxInflight=1;此场景由evaluate触发实际callback | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-006 | 普通创建更新隔离平台字段 | ego-browser真实组件/本地mock | 真实API函数过滤公开平台字段 | 创建请求data只有name;编辑data只有warning;由evaluate触发实际API函数 | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-BROWSER-007 | 列表只读入口 | ego-browser真实组件/本地mock | 展示文件但无上传删除控制 | 真实ImageUpload active=false的dialog展示3文件,无上传删除按钮 | Pass | browser-requests.json / browser-final-snapshot.txt / qa-browser-observations.md |
| WEB-ATT-MANUAL-001 | 真实截图与图文手册 | 浏览器截图/文档 | 真实截图及UI/业务复核完成 | ego-browser screenshot两次及CDP fromSurface:false一次均Page.captureScreenshot超时;组件文字说明草稿已存,无截图,UI复核未完成 | Blocked | qa-browser-observations.md / user-guide-draft.md |
风险与未验证项¶
真实后端/OSS联调、生产流程、完整CRM路由与真实角色权限未执行。截图工具3次超时,图文手册仍Blocked,文字草稿不是完整手册;UI视觉与项目业务复核待主任务协调。独立代码复核未发现可操作新增缺陷。后端property合并契约由主任务提供本轮views.py:1111-1139只读核验,非本QA独立后端验收。未提交、推送、部署。
RA Updated by Redmine Admin 23 days ago
QA 测试结果 - 第 2 轮 - 2026-10-19 Asia/Shanghai¶
- 项目:NDB;缺陷 #10;执行:独立 web_qa。
- 候选:projects/ndb/frontend,feature/configure-expert-public-permissions,HEAD 2165f83615f54709822ef51b48eab1cfb4b56292 与本轮未提交最终修复;冻结哈希candidate-files-r2.json逐项匹配。
- 环境:本地Node测试与ego-browser space32真实ImageUpload/antdv-next组件harness;实际附件回调和API源码;身份/后端/OSS仅mock。非完整CRM、真实后端或生产验收。
- 本轮新增修正:onRemove接入确认与PM/PA拦截;复制组件显示文件,防止组件移除事件污染已保存文件status。
- 汇总:Pass 212 / Fail 0 / Blocked 0 / Skipped 0。构成为聚焦执行40条、全仓执行164条(包含聚焦重复执行,非204个唯一用例)、浏览器/截图7条、最终手册复核1条。
- 第1轮截图Blocked历史保留;本轮已恢复真实截图并完成复核,因此解除该视觉交付阻塞。
- 本地证据:outputs/candidate-attachments-20261019/,聚焦qa-r2-focused.tap、全仓qa-r2-all.tap、浏览器qa-r2-browser-evidence.json。
| 编号 | 用例 | 层级 | 预期 | 实际 | 状态 | 证据 |
|---|---|---|---|---|---|---|
| WEB-ATT-R2-FOCUS-001 | addCandidate filters platform configuration (disabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-002 | editCandidate filters platform configuration (disabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-003 | addCandidate filters platform configuration (WECHAT_MINI_APP) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-004 | editCandidate filters platform configuration (WECHAT_MINI_APP) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-005 | addCandidate filters platform configuration (AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-006 | editCandidate filters platform configuration (AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-007 | addCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-008 | editCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-009 | upload removal is wired to the current component's onRemove guard | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-010 | non-PM/PA users cannot remove an attachment | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-011 | isPM deletion waits for explicit confirmation and supports cancel | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-012 | isPA deletion waits for explicit confirmation and supports cancel | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-013 | widget removal mutations cannot change saved file status before or after failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-014 | failed upload is removed from the visible list | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-015 | failed removal restores the saved attachment | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-016 | thrown save errors restore the visible list | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-017 | saved list updates preserve another in-flight upload | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-018 | an upload is not duplicated when its save updates props | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-019 | another completed upload cannot resurrect a pending removal | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-020 | done sends only attachments and commits after success | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-021 | done preserves saved state after business failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-022 | done preserves saved state after network failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-023 | removed sends only attachments and commits after success | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-024 | removed preserves saved state after business failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-025 | removed preserves saved state after network failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-026 | concurrent uploads and removal are serialized without losing attachments | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-027 | failed save does not poison subsequent operations | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-028 | queued callback cannot write to a newly loaded candidate | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-029 | an upload event retains its original status if the widget mutates the file | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-030 | edit excludes platform fields (0 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-031 | edit excludes platform fields (1 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-032 | create excludes platform fields (0 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-033 | create excludes platform fields (1 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-034 | platform toggles preserve the other platform's permission | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-035 | AI-only confirmed draft can publish and names the selected platform | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-036 | status label distinguishes platform, draft, future publication, and visible publication | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-037 | newer candidate load wins when an older response arrives later | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-038 | candidate switch invalidates an in-flight write and its final state | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-039 | canceling publication after save keeps the confirmed draft without publishing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-FOCUS-040 | 409 refreshes platform state but preserves the user's draft input | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-focused.tap |
| WEB-ATT-R2-ALL-001 | addCandidate filters platform configuration (disabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-002 | editCandidate filters platform configuration (disabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-003 | addCandidate filters platform configuration (WECHAT_MINI_APP) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-004 | editCandidate filters platform configuration (WECHAT_MINI_APP) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-005 | addCandidate filters platform configuration (AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-006 | editCandidate filters platform configuration (AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-007 | addCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-008 | editCandidate filters platform configuration (WECHAT_MINI_APP,AI_EXPERT) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-009 | upload removal is wired to the current component's onRemove guard | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-010 | non-PM/PA users cannot remove an attachment | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-011 | isPM deletion waits for explicit confirmation and supports cancel | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-012 | isPA deletion waits for explicit confirmation and supports cancel | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-013 | widget removal mutations cannot change saved file status before or after failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-014 | failed upload is removed from the visible list | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-015 | failed removal restores the saved attachment | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-016 | thrown save errors restore the visible list | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-017 | saved list updates preserve another in-flight upload | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-018 | an upload is not duplicated when its save updates props | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-019 | another completed upload cannot resurrect a pending removal | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-020 | removes script and style elements together with their content | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-021 | removes other dangerous containers case-insensitively | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-022 | drops the remainder after an unclosed dangerous element | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-023 | preserves normal paragraphs, lists, and inline formatting | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-024 | only renders project-task expert details for a valid expert id | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-025 | defaults receivers to the client and expert emails and ccs to current user, PA and PM | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-026 | removes empty and duplicate emails and does not repeat receivers in ccs | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-027 | ignores missing account assignments and emails | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-028 | formats a task email record for the history modal | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-029 | formats cancellation and missing snapshot values safely | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-030 | expert templates send plain email without calendar fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-031 | calendar and unknown templates preserve calendar behavior | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-032 | detects ISO timestamps with explicit timezone | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-033 | keeps legacy naive timestamps on the existing parsing path | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-034 | builds a fuzzy name search for non-numeric input | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-035 | builds an exact candidate id search for numeric input | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-036 | normalizes completed rate change image uploads for the API | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-037 | allows at most three rate change attachments | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-038 | parses line and comma separated IP ranges without duplicates | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-039 | serializes IP ranges for editing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-040 | builds a normalized API payload | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-041 | direct AI search sends the full sentence without keyword search | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-042 | ordinary search parameters stay unchanged without an AI query | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-043 | done sends only attachments and commits after success | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-044 | done preserves saved state after business failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-045 | done preserves saved state after network failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-046 | removed sends only attachments and commits after success | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-047 | removed preserves saved state after business failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-048 | removed preserves saved state after network failure | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-049 | concurrent uploads and removal are serialized without losing attachments | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-050 | failed save does not poison subsequent operations | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-051 | queued callback cannot write to a newly loaded candidate | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-052 | an upload event retains its original status if the widget mutates the file | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-053 | selects the first browser-supported recording MIME type | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-054 | formats recording duration as minutes and seconds | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-055 | appends recognized text without replacing existing background | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-056 | calculates and formats live microphone volume as dBFS | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-057 | edit excludes platform fields (0 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-058 | edit excludes platform fields (1 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-059 | create excludes platform fields (0 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-060 | create excludes platform fields (1 enabled) | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-061 | corporate bank rules and switching reset sensitive personal fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-062 | corporate account save strips personal fields while preserving bank fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-063 | task payment corporate selection, bank rules, snapshot and personal switch | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-064 | three cooperation fields default pending and remain independent | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-065 | resume import leaves unknown English company blank and manual input survives submit normalization | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-066 | reads duplicate candidates from a paginated response on the new page | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-067 | excludes the current candidate while retaining other duplicates | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-068 | continues to support an unpaginated candidate array | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-069 | platform toggles preserve the other platform's permission | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-070 | AI-only confirmed draft can publish and names the selected platform | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-071 | status label distinguishes platform, draft, future publication, and visible publication | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-072 | newer candidate load wins when an older response arrives later | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-073 | candidate switch invalidates an in-flight write and its final state | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-074 | canceling publication after save keeps the confirmed draft without publishing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-075 | 409 refreshes platform state but preserves the user's draft input | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-076 | defaults existing zero before suggestion; review re-fetches and does not save | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-077 | quarter default combines current advance and catch-up but preserves existing actual | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-078 | confirmation submits reviewed payload; duplicate click does not duplicate writes | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-079 | business failure keeps modal, clears review and requires explicit recheck | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-080 | newly pending receipt blocks previous-year save during fresh review | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-081 | nonfinance cannot open or review; pending rows leave previous actual blank | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-082 | annual fields mirror Excel: four advance/catch-up/actual groups and previous difference pair | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-083 | empty actual is distinct from registered zero | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-084 | invalid money, empty form, future quarter and early year-end cannot be registered | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-085 | quarter accepts explicit zero and preserves exact decimal strings | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-086 | adjustments require prior year, customer, nonzero amount and reason | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-087 | Shanghai quarter boundary and next-April annual settlement gate | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-088 | already confirmed periods and incomplete annual data are blocked | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-089 | quarter suggestion defaults exact amount, remains editable, and performs no write | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-090 | quarter changes replace defaults and stale/closed requests cannot overwrite | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-091 | no receipts default to zero; failed suggestions remain blank and allow manual entry | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-092 | review is read-only; explicit confirmation submits frozen employee/period payload | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-093 | business failure does not close modal or automatically retry | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-094 | duplicate clicks in flight cannot send duplicate writes | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-095 | nonfinance caller and settled annual period cannot write quarter updates | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-096 | confirmed quarter opens existing actual amount and allows reviewed overwrite | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-097 | prior-year adjustment verifies locked original year and chosen customer | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-098 | annual review checks four quarters and writes only employee/year after confirmation | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-099 | finance write clients reject business failures and suppress duplicate notifications | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-100 | skipped annual amounts are informational and do not block year-end registration | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-101 | annual skip summary sums cents exactly and includes every reason | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-102 | annual only; compact existing icon action and fourteen amount fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-103 | changing year automatically fetches and ignores stale results | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-104 | HTTP 200 business error clears stale rows and disables financial actions | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-105 | invalid year stops request and discards former result | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-106 | annual modal warning spacing, latest recheck and no direct payment | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-107 | shows priority payment in the expert payment table | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-108 | includes priority payment in the finance filter form and request state | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-109 | validates meeting background image type and size | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-110 | upload success stores the returned URL without base64 persistence | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-111 | failed replacement keeps the previous image and supports retry | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-112 | removing an uploaded image clears the submitted URL | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-113 | normalizeMeetingPage supports meeting and legacy pagination envelopes | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-114 | meeting API records normalize lifecycle aliases before rendering | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-115 | meeting background field maps to ready, empty, invalid and failed display states | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-116 | clipboard copies raw links and normalized hours with success, failure and empty handling | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-117 | unknown statuses never expose raw backend enums | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-118 | buildMeetingPayload sends fixed planned hours and trims text | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-119 | buildMeetingUpdatePayload only sends fields allowed by backend | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-120 | create and update payloads never submit application or meeting project ownership | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-121 | repeat save reuses its idempotency key until form data changes | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-122 | calendar value persists and backend-created project is displayed | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-123 | meeting actions follow lifecycle and do not recreate settlement | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-124 | taskGenerationSummary exposes missing linked tasks | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-125 | meeting forms do not expose application or meeting project ownership fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-126 | meeting background is upload-only and cannot be entered as a URL | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-127 | read-only edit mode cannot be re-enabled by child form controls | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-128 | meeting list owns a single retryable Chinese error state | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-129 | registration selection gates downstream resources and submission | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-130 | meeting list and detail render the shared background display without exposing its URL | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-131 | detail copy actions are gated and use raw link plus normalized hours | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-132 | meeting pages follow shared responsive page patterns | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-133 | meeting edit and detail expose retryable load failures | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-134 | meeting detail error state hides entity actions and loading status | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-135 | meeting business fields are editable and visible without exposing soft-delete state | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-136 | meeting metadata shares one row, tags follow schedule, and join link owns a textarea row | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-137 | returns the company and title from the most recent expert experience | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-138 | uses the larger id when experience start dates are missing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-139 | returns null when the expert has no experience | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-140 | uses the expert real name as the alias for real background reuse | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-141 | returns all reusable fields from the latest expert task | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-142 | allows the assigned PA to update basic information without closing or reassigning the task | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-143 | grants full permissions when a PM-role account is assigned as the task PA | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-144 | keeps an unrelated PA from editing the task | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-145 | keeps an unrelated PM-role account from editing the task | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-146 | uses task PM permissions when a PA-role account is assigned as the task PM | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-147 | uses task PM permissions when the same account is assigned as both PM and PA | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-148 | preserves full task permissions for administrators | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-149 | normalizes saved telephone meeting information for editing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-150 | normalizes third-party meeting information for editing | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-151 | builds telephone meeting fields for task updates | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-152 | builds third-party meeting fields for task updates | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-153 | opens feedback only after task and requirement progress are saved | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-154 | does not open feedback when task submission fails | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-155 | builds an existing project and requirement payload without new resource fields | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-156 | builds a new project and requirement payload without stale ids | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-157 | builds a payload with a null client when no customer contact is selected | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-158 | marks every quick-editable table cell with a visible edit affordance | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-159 | creates modal values from the selected task-list field | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-160 | builds a narrow task update payload for each modal | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-161 | topic detail error state uses an explicit title and hides entity actions | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-162 | normalizeTopicPage accepts the web pagination envelope | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-163 | topicOutlineSummary creates readable text from legacy HTML and Markdown | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-ALL-164 | topicPayload trims and deduplicates tags and relations | 独立本地源码测试 | 全部断言符合用例定义 | 该次执行Pass | Pass | qa-r2-all.tap |
| WEB-ATT-R2-BROWSER-001 | 上传并保存 | ego真实组件本地mock | 1→2文件,保存请求不含平台字段 | 新增upload.png,request count4→5,列表2 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-002 | 删除确认取消 | ego真实组件本地mock | Cancel不保存并保留2文件 | 确认框真实出现,Cancel后request仍5,保存状态done/done | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-003 | 删除确认成功 | ego真实组件本地mock | OK后2→1文件 | request5→6,剩余原附件 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-004 | 上传保存失败恢复 | ego真实组件本地mock | 移除未保存卡片,保留原附件 | request6→7;原附件1且DOM1 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-005 | 删除保存失败恢复 | ego真实组件本地mock | 确认删除失败恢复正常文件状态 | request7→8;保存对象status=done,DOM1 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-006 | 列表只读入口 | ego真实组件本地mock | 列表预览无上传或删除控制 | 真实active=false弹窗仅原附件与预览,无上传/删除控制 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-BROWSER-007 | 最终7张截图与文字步骤 | ego真实组件本地mock | 截图为本轮真实组件、无敏感数据、文字与复现一致 | QA已逐图查看7图,按手册复现全部关键步骤;本地mock标识清晰 | Pass | qa-r2-browser-evidence.json;docs/user-manual/expert-attachments.md及7图 |
| WEB-ATT-R2-MANUAL-001 | 图文手册双重复核与最终引用检查 | 文档/视觉/业务复核 | 7图匹配步骤,UI与项目业务复核通过,全部图片存在 | UI最终7图结构与可读性PASS;主任务业务准确性PASS;Cancel/OK中文对应已明确;7图片引用和冻结源码校验通过 | Pass | docs/user-manual/expert-attachments.md;assets/expert-attachments/7图 |
图文手册与复核¶
手册:projects/ndb/frontend/docs/user-manual/expert-attachments.md。7图:docs/user-manual/assets/expert-attachments/01-attachment-dialog.png、02-upload-saved.png、03-delete-confirmation.png、04-delete-saved.png、05-upload-failure-restored.png、06-delete-failure-restored.png、07-readonly-preview.png。
QA已按手册实测:上传1→2;Cancel保留2且不发请求;OK后2→1;上传失败临时卡移除;删除失败恢复且status仍done;只读入口无上传/删除。UI与项目主任务业务校对均通过。
风险与证据边界¶
未执行真实CRM路由、实际账号/PA权限、真实后端/OSS联调及生产流程;PA和非PM/PA拦截有源码测试,浏览器角色为合成PM。截图均真实当前组件本地mock,描述有本地模拟未上线标识。未提交、推送或部署。第1轮记录不覆盖。
RA Updated by Redmine Admin 23 days ago
QA 测试结果 - 第 3 轮 - 2026-10-19 测试环境真实CRM¶
- 环境:https://tcrm.mindsetech.com;实际API origin=https://tcrm-api.mindsetech.com。
- Web:2.16.3-beta.0 / 89393b3;运行入口index-C30EZD7i.js;实时读取login-Djc4Lsj7.js确认目标版本。
- 账号:既有管理员会话;不是PM/PA,未变更角色。
- 数据:本任务唯一合成专家574234“QA附件验收20261019”、QA合成图片;未访问截图原专家或生产数据。
- 汇总:Pass12 / Fail0 / Blocked4 / Skipped0。
- 重要证据边界更正:第1/2轮212Pass与本地mock图均保留为真实开发隔离证据,不计正式测试环境验收或正式手册完成。当前按新规范需真实测试流程通过后才编正式手册。
- 证据目录:outputs/candidate-attachments-20261019/staging/。每条均为本轮实际执行/阻塞,绝不沿用mock补通过。
| 编号 | 用例 | 层级 | 预期 | 实际 | 状态 | 证据 |
|---|---|---|---|---|---|---|
| LIVE-001 | 测试环境与实际Web版本 | 测试环境真实CRM | 实际tcrm/test API与目标版本一致 | tcrm.mindsetech.com;请求origin tcrm-api.mindsetech.com;live login-Djc4Lsj7.js包含2.16.3-beta.0;运维候选89393b3 | Pass | live-environment.json |
| LIVE-002 | 完整CRM登录可用 | 测试环境真实CRM | 已有测试会话可进入真实专家工作流 | 既有管理员会话有效;未填写或输出凭据 | Pass | 真实页面及后续业务证据 |
| LIVE-003 | 独立合成QA专家创建 | 测试环境真实CRM | 仅建立本任务合成记录,普通请求不含平台字段 | QA附件验收20261019 #574234创建HTTP200/code200;example.invalid邮箱,保留虚构号,无真实专家操作 | Pass | 01-create-upload-requests.json |
| LIVE-004 | 空附件入口 | 测试环境真实CRM | 真实详情弹窗初始0文件 | 完整CRM显示0文件和上传入口 | Pass | 01-attachment-dialog.png |
| LIVE-005 | 真实OSS上传及关联保存 | 测试环境真实CRM | 文件传输后专家附件保存成功 | 真实OSS staging/upload/candidate前缀;候选PUT HTTP200/code200;显示1文件并成功提示 | Pass | 02-upload-saved.png;01-create-upload-requests.json |
| LIVE-006 | 附件最小请求及平台隔离 | 测试环境真实CRM | 仅提交property.file_list,无公开平台字段 | 实际PUT顶层仅property,property内仅file_list,平台字段不存在 | Pass | 01-create-upload-requests.json |
| LIVE-007 | 刷新后的真实持久化 | 测试环境真实CRM | 重新加载后原附件仍存在 | 真实GET后弹窗1个文件 | Pass | 03-refresh-persisted.png |
| LIVE-008 | 非PM/PA删除权限拦截 | 测试环境真实CRM | 不发保存、不打开确认、保留附件 | 管理员点击删除提示权限不足,仍1文件,无删除PUT | Pass | 07-delete-permission-denied.png |
| LIVE-009 | 真实页面上传保存网络失败恢复 | 测试环境真实CRM | 保存失败后移除未保存新卡、保留已存附件 | 本任务tab精确阻断候选URL;实际上传后PUT status0;显示附件保存失败请重试,DOM回到1;已解除阻断 | Pass | 05-upload-failure-restored.png;02-postrefresh-requests.json |
| LIVE-010 | 失败后刷新仍保留原附件 | 测试环境真实CRM | 恢复正常网络并刷新,服务端原附件不丢 | 阻断已清空,真实GET成功,仍1文件 | Pass | 06-failure-refresh-persisted.png |
| LIVE-011 | 合成fixture按现有UI更正归类及普通编辑回归 | 测试环境真实CRM | 仅必要合成数据变更,自然归类且保留附件、无平台字段 | 仅574234在真实编辑UI改852/00000000,source自然abroad→candidates、省份香港;PUT200/code200,原附件1且不含平台字段 | Pass | 03-fixture-reclassification.json |
| LIVE-012 | 完整专家列表只读附件入口 | 测试环境真实CRM | 姓名搜索后只读弹窗有文件、无上传删除 | 精确QA姓名搜索找到唯一合成记录;打开1文件,uploadTriggers=0,deleteButtons=0 | Pass | 08-readonly-list-preview.png |
| LIVE-013 | PM/PA删除取消 | 测试环境真实CRM | 有权角色Cancel不保存且保留文件 | 无现成PM/PA测试账号;当前管理员不是PM/PA;新增权限等待用户授权 | Blocked | 非PM/PA实际权限拦截已验证 |
| LIVE-014 | PM/PA确认删除与刷新持久化 | 测试环境真实CRM | 真实有权角色确认后删除并刷新消失 | 缺PM/PA账号,不伪造角色或绕过UI拦截 | Blocked | 待主任务协调 |
| LIVE-015 | 有权删除网络失败恢复 | 测试环境真实CRM | 确认删除失败后原附件恢复正常状态 | 依赖PM/PA真实账号,未执行,不能沿用mock结果 | Blocked | 待主任务协调 |
| LIVE-016 | 正式测试环境图文手册 | 测试环境真实CRM | 全部关键真实流程通过后同环境采图并双重复核 | 测试环境删除流程未通过,正式手册尚未编写;业务仓库写入暂缓。既有本地手册仅开发草稿 | Blocked | docs/qa-user-manual-standard.md最新门禁 |
阻塞和残余状态¶
PM/PA专用测试账号及新lookup专用应用最小权限仍等待用户授权,QA未创建账号/应用、改角色、重置密钥或扩scope。测试应用管理只见“小程序BFF”,无expert:lookup;后端新候选未确认运行,未对旧服务作新lookup验收。此API事项由主任务单独协调,不计Web已通过。
现有QA专家保留1个已关联合成附件。网络失败场景另遗留1个未关联staging合成OSS对象,未直接删除存储对象。所有浏览器URL阻断已解除,刷新真实GET成功。只读列表经姓名搜索ES路径验收;ID查询缺file_list与跨source显示差异只观察、不扩大修复。
本轮仅改已授权测试数据、写outputs与Redmine;未修改业务仓源码/手册、分支、提交、部署或生产。专用Ego空间33保留以便后续继续。
RA Updated by Redmine Admin 23 days ago
QA 测试结果 - 第4轮 - 专用PM测试环境补验¶
- 环境https://tcrm.mindsetech.com;页面实际加载2.16.3-beta.0/index-C30EZD7i.js。
- 专用测试账号12,仅PM单角色;合成专家574234;非完整最终beta.1验收。
- 汇总Pass6 / Fail0 / Blocked2 / Skipped0。
- 证据目录outputs/candidate-attachments-20261019/staging/:pm-beta0-evidence.json、09-pm-delete-confirmation-beta0.png、10-pm-delete-saved-beta0.png、11-pm-delete-failure-restored-beta0.png、12-pm-postfailure-refresh.png。
| 编号 | 用例 | 层级 | 预期 | 实际 | 状态 |
|---|---|---|---|---|---|
| PM-001 | 专用PM真实密码登录 | 真实测试环境CRM | 仅本任务新PM12成功进入CRM | 真实登录成功,角色项目经理,访问上限20 | Pass |
| PM-002 | PM确认框与取消 | 真实测试环境CRM | 删除弹出中文确认,取消不发请求 | 确认文件名正确;取消requests=0,保留1文件 | Pass |
| PM-003 | PM确认删除 | 真实测试环境CRM | 确认后最小请求保存,文件消失 | PUT仅property/file_list=[],HTTP200/code200,无平台字段,显示0文件 | Pass |
| PM-004 | 准备失败恢复附件 | 真实测试环境CRM | 重传唯一合成图恢复1文件 | 真实OSS与PUT200/code200,显示1文件 | Pass |
| PM-005 | PM删除网络失败恢复 | 真实测试环境CRM | 确认删除传输失败后保留原文件且状态正常 | 本任务候选URL精确阻断;PUT status0;原卡恢复且class为done;随后解除阻断 | Pass |
| PM-006 | 失败后真实刷新持久化 | 真实测试环境CRM | 恢复网络刷新仍1个正常文件 | 真实重载后1文件,卡片class仍done | Pass |
| PM-007 | 新规则管理员删除 | 真实测试环境CRM | 确认的管理员/超管规则在新beta真实通过 | 用户现已明确su/admin/PM/PA均可删除;beta.1运行版本尚待Operations确认,未计通过 | Blocked |
| PM-008 | 正式手册 | 真实测试环境CRM | 新beta真实管理员路径通过后同环境编写复核 | 仍等待新beta门禁及主任务仓库写入窗口,未编正式手册 | Blocked |
历史规则更正与剩余门禁¶
用户已明确超级管理员、管理员、PM、PA都应可删除。本次第3轮“管理员权限不足”只证明旧beta.0当时的代码行为,不满足现在确认的产品规则;历史记录保留、不覆盖。Web新beta.1需真实管理员复测,不能用本轮PM或本地角色矩阵替代。超管浏览器若无真实会话则须明确未运行。
本轮使用真实完整CRM/真实测试后端和OSS,失败用例仅浏览器阻断专用候选PUT,无伪造服务端响应;阻断已清空。仅本任务合成图/专家,无真实数据或生产操作。账号密码只BW/内存;专用账号仍保留待最终新beta验收后停用。
RA Updated by Redmine Admin 23 days ago
QA 测试结果 - 第5轮 - beta.1 真实管理员与正式手册收尾¶
环境 https://tcrm.mindsetech.com,Web 2.16.3-beta.1 / 56c03f4,Backend 1.20.4b0。仅本任务合成专家574234;真实管理员user2,未改角色。
汇总 Pass22 / Fail0 / Blocked0。历史各轮及其Blocked保留,本轮为新候选验收,不覆盖。
| 编号 | 用例 | 层级 | 预期 | 实际 | 状态 |
|---|---|---|---|---|---|
| W5-001 | 版本和实际 API 门禁 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 真实测试 CRM 加载 beta.1/56c03f4,入口 index-QAt-yjBy.js;API tcrm-api.mindsetech.com,Backend 1.20.4b0 | Pass |
| W5-002 | 管理员实际身份 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 原有 user2,真实 Store roles=[admin]、isAdmin=true、isPM/isPA=false,无角色修改 | Pass |
| W5-003 | 详情附件入口 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 从合成专家 574234 详情身份图标打开,初始 1 文件;完整 CRM 真实附件弹窗 | Pass |
| W5-004 | 真实上传保存 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 合成 PNG 经真实测试 OSS 上传,PUT HTTP200/code200;文件 1→2,成功反馈 | Pass |
| W5-005 | 最小字段隔离 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 所有本轮附件保存仅 property.file_list;无 public_platforms 或其他平台字段 | Pass |
| W5-006 | 删除确认 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 管理员点击删除弹出中文确认框,文件名正确 | Pass |
| W5-007 | 取消删除 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 取消后仍 2 文件,无额外保存请求 | Pass |
| W5-008 | 确认删除 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 确定后 PUT200/code200,文件 2→1,无权限不足 | Pass |
| W5-009 | 成功后刷新持久化 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 真实页面重载后仍 1 文件,正常 done 状态 | Pass |
| W5-010 | 上传保存网络失败 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 仅精确阻断该 fixture PUT,status0;新增卡片移除,原 1 文件保留 | Pass |
| W5-011 | 删除保存网络失败 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 精确阻断该 fixture PUT,status0;原卡片恢复,仍 1 文件且 done | Pass |
| W5-012 | 故障解除和刷新 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 立即解除网络阻断,真实刷新仍 1 文件/done,无成功失败操作污染持久状态 | Pass |
| W5-013 | 列表只读入口 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 按姓名搜索合成专家,附件弹窗显示 1 文件,无上传入口/删除按钮 | Pass |
| W5-014 | 按手册重走成功路径 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 第二轮真实上传 1→2、取消无保存、确认删除 2→1;独立记录 phase1 | Pass |
| W5-015 | 按手册重走失败路径 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 第二轮上传/删除 PUT 精确阻断分别 status0、均恢复 1 文件/done;block 已解除,phase2 留证 | Pass |
| W5-016 | 失败截图补采 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 经主任务许可仅额外一次精确阻断失败删除;原1文件/done,立即解除;旧多 toast 图保留历史,正式使用清晰单错误图 | Pass |
| W5-017 | 正式图文手册资源 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 同一实际 beta.1 完整测试 CRM 9 张截图,图片引用存在,10 项资源 SHA256 已记录,非本地 harness | Pass |
| W5-018 | UI 最终复核 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 责任 UI 线程已逐张 9 图确认清晰/完整/图文一致并核验资源;无关键裁切,最终 PASS | Pass |
| W5-019 | 主 Agent 业务校对 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 实际版本、角色、最小请求、保存/恢复、入口及截图均校对 PASS;列表步骤收窄为已测姓名搜索 | Pass |
| W5-020 | 专用 PM 账号停用 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 仅 user12 通过真实 UI 改 inactive;PUT200/code200;详情读回 inactive、PM单角色和上限20,原管理员会话保留 | Pass |
| W5-021 | 专用 lookup 应用停用证据 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 仅 app2 disabled,原 scope/IP/有效期保持,真实管理 UI 读回;证据已独立写入 #9 journal116,无改 BFF app1 | Pass |
| W5-022 | 最终隔离状态 | 真实测试环境/交付复核 | 符合当前已确认规则及隔离边界 | 仅合成专家574234,保留1个合成附件;无生产数据操作,无真实专家修改,无 OSS 删除,无额外权限扩展 | Pass |
证据¶
任务 outputs/candidate-attachments-20261019/staging/:qa-live-round5-results.json、beta1-role-evidence.json、beta1-admin-request-evidence.json、manual-rehearsal-phase1.json、manual-rehearsal-phase2.json、final-failure-reshoot-evidence.json、test-account-inactive.json、test-application-disabled.json、formal-manual-hashes.json。
正式手册 projects/ndb/frontend/docs/user-manual/expert-attachments.md;同目录 assets/expert-attachments/ 下01至09共9张真实测试环境截图。最终手册SHA256 f8f55295c64ffde48a8d83072a58652a993db5d916a61b2d7c164ca2cec368ad。
实际未测与边界¶
- 没有真实超级管理员/PA逐角色浏览器会话;两者仅真实角色Store矩阵源码证据,PM浏览器为上一beta候选。
- 没有生产环境验证;本报告不等同生产上线。
- 没有真实409重复匹配等需新增多fixture的lookup验收,详见#9真实验收边界。
网络故障只在QA浏览器精确阻断本任务候选PUT,不伪造服务端成功响应;所有阻断已解除。合成图可能留有测试OSS对象,按主任务要求不清删;fixture保持1附件。未提交、推送或部署;生产由主任务及Operations后续门禁执行。