## QA 测试结果 - QA-MEETING-EXPERT-20261007-R1 - 2026-10-07 22:31 Asia/Shanghai - Redmine: NDB #1 会议管理与话题管理功能验收(含 Markdown/BFF 跨端验证)。 - 执行者: NDB QA Agent。环境: 本地微信开发者工具,skill/tool 0.3.9 equal,未登录的小程序访客;工具开发者账号登录不等于小程序用户登录。 - 候选: projects/mp/mp-conference,feat/meeting-v2-integration,HEAD dda147326123846629dd16705ef51a4cf177a536 上未提交候选。保留全部已有改动。 - 预检: effective pwd/Gitroot=/Users/gexiaowei/Documents/work/mindsetech/ndb/projects/mp/mp-conference,目标页readable/writable,docs writable;未写业务源码。 - 汇总: Pass 43 / Fail 0 / Blocked 7 / Skipped 0,共50条。36条单元/mock + 14条接口/模拟器/源码/E2E门禁。Pass严格按层级,不代表真实预约完成。 - 单元命令: node --test --test-reporter=tap tests/consultant-booking.test.cjs tests/catalog-v2.test.cjs tests/meeting-v2.test.cjs,36/36通过,无业务库POST。 - 原生tap工具限制: 多次tap/trigger仅返回success,页面未变,记录Blocked,不按回执认定交互成功。用编译页面既有eh分发tap(从真实outerWxml读取sid)后,详情导航和原生登录提示实际出现;不是源码修改,也不是真实触摸证明。 - 原生弹窗: WXML不包含按钮;本执行器无cua。尝试System Events只读遍历未在有界时间返回,已中断。未使用mock假冒原生点击。Mini本轮真实登录/返回图片已复核,独立复现仍Blocked。 - 当前模拟器经reLaunch回到会议75/source=v2;不继续占用模拟器,独占权释放。若原生模态仍在窗口上,由下一拥有者安全取消,不得点任何提交动作。 | 编号 | 用例/检查点 | 层级 | 预期 | 实际 | 状态 | 证据/缺陷 | | --- | --- | --- | --- | --- | --- | --- | | EXP-UNIT-001 | gather and search remove the duplicate online-meeting category | 单元/mock | gather and search remove the duplicate online-meeting category | node:test ok 1,断言通过;无真实业务请求 | Pass | unit-tests.tap #1 | | EXP-UNIT-002 | content, topics and experts only use the V2 catalog API | 单元/mock | content, topics and experts only use the V2 catalog API | node:test ok 2,断言通过;无真实业务请求 | Pass | unit-tests.tap #2 | | EXP-UNIT-003 | home recommendations and industry filters only use the V2 catalog API | 单元/mock | home recommendations and industry filters only use the V2 catalog API | node:test ok 3,断言通过;无真实业务请求 | Pass | unit-tests.tap #3 | | EXP-UNIT-004 | the mini-program has no legacy API origin or request client | 单元/mock | the mini-program has no legacy API origin or request client | node:test ok 4,断言通过;无真实业务请求 | Pass | unit-tests.tap #4 | | EXP-UNIT-005 | content cards open the dedicated V2 detail page | 单元/mock | content cards open the dedicated V2 detail page | node:test ok 5,断言通过;无真实业务请求 | Pass | unit-tests.tap #5 | | EXP-UNIT-006 | catalog adapters preserve public presentation and never add private expert fields | 单元/mock | catalog adapters preserve public presentation and never add private expert fields | node:test ok 6,断言通过;无真实业务请求 | Pass | unit-tests.tap #6 | | EXP-UNIT-007 | catalog error states are retryable except for unavailable content | 单元/mock | catalog error states are retryable except for unavailable content | node:test ok 7,断言通过;无真实业务请求 | Pass | unit-tests.tap #7 | | EXP-UNIT-008 | catalog lists isolate pagination, stop at total, preserve time ranges, and expose retries | 单元/mock | catalog lists isolate pagination, stop at total, preserve time ranges, and expose retries | node:test ok 8,断言通过;无真实业务请求 | Pass | unit-tests.tap #8 | | EXP-UNIT-009 | logged-out expert booking can be cancelled or open login without posting | 单元/mock | logged-out expert booking can be cancelled or open login without posting | node:test ok 9,断言通过;无真实业务请求 | Pass | unit-tests.tap #9 | | EXP-UNIT-010 | unauthenticated expert booking opens the existing authentication dialog without posting | 单元/mock | unauthenticated expert booking opens the existing authentication dialog without posting | node:test ok 10,断言通过;无真实业务请求 | Pass | unit-tests.tap #10 | | EXP-UNIT-011 | concurrent expert booking posts the public profile id once and shows the success feedback | 单元/mock | concurrent expert booking posts the public profile id once and shows the success feedback | node:test ok 11,断言通过;无真实业务请求 | Pass | unit-tests.tap #11 | | EXP-UNIT-012 | failed expert booking allows retry and rechecks access before the next post | 单元/mock | failed expert booking allows retry and rechecks access before the next post | node:test ok 12,断言通过;无真实业务请求 | Pass | unit-tests.tap #12 | | EXP-UNIT-013 | registration shows the customer charge before submitting; pending is never called confirmed | 单元/mock | registration shows the customer charge before submitting; pending is never called confirmed | node:test ok 13,断言通过;无真实业务请求 | Pass | unit-tests.tap #13 | | EXP-UNIT-014 | meeting detail downloads and opens the generated minutes attachment | 单元/mock | meeting detail downloads and opens the generated minutes attachment | node:test ok 14,断言通过;无真实业务请求 | Pass | unit-tests.tap #14 | | EXP-UNIT-015 | meeting content requires a valid session before download and opens login only once | 单元/mock | meeting content requires a valid session before download and opens login only once | node:test ok 15,断言通过;无真实业务请求 | Pass | unit-tests.tap #15 | | EXP-UNIT-016 | meeting content login prompt can be cancelled without leaving or downloading | 单元/mock | meeting content login prompt can be cancelled without leaving or downloading | node:test ok 16,断言通过;无真实业务请求 | Pass | unit-tests.tap #16 | | EXP-UNIT-017 | registration is not submitted when the price prompt is cancelled | 单元/mock | registration is not submitted when the price prompt is cancelled | node:test ok 17,断言通过;无真实业务请求 | Pass | unit-tests.tap #17 | | EXP-UNIT-018 | timeout retries reuse the same key without optimistic registration | 单元/mock | timeout retries reuse the same key without optimistic registration | node:test ok 18,断言通过;无真实业务请求 | Pass | unit-tests.tap #18 | | EXP-UNIT-019 | favorites stay independent while minutes reservation requires customer authentication | 单元/mock | favorites stay independent while minutes reservation requires customer authentication | node:test ok 19,断言通过;无真实业务请求 | Pass | unit-tests.tap #19 | | EXP-UNIT-020 | started meeting reserves minutes once with a price confirmation and authoritative reread | 单元/mock | started meeting reserves minutes once with a price confirmation and authoritative reread | node:test ok 20,断言通过;无真实业务请求 | Pass | unit-tests.tap #20 | | EXP-UNIT-021 | started meeting overview guidance follows the minutes reservation action without changing registration gates | 单元/mock | started meeting overview guidance follows the minutes reservation action without changing registration gates | node:test ok 21,断言通过;无真实业务请求 | Pass | unit-tests.tap #21 | | EXP-UNIT-022 | attendance and minutes reservation coexist without changing registration or join authorization | 单元/mock | attendance and minutes reservation coexist without changing registration or join authorization | node:test ok 22,断言通过;无真实业务请求 | Pass | unit-tests.tap #22 | | EXP-UNIT-023 | minutes-only reservation never creates a client-side attendance projection or join link | 单元/mock | minutes-only reservation never creates a client-side attendance projection or join link | node:test ok 23,断言通过;无真实业务请求 | Pass | unit-tests.tap #23 | | EXP-UNIT-024 | cancelled price confirmation does not reserve minutes | 单元/mock | cancelled price confirmation does not reserve minutes | node:test ok 24,断言通过;无真实业务请求 | Pass | unit-tests.tap #24 | | EXP-UNIT-025 | published analyst minutes block reservation even when the attachment is missing; AI minutes do not | 单元/mock | published analyst minutes block reservation even when the attachment is missing; AI minutes do not | node:test ok 25,断言通过;无真实业务请求 | Pass | unit-tests.tap #25 | | EXP-UNIT-026 | reservation read failures never become an unreserved state or consult legacy subscriptions | 单元/mock | reservation read failures never become an unreserved state or consult legacy subscriptions | node:test ok 26,断言通过;无真实业务请求 | Pass | unit-tests.tap #26 | | EXP-UNIT-027 | reservation retries reuse the business key and never optimistically mark success | 单元/mock | reservation retries reuse the business key and never optimistically mark success | node:test ok 27,断言通过;无真实业务请求 | Pass | unit-tests.tap #27 | | EXP-UNIT-028 | reservation results from an old login session never pollute the current session | 单元/mock | reservation results from an old login session never pollute the current session | node:test ok 28,断言通过;无真实业务请求 | Pass | unit-tests.tap #28 | | EXP-UNIT-029 | minutes can never be written through the legacy notification subscription API | 单元/mock | minutes can never be written through the legacy notification subscription API | node:test ok 29,断言通过;无真实业务请求 | Pass | unit-tests.tap #29 | | EXP-UNIT-030 | missing active contract keeps reservation unconfirmed and points to staff handling | 单元/mock | missing active contract keeps reservation unconfirmed and points to staff handling | node:test ok 30,断言通过;无真实业务请求 | Pass | unit-tests.tap #30 | | EXP-UNIT-031 | cancellation asks only for confirmation and allows registration again | 单元/mock | cancellation asks only for confirmation and allows registration again | node:test ok 31,断言通过;无真实业务请求 | Pass | unit-tests.tap #31 | | EXP-UNIT-032 | unavailable registration read disables mutation, logout removes a visible link | 单元/mock | unavailable registration read disables mutation, logout removes a visible link | node:test ok 32,断言通过;无真实业务请求 | Pass | unit-tests.tap #32 | | EXP-UNIT-033 | secondary failures stay local while meeting detail remains available | 单元/mock | secondary failures stay local while meeting detail remains available | node:test ok 33,断言通过;无真实业务请求 | Pass | unit-tests.tap #33 | | EXP-UNIT-034 | completed and cancelled meetings override unbound identity guidance | 单元/mock | completed and cancelled meetings override unbound identity guidance | node:test ok 34,断言通过;无真实业务请求 | Pass | unit-tests.tap #34 | | EXP-UNIT-035 | legacy IDs never enter v2 mutation routes or reveal the legacy public link | 单元/mock | legacy IDs never enter v2 mutation routes or reveal the legacy public link | node:test ok 35,断言通过;无真实业务请求 | Pass | unit-tests.tap #35 | | EXP-UNIT-036 | phone, contact and meeting eligibility gate registration; settlement errors stay explicit | 单元/mock | phone, contact and meeting eligibility gate registration; settlement errors stay explicit | node:test ok 36,断言通过;无真实业务请求 | Pass | unit-tests.tap #36 | | EXP-HTTP-001 | 会议公开资料加法契约 | 只读接口 | 保留关联ID,增加公开profile | GET meetings/75:关联481208,publicProfile.id49,显示资料匹配 | Pass | GET摘要;卡片截图01 | | EXP-HTTP-002 | 公开专家详情ID对应 | 只读接口 | 公开id49详情与卡片一致 | GET catalog/experts/49:秦贵军/某商业航空公司/联合创始人 | Pass | GET摘要;截图02 | | EXP-SIM-001 | 完整公开专家卡片 | 模拟器只读 | 默认头像、昵称、公司、职位、独立按钮可见 | 截图确认;outerWxml默认头像URL,无内部姓名 | Pass | 01-meeting-expert.png | | EXP-SIM-002 | 信息区详情导航 | 模拟器事件分发 | profileid49且保留conference_id75 | 分发既有tap后currentPage专家49/conference_id75;返回正常 | Pass | 02-expert-detail.png;runtimeInfo | | EXP-SIM-003 | 未登录独立约访提示 | 模拟器事件分发 | 提示登录且不跳专家详情 | 分发既有tap后真实提示暂不登录/去登录;仍会议75 | Pass | 03-login-gate.png | | EXP-SIM-004 | 原生取消登录独立复现 | 原生模拟器 | 取消留原会议不提交 | 原生弹窗不在WXML,当前未暴露cua;仅mock及Mini同轮证明 | Blocked | UNIT009;Mini同轮交付;无独立原生点击 | | EXP-SIM-005 | 原生去登录独立复现 | 原生模拟器 | 去登录打开login页面不提交 | QA缺原生按钮点击工具;已复核Mini登录截图 | Blocked | 04-login-page.png(Mini来源) | | EXP-SIM-006 | 原生登录页返回独立复现 | 原生模拟器 | 返回原会议75 | 独立前置去登录未完成;已复核Mini返回截图 | Blocked | 05-return-meeting.png(Mini来源) | | EXP-SIM-007 | 原生tap自动化点击 | 模拟器工具 | tap信息区或action触发行为 | tap/trigger返回success但currentPage无变化;eh事件分发正常,不能认定原生点击通过 | Blocked | 工具输出;排查记录;需桌面工具 | | EXP-STATIC-001 | 头像加载失败与空字段 | 源码检查 | 缺图默认头像,空字段省略,不回退内部姓名 | 源码有error回调及nickname专家占位;空avatar实测,图片加载失败未造运行故障 | Pass | ConsultantSimpleCard.vue源码;图01 | | EXP-STATIC-002 | 会议上下文与事件隔离 | 源码检查 | 详情公开ID与conference_id,预约不冒泡 | card information独立;action @tap.stop;会议传conference-id;publicProfile映射测试通过 | Pass | 组件/会议源码;UNIT006 | | EXP-E2E-001 | 真实微信登录与身份认证 | 真实E2E | 真实登录认证后允许申请 | 未执行真实微信登录/认证;安全范围仅mock门禁 | Blocked | UNIT010;无真实登录或认证截图 | | EXP-E2E-002 | 真实专家预约成功落库 | 真实E2E | 申请接受且仅一条,反馈一致 | 禁止业务库POST与客户通知;成功及防双击仅mock通过 | Blocked | UNIT011;无业务库申请/通知 | | EXP-E2E-003 | 真实专家预约失败恢复 | 真实E2E | 失败允许取消或重试且不误报成功 | 禁止真实预约POST;失败重试及资格重查仅mock通过 | Blocked | UNIT012;无真实故障POST | ### 候选源码指纹 - adapter.ts: bd1e0ffd45f9c3c20dbf2bf798bbfb9eb555c166ef8267723692a6cc2250a9a7 - types.ts: 242413af7ba64e4263acab5bfe87ac39dd7e8cdbaa74a51022b9047b080343a2 - ConsultantSimpleCard.vue: 27e9f7989a339a762ea2bca0222f7611a60fa0b46c35953c551248b8d66c5243 - booking.ts: ba66a8e623a308502a55ed8d8e5f4cd033afaaf941148a05bd97e2041ef8cb5c - conference/detail/index.vue: 64a7b150743f53e61a9b3974706d6c7307bcb4e18fe4aa5ceff12a9014200620 ### 风险、基线及未验证项 - 本轮不重复无关全量:统筹交付全量81/82,其中灰/白卡静态断言与已确认设计冲突为既有失败;明确保留,不回退设计、不声明全量绿。本轮43Pass/0Fail仅代表上述执行范围。 - Backend264/BFF136及Mini构建/lint/编译通过属于开发交付,不计入本轮QA独立结果。 - 真实微信登录、认证成功、真实预约成功/失败/通知与生产层均未验证。未对业务库预约POST,没有数据库或财务写入,没有外发通知。 - 多卡、长文本、无公开profile、图片加载失败的运行视觉验收未全覆盖;nullprofile/内部ID排除有UNIT006,长文本换行与默认图error有源码证据,不冒充运行通过。 - 图文手册: projects/mp/mp-conference/docs/user-manual/meeting-experts.md,5图(QA3图+Mini同轮2图,均已查看);UI结构/视觉与Mini业务校对均通过、无必修问题,统筹回传确认后由QA定稿。定稿保留7条Blocked及真实业务预约未验证边界。 - 禁止操作均未执行: commit/push/deploy/branch/worktree/业务DB写/真实预约/通知。 - Redmine首轮落库核验: journal25,2026-10-07T14:31:25Z,逐条50行、汇总一致、Blocked7行、附件93-100。https://redmine.mindsetech.com/issues/1#change-25。 - 下一步: 主统筹按本轮边界交付;提供可用桌面交互工具后重测SIM004-007;真实认证/预约仅在另行安全隔离环境与明确授权后执行。