1
0
forked from jason/echo
Commit Graph

57 Commits

Author SHA1 Message Date
jason 2ddf199850 Phase 4: shared-write hardening + group lenses
- vault_lock gains bounded retry/backoff (CHORUS_LOCK_RETRIES=4,
  CHORUS_LOCK_BACKOFF=0.5s); atomic_index_update and recall-index upkeep
  retry acquisition — unlocked fallback only after exhausted retries,
  loudly, so an already-written note is never stranded unindexed.
- Duplicate-gate candidates carry the existing note's author; STOP
  message says whose entity the capture collided with.
- recall --author <member> filters hits + linked context to one member's
  notes; recall briefs and --json surface the author: stamp.
- load --all-members appends a group-wide view (every member's scope +
  last-session heartbeat); roster parsing accepts folders as
  trailing-slash file entries (the REST API's actual shape).
- operating-contract.md concurrency section rewritten for N members.
- Two-member e2e suite committed as eval/test_multimember.py (26 checks
  incl. all four Phase-4 behaviors).
- Manifest -> 2.0.0-alpha.4; rebuilt chorus-memory.plugin.

Verified: 25/25 unit, scaffold, routing-sync, 5 mock e2e suites (incl.
new multimember), run_eval metrics unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:29:55 -05:00
jason 33a2d73a22 Phase 3: per-member namespacing — schema 5 (the core group conversion)
One shared vault, per-member namespaces for all churn-prone state:
- _agent/members/<member>/{preferences,current-context,heartbeat,inbox}.md
  + _agent/sessions/<member>/ session logs; shared group-profile.md
  (with auto-rostered ## Members) and inbox/captures/group.md.
- Self-onboarding: load detects a bootstrapped vault lacking THIS
  member's namespace and seeds it (bootstrap.member_bootstrap()).
- load = 8 reads (marker, group profile, my prefs/context/heartbeat,
  shared daily, my inbox, group inbox); heartbeat fallback lists my
  sessions dir; scope show/set is per member.
- Member-tagged shared writes: daily Agent Log lines and entity-update
  dated blocks are '- YYYY-MM-DD [member]: …'; capture --inbox targets
  my inbox; triage lists both inboxes and writes attributed audit lines.
- routing.json: member-anchors / inbox-group / member-segmented session
  routes; single-user anchor paths retired (schema 5). vault_lint runs
  aging-inbox + scope-drift per member. migrate.py 4->5 for alpha vaults.
- Scaffold: member-* seeds ({{MEMBER}}-stamped), group-profile/group-inbox
  seeds, marker schema 5. Docs (SKILL, vault-layout, routing-map,
  bootstrap) synced; manifest -> 2.0.0-alpha.3; rebuilt plugin (81 files).

Verified: all suites green (25/25 unit, scaffold, routing-sync 36 routes,
4 mock e2e, run_eval unchanged) + 19-check two-member smoke: bootstrap ->
self-onboard -> interleaved tagged daily log -> cross-member update
attribution -> independent scopes -> mine/group triage -> lint clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:16:13 -05:00
jason b3bc5272d5 Phase 2: identity plumbing — group/member config, author: attribution
Config schema {owner,endpoint,key} -> {group, member, endpoint, key}:
- member (kebab-case slug, validated) is REQUIRED — who this machine
  writes as; group is the descriptive team name. CHORUS_GROUP/
  CHORUS_MEMBER env, config set --group/--member, doctor + config show
  both with sources, NOT-CONFIGURED (78) without a valid member.
- capture stamps author: <member> on every note (_build_note); bootstrap
  gains {{MEMBER}} substitution and stamps the seeded anchors; all 8
  scaffold templates + canonical frontmatter docs gain author:.
- New missing-author lint check: agent_written notes must carry author:
  (bootstrap marker exempt — plugin-owned).
- Lock owner is now <member>-<client>-<pid> (auto_owner); offline-queue
  records carry a member field for audit.
- build.py --bake-key bakes group/member/endpoint/key (--group/--member;
  member required + slug-validated) for per-member artifacts.
- Manifest -> 2.0.0-alpha.2; rebuilt chorus-memory.plugin.

Verified: 25/25 unit (+config/member checks), scaffold suite (+6 new
member/config assertions), routing-sync, 4 mock e2e (+capture-stamps-
author), run_eval metrics unchanged, +8 phase-2 smoke checks green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:00:59 -05:00
jason d920f8821f Remove ECHO back-compat shims — CHORUS is a clean break
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 <noreply@anthropic.com>
2026-07-21 13:42:14 -05:00
jason d366ca4032 Phase 1: mechanical echo→chorus rename with back-compat shims
Identity rename, no behavior change (CHORUS-PLAN.md Phase 1):
- Plugin echo-memory → chorus-memory: manifest (v2.0.0-alpha.1), skill dir,
  16 scripts (chorus.py, chorus_config.py, …), EchoError → ChorusError,
  /chorus-* commands, hook paths, docs, scaffold seeds, eval harness,
  build.py. Docs endpoint → chorusapi.mpm.to.
- Env ECHO_* → CHORUS_*; config → ~/.claude/chorus-memory/config.json;
  state dir → ~/.chorus-memory/; marker → _agent/chorus-vault.md.

Back-compat shims (one major version):
- chorus_config aliases legacy ECHO_* env at import; reads a legacy
  echo-memory config.json when no CHORUS config exists (writes never
  land there); doctor/config report the legacy source.
- State dir honors an existing ~/.echo-memory when the new dir is absent
  (offline queue not stranded).
- Marker dual-probe in load/doctor/bootstrap/lint/sweep/migrate: a
  pre-fork _agent/echo-vault.md counts as bootstrapped; bootstrap repair
  won't write a second marker; routing gains agent-marker-legacy (GET).

Verified: 25/25 unit tests, scaffold + routing-sync checks, 4 mock e2e
suites, run_eval metrics unchanged, +6 shim smoke tests green.
Rebuilt chorus-memory.plugin (79 entries).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:35:51 -05:00
jason ff2f2efd0b Phase 0: strip versioned .plugin artifacts + .DS_Store from the tree
Per CHORUS-PLAN.md Phase 0 (and ROADMAP-2.0): versioned build artifacts
no longer live in the tree — future CHORUS versions ship as Gitea
releases. The 14 historical ECHO artifacts (0.6.0–1.5.1) remain
retrievable at the echo-fork-point tag and in the parent jason/echo
repo. Only the current pointer (echo-memory.plugin) stays tracked;
.gitignore updated to enforce this for echo-memory-* and future
chorus-memory-* builds.

Baseline verified green before any conversion work:
- test_echo_client.py 25/25, test_v1_scaffold.py pass
- eval suites (features / offline-queue / patch-semantics / reflect) pass
- run_eval.py: 0 silent write failures, 0 lost/duplicated offline writes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:21:46 -05:00
jason 7f76e3521d Add CHORUS-PLAN.md — ECHO to group-based memory conversion plan
Full review of the ECHO v1.5.1 architecture plus the phased plan to
convert the plugin to multi-member (group) memory: identity model,
schema-5 member namespacing, concurrency posture, rename map, and the
five settled design decisions (shared rollups, group-visible prefs,
shared-key first, /chorus-* commands, per-member + group inboxes).
Deployment endpoint: chorusapi.mpm.to.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:19:45 -05:00
Jason Stedwell d27db4ae34 Add docs/USAGE.md — operator usage guide for returning users (0.7 -> 1.5.1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
echo-fork-point
2026-07-15 15:56:28 -05:00
Jason Stedwell 4eea53c6c8 TODO-1.6: note the REST delete-directories limitation on the retired-tree item
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1.5.1
2026-07-03 13:44:52 -05:00
Jason Stedwell 9fd0246634 Document REST DELETE limitation: files only, empty folders orphan on disk
Learned removing the retired archive/ and _agent/outputs/ trees: DELETE
cannot remove directories; the last-file deletion leaves empty folders
that the REST listing 404s (falsely reading as gone) while Obsidian
still shows them — manual cleanup required. Noted in api-reference.md
(Deleting Files) and linked to the TODO-1.6 retired-tree lint item.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:44:03 -05:00
Jason Stedwell 746a30a08b TODO-1.6: log lint blind spot — retired dirs masked by leaf-README route
Vault sanity check found archive/ and _agent/outputs/ (retired/unrouted
pre-0.6 trees) surviving in the live vault with only seed READMEs; the
permissive leaf-readme route matches before the retired-path check, so
/echo-health never flags them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:38:49 -05:00
Jason Stedwell 46e4b18a00 Move field report to docs/history; refresh README repository layout
- docs/history/echo-improvements-prompt.md (ROADMAP-2.0 §5 box ticked)
- README repository layout brought to 1.5.1 reality: root docs
  (CHANGELOG/TODO-1.6/ROADMAP-2.0/docs/history), build.py + dist/
  (gitignored, secret-bearing), current eval harness contents, hooks/,
  and the full scripts/ roster (recall/reflect/triage/queue/
  concurrency/quality/output/doctor/hook modules) with the legacy
  commands/ dir annotated as the TODO-1.6 migration target. Also
  restores the eval-descriptor fix lost in the prior commit (edit was
  applied in memory but never written back).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:32:07 -05:00
Jason Stedwell 993abdc846 Retire ROADMAP-1.0; rewrite run_eval.py as current-version metrics harness
Knocks two items off ROADMAP-2.0 (§4 eval refresh, §5 roadmap retirement):

- run_eval.py: the stale 0.6-vs-0.7 A/B is replaced (old version in git
  history) with a four-part current-version eval against the mock —
  retrieval (hybrid+priors vs keyword/entities-only baseline: R@5 1.00
  vs 0.75, MRR 1.00 vs 0.75, session/journal queries 2/2 vs 0/2,
  freshness top-1 correct vs wrong), dedup (0 dupes gate-on vs 3
  gate-off, 0 false blocks), write safety (0 silent failures across 4
  fault scenarios), durability (3/3 offline writes queued+landed, 0
  lost, 0 re-flush dupes). Results in eval/results/latest.json.
- README: metrics table published; repo-layout eval descriptor updated.
- eval/README: new harness documented; A/B framing marked historical.
- ROADMAP-1.0.md removed (fully shipped; story lives in the README
  version table + git history); dangling docstring pointer fixed in
  echo_concurrency.py; ROADMAP-2.0 checkboxes ticked.

All suites green; artifact rebuilt (1.5.1, docstring-only source change).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:30:01 -05:00
Jason Stedwell 919e411136 Add TODO-1.6 + ROADMAP-2.0; retire MAINTENANCE.md and the codex tree
- TODO-1.6.md: skills-format migration of the eight slash commands
  (allowed-tools, disable-model-invocation, de-duped $ECHO block),
  plugin.json homepage, vault link repoints, and an open section for
  findings from 1.5.x live testing.
- ROADMAP-2.0.md: packaging & structure major — repo artifact policy
  (Gitea releases, prune versioned zips), delete legacy commands/ dir,
  codex-as-build-target if ever needed, eval refresh to current
  metrics. Includes a disposition table absorbing every open
  MAINTENANCE.md item, so that checklist is removed.
- Delete "codex plugin/": drifted derived tree; operator decision to
  regenerate from the canonical source after 2.0 if Codex use returns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:17:31 -05:00
Jason Stedwell 3b6c3053cb ver 1.5.1 — duplicate-gate precision (common tokens, cross-kind)
Live 1.5.0 use caught the gate blocking a decision note over the single
vault-common token "echo" (min-normalized overlap gives any one-token
entity a 1.0 score). New echo_index.gate_candidates() + token_df():

- gate blocks same-kind candidates only; cross-kind name collisions
  (a decision titled after its project) warn instead of blocking
- a lone shared token blocks only when unique to that entity (df == 1);
  multi-token overlaps still block

fuzzy_candidates (advisory warnings) and exit-76/--merge-into/--force
semantics unchanged. +3 offline unit tests, gate e2e cases restructured
+2 new; verified live both directions. All suites green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:03:07 -05:00
Jason Stedwell be3fd36ebf ver 1.5.0 — six-improvement pass: retention, routing, self-firing memory
1. capture-update keeps the whole body (was truncating to first line)
2. frontmatter completeness: kind-default status + kind-seeded tags at
   capture, fm create-or-replace, incomplete-frontmatter lint, sweep
   backfill (one data source: KIND_STATUS/KIND_REQUIRED_FM)
3. pre-write duplicate gate (exit 76, --merge-into/--force)
4. recall corpus + ranking: sessions/journal indexed (down-weighted),
   BM25 x freshness x status fusion, recall --json, index schema 2
5. session hooks: SessionStart auto-load, Stop reflection nudge
6. one-tap triage verb with processing-log audit; --json on read verbs

+22 mock end-to-end tests; all suites green. Docs current (README,
CHANGELOG, SKILL.md, commands, references, MAINTENANCE, eval README).
Drops tracked .DS_Store (gitignored); retires README-gretchen.md
(moved to gitignored dist/); adds the field report that drove item 2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 12:57:52 -05:00
Jason Stedwell e76add6192 ver 1.4.2 bump - sandbox mount issue 2026-06-26 20:05:47 -05:00
Jason Stedwell 9ee1530f97 v1.4.1 bump 2026-06-26 15:39:17 -05:00
Jason Stedwell 0cd8a54649 first external bake 2026-06-26 10:13:29 -05:00
Jason Stedwell bfcfdec4c9 ver 1.4.0 - baked in values and artifacts 2026-06-25 19:11:58 -05:00
jason c37b37c66a Update .gitignore 2026-06-25 19:06:57 -05:00
jason 192d14bd82 Delete API-KEY-SETUP.md 2026-06-25 19:05:57 -05:00
Jason Stedwell a1f2f02d3a ver 1.4.0 - baked in values 2026-06-25 17:54:03 -05:00
Jason Stedwell b4605a52f2 ver 1.3 and 1.3.1 2026-06-23 22:17:39 -05:00
Jason Stedwell 1881d2b105 documentation 2026-06-23 21:19:00 -05:00
Jason Stedwell e89f4660f6 testing and documentation 2026-06-23 17:17:00 -05:00
jason c2da2d261c documentation cleanup 2026-06-23 07:23:34 -05:00
jason b1e3189945 yml autobuild fix 2026-06-23 07:21:16 -05:00
jason 5529771ec8 descrip length check and fix 2026-06-23 07:18:23 -05:00
jason d34fbf7626 ver 1.2 2026-06-22 23:55:19 -05:00
Jason Stedwell 151b962662 Documentation 2026-06-22 17:44:37 -05:00
jason c25cb58418 ver 1.0 fixes 2026-06-22 09:54:33 -05:00
jason 1c0c2ea66e ver 1.0 2026-06-22 09:27:36 -05:00
jason d404f6e96f ver 0.9 2026-06-21 11:46:54 -05:00
jason 88210a4e84 codex migration 2026-06-20 23:21:40 -05:00
Jason Stedwell d6b73a4055 bump to 0.7.1 2026-06-19 22:01:07 -05:00
Jason Stedwell d314be68d1 bump to 0.7.1 2026-06-19 21:57:41 -05:00
Jason Stedwell 1af85ef846 fix description length 2026-06-19 21:25:41 -05:00
Jason Stedwell b299927117 ver-0.7 2026-06-19 21:12:14 -05:00
jason 7fdc121bfd routing added COMPANIES 2026-06-11 14:02:59 -05:00
jason 7091faad36 v0.6 2026-06-11 10:57:01 -05:00
jason 679d2adc33 Add repo README documenting echo-memory v0.5 logic, routing, and features 2026-06-10 18:49:34 -05:00
jason a2375e6c63 Delete ziT6w5F4 2026-06-10 11:13:23 -05:00
jason 0331928d50 ver0.5.1 2026-06-10 11:12:49 -05:00
jason c24650bb40 Routing: add areas/meetings/skills rows + triggers; clarify reviews cadence (weekly opt-in); prune source-material, journal weekly/monthly, archive, decisions/by-project, _agent/outputs from layout+bootstrap 2026-06-10 10:22:14 -05:00
jason 2ab61dc5c1 Routing: add areas/meetings/skills rows + triggers; clarify reviews cadence (weekly opt-in); prune source-material, journal weekly/monthly, archive, decisions/by-project, _agent/outputs from layout+bootstrap 2026-06-10 10:22:13 -05:00
jason e41e71045d Routing: add areas/meetings/skills rows + triggers; clarify reviews cadence (weekly opt-in); prune source-material, journal weekly/monthly, archive, decisions/by-project, _agent/outputs from layout+bootstrap 2026-06-10 10:22:12 -05:00
jason 02fd0e84a4 Routing: add areas/meetings/skills rows + triggers; clarify reviews cadence (weekly opt-in); prune source-material, journal weekly/monthly, archive, decisions/by-project, _agent/outputs from layout+bootstrap 2026-06-10 10:22:11 -05:00
jason a721e07fcd Initial commit — ECHO memory plugin v0.5
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 01:24:15 -05:00
jason e3e40af149 ver0.5 2026-06-07 01:18:02 -05:00