# 审计记录补追与嵌套目录清理

**发现日期**：2026-04-20
**发现上下文**：2026-04-20 历史批次预审过程中，放宽 `.gitignore` 白名单后暴露出 `docs/audit/changes/changes/` 嵌套目录

## 背景

开发机迁移（79d3c2e 提交）前后，`docs/audit/changes/` 下意外出现了一个同名嵌套子目录 `docs/audit/changes/changes/`，其中堆积了 127 份审计记录 md 文件。推测原因是迁移脚本或某次批量拷贝时，误把 `docs/audit/changes/` 整个目录作为源，再次写入到了它自身下面，形成了 `changes/changes/` 的路径嵌套。

同时期 `.gitignore` 将 `docs/audit/` 整目录屏蔽（仅白名单少量文件），导致此后新增的审计记录长期无法入仓。主目录 `docs/audit/changes/` 当前仅有 33 份入仓 md，而嵌套目录累积了 127 份。

用户最初的设想是直接 `rm -rf docs/audit/changes/changes/` 了事。但实地核查发现：嵌套目录里相当一部分文件从未进入过 git 任何分支的 history（即未 commit 的孤本），一旦删除就永久丢失。因此需要先对 127 份做全量分类，再按类别分阶段处理，不能一删了之。

本 PRD 即用于指导后续清理动作，独立可执行。

## 扫描结果统计

| 分类 | 数量 | 含义 | 处理方式 |
|------|------|------|---------|
| A 纯副本 | 30 | 主目录同名同内容（diff 无输出） | 可直接删除嵌套版本 |
| B 内容漂移 | 1 | 主目录同名但内容不同 | 人工比对选最新 |
| C 已 commit 的孤本 | 0 | 主目录无，git history 有 | 无此类 |
| D 未 commit 的孤本 | 96 | 主目录无，git history 也无 | **最高优先级补追**，删除即永久丢失 |
| **合计** | 127 | | |

扫描方法：对 `docs/audit/changes/changes/*.md` 每个文件，先查 `docs/audit/changes/<同名>.md` 是否存在，存在则用 `diff -q` 比对内容；不存在则用 `git log --all --oneline -- docs/audit/changes/<文件名>` 查历史。扫描时主目录文件数 33，嵌套目录文件数 127。

## 类别 D：未 commit 的孤本清单（最高风险，共 96 份）

以下 96 份文件仅存在于 `docs/audit/changes/changes/`，且 git 所有分支 history 中均无记录。删除即永久丢失。

```
2026-02-26__etl-bugfix-dim-staff-rankname-assistant-daily-table-area.md
2026-02-26__p1-p2-p3-fullstack-integration.md
2026-02-26__retention-clue-refactor.md
2026-02-26__root-file-gitignore-h5ui-cleanup.md
2026-02-27__biz-day-cutoff-prd-sync-check.md
2026-02-27__p4-core-business-routes-triggers.md
2026-02-28__multi-module-accumulated-changes.md
2026-03-01__dwd-cleanup-ods-fix-dim-staff-repair.md
2026-03-01__dws-numeric-precision-ods-siteid-fix.md
2026-03-02__etl-unified-analysis-hook-merge.md
2026-03-02__spi-calibration-nonzero-median.md
2026-03-03__miniprogram-dev-debug-panel.md
2026-03-04__fullstack-accumulated-changes.md
2026-03-06__fix-api-client-post-method.md
2026-03-06__fix-db-operations-dsn-proxy.md
2026-03-07__task3-project-tag-docs-sync.md
2026-03-08__p5-ai-spec-review-category-enum-align.md
2026-03-10__multi-module-ai-apps-task-defense-miniprogram.md
2026-03-12__board-finance-overview-wxss-calibration.md
2026-03-12__miniprogram-dev-docs-finalize.md
2026-03-12__multi-module-ai-taskdefense-miniprogram-etl.md
2026-03-12__pixel-audit-structured-methodology.md
2026-03-13__board-finance-line-height-audit.md
2026-03-13__board-finance-rpx-formula-correction.md
2026-03-13__task-list-h5-rewrite.md
2026-03-15__ddl-baseline-consolidation-bd-manual-reorg.md
2026-03-18__rns1-e2e-fdw-direct-connect-bugfix.md
2026-03-19__card-type-id-doc-sync.md
2026-03-19__coach-tier-hardcode-fix.md
2026-03-19__level-map-hardcode-fix.md
2026-03-19__rns12-db-audit.md
2026-03-20__ai-prompt-refinement-board-coach-mock.md
2026-03-20__h2-fdw-to-direct-etl-unification.md
2026-03-20__miniprogram-docs-sync.md
2026-03-20__r3-skill-type-filter-rebuild.md
2026-03-20__rns1-ai-autonomous-decision-risk-audit.md
2026-03-20__rns13-board-apis-e2e-fix.md
2026-03-20__rns14-chat-fdw-filter-audit.md
2026-03-20__rns14-chat-module-r3-filter-rebuild.md
2026-03-22__db-field-walkthrough-batch-fix.md
2026-03-22__ddl-db-structure-diff-bd-manual-audit.md
2026-03-22__ddl_bd_manual_consistency_fix.md
2026-03-22__dev-trace-log-fullstack-feature.md
2026-03-22__ns4-ddl-merge-deleted-at.md
2026-03-22__p14-task15-final-checkpoint.md
2026-03-22__p16-spec-closing-doc-sync.md
2026-03-22__trace-path-fix-miniprogram-login-race.md
2026-03-22__zombie-task-graceful-shutdown-rerun.md
2026-03-23__ddl-merge-rejection-count-cancelled.md
2026-03-23__disable-to-remove-user-auth-model-fix.md
2026-03-23__mysites-tenant-filter-time-format-nickname-display.md
2026-03-23__review-modal-phone-display-auto-match-identity-label.md
2026-03-23__role-routing-page-guard.md
2026-03-23__tenant-admin-case-insensitive-username.md
2026-03-23__tenant-admin-review-modal-dynamic-roles.md
2026-03-23__tenant-admin-site-access-root-fix.md
2026-03-23__tenant-user-approval-site-filter.md
2026-03-23__trigger-jobs-admin-web-miniprogram-cleanup.md
2026-03-24__add_missing_cfg_skill_type.md
2026-03-24__ddl-migration-merge-and-archive.md
2026-03-24__fix-tier-nodes-empty-progress-bar.md
2026-03-24__lookback_days_60_to_90.md
2026-03-24__miniprogram-avatar-nickname-feature.md
2026-03-24__p17-assistant-ownership-task-engine.md
2026-03-24__p18-task-engine-dashboard.md
2026-03-24__perf-page-data-fix.md
2026-03-24__review-modal-avatar-layout.md
2026-03-24__soft-delete-user-site-roles-binding.md
2026-03-24__trigger-jobs-clear-task-interaction.md
2026-03-24_fix_cfg_skill_type_missing_records.md
2026-03-25__baseline-relationship-building-tasks.md
2026-03-25__baseline-task-independent-connection-fix.md
2026-03-25__perf-to-task-detail-member-query.md
2026-03-25__perf-wxml-missing-member-id.md
2026-03-25__task-detail-service-records-6-improvements.md
2026-03-25__tenant-users-soft-delete-upsert-fix.md
2026-03-26__etl-missing-fields-phase1-ddl-mappings.md
2026-03-26__net-income-calibration-all-pages.md
2026-03-27__board-finance-double-format-fix.md
2026-03-27__board-finance-integration-T2.md
2026-03-27__board-finance-phase2-t1-t6.md
2026-03-27__board-finance-wxml-format-tabs-cleanup.md
2026-03-27__miniprogram-permission-unification.md
2026-03-27__task-list-recent60d-and-wxml-formatting.md
2026-03-28__board-finance-5fixes.md
2026-03-28__board-finance-dws-area-refactor-audit.md
2026-03-28__fix-miniprogram-login-landing-page.md
2026-03-29__board-lazy-loading-pagination.md
2026-03-29__coach-detail-500-field-name-fix.md
2026-03-29__coach-detail-design-alignment.md
2026-03-29__coach-detail-style-aggregation-fix.md
2026-03-29__dws-task-engine-etl-orchestration.md
2026-03-29__fix-recall-completion-event-chain.md
2026-03-31__task-engine-overhaul.md
2026-04-05__kiro-to-claude-code-migration.md
2026-04-08__fix13-recall-events-refactor.md
```

注意其中一份为 `2026-03-24_fix_cfg_skill_type_missing_records.md`（单下划线），与同日的 `2026-03-24__add_missing_cfg_skill_type.md` 命名风格不同，疑似历史遗留命名，补追时保持原名即可。

## 类别 B：内容漂移清单（需人工比对，共 1 份）

```
2026-04-06__v1-cleanup-ddl-consolidation.md
```

处理提示：主目录版本与嵌套版本在 2026-04-06 的 v1 整理 commit（779b2f6）前后可能经历过修订，需逐行对比选最新信息最完整的一版。

## 类别 C：已 commit 的孤本清单（可恢复，共 0 份）

本次扫描未发现此类文件。主目录缺失的 94 份全部属于 D 类未 commit 孤本。

## 类别 A：纯副本清单（可直接删除，共 30 份）

以下 30 份文件在主目录有同名同内容版本，嵌套副本可安全删除。

```
2026-02-13__api-ods-comparison-v2.md
2026-02-13__api-ods-comparison.md
2026-02-13__api-reference-batch2.md
2026-02-13__api-reference-overhaul.md
2026-02-13__bd-manual-docs-consolidation-ddl-sync.md
2026-02-13__field-drift-report-update.md
2026-02-13__git-repo-reinit-push.md
2026-02-13__remove-legacy-index-cleanup.md
2026-02-14__api-doc-reorg-field-grouping.md
2026-02-14__api-ods-comparison-v3-fixed.md
2026-02-14__api-ods-comparison-v3.md
2026-02-14__api-param-audit-ods-design.md
2026-02-14__drop-dwd-settle-list.md
2026-02-14__drop-ods-settlelist.md
2026-02-14__dws-bugfix-tier-safedecimal.md
2026-02-14__json-refresh-md-patch.md
2026-02-14__json-vs-md-audit.md
2026-02-14__legacy-ods-dwd-cleanup.md
2026-02-14__md-placeholder-fix-cleanup.md
2026-02-14__ods-cleanup-doc-update.md
2026-02-14__ods-vs-summary-comparison.md
2026-02-14__recording-client-timezone-fix.md
2026-02-14__replace-role-area-new-api-doc.md
2026-02-14__skip-words-remark-fix.md
2026-02-15__admin-web-console-db-migration-audit-reorg.md
2026-02-15__audit-consolidation-doc-reorg.md
2026-02-15__backend-deps-bootstrap.md
2026-02-15__docs-database-merge.md
2026-02-15__docs-devnotes-index-cleanup.md
2026-02-15__monorepo-migration-phase1-8.md
```

## 建议的执行顺序

1. **阶段 1：先保全 D 类（96 份）**
   - 在动任何东西前，先 `git add -A && git commit -m "WIP 清理前快照"` 做一次保护 commit
   - 将 `docs/audit/changes/changes/` 下所有 D 类文件复制（不是移动）到 `docs/audit/changes/`
   - 检查 `.gitignore` 是否放行 `docs/audit/changes/*.md`，若未放行则先调整白名单
   - `git add docs/audit/changes/ && git commit -m "补追未入仓的 96 份审计孤本"`

2. **阶段 2：处理 B 类（1 份）**
   - 针对 `2026-04-06__v1-cleanup-ddl-consolidation.md`，用 `diff docs/audit/changes/<该文件> docs/audit/changes/changes/<该文件>` 查看差异
   - 选更完整的一版保留到主目录；将另一版备份到 `_DEL/audit-backup/2026-04-06__v1-cleanup-ddl-consolidation.嵌套版.md` 或类似路径
   - commit 消息"内容漂移修正：v1-cleanup-ddl-consolidation"

3. **阶段 3：恢复 C 类（0 份，跳过）**
   - 本次无 C 类，无需操作

4. **阶段 4：删除嵌套目录**
   - 确认阶段 1、2 已 commit 入仓
   - `rm -rf docs/audit/changes/changes/`
   - `git add -A && git commit -m "清理嵌套目录 docs/audit/changes/changes/"`

## 风险与回滚

- 风险 1：D 类补追后，主目录审计时间线会出现大段 2026-02-26 至 2026-04-08 的批量入仓，commit 时间与文件日期不一致。可接受，目标是保全历史。
- 风险 2：B 类仅 1 份，若选错版本会丢失另一方内容。缓解：另一版强制先备份到 `_DEL/` 再删。
- 风险 3：`.gitignore` 可能仍然屏蔽 `docs/audit/changes/*.md`，导致 `git add` 静默忽略。阶段 1 第一次 `git add` 后必须 `git status` 核对文件是否真的进入了暂存区；若未进入，先修 `.gitignore` 白名单再重试。
- 风险 4：D 类中 `2026-03-24_fix_cfg_skill_type_missing_records.md` 为单下划线命名，可能与同日双下划线版本功能重叠，补追后若发现重复再单独合并。
- 回滚：所有删除前应已有"WIP 清理前快照"commit；任何阶段出问题 `git reset --hard <快照 hash>` 即可恢复。

## 验证

阶段 4 完成后执行以下验证：

- `ls docs/audit/changes/*.md | wc -l` 应等于 33（原）+ 96（D 补追）+ 0（C 恢复）= 129
- 若 B 类合并后主目录文件未增加，则仍为 129；若 B 类创建了新文件名则为 130
- `ls docs/audit/changes/changes/ 2>/dev/null` 应返回空或"目录不存在"
- `git log --oneline -- "docs/audit/changes/"` 应能看到至少 3 次本次操作 commit（快照 / 补追 / 清理）
- 抽查 D 类中的 3 份文件，确认 `git log --all -- "docs/audit/changes/<文件名>"` 返回非空

## 不在本次任务范围

- 审计内容本身的正确性复核（只做文件层面的保全，不审查内容）
- `.gitignore` 结构的长期设计（仅在本次清理中按需放行白名单）
- 其他模块的遗漏审计补追
- 审计看板 `docs/audit/audit_dashboard.md` 的刷新（阶段 4 完成后单独跑 `scripts/audit/gen_audit_dashboard.py`）
