From d920f8821f9e1c0f6c3b488f7881e1e6e9539d34 Mon Sep 17 00:00:00 2001 From: Jason Stedwell Date: Tue, 21 Jul 2026 13:42:14 -0500 Subject: [PATCH] =?UTF-8?q?Remove=20ECHO=20back-compat=20shims=20=E2=80=94?= =?UTF-8?q?=20CHORUS=20is=20a=20clean=20break?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decision: CHORUS deploys as fresh vaults on new machines for different users, so no ECHO adoption path is needed. Removed the Phase-1 shims: - chorus_config: legacy ECHO_* env aliasing and the read-only ~/.claude/echo-memory/config.json fallback - chorus_queue / chorus_hook_stop: ~/.echo-memory state-dir fallback - load/doctor/bootstrap/vault_lint/sweep/migrate: the _agent/echo-vault.md marker dual-probe; routing drops agent-marker-legacy (36 routes) - .gitignore, README, CHANGELOG, CHORUS-PLAN.md updated (decision #6; Phase 3 no longer migrates the live ECHO vault — fresh bootstrap only) All suites green: 25/25 unit, scaffold, routing-sync, 4 mock e2e, run_eval metrics unchanged. Rebuilt chorus-memory.plugin. Co-Authored-By: Claude Fable 5 --- .gitignore | 16 +++--- CHANGELOG.md | 19 +++----- CHORUS-PLAN.md | 36 ++++++++------ README.md | 10 ++-- chorus-memory.plugin | Bin 186352 -> 184485 bytes .../chorus-memory/references/routing-map.md | 1 - .../skills/chorus-memory/scripts/bootstrap.py | 17 ++----- .../skills/chorus-memory/scripts/chorus.py | 20 +------- .../chorus-memory/scripts/chorus_config.py | 46 ++---------------- .../chorus-memory/scripts/chorus_doctor.py | 6 +-- .../chorus-memory/scripts/chorus_hook_stop.py | 12 +---- .../chorus-memory/scripts/chorus_queue.py | 11 +---- .../skills/chorus-memory/scripts/migrate.py | 16 ++---- .../skills/chorus-memory/scripts/routing.json | 1 - .../skills/chorus-memory/scripts/sweep.py | 10 ++-- .../chorus-memory/scripts/vault_lint.py | 2 +- 16 files changed, 58 insertions(+), 165 deletions(-) diff --git a/.gitignore b/.gitignore index c846f2d..f03b6fb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,24 +8,20 @@ __pycache__/ .venv/ venv/ -# Local CHORUS/ECHO state (never commit — holds the offline queue + cached vault reads) -.echo-memory/ +# Local CHORUS state (never commit — holds the offline queue + cached vault reads) .chorus-memory/ # Eval output eval/results/*.json !eval/results/.gitkeep -# CHORUS/ECHO config: the filled-in key file is yours to distribute, never commit it -/echo-memory.config.json +# CHORUS config: the filled-in key file is yours to distribute, never commit it /chorus-memory.config.json /dist/ # Build artifacts. Per-user BAKED artifacts (build.py --bake-key) carry a live vault -# bearer token — NEVER commit them; they belong in dist/ (above). As of the CHORUS -# fork (Phase 0), versioned artifacts are no longer tracked in the tree either — -# they ship as Gitea releases (per ROADMAP-2.0). Only the current pointer -# (echo-memory.plugin / chorus-memory.plugin) stays tracked. Historical ECHO -# artifacts remain at the echo-fork-point tag and in the parent jason/echo repo. -echo-memory-*.plugin +# bearer token — NEVER commit them; they belong in dist/ (above). Versioned artifacts +# are not tracked in the tree — they ship as Gitea releases. Only the current pointer +# (chorus-memory.plugin) stays tracked. Historical ECHO artifacts remain at the +# echo-fork-point tag and in the parent jason/echo repo. chorus-memory-*.plugin diff --git a/CHANGELOG.md b/CHANGELOG.md index 10b574a..89ced88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,23 +15,16 @@ CHORUS is a group-based fork of ECHO (`jason/echo`, v1.5.1, schema 4 — preserv bootstrap marker to `_agent/chorus-vault.md`; manifest version → 2.0.0-alpha.1. - Docs' endpoint references now `chorusapi.mpm.to`. -### Back-compat (one major version) -- Legacy `ECHO_*` env vars are adopted as `CHORUS_*` at import when the new name is unset. -- A legacy `~/.claude/echo-memory/config.json` is read (never written) when no CHORUS - config exists; `config`/`doctor` report the legacy source. -- A legacy `~/.echo-memory/` state dir is honored when `~/.chorus-memory/` doesn't exist - yet, so queued offline writes aren't stranded. -- The bootstrap probe (`load`, `doctor`, `bootstrap`, `vault_lint`, `sweep`, `migrate`) - falls back to a pre-fork `_agent/echo-vault.md` marker; bootstrap's repair pass leaves - a legacy marker in place (the schema migration will rename it) rather than writing a - second marker. `routing.json` gains a read-only `agent-marker-legacy` route. +### No ECHO back-compat — clean break +CHORUS deploys as fresh vaults on fresh machines for new users, so it carries **no** +ECHO compatibility: `ECHO_*` env vars, `~/.claude/echo-memory/config.json`, +`~/.echo-memory/`, and a vault's `_agent/echo-vault.md` marker are all ignored. +(Shims for these were built during Phase 1 and then removed by decision.) ### Verified - 25/25 client unit tests, scaffold checks, routing-doc sync, and all four mock end-to-end suites green; `run_eval.py` metrics unchanged (0 dupes / 0 false blocks / - 0 silent failures / 0 lost offline writes). Six new shim smoke tests (legacy env, - legacy config path, chorus-over-legacy precedence, legacy-marker load/doctor, fresh - vault) pass. + 0 silent failures / 0 lost offline writes). ## 1.5.1 diff --git a/CHORUS-PLAN.md b/CHORUS-PLAN.md index ed4b226..fca0daf 100644 --- a/CHORUS-PLAN.md +++ b/CHORUS-PLAN.md @@ -57,7 +57,7 @@ on two machines but not for N people. its own Obsidian + Local REST API instance exposed there (separate from ECHO's `echoapi.alwisp.com`; the personal ECHO vault is untouched). The endpoint stays machine-local/baked config, never in source, same as ECHO. - `owner` → `group` (with `owner` accepted as a legacy alias). Resolution order + `owner` → `group`. Resolution order unchanged: baked > env (`CHORUS_MEMBER` etc.) > config file. Baked per-user builds (`build.py --bake-key --label alice`) already exist and become the primary **onboarding** mechanism: one artifact per member, member id baked in. @@ -158,10 +158,10 @@ theirs alone). What remains shared-write: | Commands | `/echo-{load,save,recall,reflect,triage,sweep,health,doctor}` | `/chorus-*` | | Scripts | `echo*.py` (16 modules + imports everywhere) | `chorus*.py` | | Exception | `EchoError` | `ChorusError` | -| Env vars | `ECHO_OWNER/BASE/KEY/CONFIG/TODAY/VERIFY/LOCK_TTL/TIMEOUT/WORKERS/STATE_DIR/CLIENT/DUP_GATE/REFLECT_MIN_TURNS/FRESH_HALF_LIFE` | `CHORUS_*` (+ new `CHORUS_MEMBER`); `ECHO_*` read as fallback aliases in `chorus_config` for one major version | -| Config file | `~/.claude/echo-memory/config.json` | `~/.claude/chorus-memory/config.json` (import path: `config import` accepts an old echo config) | +| Env vars | `ECHO_OWNER/BASE/KEY/CONFIG/TODAY/VERIFY/LOCK_TTL/TIMEOUT/WORKERS/STATE_DIR/CLIENT/DUP_GATE/REFLECT_MIN_TURNS/FRESH_HALF_LIFE` | `CHORUS_*` (+ new `CHORUS_MEMBER`) | +| Config file | `~/.claude/echo-memory/config.json` | `~/.claude/chorus-memory/config.json` | | State dir | `~/.echo-memory/` | `~/.chorus-memory/` | -| Marker | `_agent/echo-vault.md` (hardcoded in 8 files + routing.json) | `_agent/chorus-vault.md`; probe checks new name **then** old (adoption path) | +| Marker | `_agent/echo-vault.md` (hardcoded in 8 files + routing.json) | `_agent/chorus-vault.md` | | Hooks | `hooks.json` paths ×2 incl. CoWork fallback glob | updated paths | | Docs/branding | README, SKILL.md, references, scaffold seeds, icons | rewrite pass (cosmetic but large) | @@ -177,11 +177,14 @@ Repo hygiene on the fork: strip stale versioned `.plugin` artifacts from the tree (move to Gitea releases per ROADMAP-2.0), confirm `eval/` suites green as-is, tag the fork point. -### Phase 1 — Mechanical rename (1–2 days) -Everything in §3, with back-compat shims (env aliases, marker dual-probe, -config import from echo paths). All existing tests pass under the new names. -No behavior change. **Deliverable:** installable `chorus-memory` plugin that is -ECHO-with-a-new-name. +### Phase 1 — Mechanical rename (1–2 days) — DONE +Everything in §3. All existing tests pass under the new names. No behavior +change. **Deliverable:** installable `chorus-memory` plugin that is +ECHO-with-a-new-name. *(Decided post-Phase-1: CHORUS is a **clean break** — +fresh vaults on fresh machines for new users, so no ECHO back-compat: legacy +`ECHO_*` env vars, echo-memory configs, `~/.echo-memory` state, and +`_agent/echo-vault.md` markers are all ignored. Shims briefly existed and were +removed.)* ### Phase 2 — Identity plumbing (1–2 days) `member` in config (+ `CHORUS_MEMBER`, baked-tier support, `config set --member`), @@ -198,12 +201,10 @@ if the vault exists but your namespace doesn't — new members self-onboard), `cmd_load`/`cmd_scope`/heartbeat/inbox/triage/reflect retargeted to member paths, session logs under `sessions//`, member-prefixed Agent Log lines, `routing.json` route rows (with `` pattern segment) + retired -old paths, lint updates, `migrate.py` 4→5 (moves Jason's existing -operator-preferences/current-context/heartbeat/inbox/sessions into -`members/jason/…`, stamps `author: jason` vault-wide via sweep). Docs: -vault-layout.md, routing-map.md, bootstrap.md rewritten. -**Deliverable:** a real multi-member vault; the live ECHO vault migrates in -place. +old paths, lint updates, `migrate.py` 4→5 (for any alpha CHORUS vaults stood +up between phases — there is no ECHO-vault adoption path; CHORUS vaults start +fresh). Docs: vault-layout.md, routing-map.md, bootstrap.md rewritten. +**Deliverable:** a real multi-member vault, bootstrapped from empty. ### Phase 4 — Shared-write hardening (1–2 days) Required lock on index writes with bounded retry/backoff, gate messages carry @@ -246,3 +247,8 @@ retrieval/durability metrics. New icon. `_agent/members//inbox.md`; a shared `inbox/captures/group.md` holds unowned items (member-prefixed lines, idempotent appends), routed by whoever triages first. Both are probed at load and covered by triage. +6. **Clean break from ECHO** *(added post-Phase-1)*. CHORUS vaults are fresh + vaults on fresh machines for new users — no ECHO adoption path, no legacy + `ECHO_*` env/config/state/marker compatibility. Jason's personal ECHO vault + continues unchanged on its own plugin and endpoint. If ECHO history is ever + wanted in CHORUS, it would be a one-off import exercise, out of scope. diff --git a/README.md b/README.md index ceac51b..a0fa23c 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ > Obsidian vault serving a group of members instead of a single operator. The conversion > plan and settled design decisions live in [CHORUS-PLAN.md](CHORUS-PLAN.md). The pre-fork > ECHO v1.5.1 state is preserved at the `echo-fork-point` tag. **Phase 1 (mechanical -> rename, back-compat shims) is done**; the body of this README below the fold still -> describes the inherited single-operator behavior and is rewritten in Phase 5. -> Deployment endpoint: `https://chorusapi.mpm.to`. Legacy `ECHO_*` env vars, an existing -> `~/.claude/echo-memory/config.json`, and a vault's old `_agent/echo-vault.md` marker -> all keep working for one major version. +> rename) is done**; the body of this README below the fold still describes the +> inherited single-operator behavior and is rewritten in Phase 5. +> Deployment endpoint: `https://chorusapi.mpm.to`. CHORUS is a **clean break** from +> ECHO — fresh vaults on fresh machines; it carries no ECHO back-compat and never +> reads ECHO configs, state dirs, or vault markers. Persistent memory for Claude / CoWork sessions via the **CHORUS** Obsidian vault, driven over the [Obsidian Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api). The skill makes direct REST calls through a bundled validated client (`scripts/chorus.py`). The whole toolchain is **pure Python** (stdlib only), so it runs identically on Windows, macOS, and Linux — no bash, no platform-specific `date`. diff --git a/chorus-memory.plugin b/chorus-memory.plugin index ca9eeb29d5ebf24d3a804c4e4f9a4b30b72392ba..5f32fb18f88a040ad660d64f437a978526d7b83f 100644 GIT binary patch delta 41848 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

606gv9HW} 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

Q^dYkmx1-;~9+dXFD*a*gG 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 diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md b/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md index 07aa28d..0b961fb 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md @@ -79,7 +79,6 @@ Lifecycle folders; `status:` frontmatter MUST equal the folder name (the linter | Path | Trigger | What lands | Distinct because | Method | |------|---------|------------|------------------|--------| | `_agent/chorus-vault.md` | Bootstrap / schema migration only | Marker: `schema_version`, bootstrap date | Plugin-owned probe; never hand-edited | GET / PUT | -| `_agent/echo-vault.md` | Pre-fork ECHO vault adoption (read-only probe) | Legacy ECHO marker, honored until the rename migration | CHORUS is a fork of ECHO; adopted vaults still carry the old marker | GET | | `_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 the operator | 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 an operator-preference | Semantic note | Timeless fact, vs episodic (time-stamped event) and working (transient) | PUT | diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py index da937ca..ce41dec 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py @@ -85,17 +85,14 @@ def main(argv: list[str] | None = None) -> int: print(f"bootstrap: scaffold not found at {SCAFFOLD}", file=sys.stderr) return 1 - legacy_marker = (not exists(chorus.MARKER_PATH)) and exists(chorus.LEGACY_MARKER_PATH) - if exists(chorus.MARKER_PATH) or legacy_marker: - probe = chorus.LEGACY_MARKER_PATH if legacy_marker else chorus.MARKER_PATH - status, body = chorus.request("GET", chorus.vault_url(probe)) + if exists(chorus.MARKER_PATH): + status, body = chorus.request("GET", chorus.vault_url(chorus.MARKER_PATH)) version = "unknown" if status == 200: version = next((ln.split(":", 1)[1].strip() for ln in body.decode(errors="replace").splitlines() if ln.startswith("schema_version:")), "unknown") - note = " [legacy ECHO marker]" if legacy_marker else "" - print(f"bootstrap: marker present{note} (schema_version={version}). Running repair pass (fills only missing files).") + print(f"bootstrap: marker present (schema_version={version}). Running repair pass (fills only missing files).") for folder in LEAVES: leaf_readme(folder, args.dry_run) @@ -109,13 +106,7 @@ def main(argv: list[str] | None = None) -> int: seed("_agent/context/current-context.md", SCAFFOLD / "anchors" / "current-context.seed.md", args.dry_run) seed("inbox/captures/inbox.md", SCAFFOLD / "anchors" / "inbox.seed.md", args.dry_run) seed("README.md", SCAFFOLD / "README.vault.md", args.dry_run) - if legacy_marker: - # Adopted pre-fork ECHO vault: leave the legacy marker as the single - # authoritative probe — the schema migration renames it. Two markers - # would make "which is authoritative" ambiguous. - print("bootstrap: legacy ECHO marker present — not writing the CHORUS marker (migrate.py renames it).") - else: - seed(chorus.MARKER_PATH, SCAFFOLD / "chorus-vault.md", args.dry_run) # marker LAST + seed(chorus.MARKER_PATH, SCAFFOLD / "chorus-vault.md", args.dry_run) # marker LAST print(f"bootstrap: done ({'DRY-RUN ' if args.dry_run else ''}{chorus.today()}).") print("bootstrap: next: create today's daily note + a bootstrap session log + heartbeat (see SKILL.md).") diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py index b92a96e..4a92eb0 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py @@ -101,21 +101,6 @@ MAX_WORKERS = max(1, int(os.environ.get("CHORUS_WORKERS", "8"))) LOCK_PATH = "_agent/locks/vault.lock" MARKER_PATH = "_agent/chorus-vault.md" -# Pre-fork ECHO vaults carry the old marker name. It is honored read-only as a -# bootstrap probe (vault-adoption path); the schema migration renames it. -LEGACY_MARKER_PATH = "_agent/echo-vault.md" - - -def marker_get(): - """GET the bootstrap marker: the CHORUS name first, then the legacy ECHO - name. Returns (path, status, body) — on a double miss, the CHORUS path with - its 404 (or error) result.""" - status, body = request("GET", vault_url(MARKER_PATH)) - if status == 404: - l_status, l_body = request("GET", vault_url(LEGACY_MARKER_PATH)) - if l_status == 200: - return LEGACY_MARKER_PATH, l_status, l_body - return MARKER_PATH, status, body class ChorusError(RuntimeError): @@ -655,10 +640,7 @@ def cmd_load() -> int: heartbeat_absent = False offline = False for label, path in targets: - if label == "marker": - path, status, body = marker_get() # falls back to a legacy ECHO marker - else: - status, body = request("GET", vault_url(path)) + status, body = request("GET", vault_url(path)) if status == 200: chorus_queue.cache_put(path, body) # refresh last-known-good for offline fallback print(f"===== {label}: {path} (HTTP 200) =====") diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py index 291b787..c56d46b 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py @@ -54,26 +54,6 @@ DEFAULT_OWNER = "" DEFAULT_BASE = "" DEFAULT_KEY = "" -# ---------------------------------------------------------------- legacy shim -# CHORUS is a fork of ECHO. For one major version, legacy ECHO_* environment -# variables keep working: at import time each ECHO_ is adopted as CHORUS_ -# whenever CHORUS_ is not itself set. Scripts only ever read CHORUS_*. -_LEGACY_ENV_SUFFIXES = ( - "OWNER", "BASE", "KEY", "CONFIG", "TODAY", "VERIFY", "LOCK_TTL", "TIMEOUT", - "WORKERS", "STATE_DIR", "CLIENT", "DUP_GATE", "REFLECT_MIN_TURNS", - "FRESH_HALF_LIFE", -) - - -def _alias_legacy_env() -> None: - for suffix in _LEGACY_ENV_SUFFIXES: - new, old = f"CHORUS_{suffix}", f"ECHO_{suffix}" - if not os.environ.get(new) and os.environ.get(old): - os.environ[new] = os.environ[old] - - -_alias_legacy_env() - TEMPLATE = { "owner": "Full Name — how the agent should refer to the vault owner (third person)", "endpoint": "https://your-obsidian-rest-endpoint.example.com", @@ -87,32 +67,15 @@ def claude_dir() -> Path: def config_path() -> Path: - """Absolute path to the machine-local config file (the CHORUS path — this is - where writes always land).""" + """Absolute path to the machine-local config file.""" override = os.environ.get("CHORUS_CONFIG") if override: return Path(override).expanduser() return claude_dir() / "chorus-memory" / "config.json" -def legacy_config_path() -> Path: - """The pre-fork ECHO config location, honored read-only as a fallback.""" - return claude_dir() / "echo-memory" / "config.json" - - -def read_config_path() -> Path: - """The config file to READ: the CHORUS path when overridden or present, - else a legacy ECHO config if one exists (fork adoption path). Writes never - go to the legacy path — `config set`/`import` land at config_path().""" - p = config_path() - if os.environ.get("CHORUS_CONFIG") or p.exists(): - return p - legacy = legacy_config_path() - return legacy if legacy.exists() else p - - def _from_file() -> dict: - p = read_config_path() + p = config_path() if not p.exists(): return {} try: @@ -203,9 +166,8 @@ def source(field: str) -> str: env = {"owner": "CHORUS_OWNER", "endpoint": "CHORUS_BASE", "key": "CHORUS_KEY"}[field] if os.environ.get(env): return f"{env} env" - rp = read_config_path() - if rp.exists() and _from_file().get(field): - return "config file" if rp == config_path() else "config file (legacy echo-memory path)" + if config_path().exists() and _from_file().get(field): + return "config file" if baked: return "baked-in (plugin)" return "unset" diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py index d7ed9e6..b1dd3a8 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py @@ -59,8 +59,7 @@ def run() -> int: return 1 # 3. reachability + auth + marker, in one GET of the bootstrap marker - # (marker_get falls back to a pre-fork ECHO marker on adopted vaults) - marker_path, status, body = chorus.marker_get() + status, body = chorus.request("GET", chorus.vault_url(chorus.MARKER_PATH)) if status == 0: line(False, "vault reachable", body.decode(errors="replace")[:120]) print("\ndoctor: endpoint unreachable — is Obsidian + the Local REST API running?") @@ -72,8 +71,7 @@ def run() -> int: text = body.decode(errors="replace") ver = next((ln.split(":", 1)[1].strip() for ln in text.splitlines() if ln.startswith("schema_version:")), "?") - legacy = " (legacy ECHO marker — run migrate.py to adopt)" if marker_path == chorus.LEGACY_MARKER_PATH else "" - line(True, "vault bootstrapped", f"schema_version={ver}{legacy}") + line(True, "vault bootstrapped", f"schema_version={ver}") else: line(status < 400, "marker fetch", f"HTTP {status}") diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_stop.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_stop.py index 754d7df..da8b353 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_stop.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_stop.py @@ -38,17 +38,7 @@ REASON = ( def state_marker(session_id: str) -> Path: - # Mirrors chorus_queue.state_dir() (this hook runs standalone, so the - # ECHO->CHORUS env aliasing in chorus_config may not have run): env first - # (either name), else ~/.chorus-memory, honoring a pre-fork ~/.echo-memory - # when the new dir doesn't exist yet. - override = os.environ.get("CHORUS_STATE_DIR") or os.environ.get("ECHO_STATE_DIR") - if override: - base = Path(override) - else: - new = Path.home() / ".chorus-memory" - legacy = Path.home() / ".echo-memory" - base = legacy if (not new.exists() and legacy.exists()) else new + base = Path(os.environ.get("CHORUS_STATE_DIR") or (Path.home() / ".chorus-memory")) return base / "hook-state" / f"{session_id}.reflect-nudged" diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py index c3c9e1c..872c1ce 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py @@ -37,16 +37,7 @@ MUTATING = {"PUT", "POST", "PATCH", "DELETE"} def state_dir() -> Path: - # Env first (chorus_config aliases a legacy ECHO_STATE_DIR at import); the - # default is ~/.chorus-memory, but an existing pre-fork ~/.echo-memory is - # honored when the new dir doesn't exist yet — so queued offline writes - # from an ECHO install aren't stranded by the rename. - override = os.environ.get("CHORUS_STATE_DIR") or os.environ.get("ECHO_STATE_DIR") - if override: - return Path(override) - new = Path.home() / ".chorus-memory" - legacy = Path.home() / ".echo-memory" - return legacy if (not new.exists() and legacy.exists()) else new + return Path(os.environ.get("CHORUS_STATE_DIR") or (Path.home() / ".chorus-memory")) def outbox_path() -> Path: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py index 5e1a804..354ecbe 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py @@ -79,17 +79,8 @@ def do_or_show(apply: bool, desc: str, func=None) -> None: print(f"migrate: PLAN {desc}") -def find_marker() -> str: - """The vault's marker path: the CHORUS name, else a legacy pre-fork ECHO - marker (the rename itself is a future migration step).""" - for p in ("_agent/chorus-vault.md", "_agent/echo-vault.md"): - if get_text(p) is not None: - return p - return "_agent/chorus-vault.md" - - def marker_schema() -> int: - marker = get_text(find_marker()) + marker = get_text("_agent/chorus-vault.md") if marker is None: print("migrate: marker missing — vault not bootstrapped. Run bootstrap.py, not migrate.py.") raise SystemExit(3) @@ -155,9 +146,8 @@ def main(argv: list[str] | None = None) -> int: print("migrate: [3->4] _agent/index/ already exists (schema 3); no moves needed.") print("migrate: [3->4] then run `sweep.py --apply` to build _agent/index/recall-index.json.") - marker_path = find_marker() - do_or_show(args.apply, f"set {marker_path} schema_version -> {CURRENT_SCHEMA}", - lambda: chorus.cmd_fm(marker_path, "schema_version", str(CURRENT_SCHEMA))) + do_or_show(args.apply, f"set _agent/chorus-vault.md schema_version -> {CURRENT_SCHEMA}", + lambda: chorus.cmd_fm("_agent/chorus-vault.md", "schema_version", str(CURRENT_SCHEMA))) if args.apply: print(f"migrate: migration complete -> schema {CURRENT_SCHEMA}. Run sweep.py --apply, then vault_lint.py.") else: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json b/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json index 14f2657..efb58be 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json @@ -31,7 +31,6 @@ { "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/chorus-vault\\.md$", "method": "PUT", "trigger": "Bootstrap / schema migration only", "distinct_because": "Plugin-owned probe; never hand-edited" }, - { "id": "agent-marker-legacy", "pattern": "^_agent/echo-vault\\.md$", "method": "GET", "trigger": "Pre-fork ECHO vault adoption (read-only probe)", "distinct_because": "Legacy ECHO marker honored until the rename migration" }, { "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" }, diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py index 9b5a16b..c18220a 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py @@ -109,7 +109,7 @@ def main(argv: list[str] | None = None) -> int: apply = args.apply tag = "APPLY" if apply else "PLAN " - if get("_agent/chorus-vault.md") is None and get("_agent/echo-vault.md") is None: + if get("_agent/chorus-vault.md") is None: print("sweep: marker missing — vault not bootstrapped. Run bootstrap.py first.", file=sys.stderr) return 3 @@ -232,16 +232,12 @@ def main(argv: list[str] | None = None) -> int: links.add_one(tp, sp) # ---- 5. stamp schema ------------------------------------------------------ - marker_path = "_agent/chorus-vault.md" - marker = get(marker_path) - if marker is None: # adopted pre-fork ECHO vault — stamp the marker it has - marker_path = "_agent/echo-vault.md" - marker = get(marker_path) or "" + marker = get("_agent/chorus-vault.md") or "" cur = next((int(m) for m in re.findall(r"(?m)^schema_version:\s*(\d+)", marker)), 0) if cur < CURRENT_SCHEMA: print(f"sweep: {tag} schema_version {cur} -> {CURRENT_SCHEMA}") if apply: - chorus.cmd_fm(marker_path, "schema_version", str(CURRENT_SCHEMA)) + chorus.cmd_fm("_agent/chorus-vault.md", "schema_version", str(CURRENT_SCHEMA)) print(f"\nsweep: {'done — run vault_lint.py to confirm invariants' if apply else 'dry-run complete. Re-run with --apply to write.'}") return 0 diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py index 51acf80..db451f4 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py @@ -145,7 +145,7 @@ def route_matchers(): def main() -> int: try: - if get("_agent/chorus-vault.md") is None and get("_agent/echo-vault.md") is None: + if get("_agent/chorus-vault.md") is None: print("vault-lint: marker missing — vault not bootstrapped (run bootstrap.py).", file=sys.stderr) return 3 except Exception as exc: