fix(web): 空/非空/不可读生产目标分开呈现 #15
Reference in New Issue
Block a user
Delete Branch "fix/library-empty-target-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
F1 修复(本包唯一范围):没有读到目标观测时不再误报"目标非空"
web/src/ReleaseTargets.tsx—— overview 缺失时 production 保持 null,分类走no-observation;四类有效响应(known / 已读且为空 / 非空无版本 / 不可读)的判定与建基线入口不变;
刷新失败但保留旧观测时标"上次观测 · 刷新失败,可能已过期"。
ReleaseTargets.test.tsx复用审核者三个真实 SSR 反例 + 旧观测标记;新增
ReleaseTargets.mount.test.tsx(同一挂载 + 可控 fetch:首次读取未返回 / 空→不可读→恢复 /刷新失败→恢复 / 内外切换 / overview 属于别的范围)。撤掉"三次 SSR 当刷新"的用例。
npm ci与 lock 已核,manifests-locked 通过)。git diff 6827fa9..47be4ae -- internal cmd为空。head_sha=47be4ae502b728222b219aeb1d630ad273690eb5,identity=success。
~/.hermes/handoffs/develop-release-contract/empty-target-no-observation-fix.md/.json;RED(旧实现 5 failed / 变异 3 failed)与 GREEN 42/42 的日志都在同目录。
根因:ReleaseTargetsView 在 overview 缺失时自己补 {state:'unknown'},而 productionTargetClass 把"unknown 且没有 empty_baseline"一律当成非空。后端对 "已探测且非空"发的正是这个形状(Go struct 上 omitempty),所以页面本地默认值 与真实观测在 JSON 上无法区分:首次加载、整库状态读取失败、当前范围没有数据 三条路径都会显示"目标非空,尚无权威版本",管理员还会拿到会返回 409 的 "建立目标权威基线"入口。 修法:没有 overview 时 production 保持 null,分类走新的 no-observation 分支; 四类有效响应(known / 已读且为空 / 非空无版本 / 不可读)的判定与入口不变。 刷新失败保留上一份 overview 时标注"上次观测 · 刷新失败,可能已过期",不把旧 结果当成刚验证的状态。后端 gate、权限、预备份与 API 拒绝一律未改。 测试:把旧"三次 SSR 当刷新"的用例撤掉,改为同一挂载 + 可控 fetch 的真实行为 测试(首次读取未返回 / 空→不可读→恢复 / 刷新失败保留旧观测 / 内外切换 / overview 属于别的范围);缺观测的三条路径另以 SSR 负例复用审核者的反例。 新增 jsdom 仅作为 vitest 的 DOM 环境(商品代码零改动,npm ci 与锁文件已核)。 验证:make verify 16 项 success(tests-web 504 passed、tsc 无错、npm audit 0); 新用例先在原实现上红(断言收到"目标非空"),修后绿。未部署、未合并、未改 候选运行栈。View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.