Skill v1.0.1
currentAutomated scan100/100+3 new
version: "1.0.1" name: ctx-consolidate description: "Consolidate redundant entries in LEARNINGS.md or DECISIONS.md. Use when ctx drift reports high entry counts or entries overlap." allowed-tools: Bash(ctx:*), Read, Edit, Write
Analyze entries in LEARNINGS.md and/or DECISIONS.md, group overlapping entries by topic, and (with user approval) merge groups into denser consolidated entries. Originals are archived, not deleted.
Key Distinction
Consolidation != archival. Archival moves old entries to the archive directory. Consolidation replaces verbose entries with tighter ones: the file stays useful, just denser. The originals move to archive as a paper trail.
When to Use
- When
ctx driftreports entry counts above threshold
(default: 30 learnings, 20 decisions)
- When you notice 3+ entries about the same topic
- When the user asks "clean up learnings", "consolidate context",
"reduce noise in decisions"
- Before a release, to keep context lean
When NOT to Use
- When there are fewer than 10 entries (nothing meaningful to group)
- When the user wants to delete entries (offer archival instead)
- Automatically: always require user approval before modifying files
- Mid-task when the user is focused on shipping
Execution
Step 1: Parse Entries
Read the target file(s):
# Check entry counts firstctx drift --json
Then read the files directly:
- LEARNINGS.md (in the context directory)
- DECISIONS.md (in the context directory)
Parse entries by their ## [YYYY-MM-DD-HHMMSS] Title headers. Each entry extends from its header to the line before the next header or end of file.
Step 2: Extract Keywords and Group
For each entry, extract keywords from its title and body:
- Split text on whitespace and punctuation
- Lowercase everything
- Filter out stop words (the, and, for, with, from, are, was, etc.)
and words shorter than 3 characters
- Deduplicate
Build a keyword-to-entries map. Entries sharing 2 or more non-trivial keywords are candidates for the same group.
Grouping rules:
- Minimum group size: 2 entries (nothing to consolidate with 1)
- Maximum group size: 8 entries (larger groups suggest the topic
needs splitting, not merging)
- An entry can only belong to one group (assign to the best match)
Step 3: Present Candidates
Show the user what you found. Format:
Consolidation candidates for LEARNINGS.md:Group 1: "Hook behavior" (5 entries)- [2026-01-15] Hook scripts can lose execute permission- [2026-01-20] Two-tier hook output is sufficient- [2026-02-03] Claude Code Hook Key Names- [2026-02-09] Agent ignores repeated hook output- [2026-02-16] Security docs vulnerable after migrations-> Proposed: merge into 1 consolidated entryGroup 2: "Path handling" (3 entries)- [2026-01-10] Path construction uses stdlib- [2026-02-05] G304 gosec false positives- [2026-02-16] gosec G301/G306 permissions-> Proposed: merge into 1 consolidated entryUngrouped: 12 entries (no consolidation needed)
Wait for the user to approve, modify, or reject each group. Do NOT proceed without explicit confirmation.
Step 4: Generate Consolidated Entries
For each approved group, write a consolidated entry that:
- Uses today's timestamp in
YYYY-MM-DD-HHMMSSformat - Appends "(consolidated)" to the title
- Lists the date range of originals in a
**Consolidated from**line - Distills each original into 1-2 lines
- Preserves all unique information (nothing is lost)
Format:
## [YYYY-MM-DD-HHMMSS] Hook behavior (consolidated)**Consolidated from**: 5 entries (2026-01-15 to 2026-02-16)-Hook scripts can lose execute permission without warning; alwaysrestore +x after sync operations-Two-tier output (stdout for AI context, stderr+exit for blocks)is sufficient; don't over-engineer severity levels-Claude Code hook key names are case-sensitive: PreToolUse, notpre_tool_use-Agents develop repetition fatigue: vary hook output phrasingacross invocations-After infrastructure migrations, audit security docs first:stale paths in security guidance give false confidence
Step 5: Execute Approved Merges
For each approved group:
- Add the consolidated entry at the top of the file (below
the # Learnings or # Decisions header)
- Remove the original entries from the source file
- Append originals to archive at
archive/learnings-consolidated-YYYY-MM-DD.md in the context directory (or decisions-consolidated-YYYY-MM-DD.md)
No index rebuild is needed: the quick-reference index is computed on demand by ctx index <file>, never stored in the file.
Step 6: Report Results
Consolidated LEARNINGS.md:- Group "Hook behavior": 5 entries -> 1 (originals archived)- Group "Path handling": 3 entries -> 1 (originals archived)Total: 8 entries consolidated into 2. File reduced from 47 to 41 entries.Archive: archive/learnings-consolidated-2026-02-19.md (in context dir)
Archive Format
The archive file uses the same Markdown format as the source file. Each archived entry keeps its original timestamp and content, preceded by a header noting which consolidated entry replaced it:
# Archived Learnings (consolidated 2026-02-19)Originals replaced by consolidated entries in LEARNINGS.md.## Group: Hook behavior## [2026-01-15-120000] Hook scripts can lose execute permission(original content preserved verbatim)## [2026-01-20-093000] Two-tier hook output is sufficient(original content preserved verbatim)
What This Skill Does NOT Do
- Automatic consolidation: always requires user approval
- Cross-file consolidation: learnings stay in LEARNINGS.md,
decisions stay in DECISIONS.md
- Delete entries: always archives originals as a paper trail
- Semantic understanding via embeddings: uses keyword matching,
which is sufficient for structured entries with consistent formatting
- Consolidate TASKS.md or CONVENTIONS.md: use
ctx task archive
for tasks; conventions rarely need consolidation
Quality Checklist
Before reporting results:
- [ ] Presented all candidate groups before making changes
- [ ] Waited for explicit user approval per group
- [ ] Each consolidated entry preserves all unique information
- [ ] Original entries are archived, not deleted
- [ ] Reported what changed and where archives were written