From 06a90e2099f12be7f1bc4c0926ebb573c68bfea3 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 11 Jun 2026 10:57:01 -0500 Subject: [PATCH] v0.6 --- README.md | 37 ++-- echo-memory-0.6.0.plugin | Bin 0 -> 43094 bytes echo-memory.plugin | Bin 31860 -> 43094 bytes .../.claude-plugin/plugin.json | 2 +- echo-memory.plugin.src/README.md | 13 +- .../skills/echo-memory/SKILL.md | 63 ++++++- .../echo-memory/references/api-reference.md | 6 +- .../echo-memory/references/bootstrap.md | 10 +- .../echo-memory/references/routing-map.md | 112 +++++++++++ .../echo-memory/references/vault-layout.md | 11 +- .../echo-memory/scaffold/README.vault.md | 2 +- .../skills/echo-memory/scaffold/echo-vault.md | 2 +- .../skills/echo-memory/scripts/vault-lint.sh | 175 ++++++++++++++++++ 13 files changed, 395 insertions(+), 38 deletions(-) create mode 100644 echo-memory-0.6.0.plugin create mode 100644 echo-memory.plugin.src/skills/echo-memory/references/routing-map.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh diff --git a/README.md b/README.md index c2d0e11..0eac229 100644 --- a/README.md +++ b/README.md @@ -77,8 +77,12 @@ echo-v.05/ │ ├── captures/ ← quick captures (inbox.md), date-prefixed lines │ ├── imports/ ← raw imported material │ └── processing-log/ -├── journal/ +├── journal/ ← one append-only time-series stream; rollups are coarser journal entries (no separate reviews/ tree) │ ├── daily/ ← YYYY-MM-DD.md (has an "## Agent Log" section) +│ ├── weekly/ ← YYYY-Www.md (ISO week, opt-in rollup) +│ ├── monthly/ ← YYYY-MM.md (monthly rollup) +│ ├── quarterly/ ← YYYY-Qn.md (manual / on request) +│ ├── annual/ ← YYYY.md (manual / on request) │ └── templates/ ├── projects/ ← lifecycle: incubating → active → on-hold / archived │ ├── active/ incubating/ on-hold/ archived/ @@ -90,7 +94,7 @@ echo-v.05/ ├── decisions/ │ ├── by-date/ ← YYYY-MM-DD-.md (ADR-style) — the canonical home │ └── decision-template.md (by-project/ is retired, not created) -├── reviews/ ← weekly / monthly / quarterly / annual +│ (reviews/ is retired — journal rollups live under journal/; vault-health under _agent/health/) └── _agent/ ├── echo-vault.md ← bootstrap marker: schema_version + date (plugin-owned probe) ├── context/ ← current-context.md and task bundles @@ -99,9 +103,10 @@ echo-v.05/ │ ├── episodic/ ← what happened, when │ └── semantic/ ← durable facts / patterns (operator-preferences.md) ├── sessions/ ← YYYY-MM-DD-HHMM-.md + ├── health/ ← YYYY-MM-vault-health.md (monthly self-maintenance audit) ├── templates/ ← canonical note templates (seeded from the plugin's scaffold/) ├── skills/ ← active / archived capability catalog - └── heartbeat/ ← single-line pointers (e.g. last-session.md) + └── heartbeat/ ← last-session.md pointer (read at load, written at session end) ``` ### Memory model @@ -119,13 +124,16 @@ echo-v.05/ ### Cold-start loading -Load memory at the start of any substantive conversation (anything beyond a single quick factual question). The cold-start reads are **issued in parallel** (one batch of 4–5 GETs): +Load memory at the start of any substantive conversation (anything beyond a single quick factual question). The cold-start reads are **issued in parallel** (one batch of 5–6 GETs): 1. `_agent/echo-vault.md` — the bootstrap marker. `404` → vault not set up (run bootstrap); `200` → check `schema_version` and migrate if older than the plugin's. 2. `_agent/memory/semantic/operator-preferences.md` — Jason's profile. 3. `_agent/context/current-context.md` — active scope + Scope History. -4. `_agent/sessions/` listing — read the ~5 most recent by reverse lexical sort (filenames lex-sort chronologically). +4. `_agent/heartbeat/last-session.md` then `_agent/sessions/` — read the heartbeat pointer first (O(1) jump to the latest log); fall back to the listing's ~5 most recent by reverse lexical sort. 5. `journal/daily/YYYY-MM-DD.md` — today's note (`404` is fine). +6. `inbox/captures/inbox.md` — inbox-depth probe for the load-time reconcile. + +After the batch, **reconcile**: if the inbox holds captures older than ~7 days, surface the count and offer to triage (so triage self-fires rather than waiting to be invoked); and if the active scope diverges from what Jason just asked for, run Scope Switching. If a specific project is in play, follow up with a `search/simple/` across **all** lifecycle subfolders, querying **both the slug and any human title** used in conversation, then read the match at `projects//.md`. Loading is not narrated to the operator. @@ -158,15 +166,17 @@ After substantive activity, append a one-line entry to today's daily note's `## At the end of substantive conversations (those producing decisions, artifacts, or commitments), write a session log to `_agent/sessions/YYYY-MM-DD-HHMM-.md`. **The four-digit HHMM component is canonical, not optional** — it makes filenames lex-sort in true chronological order, which cold-start loading depends on. New writes are validated against `^\d{4}-\d{2}-\d{2}-\d{4}-[a-z0-9-]+\.md$`. -### Reviews +### Journal rollups -- **Weekly** — opt-in; offered on the first substantive session of a new ISO week, written only if accepted, to `reviews/weekly/YYYY-Www-review.md`. -- **Monthly** — automatic Vault Health pass (below) on the first session of a calendar month. -- **Quarterly / annual** — manual / on request only. +The journal is one append-only time-series stream; rollups are coarser-grained entries on the same timeline, so they live under `journal/` — there is no separate `reviews/` tree. + +- **Weekly** — opt-in; offered on the first substantive session of a new ISO week, written only if accepted, to `journal/weekly/YYYY-Www.md`. +- **Monthly** — offered alongside the Vault Health pass on the first session of a calendar month, to `journal/monthly/YYYY-MM.md`. +- **Quarterly / annual** — manual / on request only, to `journal/quarterly/YYYY-Qn.md` and `journal/annual/YYYY.md`. ### Vault Health (monthly) -A cheap pass written to `reviews/monthly/YYYY-MM-vault-health.md`: flag stale active projects (`updated:` > 30 days), unprocessed inbox items (> 14 days), duplicate slugs across lifecycle folders (broken state), and broken-heading risk on frequently-PATCHed files. Findings are reported, not auto-fixed. +Agent self-maintenance (not a journal entry), written to `_agent/health/YYYY-MM-vault-health.md`. The bundled `scripts/vault-lint.sh` mechanically asserts the invariants — folder↔status mismatch, duplicate slugs across lifecycle folders, wikilinks in frontmatter, duplicate `## Agent Log` headings, stale active projects (`updated:` > 30 days), and aging inbox items (> 14 days). Findings are reported, not auto-fixed. --- @@ -220,9 +230,13 @@ Server `https://echoapi.alwisp.com`, bearer auth, root-addressed paths. | Meeting notes / call recap | `resources/meetings/YYYY-MM-DD-.md` | PUT | | Skill / plugin capability entry | `_agent/skills/active/.md` (→ `archived/` when retired) | PUT | | Daily activity / Agent Log | `journal/daily/YYYY-MM-DD.md` | POST / PATCH | -| Periodic review | `reviews/{weekly,monthly,quarterly,annual}/` | PUT | +| Journal rollup | `journal/{weekly/YYYY-Www,monthly/YYYY-MM,quarterly/YYYY-Qn,annual/YYYY}.md` | PUT | +| Vault-health audit (agent self-maintenance) | `_agent/health/YYYY-MM-vault-health.md` | PUT | +| Session-end orientation pointer | `_agent/heartbeat/last-session.md` | PUT | | Bootstrap marker (plugin-owned) | `_agent/echo-vault.md` (`schema_version`, date) | GET / PUT | +The complete endpoint→logic map — every path with its trigger and why it's distinct — is `skills/echo-memory/references/routing-map.md`. + **Slug rules:** kebab-case, ASCII, ~40 chars max. Every file carries canonical YAML frontmatter. --- @@ -297,3 +311,4 @@ If the API returns a connection error, timeout, or `502` (usually Obsidian / the | **0.4.1** | Bugfix: daily-note Agent Log heading detection now greps raw markdown for `^## Agent Log` instead of the `::`-delimited doc-map JSON (which never matched and appended duplicate headings). Added Scope Switching cold-start test harness. | | **0.5.0** | Self-bootstrap + control-logic-in-plugin. Plugin becomes the single source of truth: bundled `scaffold/` (8 templates, 3 anchor seeds, thin vault README, marker) bootstraps an empty vault with no external/local-path dependency. New `operating-contract.md` (principles + safety from the old in-vault `CLAUDE.md`); `bootstrap.md` rewritten as a portable bootstrap/repair/migrate manifest. Cold-start probe moved from `/vault/BOOTSTRAP.md` to `_agent/echo-vault.md` (carries `schema_version`). Live vault migrated to data-only. | | **0.5.1** | Routing-doc consistency pass: decision-mirror heading unified to `## Key Decisions`; stale `Current status` PATCH examples corrected to `Status`; vault-layout inline project example refreshed to the real template. All 17 `projects/active/` notes normalized losslessly to the canonical template heading set; `android-mqtt-shell` moved to `incubating/` (was broken `status: upcoming` in active). Plugin repackaged (21 files). | +| **0.6.0** | Schema 2. **#8 Inbox auto-fire:** the Loading procedure adds an inbox-depth GET and a load-time *Reconcile* step (inbox triage + scope-drift), so triage self-fires. **#10 Routing:** `reviews/` retired — weekly/monthly/quarterly/annual rollups fold into `journal/{weekly,monthly,quarterly,annual}/`, vault-health moves to `_agent/health/`; new `references/routing-map.md` is the complete audited endpoint→logic map. **Recs:** heartbeat pointer operationalized (read first at load, written at session end); new `scripts/vault-lint.sh` mechanically checks vault invariants. Dead refs pruned (`archive/`, `_agent/outputs/`, `resources/source-material`). Migration `1 → 2` in `bootstrap.md`. | diff --git a/echo-memory-0.6.0.plugin b/echo-memory-0.6.0.plugin new file mode 100644 index 0000000000000000000000000000000000000000..1dee6a4f8e77fe49d2031d2192199dbc8cae64d2 GIT binary patch literal 43094 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 a_Rg?@Mg;@^HA43O=ks1+;!DP_Xa5h9zuMaX delta 23247 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 mPlv-T(&YBZ(EL>hg&`iM(34|f|Bixg4.md + ├── health/ ← YYYY-MM-vault-health.md (monthly self-maintenance audit) ├── templates/ ← canonical note templates (seeded from the plugin's scaffold/) - ├── outputs/ ← briefs / drafts / summaries / synthesis ├── skills/ ← active / archived - └── heartbeat/ + └── heartbeat/ ← last-session.md orientation pointer (read at load, written at session end) ``` Control logic and the master scaffold live in the plugin, not the vault: @@ -55,8 +53,11 @@ skills/echo-memory/ │ ├── operating-contract.md ← durable principles + safety │ ├── bootstrap.md ← bootstrap / repair / migrate an empty vault │ ├── vault-layout.md ← canonical layout + frontmatter +│ ├── routing-map.md ← complete endpoint→logic map (every path, trigger, why distinct) │ ├── api-reference.md ← REST endpoint patterns + routing map │ └── session-log-template.md +├── scripts/ +│ └── vault-lint.sh ← read-only invariant checker (run by the monthly Vault Health pass) └── scaffold/ ← verbatim files the bootstrap writes into the vault ├── README.vault.md echo-vault.md ├── templates/ (8 note templates) diff --git a/echo-memory.plugin.src/skills/echo-memory/SKILL.md b/echo-memory.plugin.src/skills/echo-memory/SKILL.md index 081ef55..e425cb0 100644 --- a/echo-memory.plugin.src/skills/echo-memory/SKILL.md +++ b/echo-memory.plugin.src/skills/echo-memory/SKILL.md @@ -27,6 +27,7 @@ The endpoint has a **valid TLS certificate**, so `-k` is not needed (add it only - Durable principles, memory model, and safety rules: `references/operating-contract.md` - Bootstrapping an empty vault, repair, and schema migrations: `references/bootstrap.md` - Vault layout and frontmatter conventions: `references/vault-layout.md` +- Complete endpoint→logic routing map (every write destination, its trigger, and why it's distinct): `references/routing-map.md` - Full API reference with every endpoint pattern and the memory routing map: `references/api-reference.md` ## Operating Contract & Safety @@ -46,18 +47,26 @@ Load at the start of any substantive conversation — anything beyond a single q ### Loading procedure -The cold-start reads are independent — **issue them in parallel** (one batch of 4–5 GETs), not sequentially. Parallel loading is ~3× faster wall-clock for the same call count. +The cold-start reads are independent — **issue them in parallel** (one batch of 5–6 GETs), not sequentially. Parallel loading is ~3× faster wall-clock for the same call count. | # | GET | Notes | |---|-----|-------| | 1 | `/vault/_agent/echo-vault.md` | The bootstrap marker. 404 → vault not set up; follow `references/bootstrap.md`. 200 → check its `schema_version` and migrate if older. | | 2 | `/vault/_agent/memory/semantic/operator-preferences.md` | Jason's profile | | 3 | `/vault/_agent/context/current-context.md` | Active scope + Scope History | -| 4 | `/vault/_agent/sessions/` (listing) | Pick the ~5 most recent by reverse lex sort (filenames `YYYY-MM-DD-HHMM-.md`, so lex == chrono); only read the ones whose slugs look relevant | +| 4 | `/vault/_agent/heartbeat/last-session.md` → then `/vault/_agent/sessions/` | **Read the heartbeat first** — a one-line pointer (` @ `) written at the end of the previous session. It's an O(1) jump to the latest log, so you can skip or shortcut the full listing. Fall back to the `sessions/` listing only if the pointer is missing or looks stale; then pick the ~5 most recent by reverse lex sort (filenames `YYYY-MM-DD-HHMM-.md`, so lex == chrono) and read only the relevant ones. | | 5 | `/vault/journal/daily/YYYY-MM-DD.md` | Today's note; 404 is fine — it's created on first agent activity | +| 6 | `/vault/inbox/captures/inbox.md` | Inbox depth probe — feeds the load-time reconcile below. 404 is fine (empty inbox). | Do not read every session log — older sessions are reachable via `POST /search/simple/?query=...` when needed. +**Reconcile at load (do this every cold start, after the batch returns).** The batch already fetched everything needed for a cheap self-check — run it before diving into the work so memory maintains itself instead of drifting: + +1. **Inbox depth (Inbox Triage).** If `inbox/captures/inbox.md` (GET #6) holds dated capture lines older than ~7 days that were never routed, surface the count once and offer to triage — see **Inbox Triage** below. This is the load-time trigger that makes triage self-firing rather than something you only run when asked. +2. **Scope drift.** Compare `## Scope` in `current-context.md` (GET #3) against what Jason just asked for. If they diverge, follow **Scope Switching** to record the prior scope and set the new one. + +Keep the reconcile to a single short line to Jason (e.g. "3 inbox captures from last week are still un-routed — triage now?"); don't let it crowd out the actual request. + **If a specific project is in play**, follow up with a **search across all lifecycle subfolders** (`active/`, `incubating/`, `on-hold/`, `archived/`) — searching one folder at a time misses notes filed elsewhere. Search by **both the slug AND any human title** Jason used in this conversation: ```bash @@ -265,24 +274,42 @@ When scope changes: This keeps a rolling trail of recent scopes in one file instead of spawning separate stash notes. Trim Scope History to the last ~10 entries when it grows past that. -## Weekly Review (opt-in) +## Journal Rollups (the journal is one continuum) -On the **first substantive session of a new ISO week**, offer a short weekly rollup; write it only if Jason accepts. Path: `reviews/weekly/YYYY-Www-review.md` (ISO week, e.g. `2026-W24-review.md` — lex-sorts chronologically), `type: review`. Scope: open threads across `projects/active/`, inbox items aging past ~7 days, and the week's `## Scope History` changes from `current-context.md`. Keep it a light digest, not a vault-health audit. Detect the trigger by computing the current ISO week (`date +%G-W%V`) and checking whether that week's review note already exists. +The journal is a single append-only chronological stream. Rollups are just coarser-grained journal entries over the same timeline, so they **all live under `journal/`** — there is no separate `reviews/` tree. One place to read the whole time-series story, daily through annual. -The other cadences: **monthly** is automatic (the Vault Health pass below); **quarterly** and **annual** are **manual / on request only**. +| Cadence | Path | Trigger | Type | +|---------|------|---------|------| +| Daily | `journal/daily/YYYY-MM-DD.md` | first agent activity that day | `daily-note` | +| Weekly | `journal/weekly/YYYY-Www.md` (e.g. `2026-W24.md`) | first substantive session of a new ISO week — **opt-in**, offer first | `weekly-note` | +| Monthly | `journal/monthly/YYYY-MM.md` | first substantive session of a new calendar month — offer alongside the Vault Health pass | `monthly-note` | +| Quarterly | `journal/quarterly/YYYY-Qn.md` | **manual / on request only** | `review` | +| Annual | `journal/annual/YYYY.md` | **manual / on request only** | `review` | + +All filenames lex-sort chronologically. Detect the weekly trigger with `date +%G-W%V` and check whether that week's note already exists; monthly with `date +%Y-%m`. + +A weekly/monthly rollup is a **light digest** — open threads across `projects/active/`, inbox items aging past ~7 days, and the period's `## Scope History` changes from `current-context.md`. It is *not* a vault-health audit (that's an agent-maintenance artifact — see below). ## Vault Health (monthly) -On the first substantive session of a calendar month, run a quick health pass and write findings to `reviews/monthly/YYYY-MM-vault-health.md`. Don't auto-fix without asking. +On the first substantive session of a calendar month, run a quick health pass and write findings to `_agent/health/YYYY-MM-vault-health.md`. This is **agent self-maintenance, not a journal entry** — it lives under `_agent/` because it's about the vault's mechanical integrity, not Jason's work narrative. Don't auto-fix without asking. -Checks: +Run the bundled linter first — it mechanically checks the invariants below so you don't eyeball them: + +```bash +bash "${CLAUDE_PLUGIN_ROOT}/skills/echo-memory/scripts/vault-lint.sh" +``` + +Checks (the linter asserts each and prints violations): 1. **Stale active projects** — for each note in `projects/active/`, check `updated:` >30 days. Likely belongs in `on-hold/`. 2. **Unprocessed inbox** — GET `inbox/captures/inbox.md`. List items older than 14 days that never moved through the triage protocol. 3. **Duplicate slugs across lifecycle folders** — any slug appearing in more than one of `active/`, `incubating/`, `on-hold/`, `archived/` is broken state. -4. **Broken-heading risk** — sample 2–3 frequently-PATCHed files; confirm `## Agent Log`, `## Scope`, `## Fact / Pattern`, `## Observations` headings still exist. +4. **Folder ↔ `status:` mismatch** — any `projects//` note whose `status:` frontmatter disagrees with its folder. +5. **Wikilinks in frontmatter** — any `[[...]]` inside a YAML frontmatter block (breaks Obsidian reading view). +6. **Duplicate `## Agent Log` headings** — any daily note with more than one. -The pass is cheap (a few searches + a directory listing) and pays for itself by catching drift before it requires a reorg. +The pass is cheap and pays for itself by catching drift before it requires a reorg. Write the findings as a digest; act on them only with Jason's go-ahead. ## Daily Note — Agent Log @@ -349,6 +376,12 @@ curl -s -X PATCH -H "$AUTH" \ | Meeting notes / call recap | `resources/meetings/YYYY-MM-DD-.md` | PUT | | Skill / plugin capability entry (catalog, not the build work) | `_agent/skills/active/.md` (→ `_agent/skills/archived/` when retired) | PUT | | Daily activity / Agent Log | `journal/daily/YYYY-MM-DD.md` — see **Daily Note — Agent Log** above | PATCH (with auto-create) | +| Weekly / monthly rollup | `journal/weekly/YYYY-Www.md` · `journal/monthly/YYYY-MM.md` — see **Journal Rollups** | PUT | +| Quarterly / annual review | `journal/quarterly/YYYY-Qn.md` · `journal/annual/YYYY.md` (manual / on request) | PUT | +| Vault-health audit (agent self-maintenance) | `_agent/health/YYYY-MM-vault-health.md` — see **Vault Health** | PUT | +| Session-end orientation pointer | `_agent/heartbeat/last-session.md` (one line: ` @ `) | PUT | + +> **The complete, audited routing map lives in `references/routing-map.md`** — every write destination with its trigger, what lands there, and why it's distinct from its neighbors. This table is the quick-reference; the map is the authority. If a path isn't in the map, it shouldn't be written to. **Decision mirrors:** if the decision belongs to an existing note in `projects/active/`, add a `[[wikilink]]` to the ADR under that project's `## Key Decisions` heading (PATCH). If no matching project note exists, skip the mirror — the by-date ADR is sufficient; do not invent topical mirror files in `decisions/by-project/`. @@ -382,6 +415,18 @@ curl -s -X PUT \ Then add a one-line entry to today's daily note via the **Daily Note — Agent Log** procedure above. +Finally, update the heartbeat pointer so the next session can orient in one GET (this is what closes the loop with loading-procedure Step 4 — a pointer nobody writes is a pointer nobody can read): + +```bash +NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) +printf '%s @ %s\n' "_agent/sessions/${SESSION_FILENAME}" "$NOW" \ + | curl -s -X PUT -H "Authorization: Bearer 241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab" \ + -H "Content-Type: text/markdown" --data-binary @- \ + "https://echoapi.alwisp.com/vault/_agent/heartbeat/last-session.md" +``` + +`last-session.md` is a single-line pointer overwritten (PUT) each session end — never appended, so it can't grow or duplicate. + ## Vault Unreachable If the API returns a connection error, timeout, or `502`, tell Jason once that the memory vault is unreachable (a `502` usually means Obsidian/the REST plugin is not running on the backend), then proceed without memory. Do not retry repeatedly. diff --git a/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md b/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md index af97505..34ca3be 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md @@ -169,7 +169,7 @@ Returns an array of `{ filename, score, matches: [{ context, match }] }`. ```bash curl -s -X DELETE \ -H "Authorization: Bearer 241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab" \ - "https://echoapi.alwisp.com/vault/archive/notes/old-note.md" + "https://echoapi.alwisp.com/vault/inbox/imports/old-note.md" ``` Only on explicit operator request. Deletion is destructive. @@ -205,7 +205,9 @@ Only on explicit operator request. Deletion is destructive. | Meeting notes / call recap | `resources/meetings/YYYY-MM-DD-.md` | PUT | | Skill / plugin capability entry (catalog, not build work) | `_agent/skills/active/.md` (→ `archived/` when retired) | PUT | | Daily activity / Agent Log | `journal/daily/YYYY-MM-DD.md` | POST / PATCH | -| Periodic review | `reviews/{weekly,monthly,quarterly,annual}/` (weekly = opt-in offer on first session of a new ISO week; monthly = auto via Vault Health; quarterly/annual = manual) | PUT | +| Journal rollup | `journal/{weekly/YYYY-Www,monthly/YYYY-MM,quarterly/YYYY-Qn,annual/YYYY}.md` (weekly = opt-in on first session of a new ISO week; monthly = offered with Vault Health; quarterly/annual = manual) | PUT | +| Vault-health audit (agent self-maintenance) | `_agent/health/YYYY-MM-vault-health.md` (monthly; NOT a journal entry) | PUT | +| Session-end orientation pointer | `_agent/heartbeat/last-session.md` (one line, overwritten each session end) | PUT | | Bootstrap marker (plugin-owned) | `_agent/echo-vault.md` (`schema_version`, bootstrap date) — the "is this vault set up?" probe | GET / PUT | **Slug rules:** kebab-case, ASCII, ~40 chars max. Every file carries canonical frontmatter (see `vault-layout.md`). diff --git a/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md b/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md index b9d9f42..f64c48e 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md @@ -19,7 +19,7 @@ At session start, GET the marker: curl -s -o /dev/null -w "%{http_code}" -H "$AUTH" "$BASE/vault/_agent/echo-vault.md" ``` -- **200** → bootstrapped. Read the marker's `schema_version`; if it is **less than** the plugin's current schema (1), run a migration pass (see *Migrations* below), otherwise proceed straight to the loading procedure in `SKILL.md`. +- **200** → bootstrapped. Read the marker's `schema_version`; if it is **less than** the plugin's current schema (2), run a migration pass (see *Migrations* below), otherwise proceed straight to the loading procedure in `SKILL.md`. - **404** → empty/unconfigured vault. Run **Fresh bootstrap** below. (If you expected an existing vault, confirm with the operator once that the REST API is pointed at the right vault before seeding.) --- @@ -36,18 +36,19 @@ The REST API auto-creates parent directories on PUT, so creating the tree = seed ``` inbox/captures inbox/imports inbox/processing-log -journal/daily journal/templates +journal/daily journal/weekly journal/monthly journal/quarterly journal/annual journal/templates projects/active projects/incubating projects/on-hold projects/archived areas/business areas/personal areas/learning areas/systems resources/concepts resources/references resources/people resources/meetings decisions/by-date -reviews/weekly reviews/monthly reviews/quarterly reviews/annual _agent/context _agent/memory/working _agent/memory/episodic _agent/memory/semantic -_agent/sessions _agent/templates _agent/heartbeat +_agent/sessions _agent/health _agent/templates _agent/heartbeat _agent/skills/active _agent/skills/archived ``` > `decisions/by-project/` is intentionally **not** created — it is retired. A project-relevant decision is mirrored as a `[[wikilink]]` under that project's `## Key Decisions` heading instead. +> +> `reviews/` is **not** created — it is retired. Journal rollups (weekly/monthly/quarterly/annual) live under `journal/`; the monthly vault-health audit lives under `_agent/health/`. A leaf README is just a one-liner, e.g.: @@ -117,3 +118,4 @@ Run the same steps 1–5, but GET-probe each path first and **only create what i When the marker's `schema_version` is older than the plugin's, apply the migration steps for each intervening version, then PATCH the marker's `schema_version` frontmatter to the new value. - **0 → 1** (control-docs-in-plugin): the vault previously carried root control docs (`CLAUDE.md`, `BOOTSTRAP.md`, `STRUCTURE.md`, `index.md`). Back them up outside the vault, DELETE them, PUT the thin `scaffold/README.vault.md` over the old verbose `README.md`, write the `_agent/echo-vault.md` marker, and scrub now-dangling `[[CLAUDE]]`/`[[BOOTSTRAP]]`/`[[STRUCTURE]]`/`[[index]]` links from the `## Related` sections of `operator-preferences.md` and `current-context.md` (leave historical session logs alone). Confirm with the operator before deleting. +- **1 → 2** (reviews-folded-into-journal): the `reviews/` tree is retired. (a) For each note under `reviews/weekly/` and `reviews/monthly/`, MOVE it into `journal/weekly/` (rename `YYYY-Www-review.md` → `YYYY-Www.md`) and `journal/monthly/` respectively, preserving the earliest `created:`. (b) Move any `reviews/monthly/YYYY-MM-vault-health.md` to `_agent/health/`. (c) Move `reviews/quarterly|annual/` artifacts to `journal/quarterly|annual/`. (d) Update inbound `[[reviews/...]]` wikilinks in `## Related` sections to the new paths. (e) DELETE the now-empty `reviews/` tree. Confirm with the operator before deleting; leave historical session logs alone. *(Jason's live vault was hand-migrated for the one existing `2026-W24` artifact on 2026-06-10; this step covers any vault bootstrapped under schema 1.)* diff --git a/echo-memory.plugin.src/skills/echo-memory/references/routing-map.md b/echo-memory.plugin.src/skills/echo-memory/references/routing-map.md new file mode 100644 index 0000000..99c2e67 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/references/routing-map.md @@ -0,0 +1,112 @@ +# ECHO Routing Map + +**This document is canonical and complete.** Every write destination in the vault appears here exactly once, with the condition that routes content to it, what lands there, and why it is distinct from its neighbours. The rule for the whole system: **if a path is not in this map, nothing is written to it.** A path that cannot justify its separateness from a neighbour is a merge candidate, not a valid destination. + +Three views of the same truth: the `SKILL.md` *Where to Write* table is the quick-reference, this map is the authority, and `vault-layout.md` is the physical tree. When they disagree, this map wins and the others are fixed to match. + +## How to read a row + +- **Trigger** — the observable condition that sends content here. If two rows could both fire, the more specific trigger wins. +- **What lands** — the unit of content written. +- **Distinct because** — the one reason this path is not merged into its nearest neighbour. This is the load-bearing column; a row without it is a bug. +- **Method** — the dominant REST verb (see `api-reference.md` for mechanics). + +--- + +## inbox/ — unsorted intake + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `inbox/captures/inbox.md` | "Save this, sort later" — destination genuinely unknown at capture time | One date-prefixed line | The only path whose contract is *deferred routing*; everything else here has a known home | POST | +| `inbox/imports/.md` | Raw external material dropped in wholesale (export, paste, dump) | The raw artifact, unedited | Holds un-triaged *bulk*, vs `captures` which holds single lines | PUT | +| `inbox/processing-log/YYYY-MM-DD.md` | An inbox item is routed to its real home | One line: `` | Audit trail of moves — never holds memory itself, only the record of routing | POST | + +Captures and imports are temporary by contract. Triage drains them into the homes below and logs the move; the original is left until Jason okays deletion. + +## journal/ — the one append-only time-series stream + +Rollups are coarser-grained journal entries over the same timeline, so they live in the same tree. There is no separate `reviews/` tree. + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `journal/daily/YYYY-MM-DD.md` | First agent activity on a given day | `## Agent Log` line(s) + day notes | Finest grain; the only journal note PATCHed repeatedly within its period | PATCH (auto-create) | +| `journal/weekly/YYYY-Www.md` | First substantive session of a new ISO week — **opt-in**, offer first | Light digest: open `active/` threads, aging inbox, week's scope changes | Coarser than daily, finer than monthly; ISO-week grain | PUT | +| `journal/monthly/YYYY-MM.md` | First substantive session of a new month — offered alongside Vault Health | Month digest, same shape as weekly | Month grain; separate cadence and trigger from weekly | PUT | +| `journal/quarterly/YYYY-Qn.md` | **Manual / on request only** | Quarter-scale narrative review | Strategic grain; never auto-fires | PUT | +| `journal/annual/YYYY.md` | **Manual / on request only** | Year-scale narrative review | Coarsest grain; never auto-fires | PUT | +| `journal/templates/` | Bootstrap only (seeded from plugin masters) | Note templates | Holds templates, not journal content; never a runtime routing target | PUT (seed) | + +## projects/ — work with an end state + +Lifecycle folders; `status:` frontmatter MUST equal the folder name (the linter checks this). + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `projects/active/.md` | Work in motion now | Project note (Status PATCHed fresh) | Default state for anything being worked | PUT + PATCH | +| `projects/incubating/.md` | Idea captured, work not started | Project note | Pre-work; promote to `active/` when work begins | PUT | +| `projects/on-hold/.md` | Paused but still tracked | Project note | Resumable; distinct from `archived` (which is terminal) | PUT | +| `projects/archived/.md` | Done, abandoned, or rolled up | Project note | Terminal; kept for history, never deleted | PUT | + +**Project vs area:** has an end state → `projects/`. Never "done" → `areas/`. + +## areas/ — standing responsibilities, no finish line + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `areas//.md` | Ongoing domain Jason maintains indefinitely (``: business/personal/learning/systems) | Area note | No end state — the one thing that disqualifies it from `projects/` | PUT | + +## resources/ — reference material about the world + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `resources/people/.md` | A fact about a specific person | Person note (kebab-case slug) | Keyed to a person, not a topic or event | PUT / PATCH | +| `resources/concepts/.md` | A reusable concept/idea Jason wants on file | Concept note | An idea, vs a `reference` which is an external source | PUT | +| `resources/references/.md` | An external source/link worth keeping | Reference note | Points outward (a source), vs `concepts` (an idea) | PUT | +| `resources/meetings/YYYY-MM-DD-.md` | Notes/recap tied to a specific meeting or call | Meeting note; mirror decisions to `decisions/by-date/`, commitments to the project | Event-anchored to a meeting, vs a project's ongoing thread | PUT | + +## decisions/ — non-obvious decisions (ADR) + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `decisions/by-date/YYYY-MM-DD-.md` | A non-obvious decision worth recording | ADR: Context → Decision → Consequences | The chronological system of record for decisions | PUT | + +**Mirror, don't duplicate:** if the decision belongs to an existing `projects/active/` note, PATCH a `[[wikilink]]` to the ADR under that project's `## Key Decisions`. No matching project → skip the mirror; the by-date ADR stands alone. + +## _agent/ — the agent's own working substrate + +| Path | Trigger | What lands | Distinct because | Method | +|------|---------|------------|------------------|--------| +| `_agent/echo-vault.md` | Bootstrap / schema migration only | Marker: `schema_version`, bootstrap date | Plugin-owned probe; never hand-edited | GET / PUT | +| `_agent/context/current-context.md` | Active scope changes; task focus shifts | `## Scope`, `## Scope History`, priorities | Single *live* scope pointer, vs episodic which is a *past* record | PATCH / PUT | +| `_agent/memory/semantic/operator-preferences.md` | A preference/pattern about Jason | Append under `## Observations`; promote to `## Fact / Pattern` when stable | The one curated profile; distinct from ad-hoc semantic notes | PATCH | +| `_agent/memory/semantic/.md` | A durable fact/pattern that isn't a Jason-preference | Semantic note | Timeless fact, vs episodic (time-stamped event) and working (transient) | PUT | +| `_agent/memory/episodic/.md` | A record of *what happened, when* | Episodic note | Anchored to an event in time; not a standing fact | PUT | +| `_agent/memory/working/.md` | Short-lived state needed only for the current effort | Working note | Explicitly transient/time-boxed; safe to go stale | PUT | +| `_agent/sessions/YYYY-MM-DD-HHMM-.md` | A substantive session ends (decisions/artifacts/commitments) | Session log (see template) | Per-session record; the unit loading Step 4 scans | PUT | +| `_agent/health/YYYY-MM-vault-health.md` | First substantive session of a month (Vault Health pass) | Health-audit findings | Agent self-maintenance about vault integrity — NOT Jason's work narrative, so not in `journal/` | PUT | +| `_agent/heartbeat/last-session.md` | End of every session, after the session log is written | One line: ` @ ` | O(1) orientation pointer read first at load (Step 4); overwritten, never grows | PUT | +| `_agent/templates/` | Bootstrap only (seeded from plugin masters) | Canonical note templates | Holds templates, not memory; never a runtime routing target | PUT (seed) | +| `_agent/skills/active/.md` | Jason authors/installs a skill and wants it catalogued | Skill capability entry | Catalogs a *capability*, vs `projects/` which tracks the *build effort* | PUT | +| `_agent/skills/archived/.md` | A catalogued skill is retired | Skill entry (moved from `active/`) | Terminal state of the skill catalog | PUT | + +--- + +## Retired paths — explicitly never written + +Listed so they are recognised as dead and never recreated. Any one of these appearing in a live vault is a migration miss (see `bootstrap.md` Migrations). + +| Path | Status | Where it went instead | +|------|--------|-----------------------| +| `reviews/` (weekly/monthly/quarterly/annual) | Retired in schema 2 | Journal rollups → `journal/{weekly,monthly,quarterly,annual}/`; vault-health → `_agent/health/` | +| `decisions/by-project/` | Retired in schema 1 | ADR mirrored as a `[[wikilink]]` under the project's `## Key Decisions` | +| `archive/` (top-level) | Never existed | Project archival → `projects/archived/`; skill archival → `_agent/skills/archived/` | +| `CLAUDE.md` / `BOOTSTRAP.md` / `STRUCTURE.md` / `index.md` (in-vault) | Retired in schema 1 | All control logic lives in the plugin (`references/`), not the vault | + +## Routing decision tree (the calls that get mis-made) + +1. **Destination unknown right now?** → `inbox/captures/`. Known? → route directly; never park a known fact in the inbox. +2. **Is it about Jason's work over time?** → `journal/` (pick the grain by cadence). **About the vault's mechanical health?** → `_agent/health/`. These two look similar monthly but answer different questions. +3. **Does the effort have an end state?** → `projects/` (folder = `status:`). **No finish line?** → `areas/`. +4. **A fact about the world:** timeless → `semantic/`; a thing that happened → `episodic/`; needed only for now → `working/`. A fact about a *person* → `resources/people/`. +5. **A decision:** always `decisions/by-date/`; mirror into a project only if one already exists. +6. **A capability (skill/plugin):** `_agent/skills/` catalogs the capability; `projects/` tracks building it. Both can exist for the same skill. diff --git a/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md b/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md index bc34859..bc5e438 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md @@ -11,8 +11,12 @@ │ ├── captures/ ← quick captures (inbox.md), date-prefixed lines │ ├── imports/ ← raw imported material │ └── processing-log/ -├── journal/ +├── journal/ ← one append-only time-series stream; rollups are coarser journal entries, NOT a separate reviews/ tree │ ├── daily/ ← YYYY-MM-DD.md (has an "Agent Log" section) +│ ├── weekly/ ← YYYY-Www.md (ISO week, opt-in rollup) +│ ├── monthly/ ← YYYY-MM.md (monthly rollup) +│ ├── quarterly/ ← YYYY-Qn.md (manual / on request) +│ ├── annual/ ← YYYY.md (manual / on request) │ └── templates/ ├── projects/ ← lifecycle: incubating → active → on-hold/archived │ ├── active/ ← current work (status: active) @@ -29,7 +33,7 @@ │ └── decision-template.md │ (decisions/by-project/ is retired and not created — │ mirror an ADR into a project's `## Key Decisions` heading instead) -├── reviews/ ← weekly / monthly / quarterly / annual +│ (reviews/ is retired — journal rollups live under journal/; vault-health audits under _agent/health/) └── _agent/ ├── echo-vault.md ← bootstrap marker: schema_version + bootstrap date (plugin-owned; the "is this vault set up?" probe) ├── context/ ← current-context.md and task bundles @@ -38,12 +42,13 @@ │ ├── episodic/ ← what happened, when │ └── semantic/ ← durable facts/patterns (operator-preferences.md) ├── sessions/ ← YYYY-MM-DD-HHMM-.md + ├── health/ ← YYYY-MM-vault-health.md (monthly self-maintenance audit; NOT a journal entry) ├── templates/ ← canonical note templates ├── skills/ ← active / archived └── heartbeat/ ← single-line pointers (e.g. last-session.md → most-recent session log path) ``` -**Heartbeat:** `_agent/heartbeat/last-session.md` is a one-line pointer file an agent MAY write at session end (` @ `). Reading it at session start is cheaper than listing the sessions directory; use it as a hint, not a source of truth — fall back to the directory listing if it's missing or stale. +**Heartbeat:** `_agent/heartbeat/last-session.md` is a one-line pointer (` @ `) the **session-logging procedure writes (PUT, overwrite) at session end** and the **loading procedure reads first (Step 4)** as an O(1) shortcut to the latest session log. It is a hint, not a source of truth — fall back to the `sessions/` directory listing if it's missing or stale. Because it's PUT-overwritten, it never grows or duplicates. **Slug rules:** kebab-case, ASCII only, truncate to ~40 chars. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md index 4714e4a..b8f41fa 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md @@ -9,4 +9,4 @@ This Obsidian vault is the persistent memory substrate ("second brain") for its - **Bootstrap / repair:** see the plugin's `references/bootstrap.md`. - **Version marker:** `_agent/echo-vault.md` records the schema version and bootstrap date. -Folders: `inbox/`, `journal/`, `projects/`, `areas/`, `resources/`, `decisions/`, `reviews/`, `archive/`, and the agent subtree `_agent/`. +Folders: `inbox/`, `journal/` (daily + weekly/monthly/quarterly/annual rollups), `projects/`, `areas/`, `resources/`, `decisions/`, and the agent subtree `_agent/`. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md index e83b49f..f55f2c1 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md @@ -6,7 +6,7 @@ updated: {{DATE}} tags: [agent, system, marker] agent_written: true source_notes: [] -schema_version: 1 +schema_version: 2 bootstrapped: {{DATE}} managed_by: echo-memory-plugin --- diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh b/echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh new file mode 100644 index 0000000..423f8a4 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh @@ -0,0 +1,175 @@ +#!/usr/bin/env bash +# vault-lint.sh — mechanically assert ECHO vault invariants. +# +# Catches the recurring "invariant violation" bugs that prose rules can't enforce +# on their own: folder<->status drift, duplicate slugs, wikilinks leaking into +# frontmatter, duplicate "## Agent Log" headings, stale active projects, and +# aging inbox captures. Invoked by the monthly Vault Health pass (see SKILL.md), +# but safe to run any time — it is READ-ONLY and never modifies the vault. +# +# Exit status: 0 = clean, 1 = violations found, 2 = vault unreachable. +# +# Config is hardcoded to match the rest of the plugin; override via env if needed: +# ECHO_BASE (default https://echoapi.alwisp.com) +# ECHO_KEY (default the plugin's bearer token) +# STALE_DAYS (default 30) INBOX_DAYS (default 14) + +set -euo pipefail + +ECHO_BASE="${ECHO_BASE:-https://echoapi.alwisp.com}" +ECHO_KEY="${ECHO_KEY:-241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab}" +STALE_DAYS="${STALE_DAYS:-30}" +INBOX_DAYS="${INBOX_DAYS:-14}" + +ECHO_BASE="$ECHO_BASE" ECHO_KEY="$ECHO_KEY" STALE_DAYS="$STALE_DAYS" INBOX_DAYS="$INBOX_DAYS" \ +python3 - <<'PY' +import os, sys, json, re, datetime, urllib.request, urllib.error + +BASE = os.environ["ECHO_BASE"].rstrip("/") +KEY = os.environ["ECHO_KEY"] +STALE_DAYS = int(os.environ["STALE_DAYS"]) +INBOX_DAYS = int(os.environ["INBOX_DAYS"]) +TODAY = datetime.date.today() +LIFECYCLES = ["active", "incubating", "on-hold", "archived"] +SKIP = {"README.md", "project-template.md", "decision-template.md"} + +violations = [] +def flag(check, msg): violations.append((check, msg)) + +def get(path): + """GET /vault/. Returns text, or None on 404. Raises on hard failure.""" + req = urllib.request.Request(f"{BASE}/vault/{path}", + headers={"Authorization": f"Bearer {KEY}"}) + try: + with urllib.request.urlopen(req, timeout=20) as r: + return r.read().decode("utf-8", "replace") + except urllib.error.HTTPError as e: + if e.code == 404: + return None + raise + +def listdir(path): + body = get(path if path.endswith("/") else path + "/") + if body is None: + return [] + try: + return json.loads(body).get("files", []) + except json.JSONDecodeError: + return [] + +def frontmatter(text): + """Return (raw_frontmatter_str, dict_of_scalar_fields). Empty if no block.""" + if not text or not text.startswith("---"): + return "", {} + end = text.find("\n---", 3) + if end == -1: + return "", {} + raw = text[3:end] + fields = {} + for line in raw.splitlines(): + m = re.match(r"^([A-Za-z_]+):\s*(.*)$", line) + if m: + fields[m.group(1)] = m.group(2).strip() + return raw, fields + +def parse_date(s): + m = re.match(r"(\d{4}-\d{2}-\d{2})", s or "") + if not m: + return None + try: + return datetime.date.fromisoformat(m.group(1)) + except ValueError: + return None + +# Reachability probe +try: + if get("_agent/echo-vault.md") is None: + print("vault-lint: marker missing — vault may not be bootstrapped.", file=sys.stderr) +except Exception as e: + print(f"vault-lint: vault unreachable ({e}).", file=sys.stderr) + sys.exit(2) + +# ---- Projects: folder<->status, stale active, wikilinks-in-frontmatter, dup slugs +slug_homes = {} +for lc in LIFECYCLES: + for fn in listdir(f"projects/{lc}"): + if fn.endswith("/") or fn in SKIP: + continue + slug = fn[:-3] if fn.endswith(".md") else fn + slug_homes.setdefault(slug, []).append(lc) + text = get(f"projects/{lc}/{fn}") + if text is None: + continue + raw, fm = frontmatter(text) + status = fm.get("status", "").strip().strip('"').strip("'") + if status and status != lc: + flag("folder/status", f"projects/{lc}/{fn}: status='{status}' but folder='{lc}'") + if "[[" in raw: + flag("frontmatter-wikilink", f"projects/{lc}/{fn}: '[[...]]' inside frontmatter") + if lc == "active": + d = parse_date(fm.get("updated", "")) + if d and (TODAY - d).days > STALE_DAYS: + flag("stale-active", f"projects/active/{fn}: updated {d} ({(TODAY-d).days}d ago) — consider on-hold/") +for slug, homes in slug_homes.items(): + if len(homes) > 1: + flag("duplicate-slug", f"'{slug}' exists in {', '.join(homes)}") + +# ---- Wikilinks-in-frontmatter for other high-churn notes +extra = ["_agent/context/current-context.md", + "_agent/memory/semantic/operator-preferences.md"] +for fn in listdir("resources/people"): + if fn.endswith(".md") and fn not in SKIP: + extra.append(f"resources/people/{fn}") +for fn in listdir("_agent/memory/semantic"): + if fn.endswith(".md") and fn not in SKIP: + extra.append(f"_agent/memory/semantic/{fn}") +for path in extra: + text = get(path) + if text is None: + continue + raw, _ = frontmatter(text) + if "[[" in raw: + flag("frontmatter-wikilink", f"{path}: '[[...]]' inside frontmatter") + +# ---- Daily notes: duplicate "## Agent Log" headings +for fn in listdir("journal/daily"): + if not fn.endswith(".md") or fn in SKIP: + continue + text = get(f"journal/daily/{fn}") or "" + n = len(re.findall(r"(?m)^## Agent Log\s*$", text)) + if n > 1: + flag("duplicate-agent-log", f"journal/daily/{fn}: {n} '## Agent Log' headings") + +# ---- Inbox: captures aging past INBOX_DAYS +inbox = get("inbox/captures/inbox.md") or "" +for line in inbox.splitlines(): + m = re.match(r"^\s*-\s*(\d{4}-\d{2}-\d{2})\b", line) + if m: + d = parse_date(m.group(1)) + if d and (TODAY - d).days > INBOX_DAYS: + flag("aging-inbox", f"inbox capture {d} ({(TODAY-d).days}d): {line.strip()[:80]}") + +# ---- Report +if not violations: + print("vault-lint: clean — all invariants hold.") + sys.exit(0) + +print(f"vault-lint: {len(violations)} violation(s) found\n") +by = {} +for check, msg in violations: + by.setdefault(check, []).append(msg) +labels = { + "folder/status": "Folder <-> status mismatch", + "duplicate-slug": "Duplicate slug across lifecycle folders", + "frontmatter-wikilink": "Wikilink in frontmatter (breaks reading view)", + "duplicate-agent-log": "Duplicate '## Agent Log' heading", + "stale-active": f"Stale active project (updated > {STALE_DAYS}d)", + "aging-inbox": f"Inbox capture aging (> {INBOX_DAYS}d)", +} +for check, msgs in by.items(): + print(f"## {labels.get(check, check)}") + for m in msgs: + print(f" - {m}") + print() +sys.exit(1) +PY