/bedrock:compress — Vault Alignment Engine
Plugin Paths
Entity definitions and templates are in the plugin directory, not the vault root. Use the "Base directory for this skill" provided at invocation to resolve paths:
- Entity definitions:
<base_dir>/../../entities/ - Templates:
<base_dir>/../../templates/{type}/_template.md - Plugin CLAUDE.md:
<base_dir>/../../CLAUDE.md(already injected automatically into context)
Where <base_dir> is the path provided in "Base directory for this skill".
Vault Resolution
Resolve which vault to compress. This skill can be invoked from any directory.
Step 1 — Parse --vault flag:
Check if the input arguments include --vault <name>. If found, extract the vault name and remove it from the arguments before parsing --mode.
Step 2 — Resolve vault path:
-
If
--vault <name>was provided: Read the vault registry at<base_dir>/../../vaults.json. Find the entry matching the name. If not found: error — "Vault<name>is not registered. Run/bedrock:vaultsto see available vaults." If found: setVAULT_PATHto the entry'spathvalue. Store the resolved vault name asVAULT_NAME. -
If no
--vaultflag — CWD detection: Read<base_dir>/../../vaults.json. Check if the current working directory is inside any registered vault path (CWD starts with a registered vault's absolute path). If multiple match, use the longest path (most specific). If found: setVAULT_PATHto the matching vault'spath. Store its name asVAULT_NAME. -
If CWD detection fails — default vault: From the registry, find the vault with
"default": true. If found: setVAULT_PATHto the default vault'spath. Store its name asVAULT_NAME. -
If no resolution: Error — "No vault resolved. Available vaults:" followed by the registry listing. "Use
--vault <name>to specify, or run/bedrock:setupto register a vault."
Step 3 — Validate vault path:
test -d "<VAULT_PATH>" && echo "exists" || echo "missing"
If missing: error — "Vault path <VAULT_PATH> does not exist on disk. Run /bedrock:setup to re-register."
Step 4 — Read vault config:
cat <VAULT_PATH>/.bedrock/config.json 2>/dev/null
Extract language, git.strategy, and other relevant fields for use in later phases.
From this point forward, ALL vault file operations use <VAULT_PATH> as the root.
- Entity directories:
<VAULT_PATH>/actors/,<VAULT_PATH>/people/, etc. - Git operations:
git -C <VAULT_PATH> <command> - When delegating to
/bedrock:preserve, pass--vault <VAULT_NAME>
Overview
This skill scans all entities in the vault, detects 5 types of structural misalignments,
proposes fixes to the user, and delegates all writes to /bedrock:preserve.
You are an execution agent. Follow the phases below in order, without skipping steps.
Execution modes
The skill accepts an optional --mode argument:
interactive(default): all 5 capabilities prompt the user for confirmation before execution.cron: capabilities 1 and 4 (mechanical, deterministic) execute autonomously without confirmation. Capabilities 2, 3, and 5 (semantic, judgment-dependent) are detected but written as a proposal to a fleeting note for human review — they are NOT executed.
Parse the mode from the invocation arguments. If no --mode is specified, default to interactive.
Five alignment capabilities
| # | Capability | Type | Cron behavior |
|---|---|---|---|
| 1 | Broken backlinks | Mechanical | Autonomous — fix without confirmation |
| 2 | Concept match | Semantic | Queued — write proposal to fleeting note |
| 3 | Entity misalignment | Semantic | Queued — write proposal to fleeting note |
| 4 | Duplicated entities | Mechanical | Autonomous — fix without confirmation |
| 5 | Misnamed entities | Semantic | Queued — write proposal to fleeting note |
Critical rules:
- NEVER write entity files directly — all mutations go through
/bedrock:preserve - NEVER execute semantic capabilities (2, 3, 5) without confirmation in interactive mode
- NEVER execute semantic capabilities (2, 3, 5) autonomously in cron mode — always queue
- NEVER remove existing wikilinks
- NEVER delete entities (compress aligns, it does not delete)
- People/Teams/Concepts/Topics: append-only — never delete content
- Actors: free merge — may edit body freely
Phase 0 — Sync the Vault
Execute:
git -C <VAULT_PATH> pull --rebase origin main
If it fails:
- No remote: warn "No remote configured. Working locally." and proceed.
- Conflict:
git -C <VAULT_PATH> rebase --abortand warn the user. Do NOT proceed without resolving.
Phase 1 — Scan and Detect
Scan the entire vault and run all 5 detection algorithms. Store results for Phase 2.
1.0 Load entity definitions and config
Read the entity definitions from the plugin directory to understand classification criteria:
<base_dir>/../../entities/concept.md— needed for capability 2 (concept match)<base_dir>/../../entities/*.md— needed for capability 3 (entity misalignment)<base_dir>/../../entities/code.md— needed for capability 1 graph-side detection (§1.2.2)
Store the "When to create", "When NOT to create", and "How to distinguish" sections from each entity definition for use in detection.
Read vault config for graph-side detection:
cat <VAULT_PATH>/.bedrock/config.json 2>/dev/null
Extract code.cluster_threshold (default 0.85, used by §1.2.2 for Scenario A-extended similarity matching and Scenario B clustering) and code.max_per_actor (default 200, used in Phase 5 to surface cap overrun warnings — never enforced as a hard limit). If .bedrock/config.json is missing or has no code block, use the defaults silently.
1.1 Read all entities
For each entity directory (<VAULT_PATH>/actors/, <VAULT_PATH>/people/, <VAULT_PATH>/teams/, <VAULT_PATH>/concepts/, <VAULT_PATH>/topics/, <VAULT_PATH>/discussions/, <VAULT_PATH>/projects/, <VAULT_PATH>/fleeting/):
- List all
.mdfiles, excluding_template.mdand_template_node.md- For actors: include both
<VAULT_PATH>/actors/*.md(flat) and<VAULT_PATH>/actors/*/*.md(folder)
- For actors: include both
- For each entity, read frontmatter + body
- Extract:
typefrom frontmatternamefrom frontmatter (or filename as fallback)aliasesfrom frontmatter (array)- All wikilinks
[[target]]from body AND frontmatter arrays - All proper nouns, service names, team names, person names mentioned in the body (for capabilities 4 and 5)
Optimization for large vaults: If the vault has more than 100 entities in a type, use subagents via Agent tool to parallelize reading by entity type.
Output: vault_data map: entity_name → {type, name, aliases[], wikilinks[], body_mentions[], frontmatter, body}
1.2 Capability 1 — Detect broken backlinks
Cap 1 detects backlinks that are broken on either of two layers: markdown wikilinks (§1.2.1, today's behavior) and graph-side back-pointers (§1.2.2, total-binding rule).
1.2.1 Markdown-side backlinks (existing behavior)
For each entity A in vault_data:
- For each wikilink
[[B]]found in A (body or frontmatter arrays):- Skip if B does not exist as an entity file in the vault (wikilinks to non-existent entities are valid in Obsidian)
- If B exists: check if B contains a wikilink
[[A]](body or frontmatter arrays) - If B does NOT link back to A: register as broken backlink with
kind: "markdown_backlink"
Output: broken_backlinks[] — list of {kind: "markdown_backlink", source: A, target: B, direction: "A→B exists, B→A missing"}
1.2.2 Graph-side back-pointers (total-binding rule)
Rule: every node in <VAULT_PATH>/graphify-out/graph.json MUST end up with vault_entity_path set. There is NO relevance filter at /compress time — confidence level (EXTRACTED / INF