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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user