姚章浩
5e1482e349
build / build (push) Successful in 1m40s
feat(library): 恢复验证成为可页面发起的真实作业
根因:生产可恢复性只有 PRODUCTION_BACKUP_RESTORE_VERIFIED 这个手填 env 开关,
页面没有任何入口去真跑一次恢复;CLI(librarydrill)又不是 worker 能复用的实现,
所以"已验证"既证明不了跑过、也证明不了跑的是当前目标。
改动:
- 共享实现 internal/libraryverify(维护隔离→捕获→基线校验→canary→恢复→复核→关窗口),
cmd/librarydrill 改为薄封装,CLI 与 worker 只允许一份执行体。
- verify 成为独立业务作业:kind + VerifyStages(capture/verify/canary/restore/finalize),
与 sync/restore/baseline 共用同一把写互斥;迁移 79 加 kind 约束、重建部分唯一索引、
新建 library_restore_verifications(按 target_id 绑定,换库/索引/桶旧证据自动失效,
同 target+scope+job 幂等)。
- worker:admitLibraryJob + runOwnedLibraryAttempt 之后调用共享实现,阶段实时写
library_job_stages,结束后写真实终态;通过写 passed 证据,失败写 failed+原因(不伪成功);
中断接管按同一作业 id 收掉维护窗口。
- API:POST/GET /api/v1/library/verifications(管理员;闸口关闭/维护中拒绝;返回完整
整库目标、最近证据、失败原因),OpenAPI 同步。
- 闸口:同步/恢复/续作的证据判断改为读当前目标证据;历史 env 仅在证据缺失时兜底,
证据存在时以证据为准。
- 页面:生产保护与恢复面板加「恢复验证」块(完整 KB/索引/桶、状态、最近证据、失败原因、
管理员按钮、5s 轮询),作业类型补 verify 文案。
测试:make verify 16/16 全绿(go 1387 例 + web 454 例 + 契约/迁移/密钥/依赖锁定);
新增用例覆盖证据四条件、闸口证据优先、页面无证据/失败/通过三种呈现与管理员可见性。
2026-11-03 10:14:08 +08:00
..
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:06 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-10-08 15:41:13 +08:00
2026-10-08 15:41:13 +08:00
2026-10-09 13:50:23 +08:00
2026-10-09 13:50:23 +08:00
2026-10-13 19:40:19 +08:00
2026-10-13 19:40:19 +08:00
2026-10-14 12:36:32 +08:00
2026-10-14 12:36:32 +08:00
2026-10-17 11:39:38 +08:00
2026-10-17 11:39:38 +08:00
2026-10-17 22:37:26 +08:00
2026-10-17 22:37:26 +08:00
2026-10-18 19:10:47 +08:00
2026-10-18 19:10:47 +08:00
2026-10-18 21:50:29 +08:00
2026-10-18 21:50:29 +08:00
2026-10-18 23:26:55 +08:00
2026-10-18 23:26:55 +08:00
2026-10-19 08:49:18 +08:00
2026-10-19 08:49:18 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 17:55:15 +08:00
2026-10-19 17:55:15 +08:00
2026-10-20 05:44:02 +08:00
2026-10-20 05:44:02 +08:00
2026-10-20 08:18:03 +08:00
2026-10-20 08:18:03 +08:00
2026-10-26 09:49:23 +08:00
2026-10-26 09:49:23 +08:00
2026-10-26 15:59:06 +08:00
2026-10-26 15:59:06 +08:00
2026-10-26 15:59:06 +08:00
2026-10-26 15:59:06 +08:00
2026-10-26 16:06:17 +08:00
2026-10-26 16:06:17 +08:00
2026-10-26 16:09:00 +08:00
2026-10-26 16:09:00 +08:00
2026-10-27 10:42:30 +08:00
2026-10-27 10:42:30 +08:00
2026-10-28 13:58:51 +08:00
2026-10-28 13:58:51 +08:00
2026-10-28 15:11:27 +08:00
2026-10-28 15:11:27 +08:00
2026-10-28 16:27:46 +08:00
2026-10-28 16:27:46 +08:00
2026-10-28 17:53:43 +08:00
2026-10-28 17:53:43 +08:00
2026-10-28 20:45:02 +08:00
2026-10-28 20:45:02 +08:00
2026-10-28 23:01:29 +08:00
2026-10-28 23:01:29 +08:00
2026-10-29 00:50:32 +08:00
2026-10-29 00:50:32 +08:00
2026-10-29 06:55:13 +08:00
2026-10-29 06:55:13 +08:00
2026-10-29 13:01:37 +08:00
2026-10-29 13:01:37 +08:00
2026-10-29 18:16:21 +08:00
2026-10-29 18:16:21 +08:00
2026-10-30 16:14:54 +08:00
2026-10-30 17:20:40 +08:00
2026-10-31 02:15:15 +08:00
2026-10-31 02:15:15 +08:00
2026-11-02 18:09:26 +08:00
2026-11-02 18:09:26 +08:00
2026-11-03 10:14:08 +08:00
2026-11-03 10:14:08 +08:00