Defragment a Basic Memory project: split bloated notes, consolidate scattered facts, resolve contradictions, retire stale content. Plans first; deletes only when told. Run weekly or on demand.
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Reorganize a project's notes so each topic has one clear, current home. Over time notes grow past their topic, the same fact lands in several places, old facts contradict new ones, and finished work lingers. Defrag fixes the content; memory-curate handles links, relations, and tags.
If the project is unknown, discover it with bm_project(command="list").
Pass a nonempty project on every note, folder, context and schema call, even
with one project or a qualified memory:// URL. Use the chosen project's name,
workspace/project, or external ID; <project> below is a placeholder for it.
Recent activity also requires project. Search accepts project for one
project, projects for selected projects, or all_projects=True explicitly.
Discovery and bundled manuals need no project. Keep the same scope when following
returned paths, paginating, or recovering from a refusal.
Walk the whole project, not just recent changes. Stale content is usually in notes nobody touched lately.
# Every folder and note within depth 10. Page until has_more is false;
# descend into deeper folders separately if the project has them.
bm_find(path="/", depth=10, page_size=100, project="<project>")
# Recently busy notes, to look at first
bm_project(command="recent", since="30d", output_format="json", page_size=50, project="<project>")
# Notes on one topic, to spot overlap
bm_search(query="launch plan", project="<project>")
# Commitments due on or before today: finished work that lingers, or overdue items
bm_search(time_kind="due", valid_overlaps="(,2026-10-14]", project="<project>")Read every note you might change, in full. For each, note its topic, size, last change, and anything that looks stale or contradicted.
| Problem | Signal | Fix |
|---|---|---|
| Bloated note | Covers several topics, hundreds of lines | Split into focused notes |
| Scattered facts | One topic's facts spread over several notes | Consolidate into the topic's note |
| Contradiction | Two notes disagree | Date the change, or propose for review (below) |
| Stale content | Finished work, past dates, resolved issues | Retire: close the fact's range, update status, or archive |
| Duplicate notes | Same topic, different titles | Merge (see memory-curate) |
Two statements that disagree are often both true, at different times: the launch was Friday, then moved to Thursday. Observations can say when a claim holds (see memory-notes), so a change over time can be recorded without losing either statement:
- [decision] @effective[2026-09-01,2026-10-14) Launch on Friday
- [decision] @effective:2026-10-14 Launch on Thursday (moved in [[2026-10-14 Launch Sync]])Which statement is newer is not evidence on its own. An old meeting note
imported today is new to the project and still wrong. Resolve a contradiction
directly only when a source says when the change happened and what replaced
what, and cite that source. Otherwise list both statements in the plan as
[contradiction], with their sources, and leave it for review.
Write the plan as a note before changing anything, so a person can review it. Title it with the date and time, so two runs on one day get separate plans:
---
title: Defrag Plan 2026-10-14 0830
type: defrag-plan
status: proposed
---
# Defrag Plan 2026-10-14 0830
## Observations
- [split] Launch Plan → Launch Plan, Launch Checklist (checklist is 200 lines of its own)
- [consolidate] Owner facts from 3 meeting notes → Launch Plan, Owners section
- [date-change] Launch Plan: Friday → Thursday, effective 2026-10-14 per 2026-10-14 Launch Sync
- [contradiction] Pricing Notes says $20/seat, Q4 Plan says $25/seat; no source dates the change (review needed)
- [retire] Beta Signup Tasks: all done since September → status: done, move to archive/
- [keep] Old Pricing Ideas: looks stale but is still linked from Q4 Plan (review needed)status: proposed and stop.expected_checksum, so the edit applies only to the revision
you read; on a checksum conflict, read again and recheck the plan line. Keep
relations pointing at the right note after a split or move (bm_move keeps
links working; a new note needs links added).Update the plan note: mark each line done, skipped, or left for review, and set
status: applied or status: partly-applied.
basicmachines-co/basic-memory
eddb4c0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.