QA验收 #33
open测试补发:客户联系人查询与专家提交隔离
Added by Redmine Admin 13 days ago. Updated 13 days ago.
0%
Description
TG-001 受限测试补发的独立QA记录。范围仅六个批准源码;本轮先执行本机隔离真实HTTP与合成数据验收,随后按Operations运行收据进行有界测试站专项。源、影响矩阵与证据索引:outputs/staging-test-gap-release-20261029/index.md;docs/specs/cross-project/2026-10-29-staging-two-gap-sync.md。原49项和4项开发测试按源码适用性复用,不提升为独立QA或测试站证据;本轮结果将批量追加并重新读取。
RA Updated by Redmine Admin 13 days ago Actions #1
TG-LOCAL-R1 — 2026-10-29 本机独立验收¶
Redmine:NDB #33,https://redmine.mindsetech.com/issues/33 。QA责任会话01a09aab-7ebf-79f0-bfb8-5a4382e401c0;执行约15:55–16:05 Asia/Shanghai。本轮仅本机隔离候选,不是测试站/生产验收,也不是部署收据。
结论¶
11个独立逻辑用例最新均为 Pass,无确认产品缺陷。按执行阶段为:签名HTTP 5 Pass;真实前端API helper→Django/SQLite 2 Pass;独立公开平台Django/PostgreSQL16 2 Pass;真实浏览器表单→Django/SQLite 2 Pass。不是11条单元测试,也不把HTTP请求数相加冒充用例数。
公开平台用例的首次本机503与随后SQLite JSON contains限制均保留;原runner把断言/解析失败记为Fail,诊断后应归为本机前置Blocked,不能据此认定产品缺陷。前置修正后只补未过路径,在专属PostgreSQL取得Pass;未重跑已过5+2组。浏览器曾因Bitwarden保存登录提示handOff,用户确认关闭后仅恢复Space28,无绕过提示或新增空间。
影响依据:docs/specs/cross-project/2026-10-29-staging-two-gap-sync.md,TG-IMP01–06。主任务唯一索引仍为index.md,本报告不替代或修改它。
精确候选、预检与隔离¶
- 默认pwd(未指定workdir)为canonical协调根。原Backend Git根projects/ndb/backend,main,74767130fa981590c6b170b331aa77c5c62454e8;Web Git根projects/ndb/frontend,release/payment-readiness-production-20261028,08cb3da9fc3586160c4d090f4d0e4243f6ad407e;开始及结束均clean。本轮没有切分支或修改这两个仓库。
- 非Git普通archive副本:qa-local-candidate/backend,以测试父d977024a7e750e7974f3c0de7d91a99b42eb8fdf为底;frontend以e2a046a908998716459c085ddbc453e987ca71fa为底,精确覆盖批准6源。不是worktree,没有创建Git对象/index/commit。
- 六源的完整SHA256/Git blob均见six-source-manifest.json和qa-candidate-receipt.json;执行后再次核对全部父树tracked文件,只有批准6源不同/新增,见qa-postrun-source-check.json。测试没有叠加后续3个beta元数据;版本显示不计业务差异,实际发布身份由Ops收据确认。
- Backend仅在crm_backend中运行,真实Django WSGI、标准HMAC/JWT、数据库模型/serializer/权限/路由,不使用force_authenticate或替换业务响应。初段为本包专属SQLite文件、LocMem cache;关闭MQTT、邮件外发和共享broker,socket白名单仅本包loopback端口。
- 普通专家保存的外部ES insert适配器被本机隔离,不连接原ES。本轮证明表单→真实HTTP→真实DB结果,不证明外部ES索引/供应商/通知行为。原仓.env没有复制为运行配置。
- 仅公开平台contains路径另建本机Docker PostgreSQL16,desktop-linux/unix endpoint,127.0.0.1:55479,库ndb_tg_synthetic,无真实数据。镜像sha256:9e2cf6287f25c3151f4c9421ccce2b17f3e60061c111a29165e0d2cdd9ff0a97。Docker context显式证据是在启动后补记,非启动前检查,已如实写入清理收据。
- 所有账户、app、公司、联系人、专家均为本机合成。密钥/token不进入请求日志、截图或报告;请求观察仅method/path/字段名,手机号查询值不落日志。
本轮逐项结果¶
表内路径均相对本输出目录。预期与实际合并描述;每个Pass由对应runner断言、HTTP/业务code及真实DB读回支持。
| 用例 | 影响/层级 | 操作、预期及实际 | 状态 | 证据 |
|---|---|---|---|---|
| TG-BE01 | IMP02;真实HTTP/SQLite | 同一合成联系人按ID、主号码、备用号码查,各HTTP200/code200且ID一致;仅client_contact_id/name/company_id/company_name/position五键,无电话/邮箱/备注泄漏 | Pass | qa-local-http-results.json cases0/http0–2;qa-local-runner.py positive断言 |
| TG-BE02 | IMP01/02;真实HTTP/SQLite | 匿名/错签401;只有client:resolve的应用403;非法ID400;确切不存在ID404;旧应用未自动获得client:read | Pass | 同文件cases1/http3–7 |
| TG-BE03 | IMP02;真实HTTP/SQLite | 本机第二合成联系人暂设同号,409 AMBIGUOUS_CONTACT且无data;恢复该fixture号码 | Pass | 同文件cases2/http8 |
| TG-BE04 | IMP02;真实HTTP/SQLite | POST/PUT/PATCH/DELETE均405,联系人整表前后无变;无尾斜杠GET正常 | Pass | 同文件cases3/http9–13 |
| TG-BE05 | IMP03;真实HTTP/SQLite | 原resolve路径用client:resolve签名真实成功、指向同一备用号联系人;仅client:read调用resolve为403;客户行未修改 | Pass | 同文件cases4/http14–15 |
| TG-WEB01-API | IMP04/05;真实source helper/HTTP/SQLite | 调用候选实际addCandidate,form内故意含两公开字段;发出DTO不含两键,form不变;新专家普通资料真实保存且平台默认[] | Pass | qa-real-client-chain-results.json前两项之一,实际POST/GET;qa-real-client-chain.mjs |
| TG-WEB02-API | IMP04/05;真实source helper/HTTP/SQLite | 调用实际editCandidate,form试图清平台;实际PUT不含两键,普通name/description保存,原WECHAT_MINI_APP保留 | Pass | 同文件第二项,实际GET/PUT/GET;qa-local-final-readback.json |
| TG-WEB03-API-PG | IMP05;真实HTTP/PostgreSQL16 | 补本机唯一conference:read应用;管理员独立平台API清空、读回、恢复、读回均200/code200;没有公开档案且is_public=false,未发布 | Pass | qa-public-platform-pg-results.json cases0/exchanges0–4 |
| TG-WEB04-API-PG | IMP05;真实HTTP/PostgreSQL16 | 本机低权限合成账号正常登录,公开资料GET200、平台PATCH403,管理员读回原平台保留 | Pass | 同文件cases1/exchanges5–8 |
| TG-WEB05-UI | IMP04/05;Ego28真实UI/HTTP/SQLite | 本机正常登录后,完整编辑表单改name/description并提交;仅一次目标PUT,公开两键及隐藏phone/phone1均未携带,DB保留非空公开平台 | Pass | qa-ui-edit-result.json;qa-ui-edit.png;HTTP observer及DB读回 |
| TG-WEB06-UI | IMP04/05;Ego28真实UI/HTTP/SQLite | 正常新建表单填写必填项及合成号码;仅一次POST,公开两键缺失,phone正常携带;新对象ID3、name/description正确、平台[] | Pass | qa-ui-create-result.json;qa-ui-create.png;HTTP observer及DB读回 |
UI截图均已目视检查,是同一候选的真实结果;SQLite页面独立公开状态区显示“未配置会议小程序应用”,该图不能证明公开平台UI通过。独立平台API由上面的PG用例另证。本包没有新页面或布局,不新造员工手册/原型。
前置失败与runner恢复轨迹¶
- TG-WEB03首次:GET public-profile返回503/MEETING_APPLICATION_NOT_CONFIGURED。qa-real-client-chain-results.json原Fail断言保留,属于本机未配置MEETING_WEB_APPLICATION_NAME,不是产品回归。
- 补唯一合成应用后,SQLite执行公开可见性查询抛NotSupportedError: contains lookup is not supported on this database backend,HTTP500非JSON,qa-public-platform-local-results.json保留原解析失败。这是实际模型查询的DB能力缺口;没有mock contains或修产品。后续只用专属PG补两项,原成功链不重跑。
- runner启动初次模块预加载曾造成INSTALLED_APPS空,修为正常Django settings导入后才执行任何业务请求。UI准备时CandidateExperiences误用candidate关键字,确定未建成后按模型实际candidate_id补入。一次waitForSelector把input值当文本而超时,随后观察当前DOM确认已加载再继续;这些工具/fixture错误不计产品Fail或业务Pass。
- 历史文件均不可原样重新execute:已有结果/数据库存在时runner拒绝重放。syntax/source/path/业务断言与精确fixture护栏在运行前校验;请求返回后持续保存结果,不以最后聊天作为唯一证据。
旧证据按hash复用,层级不提升¶
- 原outputs/client-contact-query-20261016/backend-test-cases.json的49 Pass是开发SQLite测试,原发布明确豁免独立QA。本轮不继承该豁免。
- qa-evidence-reuse.json核实鉴权/authentication、signatures、permissions、models、tests.py及internal_clients.py/tests_internal_clients.py与原候选逐字相同;resolve handler/service AST相同。因此原12鉴权+18客户查询+2resolve共32项作为适用开发证据复用,未重新运行、不计本轮11组数量。
- 原17个internal_users开发测试记录保留为历史:当前internal_users及其测试已与原版本不同,不能仅凭旧49总数声称这17项在新契约通过。本包与测试父树相比没有改该实现,六文件差异只增加client scope/route;本轮也不对新的员工字段契约作额外验收声明。
- 原outputs/web-hotfix-v2.16.1-20261012/release.md的4个candidateSubmit实际submit VM用例:测试文件逐字相同,submit函数逐字相同;edit.vue其他区域存在历史变化,不把整个文件说成相同。四项保留为开发VM证据,本轮真实UI另闭环,不把原14套件或生产静态资源检查抬升成真实保存证据。
- 合计可直接复用开发证据36项,仍是原开发层级;不能与本轮11组相加为47项独立QA。没有重跑整仓、49项套件或4项VM。
测试站后续最小执行方案与缺口(未执行)¶
当前共享test写仍未放行。本轮没有访问共享test/生产业务、创建共享fixture或检查Coolify。等待Ops精确6源+3元数据候选/CI/staging实际版本一次运行收据,QA审收据,不重复轮询或把原BE1.20.14b0/FE2.16.8-beta.0认作新包。
账号:Bitwarden元数据已确认NDB 专用测试账号文件夹及仅tcrm的管理员、PM、低权限候选;引用见qa-test-account-inventory.json。尚未真实登录核角色/启用状态,不宣称凭据可用。没有确认具备client:read的专属测试HMAC应用;不可使用基础设施/BFF凭据或给已有应用偷偷增scope。
建议一次放行的串行最小包:
- 只用Bitwarden专用测试管理员核当前角色;若原登记测试app可复用,先核其用途/scope及有效状态。否则由主任务释放创建两个仅本轮测试app(client:read、无client:read的负例app),secret只在进程内;不改真实应用或生产权限。
- 仅test公开UI/API建立1个唯一QA-TG公司、2个无通知合成联系人(主备号码均为本轮测试值)、1个合成专家。只读确认create路径无外部签约/通知,先记录允许字段、预期响应及query-before-retry护栏;禁止DB直写。历史本机ID1/2/3不能作为共享fixture。
- TG-ST01:消费Ops单次runtime/源码/CI收据;本包无新迁移,不新增备份或重跑无影响历史用例。
- TG-ST02:专属app真实签名查本轮ID/主备号码五键、一个403及404,必要匿名401;不发真实resolve写、不触碰真实客户电话。端到端scope及代理行为单列为测试站层级,不能用本机Pass替代。
- TG-ST03:同一合成专家普通UI新建及编辑,捕获各一次目标POST/PUT和脱敏字段名,读回公开平台/普通字段。如果要证非空平台保全,只获准在该合成专家独立平台API设置标记后再编辑,保持无profile/未发布;不做实际公开发布。已有本机边界/全部400/405无需在test重跑。
- 所有共享fixture/app IDs、创建结果、scope和清理责任先入本包manifest;未知写结果先query不重试。验收后由主任务与Ops按确切ID决定保留或正常API清理临时app/业务fixture,保持既有可复用测试账号启用,不任意清旧数据。
- QA本包sole Redmine writer;后续实际测试站轮次批量追加#33并重读。没有新的共享写释放前只准备runner/DTO,不登录业务站或创建数据。
收尾与交付边界¶
- Space28仅finish一次,成功结束;本机WSGI/Vite已停止,自己的SQLite(含瞬态会话)已移除;PG容器90f6d066edbadc978abb17076f28b5e9bb97ee8c9aeb9f97e19a7a6ef1ef94b1核对归属/loopback后stop并自动移除。收据qa-local-cleanup-receipt.json、qa-pg-cleanup-receipt.json。只保留可复核runner、源码副本、脱敏结果、fixture历史ID及截图,不清理他人资源。
- 本机11组通过可供主任务完成local candidate门禁;共享测试站专项仍待Ops与fixture包释放,不能宣称已部署或全部测试环境QA通过。
- QA没有修改两仓业务源码/版本/配置/Git/index,没有commit/push/tag/部署、生产操作、真实付款/审批/通知;主任务/Ops自己的Git动作不由QA推断或重复执行。
RA Updated by Redmine Admin 13 days ago Actions #2
TG-RELEASE-REVIEW-R1 — 2026-10-29 测试补发最终证据复核¶
NDB #33,https://redmine.mindsetech.com/issues/33 。本次仅消费Operations最终CI/runtime/source收据并检查候选Git对象;QA没有查询CI、测试环境或生产,没有重跑本机11组,没有新建共享app、fixture或scope授权。原journal324完整保留。
结论与验收层级¶
本包最终发布证据复核 Pass。主任务已接受本机真实应用独立验收11组Pass;复用36项原开发证据保持开发层级,不与11组相加,不把它们升级为测试站结果。
测试站本轮仅确认:实际新版本、同源候选/镜像、schema、新路由匿名401、旧路由存在性、实际Web资源字节与staging API指向,以及迁移no-op。共享测试站的真实签名客户查询和UI保存未执行;这是主任务明确选择的验证层级,不作为本包新增阻塞,也不计测试站端到端业务Pass。本次新增业务执行用例数为0。
候选与实际运行证据¶
| 项目 | 实际测试版本 | 候选/流水线 | 镜像与运行证据 |
|---|---|---|---|
| Backend | 1.20.15b0 | b938c3b5fea66b37a220df1383cf6ce2bec0f1d8;v1.20.15b0;cnb-v74-1k63bhg5c | sha256:521555f114628d0c13edcbcc947feb3105e52614ef1645e136a611201a5c2b5b;ops-backend-runtime.json |
| Web | 2.16.9-beta.0 | dbc40bc164b60f864e604cf0b91cb4317e2d90d5;v2.16.9-beta.0;cnb-51n-1k63bn9d7 | sha256:21a7b765fa0be95e3bb730315b2e1d1893f7bd82111d9ce41c31cd489ca8dd24;ops-frontend-runtime.json |
所有证据路径均相对outputs/staging-test-gap-release-20261029/。Ops最终handoff时间2026-10-29 16:22:29 Asia/Shanghai,status=both-test-runtime-and-readonly-contract-passed;Backend passed=true/pending=false,Web passed=true。QA对引用文件保存SHA256,见qa-release-source-review.json,未以聊天自报代替文件证据。
逐项发布复核(证据审核,不是新增业务用例)¶
| 影响/复核点 | 实际证据与结论 | 结果 |
|---|---|---|
| TG-IMP01–05:六源身份 | 逐一读取最终candidate Git blob,与six-source-manifest.json的SHA256和blob逐项匹配;业务与本机独立验收同源 | Pass |
| TG-IMP06:准确九路径 | Backend相对d977024a父只变constants/internal_clients/internal_urls/tests_internal_clients与api/init.py、.cz.toml;Web相对e2a046a9父只变edit.vue/candidateSubmit.test.mjs与package.json。总计6业务源+3beta元数据;没有整包main合入 | Pass |
| TG-IMP06:Git与范围保护 | ops-final-git-readback.json的remote preview及tag peeled均指向对应候选;原Backend main/74767130与Web release/payment-readiness-production-20261028/08cb3da9保持clean,remote main保持原生产HEAD;仅normal push,Web本地独有preview17e1f937保留 | Pass |
| TG-IMP06:CI与生产隔离 | 两个ci-stage-receipt中的candidate/digest均与最终handoff/runtime一致,staging构建/镜像/部署触发success;Backend production stage7/8、Web production stage6/7均skipped | Pass |
| TG-IMP06:迁移与后端运行 | Backend五服务镜像一致,HTTP version200/1.20.15b0;migrate exit0、noMigrationsToApply=true、applyingCount=0。源码保护证据显示迁移/MCP/env/lockfile/CI未改 | Pass |
| TG-IMP01/02:新路由契约 | Ops schema200,operationId/scope/HMAC声明匹配,响应白名单5字段;GET /internal/v1/clients/匿名401。只证明schema及匿名鉴权边界,不证明真实签名查询成功 | Pass |
| TG-IMP03:旧路由存在性 | Ops纠正runner路径后GET /internal/v1/clients/resolve/匿名401。旧误路径/v1/clients/resolve/返回404的原记录保留;仅重查正确路由,未改产品。匿名GET不证明原POST业务成功,本机TG-BE05另有真实签名证据 | Pass |
| TG-IMP04/06:Web实际资源 | 实际容器编译login版本2.16.9-beta.0,公网HTTPS字节与runtime一致;stagingApiCompiled=true,productionApiAbsentInMainBundle=true。实际login SHA256为9cdfd485c229b617677029c28ee2e2d9cb95ce04653e633821023c4bb87f35ca,main为cf88a18d5c99fab1e46ba35ecea565808676d18da650e97593181d587245c921 | Pass |
Ops本机构建的资源hash与CNB实际容器构建可能不同;本次以ops-frontend-runtime.json中“公网与实际容器同字节”及对应CI镜像digest为运行依据,不把本机build资源hash当实际运行hash。ops候选JSON中的deploymentTriggered=false/waitingFor是创建阶段遗留字段,最终phase=test-runtime-verified及上述有时间的运行收据明确已完成,不据旧字段重复触发部署。
普通专家提交修复的精确含义¶
src/api/candidates.js底层API helper原本已经过滤public_platforms和allow_public_platform。本次恢复edit.vue submit中的三行(注释及两个delete),补回第二道请求边界。不能描述成“测试站此前必定可任意修改公开平台”。独立平台API及权限规则未改,本机正常创建/编辑、平台状态保全与独立管理权限已分别实测;测试站没有重复业务保存。
历史与未测范围¶
- 原本机公开资料503(缺本机会议应用)、SQLite contains导致500/非JSON,以及浏览器保存登录提示轨迹保留,见journal324及qa-completion.json;缺项后由专属PG和同Space28完成,没有产品修复或掩盖历史错误。
- 新增Ops误runner路径404保留于ops-backend-smoke-wrong-runner-path.json;正确路由证据在ops-backend-readonly-smoke.json。
- 不验证共享测试站AK/SK成功查询、普通专家真实保存、生产行为、外部ES/供应商/通知。主任务已明确不为本包再追加共享fixture/scope授权;后续若有真实失败或相关差异再按影响补测,不能以local覆盖运行失败。
- 本包不动MCP、生产或小程序。既有本机清理收据继续有效:Space28结束、WSGI/Vite停止、自己的SQLite与专属PG容器移除;既有共享测试账号未改。
交付¶
QA最终同源复核通过,可供主任务交付“这两项仅测试补发已完成”。Git/CI/测试运行由Operations执行,QA仅审核源证据;本次没有产品、Git、环境或业务数据写入。QA输出为qa-release-source-review.json、本文及后续qa-release-redmine-receipt.json;唯一主任务index/NOTES由主任务维护。