{
  "$comment": "CANONICAL machine-readable routing manifest for the ECHO vault. This is the single source of truth for 'what paths may be written to'. The human-readable tables in SKILL.md, references/routing-map.md, and references/api-reference.md are DERIVED views of this file — when they disagree, this file wins. vault_lint.py consumes it to enforce the core rule: if a path matches no route here (and is not a retired path), nothing should be written to it. Patterns are Python regexes matched against vault-root-relative paths (no leading slash, no /vault/ prefix).",
  "schema_version": 2,
  "routes": [
    { "id": "inbox-captures",       "pattern": "^inbox/captures/inbox\\.md$",                                   "method": "POST",       "trigger": "Destination unknown at capture time", "distinct_because": "Only path whose contract is deferred routing" },
    { "id": "inbox-imports",        "pattern": "^inbox/imports/[^/]+\\.md$",                                    "method": "PUT",        "trigger": "Raw external material dropped wholesale", "distinct_because": "Bulk un-triaged material vs single-line captures" },
    { "id": "inbox-processing-log", "pattern": "^inbox/processing-log/\\d{4}-\\d{2}-\\d{2}\\.md$",               "method": "POST",       "trigger": "An inbox item is routed to its real home", "distinct_because": "Audit trail of moves, not memory itself" },

    { "id": "journal-daily",        "pattern": "^journal/daily/\\d{4}-\\d{2}-\\d{2}\\.md$",                      "method": "PATCH",      "trigger": "First agent activity on a given day", "distinct_because": "Finest grain; PATCHed repeatedly within its period" },
    { "id": "journal-weekly",       "pattern": "^journal/weekly/\\d{4}-W\\d{2}\\.md$",                           "method": "PUT",        "trigger": "First substantive session of a new ISO week (opt-in)", "distinct_because": "ISO-week grain" },
    { "id": "journal-monthly",      "pattern": "^journal/monthly/\\d{4}-\\d{2}\\.md$",                           "method": "PUT",        "trigger": "First substantive session of a new month", "distinct_because": "Month grain" },
    { "id": "journal-quarterly",    "pattern": "^journal/quarterly/\\d{4}-Q[1-4]\\.md$",                         "method": "PUT",        "trigger": "Manual / on request only", "distinct_because": "Strategic grain; never auto-fires" },
    { "id": "journal-annual",       "pattern": "^journal/annual/\\d{4}\\.md$",                                   "method": "PUT",        "trigger": "Manual / on request only", "distinct_because": "Coarsest grain; never auto-fires" },
    { "id": "journal-templates",    "pattern": "^journal/templates/.+\\.md$",                                    "method": "PUT",        "trigger": "Bootstrap seed only", "distinct_because": "Holds templates, not journal content" },

    { "id": "projects-active",      "pattern": "^projects/active/[^/]+\\.md$",                                   "method": "PUT",        "trigger": "Work in motion now", "distinct_because": "Default state for anything being worked", "status": "active" },
    { "id": "projects-incubating",  "pattern": "^projects/incubating/[^/]+\\.md$",                               "method": "PUT",        "trigger": "Idea captured, work not started", "distinct_because": "Pre-work", "status": "incubating" },
    { "id": "projects-on-hold",     "pattern": "^projects/on-hold/[^/]+\\.md$",                                  "method": "PUT",        "trigger": "Paused but still tracked", "distinct_because": "Resumable; not terminal", "status": "on-hold" },
    { "id": "projects-archived",    "pattern": "^projects/archived/[^/]+\\.md$",                                 "method": "PUT",        "trigger": "Done, abandoned, or rolled up", "distinct_because": "Terminal; kept for history", "status": "archived" },
    { "id": "projects-template",    "pattern": "^projects/project-template\\.md$",                               "method": "PUT",        "trigger": "Bootstrap seed only", "distinct_because": "Template, not a project" },

    { "id": "areas",                "pattern": "^areas/(business|personal|learning|systems)/[^/]+\\.md$",        "method": "PUT",        "trigger": "Ongoing domain with no finish line", "distinct_because": "No end state — disqualifies it from projects/" },

    { "id": "resources-people",     "pattern": "^resources/people/[^/]+\\.md$",                                  "method": "PUT",        "trigger": "A fact about a specific person", "distinct_because": "Keyed to a person" },
    { "id": "resources-companies",  "pattern": "^resources/companies/[^/]+\\.md$",                               "method": "PUT",        "trigger": "A fact about an organization", "distinct_because": "Keyed to an organization, not an individual" },
    { "id": "resources-concepts",  "pattern": "^resources/concepts/[^/]+\\.md$",                                "method": "PUT",        "trigger": "A reusable concept/idea", "distinct_because": "An idea vs an external source" },
    { "id": "resources-references", "pattern": "^resources/references/[^/]+\\.md$",                              "method": "PUT",        "trigger": "An external source/link worth keeping", "distinct_because": "Points outward" },
    { "id": "resources-meetings",   "pattern": "^resources/meetings/\\d{4}-\\d{2}-\\d{2}-[^/]+\\.md$",            "method": "PUT",        "trigger": "Notes tied to a specific meeting", "distinct_because": "Event-anchored to a meeting" },

    { "id": "decisions-by-date",    "pattern": "^decisions/by-date/\\d{4}-\\d{2}-\\d{2}-[^/]+\\.md$",             "method": "PUT",        "trigger": "A non-obvious decision worth recording", "distinct_because": "Chronological system of record for decisions" },
    { "id": "decisions-template",   "pattern": "^decisions/decision-template\\.md$",                             "method": "PUT",        "trigger": "Bootstrap seed only", "distinct_because": "Template, not a decision" },

    { "id": "agent-marker",         "pattern": "^_agent/echo-vault\\.md$",                                       "method": "PUT",        "trigger": "Bootstrap / schema migration only", "distinct_because": "Plugin-owned probe; never hand-edited" },
    { "id": "agent-context",        "pattern": "^_agent/context/[^/]+\\.md$",                                    "method": "PATCH",      "trigger": "Active scope changes / task bundles", "distinct_because": "Single live scope pointer + bundles" },
    { "id": "agent-semantic",       "pattern": "^_agent/memory/semantic/[^/]+\\.md$",                            "method": "PUT",        "trigger": "A durable fact/pattern (incl. operator-preferences.md)", "distinct_because": "Timeless fact" },
    { "id": "agent-episodic",       "pattern": "^_agent/memory/episodic/[^/]+\\.md$",                            "method": "PUT",        "trigger": "A record of what happened, when", "distinct_because": "Anchored to an event in time" },
    { "id": "agent-working",        "pattern": "^_agent/memory/working/[^/]+\\.md$",                             "method": "PUT",        "trigger": "Short-lived state for the current effort", "distinct_because": "Explicitly transient" },
    { "id": "agent-sessions",       "pattern": "^_agent/sessions/\\d{4}-\\d{2}-\\d{2}(-\\d{4})?-[^/]+\\.md$",     "method": "PUT",        "trigger": "A substantive session ends", "distinct_because": "Per-session record (new ones require HHMM)" },
    { "id": "agent-health",         "pattern": "^_agent/health/\\d{4}-\\d{2}-vault-health\\.md$",                "method": "PUT",        "trigger": "First substantive session of a month", "distinct_because": "Vault integrity, not work narrative" },
    { "id": "agent-heartbeat",      "pattern": "^_agent/heartbeat/[^/]+\\.md$",                                  "method": "PUT",        "trigger": "End of every session", "distinct_because": "O(1) orientation pointer; overwritten, never grows" },
    { "id": "agent-templates",      "pattern": "^_agent/templates/.+\\.md$",                                     "method": "PUT",        "trigger": "Bootstrap seed only", "distinct_because": "Holds templates, not memory" },
    { "id": "agent-skills-active",  "pattern": "^_agent/skills/active/[^/]+\\.md$",                              "method": "PUT",        "trigger": "A skill/plugin catalogued as a capability", "distinct_because": "Catalogs a capability vs the build effort" },
    { "id": "agent-skills-archived","pattern": "^_agent/skills/archived/[^/]+\\.md$",                            "method": "PUT",        "trigger": "A catalogued skill is retired", "distinct_because": "Terminal state of the skill catalog" },
    { "id": "agent-locks",          "pattern": "^_agent/locks/[^/]+\\.lock$",                                    "method": "PUT",        "trigger": "Advisory multi-writer lock acquire/release", "distinct_because": "Concurrency coordination, not memory" },

    { "id": "leaf-readme",          "pattern": "^(.+/)?README\\.md$",                                            "method": "PUT",        "trigger": "Bootstrap leaf signpost / vault root README", "distinct_because": "Human signpost, not read for routing" }
  ],
  "retired": [
    { "pattern": "^reviews/",                                  "retired_in_schema": 2, "replacement": "journal/{weekly,monthly,quarterly,annual}/ and _agent/health/" },
    { "pattern": "^decisions/by-project/",                     "retired_in_schema": 1, "replacement": "[[wikilink]] under the project's ## Key Decisions" },
    { "pattern": "^archive/",                                  "retired_in_schema": 0, "replacement": "projects/archived/ and _agent/skills/archived/" },
    { "pattern": "^(CLAUDE|BOOTSTRAP|STRUCTURE|index)\\.md$",  "retired_in_schema": 1, "replacement": "All control logic lives in the plugin references/, not the vault" }
  ]
}
