| name | progress-hygiene |
| description | Progress tree methodology — single source of truth location matrix, frontmatter discipline, tree expansion protocol, and new-session handoff generation for project progress tracking. Use when creating a new progress file, opening a child subtree, generating a handoff prompt for a fresh session, or auditing an existing project for progress-file drift. Answers "where does the progress file live", "when do I open a child", and "how does a new session continue the work". Pairs with progress-hygiene-rules for MUST/NEVER constraints. MUST read SKILL.md BEFORE creating, moving, or restructuring any progress file. |
| license | MIT |
| metadata | {"author":"motiful","version":"1.0"} |
Progress Hygiene — Progress Tree Methodology
Progress tracking in AI-agent projects has three recurring failure modes: ambiguous location (where does the file live?), lost lineage (what was decided when?), and failed handoff (new session can't pick up). This skill fixes all three by treating progress as a tree of frontmatter-tagged documents with exactly one location per project archetype.
Pairs with progress-hygiene-rules which carries the MUST/NEVER constraints.
When to Use
- Creating a progress file in a new or existing project
- Opening a child subtree because the parent is growing
- Generating a handoff prompt for a new Claude Code session
- Auditing an existing project for drift or missing frontmatter
- Deciding whether a project needs to graduate from flat
progress.md to a tree
Execution Procedure
Five entry points, one per action. Each sub-EP maps 1:1 to a trigger phrase in the description and is independently invocable. A primitive like write_file or read is filesystem I/O and is not sourced from a reference.
EP — Create New Document
Triggered by: "where does this progress file go", "start a new progress doc", "add a research phase".
def create_new_document(project, kind, title, body):
"""Create a progress or research document at the correct location with valid frontmatter.
kind: one of "progress_child", "research_child", "progress_flat", "tree_entry"
"""
root = locate_progress_root(project)
assert root is not None, "archetype unclear — ask user"
path = derive_path(root, kind, title)
validate_naming(path, kind)
frontmatter = render_frontmatter(
title=title, created=today(), updated=today(), status="draft",
)
write_file(path, frontmatter + body)
return path
EP — Open Subtree
Triggered by: "this progress file is getting long", "open a child for this subtask".
def open_subtree(parent_file):
"""Split a parent progress file into a subtree when a trigger fires."""
if not decide_subtree(parent_file):
return None
child_dir = create_child_tree(parent_file)
scaffold_child_readme(child_dir, parent_file)
update_parent_pointer(parent_file, child_dir)
return child_dir
EP — Generate Handoff
Triggered by: "new session handoff", "end of session, hand off to next".
def generate_handoff(progress_root):
"""Generate and save a new-session handoff prompt from the tree's active node."""
active_node = find_active_node(progress_root)
prompt = generate_handoff_prompt(active_node)
path = save_prompt_to_tree(prompt, progress_root)
return path
EP — Incoming Session
Triggered by: "new session, just got handed off", "continuing work from a prior session".
def incoming_session(progress_root):
"""Read-order and confirmation gate for a new session entering an existing tree.
MUST confirm understanding with the user before any work begins.
"""
files = read_incoming_files(progress_root)
for path in files:
read(path)
confirm_understanding_with_user()
EP — Audit Existing
Triggered by: "audit this project for progress drift", "how do I migrate old PROGRESS.md files".
def audit_existing(project):
"""Scan a project for progress-file drift; produce a migration report (no file changes).
Output is a markdown report saved to `<project>-backstage/plan/<project>-progress-migration.md`
(or equivalent per archetype). The report is the input to execute_migration below.
"""
findings = audit_project(project)
return report_findings(findings)
EP — Execute Migration
Triggered by: "run the migration I audited", "execute progress-file migration", "migrate this finding".
def execute_migration(findings):
"""Execute migrate_file for each finding. One commit per finding — no batching.
Typically invoked after audit_existing produced findings and the user has reviewed
the saved plan. Blocked findings are skipped (their blocker must clear first).
"""
for finding in findings:
if finding["blockers"]:
skip_with_reason(finding)
continue
migrate_file(finding)
Enforcement is delegated to progress-hygiene-rules (companion augmenter). Any of these sub-EPs triggers its MUST/NEVER constraints on the files touched; this capability skill does not duplicate enforcement logic.
The Core Invariants
Four invariants drive every decision in this skill. If any breaks, the methodology fails.
I1. Exactly one progress root per project
Determined by references/location-matrix.md. Two roots inevitably drift — the 2026-04-18 design-playbook incident is the proof case. Ambiguity at the location level is structurally worse than any discipline failure because the ambiguity itself creates the discipline failure.
I2. Every document carries frontmatter
Title, created, updated, status — minimum. references/frontmatter-spec.md has the full schema. An agent (or a human three months later) must be able to tell what a document is, when it was written, and whether it is still current without reading the body. Filesystem mtime is not a substitute.
I3. Progress is a tree, not a file
When a flat progress file would exceed ~150 lines, open a child. references/tree-structure.md defines when and how. The parent references the child by pointer — summary line plus link, never duplicating content. Copy-style references always drift; pointer-style references cannot.
I4. The tree is self-documenting for handoff
A fresh session joining the project reads at most 3-5 files to know exactly what to do next: CLAUDE.local.md → root README → active node. references/handoff-protocol.md defines the read order and the prompt template. If a fresh session needs 10+ files or private chat history to continue, the tree has failed and needs reshaping.
The Archetypes at a Glance
| Archetype | Progress root |
|---|
| A1. Public code + backstage | <project>-backstage/progress/ |
| A2. Standalone skill (no backstage) | <skill>/progress.md (flat) |
| A3. Augmented skill workspace | <primary>-backstage/progress/ |
| B. Private monorepo | docs/progress/ |
Full decision procedure and rationale in references/location-matrix.md. These are the only four legitimate patterns — everything else is a migration case.
Naming at a Glance
| Kind | Rule |
|---|
| Progress root directory | progress/ (lowercase) |
| Progress tree entry | README.md |
| Progress children | NN-<slug>.md (zero-padded two-digit prefix, kebab slug) |
| Skill references | No NN- prefix (functional modules, not timeline) |
| Research topic entries | research/<topic-slug>/README.md |
| Research children | NN-<slug>.md |
Full rules and exceptions in references/naming-convention.md. The NN- rule applies only to time/logic-ordered trees; applying it to skill references is a category error.
Frontmatter at a Glance
---
title: <human-readable>
created: YYYY-MM-DD
updated: YYYY-MM-DD
status: draft | active | stale | archived
---
Optional fields (type, parent, owner, supersedes, tags) documented in references/frontmatter-spec.md. Dates are always absolute YYYY-MM-DD, never relative.
Handoff at a Glance
Outgoing session produces a prompt file from the active node of the tree. Incoming session reads:
CLAUDE.md, CLAUDE.local.md
- Progress root
README.md
- Active-node file
- Any files the active node explicitly links to
Full template and verification checklist in references/handoff-protocol.md.
Relationship to Other Skills
- progress-hygiene-rules (companion augmenter) — MUST/NEVER constraints. Auto-loads on any progress file edit. This skill teaches; that skill enforces.
- repo-scaffold — defines the project archetypes (A1/A2/A3/B) that this skill's location matrix keys off of. When scaffolding a new project, repo-scaffold creates the directories; progress-hygiene fills them.
- progress-archive (deprecated, archived 2026-04) — single-purpose predecessor covering only the 200-line archive rule. Its constraint is absorbed into progress-hygiene-rules. Existing progress-archive installations should uninstall and switch to this pair.
References
references/location-matrix.md — Single-root location rules per archetype, forbidden locations, verification checklist
references/naming-convention.md — Directory/file naming, NN- prefix rule, skill-references exception, casing
references/frontmatter-spec.md — Required and optional fields, status enum, date format, enforcement
references/tree-structure.md — When to open a child, parent-child pointer format, max nesting depth, status propagation
references/handoff-protocol.md — Incoming read order, outgoing prompt template, verification before handoff
references/migration-playbook.md — Generic audit/classify/migrate/report procedure for retrofitting existing projects to the methodology (no project-specific inventory — that lives in each project's backstage)