context-infra 检查与复盘infra.guiming.net · 全内容自包含呈现 · 生成于 2026-07-21 16:28 UTC

定时文件整理 agent 执行 SOP(FS-3)

Z3 全文↑ Z2 条目

术-流程 · 术层 skill 全文

← 返回术层 skill 索引 · 返回方法论区

本页是 <code>rules/skills/workflow_file_organization.md</code> 的逐字投影(仅隐私清洗,零改写)。

时点提示:本页是仓内文件 rules/skills/workflow_file_organization.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。

报告元数据(frontmatter)
name: workflow_file_organization
status: live
req_id: FS-3
task_id: T-FS3
session_id: dafd2d92-ce6d-438f-b968-c8886c7d527d
created_at: 2026-06-16
requirement_anchor: adhoc_jobs/context_infra_base_tooling_buildout_20260615/kimi_orchestrator_setup_20260616/OPTIMIZATION_BACKLOG.md

定时文件整理 agent 执行 SOP(FS-3)

真源:OPTIMIZATION_BACKLOG.md 域 A · FS-3;ORIGINAL_PROMPT_20260616.md 第 17 行、第 50-54 行。

本 SOP 供定时 agent 直接执行。它整合 FS-1(轻量记录)、FS-2/FS-5(归档纪律)、FS-6(archive 分类)、FS-4(命名与产物检查)的规则,只做文件系统层面的整理、归档和缺失入口补充,不修改任何实质内容。


1. 本 agent 的职责边界

只做四件事

  1. 发现应归档的目录/文件。
  2. 按规则把它们物理移动到 archive/redundant_archive/
  3. 补充缺失的必要入口文件(README.md / INDEX.md)。
  4. 整理轻量记录目录(若已存在)。

绝对不做


2. 执行入口

落地后路径:

python3 tools/file_organization/run_file_organization.py

默认行为是 dry-run:只报告会做什么,不真正移动。要实际执行必须加 --execute


3. 整理动作一览

3.1 发现归档候选

每次运行先扫描以下区域:

区域扫描对象判据
adhoc_jobs/顶层目录(排除 archive / redundant_archive / 嵌套 repo)(a) adhoc_jobs/INDEX.md 状态列含「归档 / 记录 / archive / archived」;(b) 目录 README 显式声明 obsolete / deprecated / 已归档;(c) 目录名带 _old / _obsolete / _deprecated 等遗留标记;(d) 未活跃时间 ≥ --min-age-days(默认 180 天)
轻量记录目录contexts/lightweight_records/ 下的记录文件status: completed 且创建日期超过 30 天
用户明确指令candidates.jsonl 或运行时参数用户/编排者直接指定要归档的路径和类型

发现结果写入运行报告,不自动移动。自动移动必须额外加 --allow-auto-archive

3.2 分类:常规 archive vs 冗余 archive

按 FS-6 区分轴:如果把这份内容彻底删掉,会不会丢掉一处别处没有的信息?

判定顺序(命中即停):

  1. 别处有没有更新/合并后的权威副本? → redundant_archivereason = superseded_by_merge / superseded_by_newer_versionsuperseded_by 指向权威副本。
  2. 是否从未成为正式记录(草稿 / demo / 空骨架)? → redundant_archivereason = never_canonical_draft / empty_skeleton
  3. 工作是否已完结,且本目录是唯一记录? → archivereason = project_completed / design_record_retained / run_log_retainedfinal_deliverable 指向最终交付物。
  4. 模糊(部分独有 + 部分重复)? → 默认拆分;拆分代价过大时按多数价值归类,并在 reason 写明依据。

脚本对自动发现的候选按启发规则预分类,最终分类需人确认或从 candidates.jsonl 读取。

冗余条目必须填 superseded_by。脚本若无法从 README/INDEX 提取该字段,会把候选标为 needs_review,执行前自动跳过。

3.3 物理移动

目标路径模板:

adhoc_jobs/archive/adhoc_jobs/<YYYY>/<source_basename>_<YYYY-MM-DD>/   # 常规
adhoc_jobs/redundant_archive/adhoc_jobs/<YYYY>/<source_basename>_<YYYY-MM-DD>/   # 冗余

3.4 更新引用(归档后引用处理,最低摩擦混合方案)

移动完成后,引用按三类处理,不重写历史(重写数千历史引用才是 git 混乱,且 reference_validator 不覆盖 adhoc_jobs、无法全量 CASCADE):

  1. 只更新活引用;redirect 桩仅在需要转发时才留
  2. 历史引用不重写runs/、日志、*.bak、旧报告里的引用保持原样,靠 redirect 桩解析。
  3. 语义 fallback(给读文件的 agent):当前路径找不到某内容时,去 archive/ + redundant_archive/ 找——原始记录不变,靠语义引导自动定位。

若跨嵌套 repo,记录为 stale,不强行修复。改名 _OBSOLETE 在内容已物理移动到 archive 后非必需(移动本身已表达过时)。

3.5 登记台账

每次移动在对应 manifest 追加一条 JSONL:

{
  "source_path": "adhoc_jobs/old_project_20260101",
  "target_path": "adhoc_jobs/archive/adhoc_jobs/2026/old_project_20260101_2026-06-16",
  "moved_at": "2026-06-16T03:00:00+02:00",
  "reason": "project_completed",
  "archive_type": "regular",
  "final_deliverable": "adhoc_jobs/archive/adhoc_jobs/2026/old_project_20260101_2026-06-16/README.md",
  "agent_session_id": "dafd2d92-ce6d-438f-b968-c8886c7d527d"
}

冗余条目必填 superseded_by,常规条目必填 final_deliverable


4. 缺失产物补充规则

4.1 adhoc_jobs 目录入口

对每个顶层 adhoc job 目录(排除 archive、redundant_archive、嵌套 repo),检查:

产物缺失时动作补充规则
README.md创建最小 stub首段说明「放什么 / 不放什么 / 典型场景」;加「相关目录」章节;frontmatter 留 status: unknown
INDEX.md当目录下文件/子目录超过 5 个且缺失时创建列出主要子目录或文件,一句话说明

只补充入口文件,不补充实质内容。

4.2 轻量记录目录整理

contexts/lightweight_records/ 已存在:

  1. 读取 INDEX.md,与实际文件对比,修正路径和状态不一致。
  2. task_type 分组;同类型非 archive 记录达 3 条时,建议升级到子目录(dry-run 报告,执行需 --execute)。
  3. status: completed 超过 30 天的记录物理移动到 archive/completed/archive/redundant/(按 FS-6 判定:frontmatter 含 archive_type: redundantsuperseded_by 时进 redundant)。
  4. 不删除任何记录文件。

4.3 产物 frontmatter 检查

对 2026-06-10 后新建的 .md 产物,检查 frontmatter 是否含 req_id / task_id / session_id / created_at。缺失时只记录到报告,不自动修改文件内容。


5. 运行流程(定时 agent 标准五步)

# Step 1: 发现候选(dry-run)
python3 tools/file_organization/run_file_organization.py scan --min-age-days 180 > /tmp/fs3_candidates_$(date +%Y%m%d).jsonl

# Step 2: 人工/编排者审查并确认 candidates.jsonl
# (可在此调用 Opus 做二次审查)

# Step 3: 执行归档 + 补充入口
python3 tools/file_organization/run_file_organization.py run \
  --candidates /tmp/fs3_candidates_$(date +%Y%m%d).jsonl \
  --create-stubs \
  --execute \
  --session-id <当前 session id>

# Step 4: 验证
python3 tools/reference_validator.py validate

# Step 5: 提交(本工作流是文件移动、骑 daily_digest 收集链兜底,按 git_safety §5 派发型机械 worker 例外不自己 commit)

6. 判据清单(agent 自验)

每次运行结束前逐项确认:


7. 与相关条目的衔接

条目衔接点
FS-1 轻量记录整理 contexts/lightweight_records/;按 task_type 分组、归档 completed 超 30 天记录
FS-2 / FS-5 归档纪律物理移动、不留指针、不做内容增补、纠正错放
FS-6 archive 分类区分 adhoc_jobs/archive/adhoc_jobs/redundant_archive/,按四问判定
FS-4 命名/产物检查补充 README/INDEX stub 时遵循信息气味原则;归档目录命名保留原 basename + 日期
FS-7 分级注入本 SOP 本身只需注入给「文件整理 agent」;普通任务 agent 不需要读取
rules/git_safety.md禁用破坏性命令;stage 用白名单;不跨嵌套 repo 边界
rules/WORKSPACE.md文件存放架构是判据来源;具体动作由本 SOP 细化
rules/ARCHIVE_SOP.md物理移动、不留指针、不做内容增补、常规 / 冗余 archive 判据、分类四问、台账 schema 的唯一真源

8. 验收信号对照

Backlog FS-3 验收信号:一份可被定时 agent 直接执行的文件整理 SOP(整理动作 + 判据 + archive 规则 + 缺失产物补充规则)。


9. 遗留问题

  1. 自动发现中的「未活跃时间」阈值(默认 180 天)需根据实际运行数据校准。
  2. candidates.jsonl 的审查责任由人还是由编排者承担,需在本 SOP 落地时明确。
  3. 冗余 archive 的保留期(如 90 天后可安全删除)未在本 SOP 中硬编码,待后续审计需求明确。

← 返回术层 skill 索引 · 返回方法论区