缺陷 #4 » http-contract-defect.md
纪要预约:NDB200但BFF因created_at无时区返回502
发现:2026-10-07 00:25,00:26独立干净临时库复现。父验收NDB #1;级别P1候选(阻断预约反馈,协调方决定修复路由)。现有业务库完全未使用。
环境与复现
独立PostgreSQL16 tmpfs 127.0.0.1:56488,ndb_qa/mp_conference_test;真实Backend18000与最新源码独立编译BFF13000,Notification仅本地mock13001。synthetic JWT/ApiApplication,不是真实微信认证;Backend保留仓库base USE_TZ=False,禁止读取.env。合成公司/联系人/项目,无合同;A已开始、0h、无人工纪要。
- 使用合成绑定用户 PUT /api/v2/meetings/1/minutes-subscription,Idempotency-Key=qa-a-minutes。
- NDB统一POST /internal/v1/meetings/1/registrations/ intent=minutes实际返回HTTP200。
- BFF返回HTTP502,error.code=NDB_CONTRACT_ERROR,“上游响应格式异常”。
- 使用合成AK签名GET NDB /internal/v1/meetings/1/registration/?client_contact_id=2,HTTP200;检查独立PG仍只有1个Registration、1个Task,未产生重复。
精确脱敏值与类型
| 字段 | 真实NDB值 | JSON类型 |
|---|---|---|
| id / meeting_id / client_contact_id / task_id | 1 / 1 / 2 / 1 | number(正整数) |
| attend_requested / minutes_requested | false / true | boolean |
| status | reserved | string |
| created_at | 2026-10-07T00:26:08.883534 | string,缺少Z或+08:00 |
| task_status / charge_status / payment_status | ongoing / unbilled / not_required | string |
DB状态:Registration.id=1、task_id=1、attend=false、minutes=true、内部status=confirmed(wire由序列化投影为reserved)。Task.id=1、status=ongoing、contract_id=null、charge_total_hours=0.0000、actual_price=0.00、total_price=0.00;合同数0。
原因证据
Backend api/meetings/serializers.py:99-134未给Registration.created_at声明带上海时区的字段,base.py USE_TZ=False,输出上述naive字符串。BFF src/ndb-client/meeting.adapter.ts:36要求 z.string().datetime({offset:true});实际字符串独立safeParse=false、Invalid ISO datetime。IDs、boolean、status均符合当前schema。
Backend serializer SHA256 611bc92ed9d1c5d84abd8318a50c9ae41232275a454cea0c5588831c0b1de958;BFF adapter SHA256 bae0ad5a83eb86faf95e6ffa21f2ab53656443da8c3442998f081e0ffd49140e;本次编译JS SHA256 1dc3e9afcfad80e884cbbc2d80159e5e75d7672a152ab1e4f8d78c744360deec。
修复与重测边界
QA不改业务源码,也不切USE_TZ=True以掩盖失败。协调方路由Backend/BFF确认正确兼容策略。修复后在新临时库重跑同幂等键PUT、GET权威状态、两个意图顺序及取消后保留Task,并再次核对数量,不能因客户端502直接认定NDB未写入。当前已做权威GET及数量快照;BFF同键重试尚未实测,不能声称完成。
证据:http-round2-results.json、http-integration-results.json(第3轮原始响应/快照)、http-backend.log。全部专用服务已停,容器已停,tmpfs合成数据已随停止消失;日志保留,无现有数据删除、真实邮件或生产操作。