## Why 后端在 target 规模增长(预计到 100)和 checker 类型扩展(预计超过 5 种)的趋势下,存在查询性能瓶颈、可观测性盲区、启动逻辑重复、路径解析 bug 和类型安全不足等问题。本次变更集中修复这些架构短板,为后续扩展打好基础。 ## What Changes - **targets 路由 N+1 查询优化**:`handleTargets` 中对每个 target 单独调用 `getRecentSamples` 改为批量查询,消除 N 次独立 SQL - **Engine rejected 结果持久化**:`probeGroup` 中 `Promise.allSettled` 的 rejected 结果写入 `matched: false` 的 check_result(failure 标记为 internal error),替代仅 `console.warn` - **启动逻辑统一**:抽取 `bootstrap.ts`,`dev.ts` 和 build 生成的 entry 共用同一启动序列,消除重复 - **dataDir 相对路径修复**:`config-loader.ts` 中用 `resolve(configDir, dataDir)` 处理相对路径,确保从任意 cwd 启动时数据库位置一致 - **validatePagination 加 pageSize 上限**:限制最大 pageSize 为 200,超出返回 400 - **CheckerDefinition 泛型化**:为 `CheckerDefinition` 加泛型参数 ``,checker 内部获得完整类型安全,registry 用类型擦除保持解耦 - **availability 精度统一**:`getAllTargetStats` 和 `getTargetStats` 的 availability 计算精度不一致,统一为相同的四舍五入策略 ## Capabilities ### New Capabilities - `server-bootstrap`: 统一的服务启动引导流程,dev 和 production 共用 ### Modified Capabilities - `batch-data-queries`: 新增 `getAllRecentSamples` 批量采样查询,消除 targets 路由的 N+1 问题;修复 availability 精度不一致 - `probe-engine`: Engine 对 rejected 结果写入 matched:false 记录而非静默丢弃 - `probe-config`: dataDir 相对路径基于 configDir 解析 - `probe-api`: validatePagination 增加 pageSize 上限校验 - `checker-runner-abstraction`: CheckerDefinition 接口泛型化,checker 内部类型安全 ## Impact - **代码**:`src/server/` 下约 8 个文件变更,新增 `bootstrap.ts` 和 `store.ts` 的批量查询方法;另修复 `src/web/components/ErrorBoundary.tsx` 的 `override` 标记(typecheck 前置修复) - **API**:pageSize 超过 200 时返回 400(新增约束,当前前端未使用超大 pageSize) - **构建**:`scripts/build.ts` 生成的 entry 改为调用 bootstrap - **测试**:需新增/更新 engine、store、middleware、bootstrap 相关测试