Ql housekeep
Spec-driven autonomous development loop for Claude Code. Combines structured PRD generation, dependency DAG execution, two-stage review gates, and Iron Law verification.
npx -y skills add andyzengmath/quantum-loop --skill ql-housekeepAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 23 stars23 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Detect repo-hygiene issues that accumulate during long-running autonomous development (merge-conflict markers, orphan worktrees, CPC-variant duplicates, stale branches, version-manifest drift). Detection-only by default — reports findings, never deletes or modifies without explicit user confirmation.
SKILL.md
8.1 KB, as published. Nobody here has run it
ql-housekeep — repo hygiene detector
Purpose
ql-housekeep surfaces the hygiene failures that accumulate when an autonomous development pipeline runs for weeks without human sweep. It is a detector, not an actuator. Auto-fix is explicitly out of scope.
This skill exists because idea-stage/AUDIT_QL.md catalogued eight categories of hygiene failure on master. The first job of the next pipeline iteration is to not produce that state again.
When to use
- Before starting a new
/ql-brainstormcycle on a repo that has been running parallel execution for weeks. - As a gate in
ql-executebetween waves if you suspect accumulated drift. - Manually, when you want a structured view of "what is wrong with the repo right now that the runtime cannot see".
What it detects
1. Merge-conflict markers in tracked files
Pattern: ^<<<<<<< or ^=======$ or ^>>>>>>>. These are the signature of an abandoned git merge that was committed without resolution.
Note: the ^=======$ pattern can theoretically false-positive on Markdown setext-heading underlines (e.g., a heading followed by exactly seven = chars at column 1). In practice this is rare, and the <<<<<<< + >>>>>>> siblings are required for a real conflict block, so false positives are self-limiting.
Command:
grep -rn --include='*.md' --include='*.sh' --include='*.ts' --include='*.js' \
--include='*.py' --include='*.json' --include='*.yml' --include='*.yaml' \
-E '^<<<<<<<|^=======$|^>>>>>>>' .
2. Orphan git worktrees
Directories under .claude/worktrees/agent-* or .ql-wt/<story-id>/ that git no longer tracks.
Command:
for d in .claude/worktrees/agent-* .ql-wt/*; do
[ -d "$d" ] || continue
git worktree list | grep -q "$d" || echo "$d"
done
3. CPC-variant duplicate files
Pattern: files matching *-CPC-andyz-ZH84K.*. These are OneDrive-renamed copies that indicate a parallel-hardening fork. If detected, the project likely has two pipelines coexisting — see idea-stage/AUDIT_QL.md for promotion protocol.
Command:
find . -path ./node_modules -prune -o -name '*-CPC-andyz-*' -print
4. Superseded-but-not-deleted files
Files whose header docstring says "supersedes X" where X still exists. Currently catches:
lib/crash-recovery.sh(superseded bylib/resilience.sh:3)
Command (case-insensitive Supersedes / supersedes):
for f in lib/*.sh; do
sup=$(grep -oiE 'supersedes lib/[a-z_-]+\.sh' "$f" 2>/dev/null | head -1 | awk '{print $NF}')
[ -n "$sup" ] && [ -f "$sup" ] && echo "DEAD: $sup (superseded by $f)"
done
5. Stale branches
worktree-agent-*branches that are no longer referenced by any live worktree.ql/*andfix/*branches whose tip commits are strict ancestors of master OR have been inactive > 90 days.
Command:
git branch -a --format='%(refname:short) %(committerdate:short) %(upstream:track)' \
| awk '$1 ~ /^(ql|fix|worktree-agent)/' \
| sort -k2
6. Plugin version / CHANGELOG drift
.claude-plugin/plugin.json.version must match .claude-plugin/marketplace.json.version and must have a corresponding entry in CHANGELOG.md.
Command:
plugin_v=$(jq -r .version .claude-plugin/plugin.json 2>/dev/null)
market_v=$(jq -r '.plugins[0].version // .version' .claude-plugin/marketplace.json 2>/dev/null)
[ "$plugin_v" = "$market_v" ] || echo "version mismatch: plugin=$plugin_v market=$market_v"
grep -q "^## \[$plugin_v\]" CHANGELOG.md 2>/dev/null || echo "CHANGELOG missing entry for v$plugin_v"
7. Stale quantum.json
quantum.json.updatedAt older than 30 days with the project in active development suggests the team isn't dogfooding.
Command (cross-platform: GNU date, macOS date, Git Bash):
last=$(jq -r '.updatedAt // empty' quantum.json 2>/dev/null)
if [ -n "$last" ]; then
# Portable ISO-8601 → epoch via python3 (GNU date -d is not on macOS/BSD)
age_days=$(python3 -c "
import datetime,sys
t = datetime.datetime.fromisoformat('$last'.replace('Z', '+00:00'))
now = datetime.datetime.now(datetime.timezone.utc)
print(int((now - t).total_seconds() // 86400))
" 2>/dev/null)
[ -n "$age_days" ] && [ "$age_days" -gt 30 ] && echo "quantum.json not updated in $age_days days"
fi
Fallback when python3 is unavailable: compare $last lexicographically against a pre-computed $threshold = "$(TZ=UTC date -u +%Y-%m-%d)" minus 30 days (date-string compare works because ISO-8601 is lexicographic-sortable); implementer should prefer python3.
8. Duplicate test files (same logical test in two files)
Pattern: two test files whose paths differ only by a suffix that indicates a fork (-CPC-*, .bak, .old, copy).
Command:
find tests -type f -name '*.sh' \
| sed -E 's/(-CPC-[^/]+|\.bak|\.old| copy)?\.sh$//' \
| sort | uniq -d
Anti-rationalization guards
| The agent says… | The truth is… |
|---|---|
| "These orphan worktrees must be live runs" | Live worktrees appear in git worktree list. If they don't, they're orphans. |
| "Deleting the CPC-variant could lose work" | That's why this skill does NOT delete. It REPORTS. Promotion is a separate user-confirmed action (see docs/plans/2026-04-21-p0-consolidation-design.md). |
| "The merge-conflict markers are inside a docstring example" | Then they wouldn't pass lint or test. The code is not doing conditional-skip. |
| "The supersedes comment is ambiguous" | Read the file, confirm, then report. Never silently swallow detection. |
| "CHANGELOG is a nice-to-have" | Users rely on CHANGELOG to know what changed between versions. An empty CHANGELOG means the team has abandoned the compact with downstream. |
How to run
The skill produces a structured report to stdout. No flags required.
# In Claude Code:
/quantum-loop:ql-housekeep
The skill will:
- Run each detector in turn.
- Emit a section per category with findings.
- Summarize as a
findings[]JSON block at the end. - Return an exit code: 0 = clean, 1 = findings present.
What it does NOT do
- Delete files.
- Rename files.
- Prune branches.
- Remove worktrees.
- Modify CHANGELOG or plugin manifests.
- Commit anything.
Fixes are the user's job, potentially driven by the consolidation design in docs/plans/2026-04-21-p0-consolidation-design.md.
Output format
{
"timestamp": "<ISO 8601>",
"branch": "<current branch>",
"summary": {
"conflict_markers": 0,
"orphan_worktrees": 0,
"cpc_variants": 0,
"superseded_files": 0,
"stale_branches": 0,
"version_drift": false,
"stale_quantum_json": false,
"duplicate_test_files": 0
},
"findings": [
{
"category": "conflict_markers",
"severity": "high",
"file": "README.md",
"lines": [368, 372, 399],
"detail": "<content snippet>"
}
],
"recommended_next_steps": [
"Review idea-stage/AUDIT_QL.md before taking action",
"Do not delete anything without user confirmation",
"See docs/plans/2026-04-21-p0-consolidation-design.md for a full consolidation protocol"
]
}
Integration with other skills
ql-brainstorm: Reads priorql-housekeepoutput to warn about hygiene before inviting new design work.ql-execute: Between waves, runsql-housekeepas a lightweight check; warns user but does not auto-fix.ql-review: Post-merge review phase inspects whether the merge introduced any of categories 1, 3, 4, 8.
Known limitations
- Detection patterns are intentionally conservative — false negatives preferred over false positives because this drives user action.
- Category 5 (stale branches) uses simple heuristics; borderline cases should be manually classified.
- The skill does not detect content-level duplicate code across stories; that is the job of
agents/duplication-detector.md.