1
0
forked from jason/echo

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>
This commit is contained in:
2026-07-21 15:29:55 -05:00
parent 33a2d73a22
commit 2ddf199850
14 changed files with 302 additions and 38 deletions
+27
View File
@@ -1,5 +1,32 @@
# Changelog
## 2.0.0-alpha.4 — Phase 4 (shared-write hardening + group lenses)
### Added
- **Bounded lock retry on index writes.** `vault_lock` gains `retries`/`backoff`
(linear); `atomic_index_update` and the recall-index upkeep now retry acquisition
(`CHORUS_LOCK_RETRIES`, default 4 / `CHORUS_LOCK_BACKOFF`, default 0.5s). Index
lock holds are sub-second, so a retrying writer virtually always acquires; only
after exhausted retries does it proceed unlocked — loudly — because an
already-written note must never be stranded unindexed.
- **Duplicate-gate attribution.** Gate candidates now carry the existing note's
`author`; the STOP message reads `candidate: acme-rockets -> … (score 1.0,
created by jason)`, so a blocked member knows whose entity they collided with.
- **`recall --author <member>`** — filter hits and linked context to one member's
notes (a lens, not a wall); recall briefs and `--json` summaries now surface the
`author:` stamp alongside updated/status.
- **`load --all-members`** — appends a compact group-wide orientation: every
member's active scope + last-session heartbeat ("what has the team been doing").
- `references/operating-contract.md` concurrency section rewritten for N members
(namespacing as first defense; member-tagged idempotent appends; retried index
lock; member-attributed lock owners).
- Eval: the two-member end-to-end suite is now committed as
`eval/test_multimember.py` (26 checks, incl. the four Phase-4 behaviors).
### Fixed
- `load --all-members` roster parsing accepts folders as trailing-slash entries in
`files` (the shape the REST API actually returns) as well as a `folders` key.
## 2.0.0-alpha.3 — Phase 3 (per-member namespacing — schema 5)
The core of the group conversion: one shared vault, per-member namespaces for all