diff --git a/docs/EXECUTION_BOARD.md b/docs/EXECUTION_BOARD.md index fd2b00b0..0450fc73 100644 --- a/docs/EXECUTION_BOARD.md +++ b/docs/EXECUTION_BOARD.md @@ -500,6 +500,69 @@ - 管理员已经能通过统一页面查看帐号资产、筛选 `shadow_group`、执行人工启停 - `route / logical_group` 归属在唯一 shadow binding 下会自动补齐;在歧义 shadow binding 下会显式显示未归属 - `P3-T3` 可以继续做“帐号资产与 route 的显式整理动作”或更完整的运营看板 + - 2026-05-29 已完成 Phase 3 / `P3-T3 帐号归属显式整理` + - 提交:`649eb13f feat(accounts): add explicit route binding workflow` + - 新增后端能力: + - `GET /api/provider-accounts/{account_id}/binding-candidates` + - `POST /api/provider-accounts/{account_id}/binding` + - `GET /api/provider-accounts?binding_state=assigned|unassigned|conflict` + - 当前绑定语义已收口: + - `assigned` + - `provider_accounts.route_id` 已明确绑定到一条 route + - `unassigned` + - 当前没有 route 归属,且同一 `shadow_host_id + shadow_group_id` 下候选 route 不超过 1 条 + - `conflict` + - 当前没有 route 归属,且同一 `shadow_host_id + shadow_group_id` 下候选 route 超过 1 条 + - 新增页面动作: + - `deploy/tksea-portal/admin/accounts.html` + - 新增 `binding_state` 过滤 + - 新增“显式整理归属”区块 + - 可查看 route 候选 + - 可手动绑定到一条 route + - 可清空 route 归属,回到未归属 / 冲突状态 + - 本地门禁已通过: + - `gofmt -l .` + - `go vet ./...` + - `go test -cover ./internal/...` + - `go test ./tests/integration/... -count=1` + - `bash ./scripts/test/test_tksea_portal_assets.sh` + - `bash ./scripts/test/test_real_host_scripts.sh` + - remote43 已原位升级到: + - `repo HEAD = 649eb13f` + - CRM 活跃监听 PID:`2709328` + - `http://127.0.0.1:18173/healthz` 返回 `ok` + - portal 已重新发布,`https://sub.tksea.top/portal/admin/accounts.html` 返回包含: + - `Provider Accounts Admin` + - `显式整理归属` + - remote43 真实验证已通过: + - 现网样本: + - `account_id=1` + - `shadow_group_id=9` + - `shadow_host_id=proxy-real-host-1780026133` + - 为验证冲突整理动作,临时创建: + - `logical_group_id=p3t3-bind-1780054239` + - `route_a=primary-1780054239` + - `route_b=fallback-1780054239` + - 两条 route 都复用同一 `shadow_host_id + shadow_group_id` + - 回读结果: + - `GET /api/provider-accounts?binding_state=conflict&shadow_group_id=9` + - `conflict_count=1` + - `GET /api/provider-accounts/1/binding-candidates` + - `candidate_route_count=2` + - `POST /api/provider-accounts/1/binding` + - `route_id=primary-1780054239` + - `binding_state=assigned` + - `GET /api/provider-accounts?route_id=primary-1780054239` + - `assigned_count=1` + - `POST /api/provider-accounts/1/binding` with `{"clear":true}` + - 返回 `binding_state=conflict` + - 再次 `GET /api/provider-accounts?binding_state=conflict&shadow_group_id=9` + - `after_clear_conflict_count=1` + - 验证结束后已删除临时 `logical_group / routes`,避免 remote43 再次积累测试噪音 + - 当前结论: + - 帐号资产已不再只是“看见未归属”,而是可以直接在插件侧完成 route 归属整理 + - `shadow binding` 歧义场景已经从“只能读”升级为“可读 + 可人工收口” + - `P3` 已具备进入下一步“更完整的运营看板”或直接切到 `P4` 的条件 - 2026-05-28 已完成 Phase 1 / `P1-T1 SQLite schema foundation` - 提交:`7f75d8a6 feat(routing): add logical group schema foundation` - 新 migration:`internal/store/migrations/0010_logical_groups_and_routes.sql`