2026-05-22 15:54:10 +08:00
# Batch Auto-Import V2 设计还原审计清单
日期: 2026-05-22
2026-05-22 16:21:24 +08:00
状态:已审计,已恢复
2026-05-22 15:54:10 +08:00
基线计划:`docs/plans/2026-05-22-batch-auto-import-v2-implementation-plan.md`
## 1. Objective 恢复项
- [x] 上游发现:`internal/probe/models.go` + `tests/integration/batch_import_v2_test.go`
- [x] 模型纠错:`internal/probe/aliases.go` + `internal/batch/status_projection.go`
- [x] 兼容画像:`internal/probe/capability.go` + `internal/batch/status_projection.go`
2026-05-22 16:21:24 +08:00
- [x] 宿主演化: V2 pipeline 已从 API/CLI 入口接到真实 provision adapter
- [x] 异步确认:`ConfirmationWorker` 已由 API/CLI create-run 路径自动驱动
- [x] 闭环验证:`ValidationService` 已由 API/CLI create-run 路径自动驱动
2026-05-22 15:54:10 +08:00
- [x] 结果可视:`/api/batch-import/runs*` 与 `ResultProjection` 已接到 V2 状态表
- [x] 重复导入复用:`internal/batch/reuse_policy.go` + `tests/integration/batch_import_v2_test.go`
## 2. Canonical Contract 恢复项
- [x] `run_id / item_id / provider_id`
- [x] `run.state`
- [x] `item.current_stage`
- [x] `item.confirmation_status`
- [x] `item.access_status`
- [x] `matched_account_state / account_resolution`
- [x] `canonical_model_families`
- [x] `provision_reused / reused_from_*`
## 3. Runtime / API / Migration 恢复项
- [x] 单一状态源为 `import_runs / import_run_items / import_run_item_events`
- [x] migration 已落地并受集成测试保护
2026-05-23 09:18:02 +08:00
- [x] run 级请求上下文(`host_id / subscription_users / subscription_days / probe_api_key` )已持久化,支持重启后恢复 validate
2026-05-22 15:54:10 +08:00
- [x] `/api/batch-import/runs*` 已接到 V2 projection
2026-05-22 16:21:24 +08:00
- [x] CLI `batch-import` 已通过 `ActionSet.CreateBatchImportRun` 进入真实 pipeline
2026-05-22 15:54:10 +08:00
- [x] 结果页/结果 API 不回退 legacy 表结构
## 4. Worker / Retry / Lease 恢复项
- [x] `ConfirmationWorker` 扫描 confirm item
- [x] lease 生效,避免并发重复确认
- [x] `next_retry_at` / `retry_count` 持久化
- [x] advisory / retry / stage transition 写入 event trail
## 5. Reuse / Reactivation 恢复项
- [x] active duplicate -> `reused`
- [x] deprecated/disabled duplicate -> `reactivated`
- [x] broken duplicate -> `replaced`
- [x] same family different alias -> `patch_only`
## 6. 审计证据
### 代码文件映射
- Probe / alias / capability: `internal/probe/models.go` 、`internal/probe/aliases.go` 、`internal/probe/capability.go` 、`internal/probe/completion.go`
- Reuse / orchestration / worker / validation: `internal/batch/provider_id.go` 、`internal/batch/reuse_policy.go` 、`internal/batch/service.go` 、`internal/batch/confirmation.go` 、`internal/batch/validation.go`
2026-05-23 09:18:02 +08:00
- 状态库存储:`internal/store/sqlite/import_runs_repo.go` 、`internal/store/sqlite/import_run_items_repo.go` 、`internal/store/sqlite/import_run_item_events_repo.go` 、`internal/store/migrations/0009_batch_import_run_request_context.sql`
- Projection / API / CLI: `internal/batch/status_projection.go` 、`internal/app/http_batch_import.go` 、`internal/app/batch_runtime.go` 、`internal/app/batch_runtime_background.go` 、`internal/app/http_batch_runs.go` 、`cmd/cli/batch_import.go`
2026-05-22 15:54:10 +08:00
### 测试文件映射
- 单测:`internal/batch/types_test.go` 、`internal/probe/models_test.go` 、`internal/probe/aliases_test.go` 、`internal/probe/capability_test.go` 、`internal/probe/completion_test.go`
- 状态机:`internal/batch/provider_id_test.go` 、`internal/batch/reuse_policy_test.go` 、`internal/batch/service_test.go` 、`internal/batch/confirmation_test.go` 、`internal/batch/validation_test.go` 、`internal/batch/status_projection_test.go`
2026-05-23 09:18:02 +08:00
- API / CLI: `internal/app/http_batch_import_test.go` 、`internal/app/http_batch_runs_test.go` 、`internal/app/batch_runtime_background_test.go` 、`cmd/cli/batch_import_test.go`
2026-05-22 15:54:10 +08:00
- 集成:`tests/integration/batch_import_v2_test.go`
### API 路由映射
- `POST /api/batch-import/runs`
- `GET /api/batch-import/runs`
- `GET /api/batch-import/runs/{run_id}`
- `GET /api/batch-import/runs/{run_id}/items`
- `GET /api/batch-import/runs/{run_id}/items/{item_id}`
### 验证命令结果
- `go test ./... -count=1` : PASS
- `go test ./tests/integration/... -count=1` : PASS
- `go test -cover ./internal/... -count=1` : PASS
- `internal/access` 76.7%
2026-05-23 09:18:02 +08:00
- `internal/batch` 72.9%
2026-05-22 16:21:24 +08:00
- `internal/probe` 78.2%
2026-05-22 15:54:10 +08:00
- `internal/provision` 76.4%
- `internal/pack` 73.9%
- `go vet ./...` : PASS
- `gofmt -l .` : PASS( 空输出)
2026-05-22 16:21:24 +08:00
### 已修复缺口
2026-05-22 15:54:10 +08:00
2026-05-22 16:21:24 +08:00
- `internal/app/http_batch_import.go` 的 `buildCreateBatchImportRunAction` 已改为先解析已注册 host, 再委托 `batchImportRuntimeRunner.execute`
- `internal/app/batch_runtime.go` 已把 `BatchImportService + ConfirmationWorker + ValidationService` 串成 create-run 的同步入口驱动链
2026-05-23 09:18:02 +08:00
- `internal/app/batch_runtime_background.go` 已补后台 runtime scheduler; `running` run 在控制面重启后会继续被拾取并推进
- `internal/store/sqlite/import_run_items_repo.go` 已补原子 lease 获取;不会再在 lease 落库前并发双发 confirmer
- `internal/app/http_batch_import.go` / `internal/app/http_batch_runs.go` 已补 `cursor/next_cursor` ,且 run 列表 `q` 可命中 `run_id / provider_id / base_url`
2026-05-22 16:21:24 +08:00
- `cmd/cli/batch_import.go` 继续复用 `ActionSet.CreateBatchImportRun` ,因此 CLI create-run 也随入口修复自动进入真实 pipeline
- `internal/app/http_batch_import_test.go` 已新增真实 stub 回归,直接验证 create-run 最终把 item 推进到 `current_stage=done` 且 `access_status=active`
2026-05-22 15:54:10 +08:00
### 审计结论
- T1-T12 的单测、集成测试、OpenAPI 路由和状态投影均已落地
2026-05-22 16:21:24 +08:00
- T13 审计中识别出的 **入口 wiring 缺失 ** 已修复,并已通过最新一轮全量验证命令确认
- 当前 **可以 ** 宣称“V2 设计已按基线计划恢复实现”