QA验收 #23
open专家黑名单机制|测试站业务验收
Added by Redmine Admin 17 days ago. Updated 16 days ago.
0%
Description
专家黑名单:测试站业务验收¶
用户要求为专家库增加黑名单,并确认:拉黑后禁止新增合作;进行中的项目/会议保留并提示风险,允许原合作履约/完成/费用处理;旧会议继续接受新客户报名。加入/解除原因必填,保留操作者/时间及历史;管理权限独立,普通搜索默认排除,内部原因不对外泄露。
当前已部署测试候选:Backend 1.20.8b0 / preview 8e1752ab;Web 2.16.6-beta.0 / preview 7af88f83。测试站 https://tcrm.mindsetech.com ,后端 https://tcrm-api.mindsetech.com 。两端CI、实际版本与只读冒烟通过,迁移130→132仅accounts0013/candidates0017,未操作生产。
本记录用于已部署候选的真实业务QA:真实认证、管理员/普通角色权限、加入/解除及审计、列表/搜索与原因隐私、新合作和批量/直填拦截、旧合作/报名/费用,以及桌面/390px真实截图手册。以本轮唯一RUN标记合成对象、公开测试API/UI和专用测试账号执行;先核隔离/外发边界,禁止真实付款/审批/通知/录制或生产。23个计划用例按逻辑轮次追加预期、实际、结果和证据,失败/未测逐项记录,结果批量回写并读回。
本地PG并发/迁移及组件证据按候选差异复用,不计为本轮新Pass。MCP实际路由/身份、真实搜索隔离、非管理员管理身份等缺口应真实报告,不能以普通API成功替代。正式手册需测试站截图及复核,不用本地mock图替代。
共享证据索引:docs/plans/2026-10-25-expert-blacklist.md。
后端影响与回归:outputs/expert-blacklist-20261025/backend-impact.md。
测试站执行包:outputs/expert-blacklist-20261025/qa/test-station-plan.md。
部署收据:outputs/expert-blacklist-20261025/release/ops-execution.json,SHA256 6c778f474a49883af59494d23cd7884042f7eee22b2518f11a1c482c5fa811fb。
初始状态:测试准备中,未将计划预期提前计Pass;尚未创建业务fixture、正式截图手册或执行真实业务用例。完成部署不等于QA通过,也不构成生产发布批准。
RA Updated by Redmine Admin 17 days ago Actions #1
QABL-PREFLIGHT-R1-d769fd6e — 测试站只读/认证预检¶
2026-10-25 Asia/Shanghai,候选BE1.20.8b0/8e1752ab、FE2.16.6-beta.0/7af88f83,限定tcrm/tcrm-api;ego-browser Space7/p1。关联IMPACT为IMP-01/09及环境门禁;不是合成业务写执行轮次,没有fixture。
| Case | 预期/操作 | 实际 | 结果/证据 |
|---|---|---|---|
| ST-ENV-01 | 实际版本应匹配已部署测试组合,读取公开版本与实际登录页 | API浏览器GET /v1/version/显示HTTP200/code200/version1.20.8b0;实际登录页footer Frontend v2.16.6-beta.0。Ops部署收据迁移130→132仅accounts0013/candidates0017、无混版,QA复用该运维元数据而未连DB | Pass;release/ops-execution.json SHA256 6c778f474a49883af59494d23cd7884042f7eee22b2518f11a1c482c5fa811fb,qa/station-manifest.json |
| ST-AUTH-01/F(本人子项) | 仅复用BW专用test身份,真实密码认证并读取本人active/roles/action,不输出秘密 | 指定文件夹唯一条目b9f7b669-9b80-4222-9f19-608fd190d71d;login HTTP200/code200、profile HTTP200/code200,account19 active,roles=[finance],/candidates/blacklist/manage action=false | Pass;本人实际HTTP摘要、qa/station-manifest.json;非管理员黑名单管理拒绝边界候选,不能冒充PM/PA或管理者 |
本轮实际执行2个窄子项Pass;ST-AUTH-01整体多角色覆盖仍Blocked:尚无经BW/当前profile核验的A管理员、U普通PM/PA或M非admin管理者。未读取真实员工、未重置密码/改账号/角色/grant,不假装已测管理与拒绝操作。请统筹指定账号owner补最小身份/专属临时授权;普通拒绝子项可先复用19,但PM页面覆盖须独立身份。
预检根:默认pwd=/Users/gexiaowei/Documents/work/mindsetech/ndb;两Git根为canonical projects/ndb/backend/frontend,两仓feature/expert-blacklist;Backend仅原.aoci/config.json dirty、Web干净。目标工作包/计划/源码读取成功。
安全限制:Ops ops-qa-isolation.json显示ES为ndb-elasticsearch9-staging:9200/candidates,vector/rerank均false;正常专家create会写测试ES,vector关闭时不入embedding任务。真实AI parse endpoint/企微/邮件/录制MQTT仍配置,不是全局无外发;AI parse、真实建会、通知、录制/OSS仍禁止,受影响路由须源码条件审查后才能放行。DB/索引/审计事实来自Ops只读收据,不改环境。尚未发业务写请求。
RUN固定QABL-20261025-R1-d769fd6e;第4节fixture上限全部0/未创建。先正常依赖公司→合同/联系人→项目/需求→专家与旧Task/会议合作,再拉黑→拒绝新合作/旧合作报名费用→解除→单次重试→手册→精确清理/保留;首个业务写仍等待统筹整包release。纯离线station-guard.test.mjs 9/9通过,不计业务Pass;旧本地PG12及错误结构1按差异复用,不新增计数。
凭据仅CLI与浏览器运行进程内存,报告/脚本/图片不存password/token/cookie。普通shell直连API超时后改同任务ego空间只读访问成功;Ego子环境vault启动器未读成功,规范canonical CLI通过bw-login读取同一条目并仅内存交付。嵌套ego输出通道最初未捕获,诊断确认console在stderr;保留该执行器问题、不虚构首次认证结果,最终本人profile摘要已回读确认。无盲换身份/无效凭据重试,无业务POST重放。
没有源码/配置/DB直写、commit/push/deploy、生产、真实付款/审批/通知或历史数据清理。本条仅本轮#23追加结果,不覆盖历史/描述、不改状态或工作流。MCP实际route仍未知,不以普通版本/认证Pass替代MCP、完整业务QA或正式手册通过。
RA Updated by Redmine Admin 17 days ago Actions #2
QABL-IDENTITY-R2-d769fd6e — 专用PM与finance筛选权限¶
仅测试tcrm/tcrm-api,RUN QABL-20261025-R1-d769fd6e;候选BE1.20.8b0/8e1752ab、FE2.16.6-beta.0/7af88f83。沿用journal276环境与本人认证证据,本条不重复计已过项,不是业务fixture轮次。
| Case子项 | 预期/操作 | 实际 | 结果/证据 |
|---|---|---|---|
| ST-AUTH-01/U | 从既有专用PM精确BW引用核测试URI后真实登录及本人profile,须active/pm且无管理action | item d97c743a-43aa-4898-bec6-5333fd77c7a8仅测试host;2026-10-25T13:58:53.860Z,login与profile均HTTP200/application/json/code200;id16、active、roles=[pm]、manage=false | Pass;qa/station-auth-U.json。复用现成PM,不新建重复账号,不重置密码。 |
| ST-PERM-01/F筛选负例 | 19无管理action时对唯一RUN分别GET candidates?blacklist_status=all、blacklisted,均应拒绝,不读取无关业务结果 | 先fresh本人认证/profile200确认id19 active/finance/manage=false;2026-10-25T14:01:28.206Z,两次GET均HTTP403/application/json/code403,message=缺少专家黑名单管理权限。 | Pass,仅筛选子项;qa/station-auth-F.json含方法/path/状态/脱敏错误,无token/payload/真实业务记录。 |
ST-AUTH-01多角色整体尚未完成:新A由Ops唯一owner处理中,尚无最终账号收据;M尚未grant。本条不把finance筛选拒绝提升为整个ST-PERM通过:真实B的专属GET/POST及普通CRUD夹带字段、页面入口仍待本轮fixture。
ID0探针未执行,不伪造响应;此前BW空输出发生在浏览器/HTTP前,非invalidcredentials。改用bw-login子会话内绝对bw路径后本次精确条目读取及真实认证成功;没有换身份绕权限或盲重试错误密码。凭据只内存,无password/token/cookie落盘。
直接版本复核2026-10-25T13:59:31.625Z仍匹配BE1.20.8b0与实际登录页FE2.16.6-beta.0。离线guard新增隐式预算、Task显式false/null录制读回、最多一次普通Task成功创建,13/13支持检查通过,不计产品Pass。ES及staging broker元数据补证见release/ops-qa-dependencies.md;不声称全网消费者排他审计,统筹已允许受控普通Task常规入队。
fixture0、未知业务写0,首业务写未放行;19管理action仍false,未发grant-ready。Space7保留。无产品源码/配置/DB直写/部署/生产/真实付款/审批/通知。MCP已明确为当前未部署集成及后续Backend gate,不再描述为猜测route。
RA Updated by Redmine Admin 17 days ago Actions #3
QABL-BUSINESS-R1-d769fd6e — 真实测试业务阶段¶
仅tcrm/tcrm-api,BE1.20.8b0/8e1752ab、FE2.16.6-beta.0/7af88f83。A20 active/admin、U16 active/pm、F19 active/finance均真实登录/profile200;M19由Ops临时Role18/关联51授予唯一action346后fresh验证非admin/manage=true。以下是已执行分项结果,不是23用例完整验收或正式手册通过。
fixture manifest:公司13、合同20(active)、联系人9/10、客户项目94、会议聚合项目900001、需求28/29、专家B574241/B1 574242/C574243/B2 574244;Task142/143/144/145/146,会议72,推荐23/24/25,成本41。均唯一RUN,无联系方式/附件/外部会议链接。对应JSON响应与逐次方法/path/HTTP/code在qa/station-r1-*.json,确切ID即时入station-manifest.json。无未知业务写。
| Case/已执行范围 | 预期与实际 | 分项结果/证据 |
|---|---|---|
| ST-AUTH-01/A,U,F,M | 真实本人active/角色及能力:A20/admin可管理,U16/pm不可管理,F19/finance先不可管理;Ops按合法信号后fresh19为finance+任务role、非admin/manage=true | Pass;station-auth-A.json、station-auth-U.json、station-auth-F-session-2026-10-25T14-20-41-446Z.json;撤权fresh读回后补完整收尾。 |
| ST-FIX-01 | 本RUN公开API创建最小依赖,项目含初始需求、会议隐式项目/3Task全计数;普通Task一次成功/quick一次成功,均GET is_recorded=false且recording_schedule=null | Pass;公司/合同/联系人/项目/专家/Task/meeting create/read receipts。 |
| ST-SEARCH-BASE-01 | 黑名单前普通DB和真实ES同一RUN应命中B/B1/C | Pass;station-r1-db-search-baseline.json总3,station-r1-es-search-baseline.json total3/eq且确切3ID。 |
| ST-MANAGE-01 API分项 | 空白原因拒绝;加入后B/B1同步true/can_cooperate=false;actor20历史仅1;新背景后重复同状态不增加审计 | Pass;blacklist-blank-reason(code400)、blacklist-add、blacklist-history-after、blacklist-repeat-history;界面操作/截图另补。 |
| ST-PERM-01 API分项 | F19真实B管理GET/POST均403,状态/审计不变;U16管理GET403、普通PUT夹带黑名单字段code invalid拒绝;M19专属历史GET、重复同状态POST及管理查询200 | Pass;finance-real-b-get/post-denied、history-after-finance-negative、pm-blacklist-management-get-denied、pm-ordinary-edit-blacklist-metadata-denied、manager-real-b-history/repeat-state/blacklisted-query。role19-sequence已revoke-ready,不由QA改grant。 |
| ST-PRIVACY-01 已测投影 | U16普通专家详情、旧Task详情无PRIVATE_REASON_R1哨兵;Task风险bool为true;M专属管理可见合成原因 | Pass(限已测投影);pm-b-detail、pm-old-task-detail、manager-real-b-history;不冒称全部导出/外部身份或UI已覆盖。 |
| ST-SEARCH-01 | 拉黑及B2继承后DB/ES普通查询仅C且total1;admin all总4、blacklisted总3,page_size2第一页2/末页1 | Pass;db-after-blacklist、es-after-blacklist、admin-all-after-blacklist、admin-blacklisted-page1/page2。 |
| ST-NEW-01 | 新需求29单B及混合B/C推荐均expert_blacklisted;混合后total0;C正常单次新增 | Pass;new-recommend-mixed/single-denied、after-mixed、control-created/read;推荐总3。 |
| ST-NEW-02 | 已有旧推荐也不豁免新Task:普通B与quick B1均expert_blacklisted,受控旧Task不变 | Pass;new-ordinary-task-denied、new-quick-task-denied;customer-task-all-status-count确切4 Task142/143/145/146,聚合专家Task144另在900001,无隐式新Task/项目/需求。 |
| ST-NEW-03 已测子项 | control Task143换到B被拒绝,读回专家仍C | Pass(仅换专家);control-task-rebind-denied/after-rebind-denied;跨客户项目/跨会议迁移本包预算下未执行,最终单列限制。 |
| ST-MEETING-NEW-01 | 已有会议72新增此前无关系B1拒绝;读回仍仅原专家关系50/Task144;重复原B返回同关系50 | 功能拒绝/零新增Pass;meeting-new-background-denied保留原oracle不匹配轨迹(期待200/expert_blacklisted,实际400/INVALID_REQUEST)。Backend确认原HTTP/envelope约定保留,不据此判拦截失效;message中ErrorDetail(...) repr为独立可读性缺陷待责任人收口,不隐去原响应。 |
| ST-OLD-01 API分项 | B拉黑后原Task142备注及正常完成成功,专家归属不变;每次先GET显式无schedule/不录制 | Pass;old-task-pre-memo/memo-save/pre-finish/finish/finished-read。完成允许正常test ES/财务snapshot及无schedule即return线程,不称纯DB;页面风险另补。 |
| ST-OLD-REG-01 | 原会议B关系拉黑后仍可新客户L2报名,原L1保留且收费/小时/合同/归属不变 | Pass;meeting-l2-after-blacklist-register、registrations-after-blacklist、l1-financial-baseline-retained;Task145/146均不录制/无schedule。 |
| ST-OLD-FEE-01 | 等会议自然结束后正常status ended与专家结算,不绕时间/DB;只生成一笔小额unpaid | Pass;old-meeting-end、expert-settlement、unpaid-cost-read,Task144成本41=0.10 RMB/unpaid,无付款/审批。 |
| ST-FAMILY-01 API分项 | B1普通改original_id拒绝且root仍B;新B2继承;同名独立C正常 | Pass;background-reparent-denied(code invalid)、background-after-reparent-denied、新背景574244 inherited-read;历史环/缺根沿用已适用本地PG证据,不在共享库造异常。 |
运行器断言纠正历史保留:合同详情serializer不输出is_active,改从同公司合同列表确切ID20读回true,无重复创建;普通ValidationError字符串code=invalid,原B1重挂期待400过强,保留原receipt并读回root未变;Task列表默认仅finished/failed,原无status查询0不能判数据丢失或零部分写,随后显式全状态查询核确切4条。会议自然结束前护栏曾主动停结算,未发送请求,合法到时只续执行未发步骤。没有用新oracle重放原写入。
尚在执行:真实UI桌面/390、核心手册按文复现、解除/唯一推荐重试、M撤权fresh profile核验、最终精确保留/清理及23表。AI真实供应商未纳入包、MCP当前未部署、外部应用身份/公开fixture不具备,分别未测,不能被普通DB/ES通过替代。无产品源码/配置/Git/部署或生产操作,无真实付款/审批/通知/录制/OSS。
RA Updated by Redmine Admin 17 days ago Actions #4
- Subtask #24 added
RA Updated by Redmine Admin 17 days ago Actions #5
- Subtask #25 added
RA Updated by Redmine Admin 17 days ago Actions #6
QABL-FINAL-R1-d769fd6e — 专家黑名单测试站最终结果¶
2026-10-25 Asia/Shanghai;来源聊天01a1727b-2df1-7810-9379-c71ae801b3f5;唯一验收Redmine #23。本文件是唯一最终结果/证据索引,当前恢复点station-resume.md,精确对象账本station-manifest.json。
结论与计数口径¶
固定23项主矩阵按case去重:18 Pass / 1 Fail / 4 Blocked / 0 Skipped,无Pending。另保留执行中发现的合法null资料边界 ST-UI-NULL-01 Fail,不塞进23项或覆盖成成功。共发现/保留2项未修复缺陷:#24提示可读性、#25合法null白屏。若统计全部独立场景,则为24项:18 Pass / 2 Fail / 4 Blocked。
完整QA及生产门禁未通过。 核心手册在合法完整资料场景通过按文复现、UI/Backend/Web复核,与#24/#25及4项Blocked分开判断。没有为了补Pass修产品源码、重部署、扩fixture或调用真实外部服务。
候选仅测试站:Backend1.20.8b0 / 8e1752ab44dd4880f74df10144ca933fb81bbe9d;Web2.16.6-beta.0 / 7af88f838ce980598deb1961c702fc55d949b06b。最终退出前实际BE版本仍1.20.8b0、登录页FE页脚仍2.16.6-beta.0。Ops迁移/镜像/备份沿用本任务收据,QA未直接操作DB或将Ops元数据说成QA业务查询。
23项最终矩阵¶
下列证据文件均位于本qa目录,省略共同前缀station-;请求记录包含实际method/path、actor、HTTP、Content-Type、业务code及脱敏响应。既有本地PG证据单列local-results.md,不把其测试方法数量与本表相加。
| Case | 结果 | 预期、实际与证据/限制 |
|---|---|---|
| ST-ENV-01 | Pass | 初始及收尾实际BE1.20.8b0/FE2.16.6-beta.0;无旧站冒测。journal276、manifest版本观察、session-close.json;迁移两节点/无混版来自已核Ops收据。 |
| ST-AUTH-01 | Pass | A20 active/admin、U16 active/pm、F19 active/finance均真实登录/profile200;M19临时获唯一action后fresh非admin/manage=true,撤权后fresh仅finance/manage=false。auth收据、role19-sequence.json、Ops accounts receipt;账号保留启用。 |
| ST-FIX-01 | Pass | 本RUN公开API创建全部最小链;公司/合同/项目/需求/背景归属及ID读回,所有隐式对象计预算;普通Task成功创建1次、quick1次,Task均不录制/无schedule。manifest、r1-*-create/read及final-state.json。 |
| ST-SEARCH-BASE-01 | Pass | 黑名单前同一RUN普通DB和真实ES均确切B/B1/C共3;r1-db-search-baseline.json、r1-es-search-baseline.json。不是“从未索引到”被当成过滤成功。 |
| ST-MANAGE-01 | Pass | 空白原因UI零POST、API拒绝;A加入同步B/B1,actor20、初始审计1;重复同状态不新增;UI加入/解除权威重读。r1-blacklist-*、manual-replay-receipt.json及正式手册。 |
| ST-PERM-01 | Pass | F19真实B GET/POST403且审计/状态未变;F筛选all/blacklisted403;U16无管理按钮,专属GET403、普通PUT夹带字段code invalid拒绝;M19历史GET/同状态POST200,审计不增,后仅撤UserRole51并fresh确认。r1-finance-real-b--denied、r1-pm--denied、r1-manager-*、ui-pm-privacy.json及role19-sequence.json。 |
| ST-PRIVACY-01 | Pass | 已测普通专家/Task/项目投影及PM页面无合成私密原因;有权M管理API可见。普通专家导出仅4个本RUN ID/14列,无原因哨兵;PM会议页面权限不足403且无私密原因,不冒称该PM会议UI风险已测。r1-pm-b-detail/old-task-detail、r2-pm-project-reason-privacy、r2-pm-meeting-page-permission-denied、candidate-export-privacy.json。外部身份覆盖另为ST-EXTERNAL-01 Blocked。 |
| ST-SEARCH-01 | Pass | 拉黑含新背景后普通DB/ES仅C total1;admin all4、blacklisted3,page_size2第一页2/末页1。r1-db/es-after-blacklist、admin-all-after-blacklist、admin-blacklisted-page1/page2。只证明普通DB/ES,不替代模型/MCP。 |
| ST-AI-01 | Blocked | 真实AI供应商调用未纳入授权包;vector/rerank关闭,合成query也不能证明召回真实profile零外发。未发AI parse/模型请求。Owner:统筹/Backend;后续明确安全配置和隔离输入再验,不改本轮环境凑Pass。 |
| ST-MCP-01 | Blocked | 当前测试集成没有员工MCP搜索路由;实现仍在隔离feature分支、服务未发布。依据共享索引及outputs/local-main-merge-20261022/mcp-review.md。Owner:Backend后续部署/身份gate;未猜生产route,普通ES不替代。 |
| ST-NEW-01 | Pass | 新需求单B及混合B/C推荐均expert_blacklisted;混合后total0;正常C单次新增,再解除后B唯一重试成功。r1-new-recommend-*-denied/after-mixed/control-read、r2-unblocked-retry-read;推荐总4。 |
| ST-NEW-02 | Pass | B普通新Task、B1 quick均expert_blacklisted;已有旧推荐不豁免新Task。显式全状态客户项目查询仍确切142/143/145/146,项目/需求预算不增。r1-new-ordinary/quick-task-denied、customer-task-all-status-count。未触发自动建会/录制;不能把错误前置拒绝当锁通过。 |
| ST-NEW-03 | Blocked | 已测Task143改绑B拒绝,读回仍C;但复制、跨客户项目/会议迁移及取消/失败恢复未在真实站覆盖,不能用换专家子项包揽全部入口。客户项目1+会议隐式项目1已达2项目预算,Task已达5。Owner:统筹/Backend/QA;后续独立受控fixture补测,本轮不扩数据。 |
| ST-MEETING-NEW-01 | Fail | 功能拒绝部分按原契约Pass:HTTP400/INVALID_REQUEST,实际列表仅原关联50/Task144,重复原B复用同ID;没有B1新关联。提示message含ErrorDetail repr,可读性Fail,关联#24。 原预猜200/expert_blacklisted的oracle过强轨迹保留;不将原HTTP约定记成bug,不冒称实测DB全库零孤儿。r1-meeting-new-background-denied、experts-after-negative、existing-expert-reused及backend-qa-triage.md。 |
| ST-OLD-01 | Pass | 原Task142拉黑后备注保存、正常完成成功,专家/客户/项目保留;每次先GET is_recorded=false且recording_schedule=null;页面显示旧合作风险。r1-old-task-*、final-task-142及图07;完成正常带出test ES/财务归属快照和无schedule即返回线程,非纯DB。 |
| ST-OLD-REG-01 | Pass | 依计划同公司两合成联系人:旧会议+B已存在,拉黑后L2报名新增Task146,原L1报名保留;Task145已核收费小时、费率、金额/归属字段未变,Backend另对存证财务字段作定向比较,非全对象逐字不变。meeting-l2-after-blacklist-register、registrations-after-blacklist、l1-financial-baseline-retained及图16。 |
| ST-OLD-FEE-01 | Pass | 等会议自然结束后合法status ended、settlement0.1小时,生成单一成本41=0.10 RMB/unpaid;无付款/审批,未在共享站造processing成本或扩大旧支付验证。old-meeting-end/expert-settlement/unpaid-cost-read、final-cost-read。 |
| ST-FAMILY-01 | Pass | B1普通重挂original_id拒绝并读回原B;新B2继承;同名独立C不受影响;解除族同步正常。background-reparent-denied/after-reparent-denied、new-background-inherited-read、family最终读回。历史环/缺根沿用适用本地隔离PG证据,不在共享库造异常。 |
| ST-EXTERNAL-01 | Blocked | 无已核test第三方应用X及仅合成可见profile,本包禁止公开资料发布/借生产AK。未测公开catalog、HMAC内部应用列表/detail/lookup/外部导出。Owner:Backend/统筹准备测试身份及可见性前置,QA后补;普通JWT和导出不能替代。 |
| ST-UNBLOCK-01 | Pass | 原因解除、独立读回B/B1/B2均false/can_cooperate=true,C独立正常;刷新新增入口恢复。审计当前1–6,按文UI事件5/6为加入/解除,历史保留。r2--confirmed-unblock、r2-ui-unblock-audit、manual-replay-receipt.json及final-expert-。 |
| ST-RETRY-01 | Pass | 解除后仅重试此前被拒绝的需求29单B推荐一次,新增关系26;读回需求29仅C/B两条,全部推荐总4。r2-unblocked-single-recommend-retry、r2-unblocked-retry-read。未再重跑混批/Task。 |
| ST-MANUAL-01 | Pass | 限合法完整资料的核心流程:正式稿按文22:36:27–22:36:45实际复现,2次UI POST200,审计5/6;8张真实图,桌面及390弹窗;UI/Web/Backend复核通过、必要文案已收口。manual-replay-receipt.json、正式手册及三方review。原nullable输入失败另立ST-UI-NULL-01/#25,绝不被此Pass覆盖。 |
| ST-CLOSE-01 | Pass | 精确引用链保留;所有专家恢复正常,会议ended、cost41未支付;账号20/16/19 active且19临时grant已撤销。正常UI退出,cookie/user token及本RUN sessionStorage清除,Space7 finish一次成功;不声称服务器JWT已撤销。session-close.json、final-state.json;本结果按逻辑批次#23追加并读回,回执由同名writeback.json记录。 |
补充合法边界(不占23项、不重复计Pass)¶
ST-UI-NULL-01 Fail / #25:普通API合法创建并返回property=null的B574241,真实管理员详情主内容白屏,console为Cannot read properties of null (reading 'cpt_face_to_face')。原响应、assets/01、null-property-observation.json保留。Web对照部署/源HEAD/开发前相关代码等价,确认既有问题;既有不等于可忽略。仅对本RUN B普通PUT补属性对象,费率/黑名单未变,后续页面恢复,未修产品。其他背景仍保留原null边界供复现,未重复UI造失败或改真实数据。#25仍新建,journal281已关联Web既有归因并读回。
缺陷与原始失败轨迹¶
- #24:父23/tracker2;会议新增黑名单专家拒绝提示ErrorDetail repr。错误HTTP/顶层码不变;仅可读性缺陷。Backend确认,未修/未关闭;没有再次向已结束会议提交相同拒绝请求以凑截图。
- #25:父23/tracker2;合法空扩展资料详情白屏,Web确认既有。未修/未关闭,后续fixture完整资料场景通过不是修复。
- 运行器失败与产品Fail分开保留:合同详情不输出is_active→公司合同列表精确读回true;B1普通ValidationError code为invalid;Task列表默认finished/failed→显式全状态核4条;会议400约定纠正;自然结束前guard未发结算,合法到时只续执行未发步骤;保存登录浮层拦截点击发生在写之前,原状态读回后才续执行。没有重放结果不明POST。
- 初期认证采用按角色固定收据名,后来同角色成功会话核验更新了该文件;原执行摘要保留在journal276/277与聊天工具记录,后续已改为时间戳追加。最终身份引用以manifest和时间戳收据为准,不虚构恢复旧raw或增加通过数。
手册、截图与审阅索引¶
- 正式文档:
docs/user-manual/frontend/expert-blacklist.md;8张相对引用位于docs/user-manual/frontend/assets/expert-blacklist/,与qa原图逐字hash相同、0 missing、无尾空白。 - 管理/旧合作/普通用户/解除/窄屏引用图:05、06、07、16、11、13、15、04。图05明确空原因校验;图13有稳定图4b图注;图16去除保存登录浮层;图08只证明入口禁用,图10未作报名/风险图。未编辑原图像素或用mock替代。
- UI:
outputs/expert-blacklist-20261025/ui/manual-review.md正式增量通过,唯一图注要求已补,无需重拍全审。 - Backend:
outputs/expert-blacklist-20261025/backend-manual-review.md末尾关闭通过;管理筛选找回、旧合作边界、已核字段限定等已采用。 - Web:
outputs/expert-blacklist-20261025/web/manual-review.md业务准确性通过,非阻断文字建议已采用。 - 按文核心复现:
station-manual-replay-receipt.json,actor20/candidate574241,2次POST均200、审计5/6。PM章节沿用同候选22:30真实UI,报名/费用/推荐复用对应API结果,未假装本次又新增对象。
精确夹具处置与账号/会话收尾¶
本轮未删除业务fixture,保留以下最小有审计及财务依赖的引用链供#24/#25与验收复现;没有任意清旧数据,也没有恢复/reset业务状态:
| 对象 | 确切ID / 最终状态 | 保留原因 |
|---|---|---|
| 专家 | B574241、B1 574242、C574243、B2 574244;均正常/可合作;审计1–6保留 | 家族/同名控制、会议拒绝及null资料复现;只B补扩展资料,其他原null值仍有最终GET证据。 |
| 公司/合同/联系人 | 公司13、合同20 active、联系人9/10 | 项目/报名/收费Task的合法合同及客户归属依赖,无真实联系方式/签约/附件。 |
| 项目/需求/推荐 | 94及会议聚合900001,需求28/29,推荐23/24/25/26 | 旧/新关系与唯一成功重试的可追溯引用;总项目2/需求2/推荐4。 |
| Task/会议/成本 | Task142 finished;143/144/145/146 ongoing;会议72 ended;成本41=0.10 RMB/unpaid | 原履约/两客户应收/专家应付及合法结算审计,禁止为清理抹财务链或实付;所有Task不录制且无schedule。 |
| 专用身份 | A20 admin、U16 pm、19 finance均active;Role18保留但0绑定;仅UserRole51移除,原49保留 | 依约可复用账号及BW登记不删除/停用;QA未直接改grant,fresh19确认manage=false。 |
临时会话已正常退出:无Access-Token cookie、无user token、本RUN sessionStorage0;Space7 finish({keep:[]})仅调用并成功一次,22:43:40完成。API token进程/页面内存不保留,不冒称服务端JWT撤销;所有凭据仍只在获准BW中,报告/脚本/截图无password/token/cookie。
版本、文件及安全交付¶
- QA只写
outputs/expert-blacklist-20261025/qa/及正式手册/8图。删除的唯一文档文件是新建正式assets目录中未引用、与QA原图逐字相同的旧14副本;原始异常/浮层证据仍在qa,未改其他手册/历史。 - 两仓checkout均feature/expert-blacklist;Backend仅原
.aoci/config.jsondirty,Web干净。两仓git diff --check均exit0;QA没有源码/环境配置改动、切分支/worktree、commit/push/部署。 - 没有生产、真实付款、审批、企微/邮件通知、录制/OSS、公开资料发布或DB/ES/队列直写。普通API产生的staging索引/审计及一次普通Task正常staging Celery是已授权副作用;不宣称全网消费者排他审计。
- 本轮离线运行器检查13+5+1+2仅支持证据,不计产品case通过;未重复本地PG或未变全仓测试。
- 既有结果批次:#23 journals276/277/278。279/280为父子关联日志,不计测试结果;最终本条写回/reread receipt在
station-final-results-writeback.json。#25 journal281是既有归因补证,两个子缺陷未关闭。
交付止于测试结果。4项Blocked及2项缺陷仍由相应责任方后续安排;本次不等待修复、不扩大代码或部署范围,不要求人类重复授权当前已执行包。
RA Updated by Redmine Admin 16 days ago Actions #7
QABL-FIX-R2-FINAL — #23 黑名单修复 #24/#25¶
2026-10-25 Asia/Shanghai;原QA责任聊天;本轮RUN QABL-20261025-FIX-R2,保留原RUN QABL-20261025-R1-d769fd6e。唯一当前结果表;原qa/station-final-results.md及#23 journal282不覆盖。
候选、门禁与结论¶
仅测试tcrm/tcrm-api。BE1.20.8b1 / 294e37e613e675390c656f961ba38f4821ddda95;FE2.16.6-beta.1 / e0e5c2ef76620100c974bc409091b32e7460fd56。Ops完成收据、BE运行hash/FE公开资源hash已核;QA本人实际BE版本、FE登录版本及入口asset d734983f…a469确认。机器gate已通过,A20 active/admin、U16 active/pm且无管理能力。共享影响覆盖见qa-impact-review.md、backend-impact-regression.md;BE仅目标formatter,FE仅两处null赋值边界。原领域/锁/财务/迁移及Web提交/附件/费率逻辑未改,证据复用依据和15文件逐字比较已记录。
两个缺陷的受影响真实测试路径通过,无本轮产品Fail;不自动关闭tracker,不代表完整QA/生产准入。 本轮最小矩阵8项:实际执行/交付6项为5 Pass / 0 Fail / 1 Blocked;另2项按代码等价引用开发已执行本地证据,不重复运行或累加为本轮新业务Pass。
当前最小复测矩阵¶
| Case / 影响 | 层级/前置、操作与预期 | 实际结果/状态 | 证据 |
|---|---|---|---|
| FIX24-01 / IMP24-01,04 | 新候选A20,会议73预选正常B1后将原族拉黑;真实UI单POST应400/INVALID_REQUEST、安全普通中文、弹窗保留/按钮恢复且无部分新增 | Pass;23:20:59单次POST /v1/meetings/73/experts,message“该专家当前不可新增合作。”;无ErrorDetail/私密原因,弹窗保留、confirmLoading=false;专家列表0、project900002全状态Task0 | qa-fix-meeting-ui-refusal.json;meeting-experts-after-refusal、meeting-tasks-after-refusal;图05 |
| FIX24-02 / IMP24-02,03,05,06 | 非目标校验/权限/not-found/冲突、旧关系/正常新增及事务/幂等兼容 | Pass(引用已有本地/旧站证据,不是本轮新执行);Backend新7+相邻6为SQLite真实路由/formatter,HMAC真实签名,Web force_authenticate;原PG12项因15文件逐字等价复用。新正常创建测试是HMAC先建/Web复用重放,不虚称两端各独立新建;Web首次成功新增复用旧真实relation50/Task144 | backend-validation.md、backend-impact-regression.md;qa-pg-reuse-comparison.json;旧qa/local-results.md、qa-pg-r4.log、#23 j282 |
| FIX24-03 / IMP24-01,06 | 实际服务HMAC/第三方目录身份链 | Blocked;现场无获准测试X身份/合成可见profile;没有借生产AK或以JWT代替。仅本地真实签名成功,live边界仍未覆盖 | 沿用ST-EXTERNAL-01;Backend/统筹持有前置与后续处置 |
| FIX25-01 / property读取边界 | A20,原null 574243/574242/574244详情→刷新→直达编辑只读;管理弹窗可用、不先补资料 | Pass;三对象原null/1.00 RMB且RUN归属核对,9个加载/刷新观察完成;原null 574243管理弹窗正常加载;390只证明可渲染 | qa-fix-readonly-preflight.json、qa-fix-null-ui.json;图01–04。errorCount=1已定位ResizeObserver布局通知,不是null TypeError/unhandled rejection,不称零事件 |
| FIX25-02 / 普通安全窄保存 | C574243详情Warning一次最小保存,禁止费率/附件/Task/cost写;GET保持property null及其他数据 | Pass(仅窄Warning);23:16:15仅1次PUT /v1/candidates/574243 200/code200;完整键比较仅warning/updated_at变化,property仍null、cpt1.00/RMB;无费率审批、上传、Task/cost请求 | qa-fix-warning-ui.json、qa-fix-warning-before/after.json、manifest。原4专家无经历,真实站全编辑整表单提交未执行;不新增经历/手工绕校验,不用此Pass替代完整保存 |
| FIX25-03 / 费率、附件和提交兼容 | null/缺失/{}/完整property、0/精确十进制、附件/其他键保全 | Pass(引用已有本地证据,不是本轮新执行);Web36相关回归、8实际SFC localhost加载和390观察/lint/build已过,API/身份为mock;实际loader/submit函数与模板测试,不冒称真实OSS/JWT整表单保存 | web-delivery.md、web-focused-tests.log、web-browser-results.json;qa-impact-review.md;集成仅两SFC保护/新test/package版本,无源分支原3行额外差异 |
| FIX25-04 / 权限边界 | U16真实UI/profile,原null B1详情/编辑只读,管理入口与私密原因不可见,专属GET拒绝 | Pass;23:24:59 fresh active/pm16;23:25详情/编辑加载,管理按钮false、私密原因false;管理GET HTTP403/code403/缺少专家黑名单管理权限;PM普通GET exact574242/property null/RUN true | qa-fix-pm-ui-auth.json、qa-fix-pm-ui.json、qa-fix-pm-loaded.json、qa-fix-pm-api.json;图06 |
| FIX-DOC-01 / 变化手册 | 已通过路径截图,旧8图复用,只对新文/4图做三方定向复核 | Pass;正式手册修复增量、12图引用有效;UI/Backend/Web均通过。全编辑未实测、390局部、旧Fail/4Blocked及生产限制明确 | docs/user-manual/frontend/expert-blacklist.md;ui/backend/web-manual-review.md;qa-manual-delta.json |
原23项与历史失败的关系¶
原R1 #23 j282:23主项18 Pass / 1 Fail / 4 Blocked;额外ST-UI-NULL-01 Fail/#25。这些历史不改写。
最新适用证据:18个原主项Pass按差异复用;ST-MEETING-NEW-01在FIX24-01补为Pass,故主矩阵最新19 Pass / 0 Fail / 4 Blocked。额外null边界当前Pass,全部24独立场景最新为20 Pass / 0 Fail / 4 Blocked。不是重跑23项,也不将本轮5 Pass或开发13/36与原计数相加。ST-UI-NULL-01当前Pass限详情/编辑加载及已明确的Warning窄保存,不声称整表单真实保存。
四项持续Blocked:ST-AI-01真实AI供应商;ST-MCP-01员工MCP未部署;ST-EXTERNAL-01真实外部身份/catalog;ST-NEW-03迁移/复制/取消失败恢复完整入口。两修复和手册通过不关闭这些门禁;后续由统筹明确前置/处置,不要求用户现在重复授权。HMAC现场Blocked与其中外部身份缺口重合,不额外增加全矩阵独立条数。
精确fixture、状态与安全收尾¶
只增加会议73及其隐式项目900002(原项目总数2→3已明确纳入预算);未新增Task/成本/专家/客户/推荐/合同/身份。会议无join_url、外链、参与人、录制或第三方通知,正常取消并保留。B574241/574242/574244最终正常可合作、两个null背景仍null,审计7=加入/8=解除;C574243只新增本轮Warning且仍null。原Task142–146状态/项目/专家/录制字段均与前置一致,成本41完整脱敏GET逐字一致、0.10 RMB/unpaid;没有付款、审批、外发、DB写或角色变更,19未提权。
实际业务请求仅6次:Warning PUT1、会议创建1、拉黑1、UI专家拒绝1、会议取消1、解除1;其中5成功、1为预期400拒绝。这是请求数,不是case数。manifest无pendingUnknownWrite。
执行期间的脚本/观察偏差保留:首次Task GET误用未实现旧FE helper路径404,核实际urls后用/v1/tasks?project_id=900002及五状态读回0,未重试写;数字搜索实际后端只匹配姓名,改同一RUN姓名选确切574242,未发专家POST;SPA退出保留单POST安全护栏,PM登录在网络前被拦,确认0 auth请求后同Space14刷新清除,随后正常UI登录一次成功,不判凭据失败。PM首采样早于异步姓名数据,后以显式完整RUN/背景及GET读回补齐;原采样保留。以上不冒充产品Fail、不掩盖日志,也未新建替代空间。
浏览器收尾、Redmine写回/读回与文件检查见qa-writeback-receipt.json(完成后记录)。专用账号active保留,合成业务记录保留供复现;不声称服务器JWT已撤销。原Space7不恢复;Space14正常退出并finish一次。QA未改产品源码、版本、配置、分支,未commit/push/部署或操作生产;Ops本轮测试发布为独立原收据。
RA Updated by Redmine Admin 16 days ago Actions #8
QABL-PRODUCTION-SMOKE-20261026 — #23 黑名单正式发布只读闭环¶
执行:2026/10/26 00:10:49–2026/10/26 00:10:50 Asia/Shanghai;原QA责任聊天。仅公开GET及本地证据核对;不是重新运行整套业务验收。生产请求明细/状态/hash见同目录qa-smoke-evidence.json。
正式身份与自动起点¶
- Backend正式1.20.8,commit e9b9f553f96d196a5589b2e2f51af614462ac071,tree a4554bf607d63f121589e945e3228401000b60b7。
- Web正式2.16.6,commit a5b759361c578eb46dae748369f804478615c56f,tree 4890485cc8a080456e055714b5622ac616b6625f。
- Ops收据ops-execution.json phase=formal-production-verified、completedAt=2026-10-25T16:08:30.181Z(等同已授权包的prod-package-complete终点),QA独立读取两个正式commit的tree,与已审manifest内存重建树完全一致。收据SHA256 8a0b1901c6023321b47595254eec64e6973cce0e164a9d9b6c60fb7a9d5654e4。
- 起点同时核到:备份ledger130→正常迁移后132、两项预期迁移、后端28文件运行hash、前端7公开资源成功、production构建确认。前期未完成状态/旧页观察不作为最终失败覆盖已完成结果。
本次发布smoke结果¶
| 检查 | 层级与操作 | 实际结果 |
|---|---|---|
| PROD-ID-01 | QA本人无认证GET https://crm-api.mindsetech.com/v1/version/ | Pass:HTTP200、application/json、code200、version1.20.8 |
| PROD-WEB-01 | QA本人GET https://crm.mindsetech.com/users/sign_in + Ops列明7个公开assets | Pass:登录HTML200、两个预期入口均出现;7资源各200且SHA256与已部署Ops资源/容器收据全部匹配。正式commit package版本2.16.6、Ops实际页脚2.16.6、同一组资源绑定一致。production API地址出现在资源中,未发现staging API地址;CI收据production模式确认。QA未执行DOM/浏览器,所读7资源没有版本字面量,不冒称QA亲自看到页脚 |
| PROD-RUNTIME-01 | QA只读复核本地Git/现有Ops生产完成收据 | Pass(收据核验):正式树等于已审树,28个后端运行文件hash逐项对应正式候选,五服务同镜像;前端实际资源匹配。QA不登录生产主机或操作Coolify,不把此项计为业务行为实测 |
| PROD-MIG-01 | QA只读消费Ops迁移/备份收据,未连接DB | Pass(收据核验):normal migrate exit0,仅accounts.0013_expert_blacklist_permission和candidates.0017_expert_blacklist,账本130→132。备份一致快照/归档可读/核心表存在由Ops核,完整恢复演练未执行;不夸称已完成全量恢复测试 |
总共9次公开GET,无自动retry、无失败;这是请求数,不是9项新业务case。未执行生产黑名单加入/解除、会议专家POST、资料保存、业务查询、真实供应商调用或角色验收。QA生产公开smoke通过,仅证明本表发布身份/资源及收据事实,不表示完整生产业务验收。
证据复用与未测处置¶
已在qa-candidate-review.json/md完成55文件hash/完整拟树核对。正式只保留解释清楚的既有main与beta差异:BE public_platforms字段排列、Web原main三行公开字段过滤;MCP/旧迁移/环境/日志/旧文档均记录来源。不因新正式SHA、tag或版本重新验收;两正式执行树仍匹配已审核结果。
测试环境业务证据继续引用fixes/qa-results.md与Redmine #23 journal283、#24 journal284、#25 journal285;主23项最新19 Pass / 4 Blocked、额外null场景Pass,历史j282/R1 Fail完整保留。本次不增加业务Pass、不把本地/测试站证据升级成生产实测。真实站整表单提交未执行,Warning窄保存仍不能替代。
正式12图手册docs/user-manual/frontend/expert-blacklist.md及UI/Backend/Web定向结论复用,未重拍或重复送审。图片均来自原测试环境,正式发布不会改变图片来源和证据等级。
四项持续未测/Blocked:ST-AI-01真实AI供应商,ST-MCP-01员工MCP,ST-EXTERNAL-01真实外部身份/catalog,ST-NEW-03复制/跨项目会议迁移/取消失败恢复完整入口。统筹已先披露四项并询问处置,人类明确“直接发布生产吧”,决定见docs/plans/2026-10-25-expert-blacklist.md末“生产发布决定续接”;按已披露边界继续发布,不重复索取相同决定,不把这些范围改Pass或隐去。
权限、旧轨迹与写入边界¶
- 正式迁移提供管理专家黑名单action种子,不能据此声称已给任何员工分配生产角色。本次未分配生产角色、未新建账号、未建立生产登录身份,没有生产角色有效性实测。
- 旧preflight IP守卫漂移已由Ops按当前app→DB指纹/cluster身份重新核定;Web曾先排队旧镜像后等待至实际新版本。保留原Ops轨迹,只使用最终正式完成收据,不把早期旧页误记最终Fail,也不把IP修正当业务改动。
- QA仅写本地qa-*及#23结果journal;不登录、不读业务专家/客户/PII、不写生产fixture/数据、不触发审批/付款/通知,不改源码/配置/DB/Git引用/角色,不执行部署。部署、备份与normal迁移为Ops按授权完成,角色管理没有实际发生。
- 无新浏览器空间;测试Space7/14原finish收据保持。合成测试fixture与账号保留,无清理生产/测试业务数据。
回写与终点¶
本报告全文仅向#23追加一次生产事实批次并读回,journal ID及全文匹配记录在本目录qa-writeback-receipt.json;#24/#25无新case不重复写,tracker状态保持。当前只读生产smoke通过,四项未测继续按人类决定保留;不声称全量QA通过或员工已被授权。