mongodb-log

AI 二次改写指南

1.用途

本文用于把当前项目交给 AI 继续开发、修复、重构或改写文档。目标不是让 AI 一次性重写整个仓库,而是让它在充分理解现状和约束后,做范围明确、可验证、可回退的修改。

适用任务包括:

2.AI 开始前的必读顺序

AI 不应只读取用户点名的单个文件。推荐按以下顺序建立上下文:

  1. CLAUDE.md:项目硬约束、红线和验证要求。
  2. ROADMAP.md:当前阶段、已完成事项、阻塞和最近验证。
  3. docs/design.md:系统结构、功能设计和当前权衡。
  4. 与任务直接相关的源码和测试。
  5. README.md 与 docs/user-guide.md:外部功能口径和用户行为。

发生冲突时,以源码和测试为当前事实,以 CLAUDE.md 为不可降低的约束。文档与源码冲突时,先指出差异,再判断应该改代码还是改文档,不能静默选择。

3.项目速查

3.1 运行模型

3.2 代码路由

任务 优先查看
Log 上传、队列、状态 task/TaskService.java、task/TaskRunner.java、task/AnalysisTask.java
结构化日志 parser/StructuredLogParser.java、对应测试
旧版日志 parser/LegacyLogParser.java、BalancedDocumentExtractor.java、对应测试
查询模式 parser/QueryPatternNormalizer.java
慢查询统计 analysis/AnalysisAccumulator.java、DurationDistribution.java、TopSlowQueryCollector.java
运行诊断 analysis/diagnostics/DiagnosticAccumulator.java、LogDiagnostics.java
Log 持久化 storage/FileTaskRepository.java
Markdown 报告 report/MarkdownReportService.java
Log REST web/TaskController.java、GlobalExceptionHandler.java
FTDC 上传与建索引 task/ftdc/FtdcTaskService.java、FtdcTaskRunner.java
FTDC 格式解析 parser/ftdc/
FTDC 索引 storage/ftdc/FtdcIndexWriter.java、FtdcIndexReader.java
FTDC 查询和降采样 analysis/ftdc/FtdcSeriesService.java、FtdcMetricDecoder.java
FTDC 分组 analysis/ftdc/FtdcMetricGroups.java
FTDC REST web/FtdcTaskController.java
全局清理和内存 task/ApplicationMaintenanceService.java、web/SystemController.java
Log 前端 web/src/App.vue、web/src/components/、web/src/api/tasks.js
Metric 前端 web/src/components/ftdc/、web/src/api/ftdcTasks.js
前端竞态 web/tests/task-races.test.js、web/tests/ftdc-races.test.js

3.3 当前公开功能与内部组件

AI 必须先判断目标属于「公开能力」还是「内部代码」。当前产品公开:

以下代码存在且有测试,但没有 REST 路由和前端入口:

除非用户明确要求发布这些能力,否则不要顺手暴露接口或添加页面。

4.不可破坏的设计不变量

4.1 Log 不变量

4.2 FTDC 不变量

4.3 存储与删除不变量

4.4 隐私不变量

4.5 前端不变量

5.把用户请求转换为可验证目标

AI 在动手前应把自然语言请求写成以下结构:

目标:用户最终能观察到什么变化。
范围:允许修改哪些模块和文档。
不变项:哪些统计、接口、存储或隐私行为不能改变。
输入:正常输入、无效输入和边界输入。
输出:成功结果、错误结果和历史兼容行为。
验证:新增哪些测试,运行哪些命令,如何确认结果。

示例:

目标:Log 结果页新增按客户端筛选 Top 5000 的能力。
范围:慢查询分页接口、前端筛选表单、相关测试和文档。
不变项:Top 5000 选取规则、summary.json、报告和历史任务格式不变。
输入:空筛选、IPv4、IPv6、大小写差异和无匹配值。
输出:在已保留的 Top 5000 内筛选,页数和 total 与筛选结果一致。
验证:Controller 集成测试、前端交互测试、全量后端与前端测试。

6.标准改写流程

6.1 第一步:只读调查

在修改前完成:

  1. 读取项目规范和路线图。
  2. 查看 git status,区分用户已有改动和本次任务。
  3. 精确定位相关类、组件、接口和测试。
  4. 用现有测试或最小输入复现当前行为。
  5. 记录文档口径与源码是否一致。

不要在调查阶段顺手格式化、升级依赖或重构相邻代码。

6.2 第二步:确认最小修改面

按数据流从入口向下列出改动点:

用户操作
→ 前端组件
→ API 封装
→ Controller 参数和响应
→ Service/Runner
→ Parser/Analysis
→ Repository/持久化
→ 自动化测试
→ 用户文档与设计文档

没有经过这条链路的层不要默认修改。只改后端而不检查前端,或只改模型而不检查历史 JSON 兼容,都属于不完整方案。

6.3 第三步:先写失败验证

修 bug 或改变行为时,优先添加能稳定复现问题的测试:

如果只是文档修正,不需要为了形式新增业务测试,但必须核对源码、相对链接和文档内部一致性。

6.4 第四步:最小实现

6.5 第五步:分层验证

推荐从快到慢运行:

  1. 目标单元测试。
  2. 相关包或相关前端测试文件。
  3. 全量 mvn test。
  4. 全量 npm test -- --run。
  5. npm run build。
  6. 交付相关改动再运行 mvn clean package。
  7. 涉及真实交互时启动 JAR 做浏览器验收。

验证失败时修根因,不能注释测试、降低断言或添加跳过标记让结果变绿。

6.6 第六步:同步文档和路线图

代码、接口、限制、数据目录或用户操作变化时,检查:

只有已经实现并验证的事项才能写入 ROADMAP.md 的「已完成」或「最近验证」。尚未验证的内容写「待确认」,不能用推测补齐。

7.按任务类型的修改指南

7.1 修改结构化日志解析

检查清单:

禁止只根据 MongoDB 版本号启用字段;应按字段实际存在和类型能力解析。

7.2 修改旧版日志解析

检查清单:

不要用宽泛正则从任意文本中猜耗时或命令字段。

7.3 修改慢查询统计

先回答四个问题:

  1. 统计对象是全部慢查询还是已保留明细。
  2. 是否要求精确结果。
  3. 内存上限如何保证。
  4. 历史任务缺失新字段时如何展示。

以下口径不能混用:

7.4 修改运行诊断

7.5 修改 FTDC 解析或索引

这是高风险区域,必须逐层核对:

  1. BSON 文档长度和文件偏移。
  2. zlib 声明长度、实际长度和尾随数据。
  3. baseline 长度与属性数量。
  4. uvarint 和 RLE 边界。
  5. Schema 路径与 baseline 列顺序。
  6. blocks.idx 写入和读取字段顺序。
  7. 源文件大小和 SHA-256。
  8. 数组分配前的规模校验。

索引格式字段发生变化时,必须明确是否升级 magic/version,以及旧任务如何失败或兼容。不能让旧索引被错误解释成新格式。

7.6 修改 FTDC 查询或降采样

至少覆盖:

不能为了图表方便先把全部点存入 List<Long>,再做二次处理。

7.7 修改前端异步逻辑

每个请求都要回答:

新增请求时优先复用现有的版本号、pending 和 AbortController 模式,不引入新的全局状态库。

7.8 修改持久化或删除

7.9 修改报告

8.测试选择矩阵

改动范围 最低验证 建议追加
纯 Markdown 文档 相对链接、路径、git diff --check 与源码关键常量交叉检索
单个 Log 解析规则 对应 Parser 测试 mvn test
Log 聚合或报告 对应 Analysis/Report 测试 Controller 集成测试、mvn test
FTDC 格式或索引 Parser/Index 测试 Series、集成、真实样本条件测试
FTDC 查询或降采样 FtdcSeriesServiceTest Controller 集成测试、真实样本条件测试
后端 API Controller 集成测试 前端 API/组件测试、mvn test
前端展示 相关 Vitest 文件 全量前端测试和生产构建
前端竞态 race 测试 浏览器快速切换手工验收
构建/发布 全量测试 mvn clean package 和 JAR 启动
删除/清理 临时目录集成测试 权限和符号链接边界

9.常见错误模式

9.1 把 Top 5000 当作全量数据

错误结果:耗时分布、平均值或模式频次只基于保留明细。

正确做法:聚合在流式读取阶段完成,Top 5000 只影响持久化明细。

9.2 把缺失字段显示成零

错误结果:用户无法区分「指标确实为零」和「日志没有提供」。

正确做法:后端使用可空字段,前端显示「日志未提供」或 —。

9.3 用服务器版本号判断字段

错误结果:混合版本日志、版本缺失或字段提前/延后出现时统计错误。

正确做法:按字段存在、类型和可解析性判断,版本号只做数据质量信息。

9.4 为 FTDC 查询展开全部列

错误结果:大文件或多文件任务内存随「指标数 × 样本数」增长。

正确做法:索引定位 Block,只解码时间列和选中组的列。

9.5 用降采样点算统计值

错误结果:尖峰、低谷、平均值和全零判断失真。

正确做法:遍历全部点计算统计,同时只把有界代表点写入响应。

9.6 在前端推断时间断裂

错误结果:极值降采样造成不规则时间间距,被误判为真实断裂。

正确做法:后端基于完整时间序列判断并插入 null,前端只负责渲染。

9.7 把内部类当成已发布功能

错误结果:README 或用户指南声称支持单指标分页或 CSV 导出,但用户没有入口。

正确做法:以 Controller 路由和前端入口共同判断公开能力。

9.8 只改源码不更新进度源

错误结果:ROADMAP.md 与仓库实际状态不一致。

正确做法:实现、验证完成后同步路线图;未验证事项不能标为完成。

10.提供给 AI 的任务上下文模板

复制以下模板,并用本次任务信息替换占位内容:

项目:MongoDB Log & Metric Analyzer

目标:
<用户可观察的最终结果>

当前行为:
<如何复现,实际结果是什么>

期望行为:
<正常输入、边界输入、错误输入分别是什么结果>

允许修改:
<文件或模块范围>

禁止改变:
- Log 全量聚合与 Top 5000/Top 50 的口径。
- FTDC 流式、有界、串行和源文件完整性约束。
- 本地离线与隐私边界。
- 未点名的公开 API 和存储格式。

必读:
- CLAUDE.md
- ROADMAP.md
- docs/design.md
- 与任务相关的源码和测试

验证:
<必须运行的目标测试、全量测试、构建或浏览器验收>

交付:
<代码、测试、文档、ROADMAP 更新和汇报格式>

11.可直接使用的提示词

11.1 Bug 修复

先读取 CLAUDE.md、ROADMAP.md 和 docs/design.md,再调查这个问题。先用现有输入或最小测试稳定复现,给出根因和最小修改面;确认属于实现任务后,先补失败测试,再做最小修复。不要修改无关代码,不要改变现有统计口径、FTDC 资源边界、存储格式或公开 API。修复后运行相关测试和全量测试,并只在验证通过后更新 ROADMAP.md。最终汇报根因、改动文件、验证结果和仍存在的边界。

问题:<粘贴问题>

11.2 新功能

先读取 CLAUDE.md、ROADMAP.md、docs/design.md 和相关测试,把需求转换成可验证目标。列出用户流程、输入边界、接口变化、持久化影响、内存上限、历史兼容和隐私影响。只实现明确要求的最小功能,先写失败测试,不增加未要求的依赖、配置和兼容层。完成后同步用户文档、设计文档和 ROADMAP.md,并运行相关全量验证。

需求:<粘贴需求>

11.3 局部重构

这是行为保持型重构。先读取 CLAUDE.md、ROADMAP.md 和 docs/design.md,明确当前可观察行为和现有测试覆盖。只重构指定模块,不改变 REST 路由、JSON 字段、排序、错误消息、存储格式、资源上限和 UI 行为。先运行重构前测试建立基线,再小步修改,每步复跑目标测试。若发现必须改变行为,停止并单独说明,不要把行为变更混入重构。

范围:<粘贴类或组件>
目的:<粘贴维护性问题>

11.4 文档更新

先读取 CLAUDE.md、ROADMAP.md、docs/design.md,并从 Controller、Service、核心常量、前端入口和测试交叉核对事实。只记录当前已经实现的行为,明确区分公开功能、内部组件、精确统计和近似统计。以当前源码和测试为准,不要根据类名猜功能。完成后检查所有相对链接、文件路径、接口路径、数值上限和中英文口径;运行 git diff --check,并在验证通过后更新 ROADMAP.md。

文档目标:<粘贴目标>

11.5 代码审查

按 CLAUDE.md 和 docs/design.md 审查本次 diff。优先寻找会导致统计错误、全量物化、内存无界、竞态覆盖、半成品发布、越界删除、敏感信息泄露、历史任务不兼容和公开能力误判的问题。每条问题必须指出具体文件和行、可复现条件、实际影响和最小修复方向。没有证据的问题不要写成结论。只做审查,不直接改代码。

12.AI 完成任务前的自检

12.1 范围

12.2 正确性

12.3 资源

12.4 安全和隐私

12.5 验证和文档

13.AI 最终汇报模板

结论:<任务是否完成,用户现在得到什么>

改动:
- <文件或模块>:<具体变化及原因>

验证:
- <命令>:<通过数量或关键结果>
- <未执行项>:<原因和影响>

边界:
- <仍然不支持或需要用户注意的事项>

汇报只写已发生的事实。不要把「应该通过」「理论上可用」写成「已验证」。