forked from jason/echo
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>
This commit is contained in:
@@ -1,5 +1,52 @@
|
||||
# Changelog
|
||||
|
||||
## 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
|
||||
churn-prone state. A CHORUS vault now bootstraps multi-member from empty.
|
||||
|
||||
### Added — vault layout (schema 5)
|
||||
- **`_agent/members/<member>/`** — each member's `preferences.md`,
|
||||
`current-context.md` (scope + history), `heartbeat.md` (last-session pointer,
|
||||
written at session end), and `inbox.md`. Members never contend on each other's
|
||||
churn-prone files.
|
||||
- **`_agent/sessions/<member>/YYYY-MM-DD-HHMM-<slug>.md`** — member-namespaced
|
||||
session logs (no same-minute collisions, filterable per member).
|
||||
- **`_agent/memory/semantic/group-profile.md`** — shared group facts, conventions,
|
||||
and a `## Members` roster (members are rostered automatically at onboarding).
|
||||
- **`inbox/captures/group.md`** — shared inbox for unowned member-tagged items;
|
||||
whoever triages first routes them.
|
||||
|
||||
### Added — behavior
|
||||
- **Self-onboarding**: `chorus.py load` detects a bootstrapped vault that lacks THIS
|
||||
member's namespace and stands it up automatically (anchors + sessions dir +
|
||||
roster line). New members install their baked plugin and just start.
|
||||
- `load` is now 8 orientation reads: marker → group profile → my preferences /
|
||||
context / heartbeat → today's shared daily note → my inbox → group inbox; the
|
||||
heartbeat fallback lists MY sessions dir.
|
||||
- `scope show/set` operates on the member's own current-context; drift counts only
|
||||
that member's sessions.
|
||||
- **Member-tagged shared writes**: daily `## Agent Log` lines and entity-update
|
||||
dated blocks are written as `- YYYY-MM-DD [member]: …`; `capture --inbox` lands
|
||||
in the member's own inbox; triage lists BOTH inboxes (tagged mine/group) and
|
||||
writes member-attributed audit lines.
|
||||
- `bootstrap.py` seeds group anchors + the configured member's namespace
|
||||
(`member_bootstrap()` is reusable); the marker is schema 5; `migrate.py` gains a
|
||||
4→5 step for alpha vaults (moves pre-5 anchors into the configured member's
|
||||
namespace; no ECHO adoption path).
|
||||
- `routing.json`: new `member-anchors`, `inbox-group`, member-segmented sessions
|
||||
routes; the old single-user anchor paths (shared inbox, operator-preferences,
|
||||
current-context, heartbeat, flat sessions) are **retired**. `vault_lint` runs
|
||||
aging-inbox and scope-drift checks per member across all members found in the
|
||||
vault. Docs (SKILL, vault-layout, routing-map, bootstrap) updated to match.
|
||||
|
||||
### Verified
|
||||
- All suites green (25/25 unit, scaffold, routing-sync ×36 routes, 4 mock e2e,
|
||||
run_eval metrics unchanged) plus a 19-check two-member end-to-end smoke:
|
||||
jason bootstraps → alice self-onboards via load → interleaved member-tagged
|
||||
daily log → cross-member entity update attributed → independent scopes →
|
||||
triage separates personal vs group items → lint clean.
|
||||
|
||||
## 2.0.0-alpha.2 — Phase 2 (identity plumbing)
|
||||
|
||||
Every write is now attributed to a member. Vault layout unchanged (that's Phase 3).
|
||||
|
||||
Reference in New Issue
Block a user