这些审计记录原本堆积在 docs/audit/changes/changes/ 嵌套误产物目录下(由开发机迁移
79d3c2e 前后的不明批量操作产生)。由于同期 .gitignore 屏蔽了 docs/audit/ 全目录,
它们从未入过 git 任何分支 history。删除即永久丢失。
按 docs/specs/audit-gap-recovery/tasks.md 阶段 1 执行,将全部 96 份 D 类孤本
(主目录无同名、git history 亦无记录)复制到 docs/audit/changes/ 主目录入仓。
涵盖主题: P1-P18 全栈集成 / 多模块累积变更 / ETL bug 修复 / 业务日切 /
召回与任务引擎改造 / 租户管理与审批 / 董事会财务 / 客户与助教详情 /
DDL 基线合并 / Kiro 到 Claude Code 迁移
阶段 2(B 类内容漂移 1 份)和阶段 4(嵌套目录删除)独立推进。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.9 KiB
2.9 KiB
变更审计记录:修复 RecordingAPIClient 缺少 post 方法
| 字段 | 值 |
|---|---|
| 日期 | 2026-03-06 08:37:26 |
| Prompt-ID | P20260306-083206 |
| Session-ID | f1836fa4 |
| Session 路径 | docs/audit/session_logs/2026-03/06/34_a8dca428_070120 |
| 风险等级 | 极低 |
| 影响范围 | ETL API 客户端层 |
操作摘要
修复 ETL 运行时错误:RecordingAPIClient 缺少 post 方法,导致 ODS_GROUP_PACKAGE 任务的详情拉取阶段(非预取模式)调用 self.api.post() 时抛出 AttributeError。在 APIClient 新增 post() 作为 _post_json() 的公共别名,在 RecordingAPIClient 新增 post() 委托给 self.base.post()。
根因分析
UnifiedPipeline在非预取模式下调用self.api.post(endpoint, params)(unified_pipeline.py:262)APIClient只有get()(实际是 POST JSON 的历史命名)和私有_post_json(),没有公共post()方法RecordingAPIClient作为代理只转发了iter_paginated/get_paginated,未覆盖post- 新增的
ODS_GROUP_PACKAGE详情拉取阶段首次触发了非预取模式的post()调用路径
触发场景
用户从 admin-web 启动 ETL 任务,任务开始时间 2026/3/6 07:32:40,错误日志:'RecordingAPIClient' object has no attribute 'post'
验证
- getDiagnostics 两个文件均无问题
- 166 个单元测试通过(2 个 hypothesis deadline 超时与本次修改无关)
本次对话文件变更
新增文件
docs/audit/prompt_logs/prompt_log_20260306_083206.mddocs/audit/session_logs/2026-03/06/34_a8dca428_070120/main_02_f1836fa4.mddocs/audit/session_logs/2026-03/06/34_a8dca428_070120/sub_01_f1836fa4.mddocs/audit/session_logs/2026-03/06/37_e5276b93_082544/main_06_dfa80d9e.md
改动注解
apps/etl/connectors/feiqiu/api/client.py
- 变更类型:修改
- 原始原因:
APIClient缺少公共post()方法,导致UnifiedPipeline在详情拉取模式下调用失败 - 思路分析:
get()方法实际执行 POST JSON 请求(历史命名),新增post()作为_post_json()的语义明确别名,与get()平行放置,不改变任何请求逻辑 - 修改结果:
APIClient公共接口补齐post()方法,所有通过APIClient或其代理发起的非分页 POST 请求均可正常工作
apps/etl/connectors/feiqiu/api/recording_client.py
- 变更类型:修改
- 原始原因:
RecordingAPIClient作为APIClient的代理,未转发post()方法,导致详情拉取阶段AttributeError - 思路分析:与已有的
iter_paginated/get_paginated代理模式一致,新增post()直接委托给self.base.post()。详情请求不需要落盘(非分页数据),因此不做额外录制 - 修改结果:
RecordingAPIClient完整覆盖APIClient的公共接口,UnifiedPipeline在在线拉取模式下可正常调用self.api.post()