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