From d256b7f9df634b9fcecb09e9eb2aaae2cbe1885d Mon Sep 17 00:00:00 2001 From: Jason Stedwell Date: Fri, 19 Jun 2026 21:57:41 -0500 Subject: [PATCH] bump to 0.7.1 --- README.md | 1 + echo-memory-0.7.1.plugin | Bin 0 -> 148397 bytes echo-memory.plugin | Bin 142196 -> 148397 bytes .../.claude-plugin/plugin.json | 2 +- .../skills/echo-memory/SKILL.md | 18 ++++--- .../scaffold/anchors/current-context.seed.md | 1 + .../skills/echo-memory/scripts/echo.sh | 48 +++++++++++++++++- .../skills/echo-memory/scripts/vault-lint.sh | 25 +++++++++ 8 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 echo-memory-0.7.1.plugin diff --git a/README.md b/README.md index f893f2b..8da4772 100644 --- a/README.md +++ b/README.md @@ -352,4 +352,5 @@ If the API returns a connection error, timeout, or `502` (usually Obsidian / the | **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`. | +| **0.7.1** | **Scope-drift fix.** Scope is the most churn-prone state (several sessions/day) and had no freshness signal, so sessions silently ran under stale scope (same failure class as #8). Added a `scope_updated:` frontmatter timestamp (maintained automatically), an `echo.sh scope show` / `scope set` command (atomic switch: archive prior → replace → stamp), and a `vault-lint.sh` **drift check** (flags when ≥ `SCOPE_STALE_SESSIONS`, default 3, session logs are dated after `scope_updated`) — making drift mechanically *evaluable* via `/echo-health`. Tightened the SKILL load-reconcile to *state and confirm* scope every session and switch before working. (Also fixed a bash nested-quote parse bug found while building `scope`, where `show` could fall through into `set`.) | | **0.7.0** | Schema 2 (unchanged layout). Hardening pass — gave the prose-and-curl skill an executable spine. **S2** `scripts/echo.sh`: one validated client wrapping every verb with auth, HTTP-status checking (failed writes exit non-zero instead of looking like success), one bounded retry on 5xx, read-back-verified PUT, and idempotent `append`. **S3** `scripts/routing.json`: canonical machine-readable route manifest; `vault-lint.sh` enforces it (flags unknown/retired paths). **S4** deterministic `scripts/bootstrap.sh` + `scripts/migrate.sh` (idempotent, dry-run, probe-before-write; fixes the old CWD-relative `@scaffold/...` empty-body bug). **S5** cooperative advisory lock (`_agent/locks/vault.lock`) + documented multi-writer model. **M1/M2/M5** linter rewrite: real YAML parsing, injected clock (`ECHO_TODAY`), exits `3` (not "clean") on an un-bootstrapped vault, plus routing-membership + frontmatter-integrity checks. **M3** status-check guidance throughout. **M4** four slash commands (`/echo-load`, `/echo-save`, `/echo-triage`, `/echo-health`). Added a credential-free A/B `eval/` harness (mock REST API + fault injection): isolates a **−76% generated-token** I/O layer and **4 → 0 silent write failures** vs 0.6. | diff --git a/echo-memory-0.7.1.plugin b/echo-memory-0.7.1.plugin new file mode 100644 index 0000000000000000000000000000000000000000..07f501fb84d8adc9299f96547d053777c2f9f863 GIT binary patch literal 148397 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 HKlT3t31JXS literal 0 HcmV?d00001 diff --git a/echo-memory.plugin b/echo-memory.plugin index 54b35570fcc871b8279412f4bd845e705939ef37..07f501fb84d8adc9299f96547d053777c2f9f863 100644 GIT binary patch delta 6901 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 ZJu%g9?tJ}E9!@SE(MPs@_Lz?8egRohzj*)v delta 1272 zcmZWnTSy#N7@qU5*G*h^A&J^GdhA-%ad*&F)4HokS5uPoVg)S;Ma)ijkGtEfGwaN3 zj1ScaZGEg|)BF;8p{YWU+BB6iX^`}#l+uI{u!x}s`p}1#CZ&a52qaC<%mz)!Fz4a> z&i7x=$G0?7`qx^?=jSRwU(795G?(a$t3zkcXO?m|D+Wl*a%<&+2Vh}&y=m?X7@J?# zHvDdne|~l7OM<`MtrG<6Jeix`sL8o~#mhh3YAsp*_3v;MepE%?GQ}szHy+OzmtX&I z@}ElqL9kAvE&sZ<%oP3Py+Zu6mAqq~50VaI`r3(6XP$hO94RnQ9VLSeE?8I{avb^j z&hU&N4A0~yH>%9?8KV29BvGWj>S#vR7>)XTbRec?Sd^v|8jWQ&jVVSTrYZ(IVMwF# zC~Z9O+#vO}HBmVsrxe|w<4M_|&&#^1(ATpZ%la`Erz5H+(L*EDNU{kUPaS7kg84a{ zPOIZo6zw5&U_51X#F8l`!FMoJsPF01OpDdBJ zhEB=pJe*|816?dBD+#8DoX%E>_D2SL57KBxV;QFKy=5Ag4ZhfG*>sv2IJrhD_Qd3j zk=6KkyR|6VL-{KCv5kBVO{WwVqR{{iwgmSCTC5+(B&aNGvYv<2Yh=gaxXN^;!JzC! ziobt?8GhRT^1z_oG|A++HDDyA>73W)QT{gBFqo!rr))`FPNgRTifS+#NpQRAi)uo0 z1||Gzop^C&jkrqfg(PR2g!iwJ2E2TOESjf&B;WPpwn}hg+7Cfb*T<_v%{OjNTqS~F zoiIjrLM>kN!)LhL2leK~0C2!gg5hPy4qod@MxM>JK!SlY~tI`z!}%0*+i)m zqHx`Xvz^dU_gD~xt?%~q6eURfqzTJIAUdY{NbbU|YMjWC?f(832-G;7w))XP3W9g5 zhcG|gp2gV^9B^E@OYnjpcH_TRv%-51P;@7hVPBY2KiwzzZWlCQyo)=bcEfhO90nKE z3pm>aE%+Z7LB<9lOC!R!Hh2RPU@1bm+PPhLw3}btb67+py7odbUb2{j1)EG5KG*^t zd~+}Chwh@yYfo++y;!r47ZsE|#P*%8z%v&6OKG0{eIL96pKi;8;d&^="` (see **Scope Switching**). If `scope show` reports several sessions logged since the last switch, treat the recorded scope as suspect and confirm with Jason rather than trusting it. 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. @@ -307,16 +307,22 @@ curl -s -X POST \ ## Scope Switching (`current-context.md`) -`_agent/context/current-context.md` tracks a single active scope. Jason routinely shifts scope within a day (echo plugin → MPM brand → WISP docs). +`_agent/context/current-context.md` tracks a single active scope. Jason routinely shifts scope within a day (echo plugin → MPM brand → WISP docs), so this is high-churn — switch deliberately, every time the work changes topic. -When scope changes: +**Preferred — one command:** -1. PATCH `prepend` a dated bullet to `## Scope History` capturing the **prior** scope (one line: `- 2026-06-06: `). If `## Scope History` doesn't exist yet, POST the heading first, same pattern as the daily-note Agent Log. -2. PATCH `replace` `## Scope` with the new scope. -3. PATCH the frontmatter `updated:` field. +```bash +"$ECHO" scope set "" +``` + +`scope set` does the whole switch atomically and correctly: it archives the **prior** scope to `## Scope History` (dated, truncated), replaces `## Scope` with the new text, and stamps the `scope_updated:` frontmatter timestamp. That timestamp is the **freshness signal** — it's what `echo.sh scope show` and the `vault-lint.sh` drift check read to tell whether the recorded scope still reflects current work. Always switch through `scope set` so `scope_updated` stays honest; a hand-edited `## Scope` that skips the stamp reintroduces silent drift. + +**Manual fallback** (only if `echo.sh` is unavailable): PATCH `prepend` the prior scope to `## Scope History`, PATCH `replace` `## Scope`, then PATCH the frontmatter `scope_updated:` (and `updated:`) to today. Note `scope_updated` must already exist in frontmatter — a `PATCH replace` on a missing field returns `400 invalid-target`; run `bootstrap.sh` repair to add it. 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. +**Drift backstop:** `vault-lint.sh` flags when ≥ `SCOPE_STALE_SESSIONS` (default 3) session logs are dated after `scope_updated` — i.e. work happened without a scope switch. It's advisory (surfaced in Vault Health / `/echo-health`), the mechanical safety net under the load-time judgment above. + ## Journal Rollups (the journal is one continuum) 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. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md index e8d6474..5c6e56d 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md @@ -7,6 +7,7 @@ tags: [agent, context] agent_written: true source_notes: [] scope: +scope_updated: {{DATE}} refresh_strategy: on-demand --- diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo.sh b/echo-memory.plugin.src/skills/echo-memory/scripts/echo.sh index b9acece..9be3f41 100755 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo.sh +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo.sh @@ -27,6 +27,8 @@ # echo.sh delete # DELETE (destructive; explicit use only) # echo.sh lock # acquire advisory lock (exit 75 if held by someone else & fresh) # echo.sh unlock # release advisory lock if owned by +# echo.sh scope show # print active scope, its freshness, and sessions-since +# echo.sh scope set "" # switch scope atomically (history + replace + stamp scope_updated) # # Exit codes: 0 ok · 44 not-found(404) · 75 lock-held · 2 usage · 1 other HTTP/transport error. @@ -194,6 +196,50 @@ case "$cmd" in [ "$HTTP" = "404" ] || _check "unlock" echo "ok: unlocked" ;; + scope) + # scope show | scope set "" + # 'set' archives the prior scope to ## Scope History, replaces ## Scope, and stamps + # the scope_updated freshness timestamp — one command instead of three error-prone PATCHes. + sub="${1:-show}"; shift || true + ccpath="_agent/context/current-context.md" + case "$sub" in + show) + _curl GET "$(_vault_url "$ccpath")"; _check "scope show" + cur="$RESP" + echo "── Active scope ──" + awk '/^## Scope[[:space:]]*$/{f=1;next} /^## /{if(f)exit} f' "$cur" + su="$(sed -n 's/^scope_updated:[[:space:]]*//p' "$cur" | head -1)" + su="${su//\"/}" + echo "scope_updated: ${su:-}" + _curl GET "$(_vault_url "_agent/sessions/")" + if [ "$HTTP" = "200" ] && [ -n "$su" ]; then + n="$(python3 -c "import json,sys;f=json.load(open('$RESP'))['files'];print(sum(1 for x in f if x.endswith('.md') and x[:10]>'$su'))" 2>/dev/null || echo '?')" + echo "sessions logged since: ${n}" + fi ;; + set) + [ $# -ge 1 ] || die "scope set needs the new scope text" + new="$1" + _curl GET "$(_vault_url "$ccpath")"; _check "scope set(read)" + prior="$(awk '/^## Scope[[:space:]]*$/{f=1;next} /^## /{if(f)exit} f' "$RESP" \ + | tr '\n' ' ' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' | cut -c1-140)" + BODY="$(mktemp)"; printf -- '- %s: %s\n' "$(_today)" "${prior:-(prior scope)}" > "$BODY" + _curl PATCH "$(_vault_url "$ccpath")" -H 'Operation: prepend' -H 'Target-Type: heading' \ + -H 'Target: Current Context::Scope History' -H 'Content-Type: text/markdown' --data-binary @"$BODY" + _check "scope set(history)" + BODY="$(mktemp)"; printf '%s\n' "$new" > "$BODY" + _curl PATCH "$(_vault_url "$ccpath")" -H 'Operation: replace' -H 'Target-Type: heading' \ + -H 'Target: Current Context::Scope' -H 'Content-Type: text/markdown' --data-binary @"$BODY" + _check "scope set(replace)" + BODY="$(mktemp)"; printf '"%s"' "$(_today)" > "$BODY" + _curl PATCH "$(_vault_url "$ccpath")" -H 'Operation: replace' -H 'Target-Type: frontmatter' \ + -H 'Target: scope_updated' -H 'Content-Type: application/json' --data-binary @"$BODY" + if [ "${HTTP:-000}" -ge 400 ]; then + die "scope set: body switched, but scope_updated frontmatter is missing (run bootstrap.sh repair to add it) [HTTP $HTTP]" + fi + echo "ok: scope switched (prior archived to Scope History; scope_updated=$(_today))" ;; + *) die "scope: use 'show' or 'set \"\"'" ;; + esac ;; + ""|-h|--help|help) usage ;; - *) die "unknown command '$cmd' (try: get map ls search put post append patch fm bump delete lock unlock)" ;; + *) die "unknown command '$cmd' (try: get map ls search put post append patch fm bump delete lock unlock scope)" ;; esac 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 index d9a5f7f..3301c16 100755 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/vault-lint.sh @@ -28,9 +28,11 @@ ECHO_BASE="${ECHO_BASE:-https://echoapi.alwisp.com}" ECHO_KEY="${ECHO_KEY:-241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab}" STALE_DAYS="${STALE_DAYS:-30}" INBOX_DAYS="${INBOX_DAYS:-14}" +SCOPE_STALE_SESSIONS="${SCOPE_STALE_SESSIONS:-3}" ECHO_TODAY="${ECHO_TODAY:-$(date +%Y-%m-%d)}" ECHO_BASE="$ECHO_BASE" ECHO_KEY="$ECHO_KEY" STALE_DAYS="$STALE_DAYS" INBOX_DAYS="$INBOX_DAYS" \ +SCOPE_STALE_SESSIONS="$SCOPE_STALE_SESSIONS" \ ECHO_TODAY="$ECHO_TODAY" ROUTING_JSON="$SCRIPT_DIR/routing.json" \ python3 - <<'PY' import os, sys, json, re, datetime, urllib.request, urllib.error @@ -39,6 +41,7 @@ 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"]) +SCOPE_STALE_SESSIONS = int(os.environ["SCOPE_STALE_SESSIONS"]) TODAY = datetime.date.fromisoformat(os.environ["ECHO_TODAY"]) ROUTING_JSON = os.environ["ROUTING_JSON"] LIFECYCLES = ["active", "incubating", "on-hold", "archived"] @@ -260,6 +263,26 @@ for line in inbox.splitlines(): if d and (TODAY - d).days > INBOX_DAYS: flag("aging-inbox", f"inbox capture {d} ({(TODAY-d).days}d): {line.strip()[:80]}") +# ---- Scope freshness (drift detector) ---------------------------------------- +# Scope is the most churn-prone state (Jason runs several sessions/day across topics). +# It has no natural staleness signal, so drift is otherwise invisible. Rule: if N+ session +# logs are dated AFTER current-context's scope_updated, the recorded scope may no longer +# reflect current work — surface it for a human glance (advisory, like every health finding). +cc = get("_agent/context/current-context.md") +if cc is not None: + _, ccfm = parse_fm(cc) + su = parse_date(ccfm.get("scope_updated")) + if su is None: + flag("scope-no-timestamp", + "_agent/context/current-context.md: no scope_updated frontmatter — scope drift cannot be detected; add it (bootstrap.sh repair) and switch scope via `echo.sh scope set`") + else: + since = [p for p in all_files + if (m := re.match(r"^_agent/sessions/(\d{4}-\d{2}-\d{2})", p)) + and (d := parse_date(m.group(1))) and d > su] + if len(since) >= SCOPE_STALE_SESSIONS: + flag("scope-stale", + f"scope set {su}; {len(since)} session(s) logged since without a switch — confirm it still reflects current work (or run `echo.sh scope set`)") + # ---- Report ------------------------------------------------------------------ if not violations: print("vault-lint: clean — all invariants hold.") @@ -283,6 +306,8 @@ labels = { "future-date": "updated date is in the future", "source-notes-wikilink": "Wikilink in source_notes (must be plain paths)", "routing-manifest": "routing.json problem", + "scope-no-timestamp": "current-context has no scope_updated (drift undetectable)", + "scope-stale": f"Scope may have drifted (>= {SCOPE_STALE_SESSIONS} sessions since last switch)", } for check, msgs in by.items(): print(f"## {labels.get(check, check)}")