tidy
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: tidy
Skill: tidy
WHAT
WHAT
Purpose và context
目的与上下文
- Purpose: dọn + validate kho nháp và render (+
wiki/sources/draft/*.md) khi phình to: PROMOTE bản chất quý lên wiki, ARCHIVE nháp đã xong (tracked, không xoá), KEEP canonical, rồi RE-INDEX.llmwiki/html/*.html - Trigger (when to use):
- Đầu phiên thấy — hook
🧹 [tidy] draft/ có N file .md tầng gốc (> ngưỡng 10)hỏi user; user ĐỒNG Ý → chạy skill này. User TỪ CHỐI → bỏ qua, không hỏi lại trong phiên.session_start.py - User tự gọi khi thấy
/tidyhoặcdraft/lộn xộn, khó tìm, sợ mất bản chất quý.llmwiki/html/ - bước 8c (docs-sprawl pulse) hoặc
/lintprobemedicbáo warn.tidy
- Đầu phiên thấy
- Non-goals: không xoá nháp, không archive draft còn sống chỉ vì cũ, không "sửa cho đúng chuẩn" file đã nằm trong .
archive/
- 目的: 当草稿库与渲染内容(+
wiki/sources/draft/*.md)膨胀时,执行清理 + 校验:PROMOTE 有价值的核心内容到 wiki,ARCHIVE 已完成的草稿(tracked,不删除),KEEP canonical 内容,然后 RE-INDEX。llmwiki/html/*.html - 触发条件(何时使用):
- 会话开始时看到 ——hook
🧹 [tidy] draft/ có N file .md tầng gốc (> ngưỡng 10)会询问用户;用户同意 → 运行此 skill。用户拒绝 → 跳过,且本会话内不再询问。session_start.py - 用户自行调用 ,因为
/tidy或draft/显得杂乱、难以查找,担心丢失有价值的核心内容。llmwiki/html/ - 的步骤 8c(docs-sprawl pulse),或
/lintprobemedic报告 warn。tidy
- 会话开始时看到
- 非目标: 不删除草稿;不因草稿仍然活跃就仅仅因为它很旧而将其 archive;不“修正到符合规范”已位于 中的文件。
archive/
Mental model
思维模型
Vì sao 3 tầng (không chỉ "merge"): Cái QUÝ trong nháp là quyết định / bài học / pattern — nó phải lên wiki (concept/ADR, travel + được commit + được index). Còn nháp đã thi hành xong và render html là lịch sử → archive (giữ, không xoá). Tool tất định lo đếm + phân loại + dời + index; phần đọc-hiểu để promote là việc của agent.
draft/ + html/ → check (đếm) → plan (KEEP · ARCHIVE · PROMOTE?) → agent promote → apply (git mv vào archive/<nhóm>/) → re-index → verify + commit为什么是三层(不只是“合并”):草稿中的精华是决策 / 经验 / pattern——它必须进入 wiki(concept/ADR,完成 travel + commit + index)。已完成并 render 为 html 的草稿属于历史 → archive(保留,不删除)。确定性工具负责计数 + 分类 + 移动 + index;需要阅读、理解并执行 promote 的部分由 Agent 负责。
draft/ + html/ → check(计数)→ plan(KEEP · ARCHIVE · PROMOTE?)→ Agent promote → apply(通过 git mv 移入 archive/<组>/)→ re-index → verify + commitInput và output contract
输入与输出约定
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | | không (mặc định 10) | ngưỡng số file |
| In | | không (mặc định 2) | số mốc ngày html report giữ lại |
| In | | không | dùng khi downstream không có |
| Out | bảng plan | có | KEEP / ARCHIVE / PROMOTE? kèm lý do từng file |
| Out | ADR/concept mới trong wiki | theo nội dung | bản chất quý đã promote, có |
| Out | rename vào | có (khi apply) | git thấy rename, không delete |
| 字段 | 是否必需? | 含义 | |
|---|---|---|---|
| 输入 | | 否(默认 10) | 根层级 |
| 输入 | | 否(默认 2) | 保留的带日期 html report 数量 |
| 输入 | | 否 | 当 downstream 环境中没有 |
| 输出 | plan 表 | 是 | 包含每个文件的 KEEP / ARCHIVE / PROMOTE? 及原因 |
| 输出 | wiki 中新建的 ADR/concept | 根据内容而定 | 已 promote 的精华,包含 |
| 输出 | 重命名至 | 是(apply 时) | git 将其识别为 rename,而非 delete |
Rules và capabilities
规则与能力
- RULE-01 (MUST): PROMOTE trước APPLY. Archive giờ TRACKED nên promote-sau vẫn làm được, nhưng đừng để bản chất chôn dưới mà không ai biết.
archive/ - RULE-02 (MUST): Archive = DỜI, KHÔNG XOÁ. Không bao giờ nháp;
rmgiữ history (git mv).git log --follow - RULE-03 (MUST): Tuổi không phải lý do archive một draft còn . Chỉ status/task đã xong (hoặc PLAN/seq đi theo SPEC đã archive) mới archive. Muốn dọn draft treo → người quyết, đổi status, chạy lại.
status: proposed/open/implementing - RULE-04 (MUST): Canonical (,
overstack.html,index.html,wiki-graph.html,*-cheatsheet,*-health-dashboard,problem-tree) không bao giờ archive. Html report có ngày: giữ 2 mốc ngày gần nhất (line-status), cũ hơn archive — html là render, không áp cho--keep-dates N..md - RULE-05 (MUST): Vai rõ: tool = đếm/phân loại/dời/re-index (tất định, 0 token); agent = promote (đọc-hiểu). Không lẫn.
- RULE-06 (MUST): Wiki entry mới phải có + frontmatter
## Origin(R2/R9); cập nhậttype+wiki/index.md(R3).wiki/log.md - RULE-07 (MUST): Validator R7/R9/R18 và /
wiki-healthbỏ quaindex_sync(nháp đông cứng) — đừng "sửa cho đúng chuẩn" file trong archive, chúng là lịch sử.archive/ - Capabilities: đọc draft/html + frontmatter; dời file bằng git (tracked rename); ghi wiki (ADR/concept/index/log); chạy kiểm wiki-health/index_sync cục bộ.
- RULE-01(必须):先 PROMOTE,再 APPLY。 Archive 目前是 TRACKED,因此延后 promote 仍然可行,但不要让精华被埋在 下而无人知晓。
archive/ - RULE-02(必须):Archive = 移动,不删除。 绝不要使用 删除草稿;
rm会保留 history(git mv)。git log --follow - RULE-03(必须):草稿仍为 时,年龄不能成为 archive 的理由。 只有 status/task 已完成(或 PLAN/seq 跟随已 archive 的 SPEC)时才能 archive。若要清理悬而未决的 draft,需要由用户决定,修改 status,然后重新运行。
status: proposed/open/implementing - RULE-04(必须):Canonical(、
overstack.html、index.html、wiki-graph.html、*-cheatsheet、*-health-dashboard、problem-tree)永不 archive。带日期的 html report:保留最近 2 个日期节点(line-status),更早的则 archive——html 是 render,不适用于--keep-dates N。.md - RULE-05(必须):职责明确:工具 = 计数/分类/移动/re-index(确定性,0 token);Agent = promote(阅读并理解)。不得混淆。
- RULE-06(必须):新建的 Wiki entry 必须包含 + frontmatter
## Origin(R2/R9);更新type+wiki/index.md(R3)。wiki/log.md - RULE-07(必须):Validator R7/R9/R18 和 /
wiki-health必须跳过index_sync(已冻结的草稿)——不要“修正到符合规范” archive 中的文件,它们属于历史。archive/ - 能力:读取 draft/html + frontmatter;通过 git 移动文件(tracked rename);写入 wiki(ADR/concept/index/log);在本地运行 wiki-health/index_sync 检查。
Failure boundaries
失败边界
- exit 3 = vượt ngưỡng → đi tiếp plan; dưới ngưỡng và user không tự gọi → dừng, không có gì dọn.
check - Draft treo () → clarify: hỏi user làm-tiếp hay reject, không tự archive.
status: proposed/open… - Đích archive bị → tool từ chối dời (chủ ý), in dòng gitignore cần bỏ → blocked cho file đó.
.gitignore - hoặc
wiki-health --fail-on brokenđỏ → failed, sửa trước khi commit.index_sync
- exit 3 = 超出阈值 → 继续进入 plan;低于阈值且用户未手动调用 → 停止,不做任何清理。
check - 悬而未决的 draft()→ clarify:询问用户是继续还是 reject,不得自行 archive。
status: proposed/open… - Archive 目标被 → 工具拒绝移动(有意为之),并打印需要移除的 gitignore 行 → 对该文件而言为 blocked。
.gitignore - 或
wiki-health --fail-on broken为红色 → failed,commit 前先修复。index_sync
HOW
HOW
Main workflow
主工作流
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | | Check (0 token, không đụng file): | exit 3 = vượt ngưỡng | dưới ngưỡng → dừng trừ khi user tự gọi |
| W02 | deterministic | draft + html | Plan (dry-run): | bảng KEEP/ARCHIVE/PROMOTE? | draft treo → B01; cờ outdated → B02 |
| W03 | judgment | mục PROMOTE? + ARCHIVE có quyết định | PROMOTE bản chất quý vào wiki TRƯỚC khi apply | ADR/concept + index + log | đã có trong wiki → chỉ archive |
| W04 | effect | plan | Apply: | rename + index | đích gitignored → B03 |
| W05 | deterministic | worktree | Verify + commit: | commit + log | đỏ → sửa, lặp W05 |
Chi tiết từng bước (nguồn chân lý cho W01–W05, bước 0–4):
- Check (0 token, không đụng file):
Exit 3 = vượt ngưỡng (mặc định 10 filebash
python3 harness/scripts/tidy.py check # downstream không có harness/: python3 ~/.claude/harness/harness/scripts/tidy.py check --root .tầng gốc, thư mục con không tính; đổi bằng.mdhoặc env--threshold N).OVERSTACK_DRAFT_THRESHOLD - Plan (dry-run): → bảng KEEP / ARCHIVE / PROMOTE? kèm lý do từng file. Đọc kỹ cột lý do:
python3 harness/scripts/tidy.py plan- hoặc
OUTDATED — status done|implemented|…→ nháp đã xong → ARCHIVE.task T-… đã done - → còn sống, tuổi không phải lý do archive; muốn dọn thì hỏi user quyết làm-tiếp hay reject (đổi
⏱ TREO — status proposed/open…trong frontmatter rồi chạy lại).status: - = draft không status, không task → agent đọc rồi quyết.
PROMOTE? - dưới một draft GIỮ = file nó trích dẫn đã chết (claim-receipts) hoặc code nó nói tới đã đổi sau khi viết (cờ
↳ ⚠ nội dung có thể outdatedtrongcode-drift). Status còn sống không có nghĩa là nội dung còn đúng: đối chiếu với code, rồi (a) đã làm xong → đổi status và archive, (b) còn làm → sửa đúng câu sai, (c) bỏ →stale.jsonhoặc dờirejected. Có dương tính giả (đường dẫn ví dụ), nên phải đọc trước khi kết luận.need-review/
- PROMOTE bản chất QUÝ vào wiki — làm TRƯỚC khi apply (phán đoán của agent): với mỗi mục và mỗi mục ARCHIVE có vẻ chứa quyết định/bài học chưa có trong wiki → viết
PROMOTE?(quyết định) hoặcllmwiki/wiki/sources/adr/ADR-NNN-<slug>.md(khái niệm), đúng frontmatterllmwiki/wiki/concepts/<slug>.md+type:trỏ draft; cập nhật## Origin+wiki/index.md. Đã có trong wiki → chỉ archive. Không promote thứ tầm thường (report tiến độ, render trùng).wiki/log.md - Apply: — dời nhóm ARCHIVE vào
python3 harness/scripts/tidy.py apply(file tracked →archive/<proposals|superseded|analysis|reports>/, git thấy rename không delete), sắp xếp cả file đã archive từ trước, rồi re-index (git mvnếu có,build-docs-index,index_sync --fix).html/archive/INDEX.md- Tool từ chối dời file tracked khi đích bị (dời = xoá khỏi repo) và in dòng gitignore cần bỏ. Đây là chủ ý, không phải lỗi.
.gitignore
- Tool từ chối dời file tracked khi đích bị
- Verify + commit: chỉ thấy rename/
git status;archive/INDEX.mdsạch (wikilink trỏ stem trong archive/ = resolved-frozen, không broken);python3 harness/scripts/wiki-health.py --wiki-dir llmwiki/wiki --fail-on brokenxanh. Commit gồm ADR/concept mới promote + các rename. Appendindex_sync.wiki/log.md
| 步骤 | 类型 | 输入 | 操作 | 输出/退出码 | 失败/下一步 |
|---|---|---|---|---|---|
| W01 | 确定性 | | Check(0 token,不接触文件): | exit 3 = 超出阈值 | 低于阈值 → 停止,除非用户手动调用 |
| W02 | 确定性 | draft + html | Plan(dry-run): | KEEP/ARCHIVE/PROMOTE? 表 | 悬而未决的 draft → B01;标记 outdated → B02 |
| W03 | 判断 | | 在 apply 之前,将有价值的核心内容 PROMOTE 到 wiki | ADR/concept + index + log | 已存在于 wiki → 只 archive |
| W04 | 执行变更 | plan | Apply: | rename + index | 目标被 gitignore → B03 |
| W05 | 确定性 | worktree | Verify + commit: | commit + log | 红色 → 修复,重复 W05 |
以下各步骤的详细信息(W01–W05 的真实来源,对应步骤 0–4):
- Check(0 token,不接触文件):
Exit 3 = 超出阈值(默认 10 个根层级bash
python3 harness/scripts/tidy.py check # downstream 没有 harness/ 时:python3 ~/.claude/harness/harness/scripts/tidy.py check --root .文件,子目录不计入;使用.md或环境变量--threshold N修改)。OVERSTACK_DRAFT_THRESHOLD - Plan(dry-run): → 包含每个文件 KEEP / ARCHIVE / PROMOTE? 及原因的表。仔细阅读原因列:
python3 harness/scripts/tidy.py plan- 或
OUTDATED — status done|implemented|…→ 草稿已完成 → ARCHIVE。task T-… đã done - → 仍然活跃,年龄不能成为 archive 的理由;若要清理,询问用户是继续还是 reject(修改 frontmatter 中的
⏱ TREO — status proposed/open…,然后重新运行 plan)。status: - = draft 没有 status,也没有 task → 由 Agent 阅读后决定。
PROMOTE? - 某个 KEEP 草稿下方的 表示它引用的内容已经失效(claim-receipts),或其描述的代码在撰写后已经改变(
↳ ⚠ nội dung có thể outdated中的stale.json标记)。status 仍然活跃并不代表内容仍然正确:应与代码核对,然后:(a) 已完成 → 修改 status 并 archive;(b) 仍在进行 → 修正错误的陈述;(c) 放弃 → 设置为code-drift或移至rejected。可能存在假阳性(例如示例路径),因此必须阅读后再下结论。need-review/
- 将精华 PROMOTE 到 wiki——在 apply 之前执行(由 Agent 判断): 对于每个 项,以及每个包含尚未收录到 wiki 的决策/经验的 ARCHIVE 项 → 写入
PROMOTE?(决策)或llmwiki/wiki/sources/adr/ADR-NNN-<slug>.md(概念),使用正确的 frontmatterllmwiki/wiki/concepts/<slug>.md+ 指向 draft 的type:;更新## Origin+wiki/index.md。若 wiki 中已存在 → 只 archive。不要 promote 琐碎内容(进度 report、重复 render)。wiki/log.md - Apply: ——将 ARCHIVE 组移入
python3 harness/scripts/tidy.py apply(tracked 文件 →archive/<proposals|superseded|analysis|reports>/,git 将其识别为 rename 而非 delete),同时重新整理此前已 archive 的文件,然后 re-index(若存在则运行git mv,运行build-docs-index,并更新index_sync --fix)。html/archive/INDEX.md- 工具拒绝移动目标被 覆盖的 tracked 文件(移动意味着从 repo 中删除),并打印需要移除的 gitignore 行。这是有意设计,不是错误。
.gitignore
- 工具拒绝移动目标被
- Verify + commit: 只应显示 rename/
git status;archive/INDEX.md应为干净状态(指向 archive/ 中 stem 的 wikilink = resolved-frozen,不算 broken);python3 harness/scripts/wiki-health.py --wiki-dir llmwiki/wiki --fail-on broken应为绿色。Commit 包含新 promote 的 ADR/concept + 各项 rename。追加index_sync。wiki/log.md
Branches
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | plan báo | giữ; muốn dọn thì hỏi user làm-tiếp hay reject, đổi | user không quyết → KEEP | W02 |
| B02 | conditional_required | dòng | đối chiếu code: (a) xong → đổi status + archive, (b) còn làm → sửa đúng câu sai, (c) bỏ → | dương tính giả (đường dẫn ví dụ) → giữ nguyên | W03 |
| B03 | recovery | tool từ chối dời vì đích bị | báo user dòng gitignore cần bỏ; không lách bằng xoá | user không bỏ → file đó ở yên | W04 |
| ID | 类型 | 守卫条件 | 行为 | 跳过/失败 | 汇合点 |
|---|---|---|---|---|---|
| B01 | 条件必需 | plan 报告 | 保留;如需清理,询问用户是继续还是 reject,修改 | 用户未决定 → KEEP | W02 |
| B02 | 条件必需 | KEEP 草稿下方出现 | 与代码核对:(a) 已完成 → 修改 status + archive;(b) 仍在进行 → 修正错误的陈述;(c) 放弃 → | 假阳性(例如示例路径)→ 保持不变 | W03 |
| B03 | 恢复 | 工具因目标被 gitignore 而拒绝移动 | 向用户报告需要移除的 gitignore 行;不得通过删除绕过 | 用户不移除 → 该文件保持原位 | W04 |
Validation và stopping
验证与停止条件
Tất định: (mục Test tất định dưới), sạch, xanh, chỉ thấy rename/. Cần review: quyết định PROMOTE (agent đọc-hiểu). Dừng sau W05 commit; không lặp apply nhiều lần trong một phiên nếu plan không đổi.
bash harness/tests/tidy-test.shwiki-health --fail-on brokenindex_syncgit statusarchive/INDEX.md确定性验证:(见下方“确定性测试”)、 无异常、 为绿色,且 仅显示 rename/。需要审核:PROMOTE 决策(由 Agent 阅读并理解)。在 W05 commit 后停止;如果 plan 没有变化,不应在同一会话中多次执行 apply。
bash harness/tests/tidy-test.shwiki-health --fail-on brokenindex_syncgit statusarchive/INDEX.mdExamples
示例
- Positive: đầu phiên báo , user đồng ý → plan: 40 ARCHIVE (status done), 4 PROMOTE?, 13 KEEP → agent viết 1 ADR cho quyết định chưa có trong wiki →
[tidy] draft/ có 57 file→tidy.py applychỉ thấy rename →git statussạch → commit.wiki-health - Boundary/failure: draft 3 tháng tuổi → plan đánh
status: proposed, KHÔNG archive; hỏi user làm-tiếp hay reject. Đích⏱ TREObị gitignore → apply từ chối dời file tracked đó và in dòng gitignore cần bỏ.archive/reports/
- 正向示例: 会话开始时提示 ,用户同意 → plan:40 ARCHIVE(status done)、4 PROMOTE?、13 KEEP → Agent 为 wiki 中尚不存在的决策撰写 1 篇 ADR →
[tidy] draft/ có 57 file→tidy.py apply只显示 rename →git status干净 → commit。wiki-health - 边界/失败: 一个 且已有 3 个月的 draft → plan 标记
status: proposed,不 archive;询问用户是继续还是 reject。⏱ TREO目标被 gitignore → apply 拒绝移动该 tracked 文件,并打印需要移除的 gitignore 行。archive/reports/
Test tất định
确定性测试
bash harness/tests/tidy-test.sh>10bash harness/tests/tidy-test.sh>10