diff --git a/.claude/docs/ai/async-tasks/api-handoff.md b/.claude/docs/ai/async-tasks/api-handoff.md index 31d2bbc..917da73 100644 --- a/.claude/docs/ai/async-tasks/api-handoff.md +++ b/.claude/docs/ai/async-tasks/api-handoff.md @@ -19,7 +19,7 @@ | GET /api/v1/tasks | 当前身份可见任务列表 | 支持 domain_id 和 limit;返回 200 与 items 数组 | | GET /api/v1/tasks/:id | 单个任务最新状态 | 返回 200 与任务对象本身,不包 task 字段 | | GET /api/v1/tasks/:id/attempts | 任务尝试历史 | 返回 200 与 items 数组 | -| GET /api/v1/tasks/:id/deployment-results | 逐尝试的逐服务器部署结果 | 返回 200 与 items 数组;前端按最近 attempt_number 筛选 | +| GET /api/v1/tasks/:id/deployment-results | 逐尝试的逐服务器结果与完整报告 | 返回 200、items 和 reports 数组;按任务、最近尝试编号及尝试 ID 精确匹配 | 列表 limit 默认 50,有效范围为 1~200,越界由仓储回退至 50。不存在和无权访问的任务都返回 403,不能根据接口泄露其他项目资源是否存在。 @@ -63,6 +63,7 @@ | Task | id、domain_id、task_type、status、stage、message、scope_type、project_id、created_at、updated_at;可选 operator_id、certificate_version_id、idempotency_key、started_at、finished_at | | TaskAttempt | id、task_id、attempt_number、stage、status、message、scope_type、project_id、created_at;可选 started_at、finished_at | | TaskDeploymentResult | task_id、attempt_id、attempt_number、result_index、server_id、server、status、message、created_at;可选 backup_id | +| TaskDeploymentReport | task_id、attempt_id、attempt_number、report、created_at;report 保留汇总、逐目标结果、verification_status 与 recovery_status | 编号和时间为字符串,时间使用带时区的 RFC3339 表示;attempt_number 与 result_index 为整数。Task 与 TaskAttempt 的状态含义如下: @@ -79,12 +80,42 @@ 未知状态不得默认视为成功。逐服务器结果不包含完整的站点验证及恢复报告,不能据此推导 HTTPS 校验成功。 +### 完整报告读取 + +deployment-results 响应保留旧 items,新增 reports;每次尝试独立保存,重试不覆盖历史。report.results 即使零目标也返回数组。示例省略逐目标明细: + +```json +{ + "items": [], + "reports": [{ + "task_id": "task-example", + "attempt_id": "attempt-example", + "attempt_number": 1, + "created_at": "2026-10-02T09:00:00Z", + "report": { + "total": 0, + "success": 0, + "failed": 0, + "status": "failed", + "verification_status": "failed", + "recovery_status": "success", + "results": [] + } + }] +} +``` + +- 完整报告写入和读取均按公开诊断规则处理;逐目标 failure_code 保留,原始远端错误不公开。 +- 前端只在任务终态与最近尝试一致后展示报告,以任务终态覆盖报告展示状态,不能由外部操作成功推断收尾成功。 +- 旧服务未提供 reports 或旧历史无完整报告时兼容逐目标汇总,但不补造验证/恢复状态。reports 存在而不是数组时视为读取异常。 +- 报告读取在仓储查询中实时检查任务项目权限;只读成员可读,撤权后不得凭旧会话读取。 + ## 执行及前端交互边界 - 当前后台最多接收 32 个在途任务,4 个执行槽,总执行预算 30 分钟;这些是实现限制,不是保证耗时。 - 队列满或关闭时拒绝执行,并尝试保存失败终态;持久化失败保留中断状态,不伪造已完成。 - 服务关闭停止接收、发送取消信号并等待工作线程收尾。启动恢复将中断记录标为失败,不自动重放外部签发、部署。 -- 任务和本次尝试的终态通过同一数据库事务保存;逐目标结果和完成审计目前仍为独立写入,不能描述成所有记录完全原子化。 +- HTTP 异步收尾路径将任务、本次尝试、完整报告、逐目标结果及完成审计放入同一事务;任一写入失败整体回滚并保留中断状态,不伪造终态。其他后台工作流仍需独立核查,不能据此声明全项目所有写入原子化。 - 前端每三秒查询一次,单次周期十秒超时且不重叠;卸载后停止轮询、取消请求。 - 切换任务时丢弃旧选择的迟到响应;撤权清除详情及部署结果。一般查询故障保留最后有效状态并提示未知,不改变任务终态。 - 三个详情 GET 不是一次原子快照;任务终态与最大 attempt_number 的状态不一致时暂不合并,下一周期重新查询。 @@ -95,7 +126,7 @@ 已加入自动用例:断线后继续执行、排队取消、取消收尾禁止重试、队列满、异常脱敏、读取和保存失败、跨任务尝试拒绝、终态事务回滚、已完成与部分成功不被取消意图覆盖、前端迟到响应和网络恢复。 - [~] 当前 Linux 自动回归持续执行;竞争检测尚无可靠通过结果。 -- [ ] 完整验证及恢复报告持久化与页面展示仍需补齐。 -- [ ] 完成审计、逐服务器结果与任务终态之间的跨记录一致性继续复核。 +- [x] 完整验证及恢复报告持久化与页面读取已实现,关联回归和前端 256 项通过;未部署。 +- [x] HTTP 异步完成审计、逐服务器结果与任务终态同事务,已覆盖三类保存失败整体回滚;其他工作流及三库实机复审仍待完成。 - [ ] 导入、版本恢复、校验及手动续期等其他长操作尚未全部异步化。 - [ ] 正式构建部署后验证超过反代等待窗口的真实操作、断线查询、取消回滚和服务重启;本说明不替代生产验收。 diff --git a/doc/Linux生产流程测试记录.md b/doc/Linux生产流程测试记录.md index dd5516a..59f9d24 100644 --- a/doc/Linux生产流程测试记录.md +++ b/doc/Linux生产流程测试记录.md @@ -1,5 +1,16 @@ # Linux 生产流程测试记录 +## 2026年10月2日17:56 完整报告与审计事务回归(未部署) + +- [x] 源码 4e8d509 已推送;第二台隔离目录 /var/tmp/scert-async-20261002-1556/source 执行,不修改正式安装目录或线上数据库。 +- [x] 最新输入 async-report-20261002-1743.tar 在两端核对 SHA256 为 0b3ec412aa6d8d0c93e03d4c01b067ebe8e6047ecfc03eea4a0cdf4a9a2158d8;第一次等待密码的 SCP 已断开,确认终止后重新上传,重传退出 0。 +- [!] report-first.log:第一轮失败,仓储测试错误绕过正式重试入口,SQLite 取消测试在单执行线程下没有覆盖取消;已改用正式重试入口和显式让出调度,未放宽终态或取消覆盖断言。 +- [!] report-second.log:仓储和数据库通过,HTTP 三项失败;修复重复完成审计及 failed 到 error 的既有审计状态契约,更新启动审计失败时真实失败审计的断言。 +- [x] report-third.log:仓储 9.488 秒、HTTP 30.477 秒、数据库 31.531 秒,REPORT_THIRD_EXIT=0。覆盖完整报告重读、重试隔离、权限撤销、脱敏及报告/逐目标/审计故障整体回滚;使用隔离 SQLite,不当作 MySQL 或 PostgreSQL 实库通过。 +- [x] 本机 .runtime/async-report-third-frontend-20261002.log:256 项通过,零失败、零跳过;.runtime/async-report-third-build-20261002.log:生产构建通过,退出码均为 0。 +- [x] report-full.log 与 report-vet.log:全后端测试与静态检查通过,REPORT_FULL_EXIT=0、REPORT_VET_EXIT=0;使用 nobody、GOMAXPROCS=1、GOMEMLIMIT=384MiB、-p 1。未启用外部数据库的测试不计实库通过。 +- [!] 本批无正式部署、无首次 Web 验收、无竞争检测通过结论。第一台旧竞争检测已中断退出 130,不重启无限制负载;不新增公网端口、不放宽 TLS 或 SSH 主机校验。 + ## 2026年10月2日17:11 任务收尾事务与服务配置回归(未部署) - [x] 第二台隔离源码首次关联回归:internal/httpapi、internal/repository、internal/servicehost、internal/app 全部通过,COMPLETION_FIRST_EXIT=0;日志为 /var/tmp/scert-async-20261002-1556/completion-first.log。 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index f8bde07..8a534a5 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1,5 +1,19 @@ # Scert 整改任务执行清单 +## 2026年10月2日17:56 当前执行入口 + +本节为当前状态,下方时间段保留历史过程。需求沿用已确认的 Linux 全清单:先完成开发和自动回归,再统一正式部署;不清线上数据库,不以测试脚本替代产品验收。 + +- [x] 完整报告与完成审计原子化已保存并推送为 4e8d509;任务、尝试、完整报告、逐目标结果和完成审计在 HTTP 异步收尾路径共用事务,任何一项失败全部回滚。 +- [x] 第二台隔离源码第三轮仓储、HTTP、数据库关联回归全部通过,REPORT_THIRD_EXIT=0。前两轮失败日志保留;不将修复前失败抹去。 +- [x] 最新前端 256 项全部通过,零失败、零跳过;生产构建通过。覆盖页面刷新读取完整验证与恢复报告、重试报告隔离及旧响应兼容。 +- [x] 最新全后端测试与 go vet 在第二台串行、低资源运行通过,REPORT_FULL_EXIT=0、REPORT_VET_EXIT=0;未部署本批代码。 +- [~] 核查自动续期、导入、恢复等其他工作流:已发现取消错误优先于部分成功和恢复未确认,可能掩盖真实结果;下一步新增负向回归并修复。当前原子化不能扩大为全项目所有工作流已经统一。 +- [ ] 补齐新报告迁移的实库恢复、结构冲突及旧数据保持回归;三库迁移文件齐全不代表三库生产验收完成。 +- [!] 竞争检测、其他长操作异步化、关停与重启 502、历史恢复证据、系统通知重置、三库首次 Web、备份恢复及最终验收仍未关闭。 + +校正:17:30 的“完成审计尚未与上述事务统一”属于当时状态,现已实现且关联回归通过;17:11 的推送超时和竞争测试运行态也不是当前状态,推送已成功,先前竞争检测中断退出 130。 + ## 2026年10月2日17:30 完整异步报告整改入口 需求已沿用既定清单确认:异步执行后必须保留完整部署、站点验证与恢复报告;不能仅由逐目标成功推断整个任务成功。本轮仍只处理 Linux 开发与自动回归,不清线上数据,不部署。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 566f49d..71e70b9 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1,5 +1,13 @@ # Scert 整改、合并与优化清单 +## 2026年10月2日17:56 最新开发进度入口 + +- [x] P0-10/P1-04 子项:HTTP 异步任务完整报告已持久化,终态、尝试、逐服务器结果与完成审计共用事务;前端按最新尝试读取验证和恢复状态,旧记录不伪造结论。源码 4e8d509 已推送。 +- [x] 最新仓储、HTTP、数据库关联回归通过;前端 256 项通过、生产构建通过。第一、第二轮失败与修复经过保留在 Linux 测试记录中。 +- [x] 完整报告批次的全后端回归及静态检查已通过,REPORT_FULL_EXIT=0、REPORT_VET_EXIT=0;自动续期等其他工作流仍需单独核查,不把 HTTP 路径原子化扩大为全项目完成。 +- [ ] 新迁移实库恢复、其他长操作、关停 502、系统通知重置、三数据库首次 Web、备份恢复及统一生产复审继续执行。 +- [!] 本批未部署、未清库;竞争检测无通过证据,原 P0/P1/P2/P3 清单不缩减,Windows 按要求不在本轮处理。下方带时间的旧状态仅作历史证据,不据此重复报告旧阻塞。 + ## 2026年10月2日17:11 最新开发进度入口 - [x] P0-10 新增任务与尝试的原子终态保存,避免部分写入造成长期状态冲突;补齐取消到达较晚、部分成功、回滚未确认和收尾持久化失败的处理与测试。