jason
1a7690426f
README banner: correct Phase 1-4 wording
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-21 15:30:14 -05:00
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 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
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
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
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 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
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