diff --git a/.gitignore b/.gitignore index 3ff997d2..a1d9e70f 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,8 @@ OPS_REDIS_MYSQL_OPTIMIZATION_NOTES.md # ===== 本地规划文档(不入库)===== docs/plans/ docs/*plan*.md + +# ===== 进度/规划工具(本地使用,不入库)===== +check_progress.py +progress.json +progress_*.json diff --git a/check_progress.py b/check_progress.py deleted file mode 100644 index ff766da6..00000000 --- a/check_progress.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -"""检查 crawler-plugin 的 Plan 任务是否全部完成。""" -from __future__ import annotations - -import json -import sys -from pathlib import Path - - -ROOT = Path(__file__).resolve().parent -PROGRESS_PATH = ROOT / "progress.json" - - -def main() -> int: - if not PROGRESS_PATH.is_file(): - print("progress.json not found", file=sys.stderr) - return 2 - - try: - data = json.loads(PROGRESS_PATH.read_text(encoding="utf-8")) - except Exception as exc: - print(f"invalid progress.json: {exc}", file=sys.stderr) - return 2 - - total = data.get("total_tasks") - tasks = data.get("tasks") - if not isinstance(total, int) or total <= 0 or not isinstance(tasks, list): - print("invalid progress shape", file=sys.stderr) - return 2 - if len(tasks) != total: - print(f"task count mismatch: total_tasks={total}, tasks={len(tasks)}", file=sys.stderr) - return 2 - - ids = [task.get("id") for task in tasks if isinstance(task, dict)] - if ids != list(range(1, total + 1)): - print("task ids are not contiguous from 1", file=sys.stderr) - return 2 - - pending = [task for task in tasks if task.get("status") != "done"] - completed = total - len(pending) - if pending: - print(f"{len(pending)} tasks remaining out of {total}") - for task in pending[:20]: - print(f" task {task.get('id')}: {task.get('status')}") - if len(pending) > 20: - print(f" ... and {len(pending) - 20} more") - print("all tasks done: false") - return 1 - - print("all tasks done") - print(f"total: {total}, completed: {completed}, rounds: {data.get('rounds', 0)}") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/progress.json b/progress.json deleted file mode 100644 index a342a36d..00000000 --- a/progress.json +++ /dev/null @@ -1,867 +0,0 @@ -{ - "version": 1, - "total_tasks": 100, - "completed": 100, - "rounds": 83, - "started_at": "2026-08-29T14:10:48+08:00", - "updated_at": "2026-08-31 00:33:00+08:00", - "tasks": [ - { - "id": 1, - "title": "建立 Similar ASIN 性能基线夹具:1000/5000 行、图片开关、chunk 数与 payload 大小采样", - "module": "similarasin", - "dependency": "无", - "status": "done" - }, - { - "id": 2, - "title": "将解析载荷改为单一规范行集合,消除 items/groups/allItems 重复数据结构", - "module": "similarasin", - "dependency": "1", - "status": "done" - }, - { - "id": 3, - "title": "保留旧 payload 读取兼容逻辑,并验证新旧结构均可恢复全量行", - "module": "similarasin", - "dependency": "2", - "status": "done" - }, - { - "id": 4, - "title": "解析接口改为只返回固定数量预览行,完整行仅保存在后端任务载荷", - "module": "similarasin", - "dependency": "3", - "status": "done" - }, - { - "id": 5, - "title": "为预览行数量增加配置边界、空文件和超限输入校验", - "module": "similarasin", - "dependency": "4", - "status": "done" - }, - { - "id": 6, - "title": "将分组数据改为索引/范围引用,避免 groups 嵌套复制完整行对象", - "module": "similarasin", - "dependency": "5", - "status": "done" - }, - { - "id": 7, - "title": "限制单文件大小、最大行数和最大字段长度,防止解析任务无界增长", - "module": "similarasin", - "dependency": "6", - "status": "done" - }, - { - "id": 8, - "title": "将 WorkbookFactory 输入解析改为受控读取,并验证超大 Excel 的失败提示", - "module": "similarasin", - "dependency": "7", - "status": "done" - }, - { - "id": 9, - "title": "将 chunk 查询从单行分页改为批量 keyset 分页,保持低内存读取", - "module": "similarasin", - "dependency": "8", - "status": "done" - }, - { - "id": 10, - "title": "为 chunk 结果建立按 row key 的批量索引,消除跨 chunk 线性扫描", - "module": "similarasin", - "dependency": "9", - "status": "done" - }, - { - "id": 11, - "title": "将 Coze 结果合并的重复检测从 O(n²) 改为 HashSet/稳定 row key", - "module": "similarasin", - "dependency": "10", - "status": "done" - }, - { - "id": 12, - "title": "扩展 Coze 结果缓冲覆盖范围,减少频繁读写完整 chunk payload", - "module": "similarasin", - "dependency": "11", - "status": "done" - }, - { - "id": 13, - "title": "为 chunk 合并增加单次最大行数与 payload 字节上限", - "module": "similarasin", - "dependency": "12", - "status": "done" - }, - { - "id": 14, - "title": "图片 DB cache 改为批量读取缩略图,并只更新实际命中的 last_used_at", - "module": "similarasin", - "dependency": "13", - "status": "done" - }, - { - "id": 15, - "title": "将图片缓存访问时间更新改为异步批量刷新,减少逐图 UPDATE", - "module": "similarasin", - "dependency": "14", - "status": "done" - }, - { - "id": 16, - "title": "图片预取改为短预算 best-effort,超时后直接回退 URL", - "module": "similarasin", - "dependency": "15", - "status": "done" - }, - { - "id": 17, - "title": "优化图片解码采样、像素上限和 JPEG 质量搜索,降低 CPU 与堆峰值", - "module": "similarasin", - "dependency": "16", - "status": "done" - }, - { - "id": 18, - "title": "统一图片 spool 生命周期,确保超时、取消和异常路径删除临时文件", - "module": "similarasin", - "dependency": "17", - "status": "done" - }, - { - "id": 19, - "title": "将 Coze 请求/响应及 Python 回传日志改为采样、截断和 DEBUG 级别", - "module": "similarasin", - "dependency": "18", - "status": "done" - }, - { - "id": 20, - "title": "完成 Similar ASIN 端到端压测、JFR/GC 分析与结果文件兼容回归", - "module": "similarasin", - "dependency": "19", - "status": "done" - }, - { - "id": 21, - "title": "建立店铺抓取性能基线:单店铺 1k/5k 行、多国家、图片成功/失败场景", - "module": "shopdatacrawl", - "dependency": "无", - "status": "done" - }, - { - "id": 22, - "title": "将店铺 Excel 图片缓存替换为有界字节缓存", - "module": "shopdatacrawl", - "dependency": "21", - "status": "done" - }, - { - "id": 23, - "title": "图片嵌入成功后立即释放外部缩略图字节副本", - "module": "shopdatacrawl", - "dependency": "22", - "status": "done" - }, - { - "id": 24, - "title": "为店铺图片预取增加任务级数量、字节和超时上限", - "module": "shopdatacrawl", - "dependency": "23", - "status": "done" - }, - { - "id": 25, - "title": "评估并实现店铺结果 workbook 的 SXSSF 或 spool 化写入路径", - "module": "shopdatacrawl", - "dependency": "24", - "status": "done" - }, - { - "id": 26, - "title": "为模板 workbook 增加大行数下的样式、图片和工作表兼容测试", - "module": "shopdatacrawl", - "dependency": "25", - "status": "done" - }, - { - "id": 27, - "title": "将 chunk 接收改为原子插入/幂等 upsert,减少先查后插", - "module": "shopdatacrawl", - "dependency": "26", - "status": "done" - }, - { - "id": 28, - "title": "以 scope 计数器替代每个 chunk 的 COUNT(*) 完整统计", - "module": "shopdatacrawl", - "dependency": "27", - "status": "done" - }, - { - "id": 29, - "title": "合并 scope 状态查询与更新,减少单 chunk 数据库往返", - "module": "shopdatacrawl", - "dependency": "28", - "status": "done" - }, - { - "id": 30, - "title": "为国家结果行建立稳定去重键,替换线性重复扫描", - "module": "shopdatacrawl", - "dependency": "29", - "status": "done" - }, - { - "id": 31, - "title": "将任务快照改为轻量进度字段,避免每次写入完整结果 JSON", - "module": "shopdatacrawl", - "dependency": "30", - "status": "done" - }, - { - "id": 32, - "title": "将 task entity 本地缓存替换为有容量和过期回收的实现", - "module": "shopdatacrawl", - "dependency": "31", - "status": "done" - }, - { - "id": 33, - "title": "将店铺源文件 key 映射改为确定路径,取消临时目录递归扫描", - "module": "shopdatacrawl", - "dependency": "32", - "status": "done" - }, - { - "id": 34, - "title": "将 ownerInstanceId 从 JSON 查询迁移到显式列并补充索引", - "module": "shopdatacrawl", - "dependency": "33", - "status": "done" - }, - { - "id": 35, - "title": "将每日累计文件改为数据层增量模型,避免每次下载并重写完整 XLSX", - "module": "shopdatacrawl", - "dependency": "34", - "status": "done" - }, - { - "id": 36, - "title": "为每日累计文件引入版本号/CAS,缩短店铺级锁的持有时间", - "module": "shopdatacrawl", - "dependency": "35", - "status": "done" - }, - { - "id": 37, - "title": "拆分每日累计文件组装与任务结果接收,增加异步文件作业状态", - "module": "shopdatacrawl", - "dependency": "36", - "status": "done" - }, - { - "id": 38, - "title": "历史列表与进度查询增加分页、字段裁剪和批量任务加载", - "module": "shopdatacrawl", - "dependency": "37", - "status": "done" - }, - { - "id": 39, - "title": "补充删除、超时、重复回传和累计文件失败的资源清理测试", - "module": "shopdatacrawl", - "dependency": "38", - "status": "done" - }, - { - "id": 40, - "title": "完成店铺抓取压测并比较内存、CPU、DB QPS、对象存储流量和锁等待", - "module": "shopdatacrawl", - "dependency": "39", - "status": "done" - }, - { - "id": 41, - "title": "建立 Collect Data 1k/10k 行、多个 chunk 和品牌检测场景基线", - "module": "collectdata", - "dependency": "无", - "status": "done" - }, - { - "id": 42, - "title": "限制采集解析的文件大小、最大行数和单 chunk 行数", - "module": "collectdata", - "dependency": "41", - "status": "done" - }, - { - "id": 43, - "title": "将采集源文件查找改为确定路径/索引查询", - "module": "collectdata", - "dependency": "42", - "status": "done" - }, - { - "id": 44, - "title": "保留原始 chunk payload 的同时,减少逐行 extra JSON 的重复序列化", - "module": "collectdata", - "dependency": "43", - "status": "done", - "updated_at": "2026-08-30T13:20:04" - }, - { - "id": 45, - "title": "将 ASIN 去重查询与无效品牌查询统一为批量集合查询", - "module": "collectdata", - "dependency": "44", - "status": "done", - "updated_at": "2026-08-30T13:31:58" - }, - { - "id": 46, - "title": "跳过空品牌批次的无效远程品牌检查请求", - "module": "collectdata", - "dependency": "45", - "status": "done", - "updated_at": "2026-08-30T13:40:09" - }, - { - "id": 47, - "title": "为品牌检查结果增加任务内短期缓存,避免同品牌重复远程调用", - "module": "collectdata", - "dependency": "46", - "status": "done", - "updated_at": "2026-08-30T13:53:59" - }, - { - "id": 48, - "title": "将 invalid ASIN 记录改为批量 INSERT IGNORE/upsert", - "module": "collectdata", - "dependency": "47", - "status": "done", - "updated_at": "2026-08-30T14:15:36" - }, - { - "id": 49, - "title": "将结果明细从逐行 RustFS 对象改为 chunk 级 payload 存储", - "module": "collectdata", - "dependency": "48", - "status": "done", - "updated_at": "2026-08-30T14:31:08" - }, - { - "id": 50, - "title": "为结果明细设计批量 upsert mapper 与幂等唯一键", - "module": "collectdata", - "dependency": "49", - "status": "done", - "completed": 50, - "rounds": 50, - "updated_at": "2026-08-30T15:35:00+08:00" - }, - { - "id": 51, - "title": "将 accepted 行的序列化和 hash 计算改为批量处理", - "module": "collectdata", - "dependency": "50", - "status": "done", - "completed": 51, - "rounds": 51, - "updated_at": "2026-08-30T15:40:00+08:00" - }, - { - "id": 52, - "title": "生成结果文件时按 chunk 一次读取,取消逐行对象读取", - "module": "collectdata", - "dependency": "51", - "status": "done", - "completed": 52, - "rounds": 52, - "updated_at": "2026-08-30T16:00:00+08:00" - }, - { - "id": 53, - "title": "将 rawRows 与 finalRows 的内存生命周期分段,避免同时长期驻留", - "module": "collectdata", - "dependency": "52", - "status": "done", - "completed": 53, - "rounds": 53, - "updated_at": "2026-08-30T16:35:00+08:00" - }, - { - "id": 54, - "title": "将 finalRowCount 从每个 chunk COUNT(*) 改为任务内增量计数", - "module": "collectdata", - "dependency": "53", - "status": "done", - "completed": 54, - "rounds": 54, - "updated_at": "2026-08-30T17:05:00+08:00" - }, - { - "id": 55, - "title": "将进度统计更新改为节流/合并写,减少高频 task UPDATE", - "module": "collectdata", - "dependency": "54", - "status": "done", - "completed": 55, - "rounds": 55, - "updated_at": "2026-08-30T22:30:00+08:00" - }, - { - "id": 56, - "title": "为采集结果文件增加流式写入失败后的临时文件清理", - "module": "collectdata", - "dependency": "55", - "status": "done", - "completed": 56, - "rounds": 56, - "updated_at": "2026-08-30T23:10:00+08:00" - }, - { - "id": 57, - "title": "为采集结果对象增加数据库删除与物理对象删除的一致性处理", - "module": "collectdata", - "dependency": "56", - "status": "done", - "completed": 57, - "rounds": 57, - "updated_at": "2026-08-30T23:55:00+08:00" - }, - { - "id": 58, - "title": "补充外部品牌服务不可用、RustFS 超时和重复 chunk 的降级测试", - "module": "collectdata", - "dependency": "57", - "status": "done", - "completed": "2026-08-30T17:28:00+08:00", - "rounds": 58, - "updated_at": "2026-08-30T17:28:00+08:00" - }, - { - "id": 59, - "title": "完成采集模块数据库索引、批量 SQL 和对象存储调用次数验证", - "module": "collectdata", - "dependency": "58", - "status": "done", - "completed": "2026-08-30T17:40:00+08:00", - "rounds": 59, - "updated_at": "2026-08-30T17:40:00+08:00" - }, - { - "id": 60, - "title": "完成采集模块 10k 行压测并验收结果完整性、内存和吞吐", - "module": "collectdata", - "dependency": "59", - "status": "done", - "completed": "2026-08-30T17:48:00+08:00", - "rounds": 60, - "updated_at": "2026-08-30T17:48:00+08:00" - }, - { - "id": 61, - "title": "建立共享任务链路资源指标基线:线程、连接、队列、GC、Redis、RustFS 和 DB", - "module": "shared", - "dependency": "无", - "status": "done", - "completed": "2026-08-30T18:00:36+08:00", - "rounds": 61, - "updated_at": "2026-08-30T18:00:36+08:00" - }, - { - "id": 62, - "title": "为本地任务实体缓存增加最大条目数、TTL 和定时清理", - "module": "shared", - "dependency": "61", - "status": "done", - "completed": "2026-08-30T18:17:55+08:00", - "rounds": 62, - "updated_at": "2026-08-30T18:17:55+08:00" - }, - { - "id": 63, - "title": "为前端/后端进度快照增加写入去重和最小更新间隔", - "module": "shared", - "dependency": "62", - "status": "done", - "completed": "2026-08-30T18:28:19+08:00", - "rounds": 63, - "updated_at": "2026-08-30T18:28:19+08:00" - }, - { - "id": 64, - "title": "将 transient payload 压缩改为直接 gzip 二进制流上传", - "module": "shared", - "dependency": "63", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T18:42:22.724380+08:00" - }, - { - "id": 65, - "title": "为 transient payload 读取增加流式解压和解压后字节上限", - "module": "shared", - "dependency": "64", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T18:49:59.467019+08:00" - }, - { - "id": 66, - "title": "限制 RustFS 并发读写与重试的总资源预算,防止多任务叠加爆发", - "module": "shared", - "dependency": "65", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T18:57:31.246593+08:00" - }, - { - "id": 67, - "title": "复用 RustFS/MinIO 客户端与 HTTP 连接池,减少每次操作创建客户端", - "module": "shared", - "dependency": "66", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T19:04:37.016780+08:00" - }, - { - "id": 68, - "title": "将 payload 引用删除改为批量引用检查与异步物理删除", - "module": "shared", - "dependency": "67", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T19:13:47.257322+08:00" - }, - { - "id": 69, - "title": "为数据库删除任务补充 transient payload 指针收集和清理队列", - "module": "shared", - "dependency": "68", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T19:29:59.023068+08:00" - }, - { - "id": 70, - "title": "将历史清理改为 keyset 分页、小批量和短事务", - "module": "shared", - "dependency": "69", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T19:49:03.265056+08:00" - }, - { - "id": 71, - "title": "清理日志改为数量与 sample ID,禁止输出超长任务 ID 列表", - "module": "shared", - "dependency": "70", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T19:53:49.613507+08:00" - }, - { - "id": 72, - "title": "为文件作业实现数据库原子 claim,避免重复派发同一 job", - "module": "shared", - "dependency": "71", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T20:01:22.248696+08:00" - }, - { - "id": 73, - "title": "为本地文件作业队列增加 in-flight 去重和队列背压", - "module": "shared", - "dependency": "72", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T20:23:07+08:00" - }, - { - "id": 74, - "title": "隔离调度线程池、文件作业线程池和外部 Coze/图片执行池", - "module": "shared", - "dependency": "73", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T20:31:43+08:00" - }, - { - "id": 75, - "title": "为虚拟线程任务增加等待队列上限与拒绝/延迟指标", - "module": "shared", - "dependency": "74", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T20:39:35+08:00" - }, - { - "id": 76, - "title": "将 JSON owner 查询迁移到显式列并补充任务/状态复合索引", - "module": "shared", - "dependency": "75", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T20:51:14+08:00" - }, - { - "id": 77, - "title": "统一 Coze、品牌检查和紫鸟 HTTP 客户端的连接复用策略", - "module": "shared", - "dependency": "76", - "status": "done", - "completed": 1, - "rounds": 1, - "updated_at": "2026-08-30T21:08:32+08:00" - }, - { - "id": 78, - "title": "为所有外部调用增加耗时、重试、失败率和 payload 字节指标", - "module": "shared", - "dependency": "77", - "status": "done" - }, - { - "id": 79, - "title": "为对象存储、数据库和队列增加故障注入测试", - "module": "shared", - "dependency": "78", - "status": "done", - "completed": 79, - "rounds": 62, - "updated_at": "2026-08-30T22:23:43.531511+08:00" - }, - { - "id": 80, - "title": "补充 JVM 堆、直接内存、临时磁盘和连接池容量配置说明", - "module": "shared", - "dependency": "79", - "status": "done", - "completed": 80, - "rounds": 63, - "updated_at": "2026-08-30T22:31:07.539232+08:00" - }, - { - "id": 81, - "title": "建立前端任务轮询请求量、响应体大小和页面内存基线", - "module": "frontend", - "dependency": "无", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 82, - "title": "为进度响应 Map 增加 TTL 清理与最大条目数", - "module": "frontend", - "dependency": "81", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 83, - "title": "统一不同页面的轮询去重、in-flight 合并和终态清理", - "module": "frontend", - "dependency": "82", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 84, - "title": "优化店铺抓取队列状态合并,消除 historyItems 的线性重复查找", - "module": "frontend", - "dependency": "83", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 85, - "title": "优化 Similar ASIN 轮询与文件生成等待,避免重复 force 请求", - "module": "frontend", - "dependency": "84", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 86, - "title": "将隐藏页面轮询间隔、前台恢复和退避策略统一配置化", - "module": "frontend", - "dependency": "85", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 87, - "title": "限制 localStorage 中任务、快照和队列数据的最大数量/字节数", - "module": "frontend", - "dependency": "86", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 88, - "title": "解析结果前端只接收预览数据,避免大 payload 进入响应式对象", - "module": "frontend", - "dependency": "87", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 89, - "title": "清理页面卸载时的所有 timer、请求和临时 URL", - "module": "frontend", - "dependency": "88", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 90, - "title": "为进度接口增加断网、超时、服务恢复和重复响应测试", - "module": "frontend", - "dependency": "89", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 91, - "title": "按页面拆分 Element Plus 与公共业务 chunk", - "module": "frontend", - "dependency": "90", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 92, - "title": "配置 Vite manualChunks 并比较各页面首屏传输大小", - "module": "frontend", - "dependency": "91", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 93, - "title": "补充 Similar ASIN、店铺抓取和采集数据页面的 E2E 核心路径", - "module": "frontend", - "dependency": "92", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 94, - "title": "补充移动端与桌面端响应式页面验收截图", - "module": "frontend", - "dependency": "93", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 95, - "title": "补充深色主题、错误提示、重试和终态刷新验收", - "module": "frontend", - "dependency": "94", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 96, - "title": "建立 Java/Python/Vue 三端统一的 API 字段兼容检查", - "module": "frontend", - "dependency": "95", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 97, - "title": "执行 Java 全量测试、Python unittest、Vue 类型检查与构建", - "module": "frontend", - "dependency": "96", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 98, - "title": "执行真实启动、健康检查、核心请求和外部依赖调用验证", - "module": "frontend", - "dependency": "97", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 99, - "title": "执行全链路压测并记录 CPU、内存、GC、DB、Redis、RustFS、网络结果", - "module": "frontend", - "dependency": "98", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - }, - { - "id": 100, - "title": "完成发布前回滚演练、git commit 对应关系检查和交付清单", - "module": "frontend", - "dependency": "99", - "status": "done", - "completed": 100, - "rounds": 83, - "updated_at": "2026-08-31 00:33:00+08:00" - } - ], - "pending": 0 -}