# Change: Add Clean ## Why The `check` capability writes a machine report and a human report, but nothing acts on them. The `SessionStart` banner already tells users their docs may be stale and advertises `/hygiene check`; the check skill now delivers a report — but the feature loop is still open: **no `/hygiene clean` or `/hygiene sweep` exists**, so the report sits in `.dochygiene/` and nothing is ever fixed. `patch_applier.py` and its 263 tests are already built; this change wires the remaining pieces so the plugin actually remediates doc rot. ## What Changes - **`patch_applier.py`** (already built — 263 tests pass): a standalone deterministic script that applies a report's entries to project files in per-file transactions, with a content-hash guard, incompatible-ops detection, and precise git staging. Marked DONE in the task list. - **`skills/hygiene-clean/SKILL.md`**: the orchestration skill — loads the current report, partitions entries by safety tier and op type, gates `confirm`-tier entries with a batch-confirm prompt (per-entry opt-out), applies deterministic entries via `patch_applier.py`, delegates generative entries to a Sonnet subagent (via `workflows/distill.md`), stages precisely, and commits once via `git-context commit-apply`. - **`workflows/distill.md`**: the generative Sonnet workflow invoked for `distill`/`split`/`generative` entries; isolated from the skill via a LOOP-GUARD subagent pointer. - **`commands/hygiene.md` update**: replaces the "not yet implemented (Phase 4)" stubs for `clean` and `sweep` with live routing to the `hygiene-clean` skill. - **Integration tests** (`tests/test_clean_integration.py`): fixture-repo tests covering invariant #5 GAP (dirty→checkpoint+exactly-one cleanup commit; clean→one commit; all-skipped→zero commits) and invariant #7 sweep-gating GAP (confirm escalates under `sweep`). ## Capabilities ### New Capabilities - `doc-clean`: the clean pipeline and its guarantees — the `hygiene-clean` skill orchestration (load report → gate confirms → git preflight → apply deterministic entries → dispatch generative → stage precisely → single commit → stamp `last_clean`), the per-file transaction model in `patch_applier.py` (content-hash guard, descending-anchor application, incompatible-ops detection, precise staging), safety-tier gating (invariant #7), git-safety (invariant #5: WIP checkpoint, single commit, tracked-files-only, rollback on hard failure), and the `sweep` composition (`/hygiene sweep` = check-then-clean without double-commit). One capability because the applier, the skill, the gating, and git safety are a single atomic pipeline — splitting them would scatter tightly coupled guarantees across capability boundaries. ### Modified Capabilities None. The `doc-check` capability is **consumed, not modified** — the clean skill reads the report written by check without changing any check requirement. ## Impact - **Affected specs:** creates one new capability — `doc-clean`. Consumes the frozen `report-schema`, `doc-scanner`, `state-store`, and `doc-check` capabilities without modifying them. - **Affected code:** introduces `skills/hygiene-clean/SKILL.md`, `workflows/distill.md`, integration tests, and CONTEXT.md updates for `skills/hygiene-clean/` and `scripts/`. Updates `commands/hygiene.md` (stub replacement only — no structural change). `patch_applier.py` and its unit tests already exist and pass. - **Out of scope (named owners):** - `token_estimate` weighting (`injection_frequency`, `weighted_tokens`, bottom-up rollup) — v2 bonus per PRD phase 5. - Link rewrite after `move-to-archive` — v1 moves only, next `/hygiene check` flags new orphans. - Live model-classification regression harness — separate, manually invoked. - **Dependencies:** depends on `report-schema` (frozen), `doc-scanner`, `state-store`, `doc-check` (produces the report this change consumes), and the already-built `patch_applier.py`. No upstream capability specs are modified.