Progress Hygiene Rules — Hard Constraints
Companion rule-skill to progress-hygiene. This file enforces; the capability skill teaches.
Treat every MUST/NEVER below as equivalent authority to platform-native rule files. Meta-rule protocol (rules-as-skills) raises load priority to MUST-level automatically on any -rules suffix skill.
Immutable by agent self-modification.
Scope
Applies to every file that participates in a project progress tree or research tree. Specifically:
progress/ directories and their descendants
progress.md files (flat, Archetype A2)
research/<topic>/ trees
<project>-backstage/progress/ under split-repo archetypes
- Any
PROGRESS.md or progress.md file currently existing (migration targets)
Does not apply to: skill references/ directories, skill scripts/, design documents, or code files.
Location Constraints
- MUST locate exactly one progress root per project, determined by the project archetype per the progress-hygiene location matrix. Two roots cause drift; non-matrix locations cause confusion.
- NEVER place progress files under any
.claude/, .agents/, or other agent-workspace directory. Those directories are for skill/rule/setting config, not project state.
- NEVER maintain two progress files in the same project with mutual cross-references. The design-playbook 2026-04-18 incident is the reference failure mode.
- MUST declare "Source of Truth" explicitly at the top of the authoritative progress root when the project legitimately has multiple related repos (e.g., skill + backstage). Agents editing other repos must see this declaration and edit the SoT only.
Frontmatter Constraints
- MUST include a YAML frontmatter block with
title, created, updated, status on every progress, research, and tree-entry document.
- MUST use absolute ISO dates (
YYYY-MM-DD). NEVER use relative phrasing (yesterday, Thursday, last week) in these fields.
- MUST use exactly one of the four
status values: draft, active, stale, archived. No synonyms or custom states.
- MUST update the
updated field on every substantive edit.
- NEVER use filesystem
mtime as a substitute for the updated field. mtime is clobbered by git clone, editor auto-save, and indexers.
Naming Constraints
- MUST use lowercase directory names (
progress/, not Progress/ or PROGRESS/).
- MUST name tree entry files
README.md, not index.md or redundant PROGRESS.md.
- MUST use zero-padded two-digit
NN-<slug>.md prefix for children of progress/ and research/<topic>/ trees. Order reflects creation sequence, not current priority.
- NEVER apply
NN- prefix to skill references/, scripts/, or design/ directories. Those are functional modules, not timelines — prefixing them misrepresents the structure.
- NEVER rename files to reflect priority changes. Use the
status field and parent summary line instead; the prefix preserves chronology.
Tree Structure Constraints
- MUST open a child subtree before the parent progress file exceeds ~150 lines, or when a subtask is complex enough to spawn its own session.
- MUST reference children from parents by pointer — summary line plus relative link. NEVER duplicate child content into parent text; copy-style references always drift.
- MUST use relative paths in all parent-child and archive links. Absolute paths break when the repo is cloned or moved.
- MUST update the parent summary line when a child's
status transitions (active → archived, etc.) within the same commit.
- NEVER exceed 3 levels of nesting below the progress root. Level-3 children usually indicate a task decomposition failure, not a depth requirement.
Archive Constraints
Inherited from the deprecated progress-archive skill and extended:
- MUST archive completed phases when a progress file exceeds ~200 lines. Long files waste agent context and bury current state.
- MUST preserve archived text verbatim. Archive is a historical record, not a summary.
- MUST archive a section only when all its sub-tasks are complete. Sections with open sub-tasks must be restructured first — move the incomplete tasks to an active section, then archive the rest.
- MUST keep all incomplete tasks and their context untouched in the main file. Removing context that open tasks depend on breaks continuity.
- MUST name archive files with a date suffix:
{original-stem}-{milestone}-{YYYY-MM-DD}.md.
- NEVER summarize, paraphrase, or rewrite content when archiving. Lossy compression destroys decisions and rationale that future work depends on.
- NEVER delete completed content. Archive is move, not delete.
- SHOULD keep recent update-log entries (last ~2 weeks of changes) in the main file and move older entries with the archive. The main file carries current-momentum signal; deep history belongs in the archive. Inherited verbatim from the deprecated
progress-archive skill's line 23.
Compression Stub Template
When a section is archived, leave this stub in the main file:
## [Phase/Milestone Name] — Archived
**Completed**: YYYY-MM-DD
**Archive**: `relative/path/to/archive-file.md`
**Summary** (headline only, not content):
- Key output 1
- Key output 2
**Decisions carried forward** (affecting open work):
- Decision 1
- Decision 2
The stub exists to give context to open work, not to reproduce archived detail. If you find yourself copying content into the stub, stop — the archive file is one click away.
Handoff Constraints
- MUST generate a handoff prompt from the progress tree, not from chat history. The tree carries state; chat history is ephemeral.
- MUST name specific files for the incoming session to read (3-5 files). NEVER instruct the new session to "read everything" or "continue where we left off".
- MUST include a first-step confirmation gate in the handoff prompt: incoming session reads, summarizes understanding, waits for user confirmation. NEVER instruct the new session to begin work immediately.
- MUST save the handoff prompt as a file in the progress tree (typically
NN-session-prompt-<slug>.md), not as inline chat text. The prompt itself becomes tree history.
Verification Procedure (for Agents)
Before finalizing any edit to a progress-tree file:
def verify_compliance(file, tree):
# Location
assert tree.root_is_unique(), "multiple progress roots detected"
assert not file.path.contains(".claude/"), "progress must not live under .claude/"
# Frontmatter
fm = file.frontmatter
assert fm is not None, "frontmatter missing"
assert {"title", "created", "updated", "status"} <= fm.keys()
assert fm.dates_are_absolute()
assert fm.status in {"draft", "active", "stale", "archived"}
# Naming
if file.is_child_of(["progress/", "research/"]):
assert file.name matches r"^\d{2}-[a-z0-9-]+\.md$"
if file.is_child_of(["references/", "scripts/", "design/"]):
assert not file.name matches r"^\d{2}-"
# Tree structure (if file has a parent)
if file.parent_progress_doc:
parent = file.parent_progress_doc
assert parent.references_child_as_pointer(file)
assert not parent.duplicates_child_content(file)
# Archive (if archiving)
if action == "archive":
assert all_subtasks_complete(section)
assert archive_path ends with f"-{today:YYYY-MM-DD}.md"
assert archive_content == original_content # verbatim
Fail any check → do not commit. Fix the underlying violation first.
Deprecation of progress-archive
The standalone progress-archive skill was archived on 2026-04-21. Its archive-threshold and verbatim-preservation rules are absorbed into §Archive Constraints above. Existing installations should:
- Uninstall
progress-archive (npx skills remove motiful/progress-archive or remove symlinks)
- Install this rule-skill paired with
progress-hygiene
- The original GitHub repo is archived but remains available for historical reference
Relationship to progress-hygiene (Capability)
This rule-skill and progress-hygiene are an Augmented Skill collection (per skill-forge publishing strategy):
progress-hygiene is the primary capability — intent-triggered ("create a progress file", "open a subtree", "hand off to new session")
- This rule-skill is the augmenter — environment-triggered (activates on any progress file edit regardless of user intent phrasing)
- Forking the primary without this rule-skill silently breaks the methodology — the MUST/NEVER boundaries stop being enforced
The collection is installed together. Maintenance-dependency is uni-directional: this rule-skill exists to constrain progress-hygiene's iterations and cannot stand alone (it has no meaning without the capability's vocabulary).
1---2name: progress-hygiene-rules3description: Progress file hard constraints. MUST maintain exactly one progress root per project per the location matrix, valid frontmatter with absolute dates on every progress doc, NN- numeric prefix only for time-ordered children in progress/ and research/ trees (never skill references), archive when files exceed ~200 lines preserving content verbatim, relative paths in all cross-file references. NEVER place progress under .claude/, maintain two progress files with mutual references, use relative dates, duplicate child content into parent, summarize archived content, or discard completed history. Activates on any progress file edit, migration, or new-session handoff. MUST read SKILL.md BEFORE editing, creating, moving, or archiving any progress or research tree file.4license: MIT5---67# Progress Hygiene Rules — Hard Constraints89> Companion rule-skill to [`progress-hygiene`](../progress-hygiene/). This file enforces; the capability skill teaches.10> Treat every MUST/NEVER below as equivalent authority to platform-native rule files. Meta-rule protocol (rules-as-skills) raises load priority to MUST-level automatically on any `-rules` suffix skill.11> Immutable by agent self-modification.1213## Scope1415Applies to every file that participates in a project progress tree or research tree. Specifically:1617- `progress/` directories and their descendants18- `progress.md` files (flat, Archetype A2)19- `research/<topic>/` trees20- `<project>-backstage/progress/` under split-repo archetypes21- Any `PROGRESS.md` or `progress.md` file currently existing (migration targets)2223Does **not** apply to: skill `references/` directories, skill `scripts/`, design documents, or code files.2425## Location Constraints2627- **MUST** locate exactly one progress root per project, determined by the project archetype per the progress-hygiene location matrix. Two roots cause drift; non-matrix locations cause confusion.28- **NEVER** place progress files under any `.claude/`, `.agents/`, or other agent-workspace directory. Those directories are for skill/rule/setting config, not project state.29- **NEVER** maintain two progress files in the same project with mutual cross-references. The design-playbook 2026-04-18 incident is the reference failure mode.30- **MUST** declare "Source of Truth" explicitly at the top of the authoritative progress root when the project legitimately has multiple related repos (e.g., skill + backstage). Agents editing other repos must see this declaration and edit the SoT only.3132## Frontmatter Constraints3334- **MUST** include a YAML frontmatter block with `title`, `created`, `updated`, `status` on every progress, research, and tree-entry document.35- **MUST** use absolute ISO dates (`YYYY-MM-DD`). **NEVER** use relative phrasing (`yesterday`, `Thursday`, `last week`) in these fields.36- **MUST** use exactly one of the four `status` values: `draft`, `active`, `stale`, `archived`. No synonyms or custom states.37- **MUST** update the `updated` field on every substantive edit.38- **NEVER** use filesystem `mtime` as a substitute for the `updated` field. `mtime` is clobbered by `git clone`, editor auto-save, and indexers.3940## Naming Constraints4142- **MUST** use lowercase directory names (`progress/`, not `Progress/` or `PROGRESS/`).43- **MUST** name tree entry files `README.md`, not `index.md` or redundant `PROGRESS.md`.44- **MUST** use zero-padded two-digit `NN-<slug>.md` prefix for children of `progress/` and `research/<topic>/` trees. Order reflects creation sequence, not current priority.45- **NEVER** apply `NN-` prefix to skill `references/`, `scripts/`, or `design/` directories. Those are functional modules, not timelines — prefixing them misrepresents the structure.46- **NEVER** rename files to reflect priority changes. Use the `status` field and parent summary line instead; the prefix preserves chronology.4748## Tree Structure Constraints4950- **MUST** open a child subtree before the parent progress file exceeds ~150 lines, or when a subtask is complex enough to spawn its own session.51- **MUST** reference children from parents by **pointer** — summary line plus relative link. **NEVER** duplicate child content into parent text; copy-style references always drift.52- **MUST** use relative paths in all parent-child and archive links. Absolute paths break when the repo is cloned or moved.53- **MUST** update the parent summary line when a child's `status` transitions (`active → archived`, etc.) within the same commit.54- **NEVER** exceed 3 levels of nesting below the progress root. Level-3 children usually indicate a task decomposition failure, not a depth requirement.5556## Archive Constraints5758Inherited from the deprecated `progress-archive` skill and extended:5960- **MUST** archive completed phases when a progress file exceeds ~200 lines. Long files waste agent context and bury current state.61- **MUST** preserve archived text **verbatim**. Archive is a historical record, not a summary.62- **MUST** archive a section only when all its sub-tasks are complete. Sections with open sub-tasks must be restructured first — move the incomplete tasks to an active section, then archive the rest.63- **MUST** keep all incomplete tasks and their context untouched in the main file. Removing context that open tasks depend on breaks continuity.64- **MUST** name archive files with a date suffix: `{original-stem}-{milestone}-{YYYY-MM-DD}.md`.65- **NEVER** summarize, paraphrase, or rewrite content when archiving. Lossy compression destroys decisions and rationale that future work depends on.66- **NEVER** delete completed content. Archive is move, not delete.67- **SHOULD** keep recent update-log entries (last ~2 weeks of changes) in the main file and move older entries with the archive. The main file carries current-momentum signal; deep history belongs in the archive. Inherited verbatim from the deprecated `progress-archive` skill's line 23.6869## Compression Stub Template7071When a section is archived, leave this stub in the main file:7273```markdown74## [Phase/Milestone Name] — Archived7576**Completed**: YYYY-MM-DD77**Archive**: `relative/path/to/archive-file.md`7879**Summary** (headline only, not content):80- Key output 181- Key output 28283**Decisions carried forward** (affecting open work):84- Decision 185- Decision 286```8788The stub exists to give context to open work, not to reproduce archived detail. If you find yourself copying content into the stub, stop — the archive file is one click away.8990## Handoff Constraints9192- **MUST** generate a handoff prompt from the progress tree, not from chat history. The tree carries state; chat history is ephemeral.93- **MUST** name specific files for the incoming session to read (3-5 files). **NEVER** instruct the new session to "read everything" or "continue where we left off".94- **MUST** include a first-step confirmation gate in the handoff prompt: incoming session reads, summarizes understanding, waits for user confirmation. **NEVER** instruct the new session to begin work immediately.95- **MUST** save the handoff prompt as a file in the progress tree (typically `NN-session-prompt-<slug>.md`), not as inline chat text. The prompt itself becomes tree history.9697## Verification Procedure (for Agents)9899Before finalizing any edit to a progress-tree file:100101```python102def verify_compliance(file, tree):103 # Location104 assert tree.root_is_unique(), "multiple progress roots detected"105 assert not file.path.contains(".claude/"), "progress must not live under .claude/"106107 # Frontmatter108 fm = file.frontmatter109 assert fm is not None, "frontmatter missing"110 assert {"title", "created", "updated", "status"} <= fm.keys()111 assert fm.dates_are_absolute()112 assert fm.status in {"draft", "active", "stale", "archived"}113114 # Naming115 if file.is_child_of(["progress/", "research/"]):116 assert file.name matches r"^\d{2}-[a-z0-9-]+\.md$"117 if file.is_child_of(["references/", "scripts/", "design/"]):118 assert not file.name matches r"^\d{2}-"119120 # Tree structure (if file has a parent)121 if file.parent_progress_doc:122 parent = file.parent_progress_doc123 assert parent.references_child_as_pointer(file)124 assert not parent.duplicates_child_content(file)125126 # Archive (if archiving)127 if action == "archive":128 assert all_subtasks_complete(section)129 assert archive_path ends with f"-{today:YYYY-MM-DD}.md"130 assert archive_content == original_content # verbatim131```132133Fail any check → do not commit. Fix the underlying violation first.134135## Deprecation of progress-archive136137The standalone `progress-archive` skill was archived on 2026-04-21. Its archive-threshold and verbatim-preservation rules are absorbed into §Archive Constraints above. Existing installations should:1381391. Uninstall `progress-archive` (`npx skills remove motiful/progress-archive` or remove symlinks)1402. Install this rule-skill paired with [`progress-hygiene`](../progress-hygiene/)1413. The original GitHub repo is archived but remains available for historical reference142143## Relationship to progress-hygiene (Capability)144145This rule-skill and `progress-hygiene` are an **Augmented Skill collection** (per skill-forge publishing strategy):146147- `progress-hygiene` is the primary capability — intent-triggered ("create a progress file", "open a subtree", "hand off to new session")148- This rule-skill is the augmenter — environment-triggered (activates on any progress file edit regardless of user intent phrasing)149- Forking the primary without this rule-skill silently breaks the methodology — the MUST/NEVER boundaries stop being enforced150151The collection is installed together. Maintenance-dependency is uni-directional: this rule-skill exists to constrain progress-hygiene's iterations and cannot stand alone (it has no meaning without the capability's vocabulary).