1
0
forked from jason/echo

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>
This commit is contained in:
2026-07-21 14:00:59 -05:00
parent d920f8821f
commit b3bc5272d5
35 changed files with 304 additions and 144 deletions
+30
View File
@@ -1,5 +1,35 @@
# Changelog
## 2.0.0-alpha.2 — Phase 2 (identity plumbing)
Every write is now attributed to a member. Vault layout unchanged (that's Phase 3).
### Added
- **Config schema is now `{group, member, endpoint, key}`** (was `{owner, endpoint,
key}`). `member` is REQUIRED — a kebab-case slug (`^[a-z0-9][a-z0-9-]{0,31}$`)
identifying who this machine writes as; `group` is the descriptive display name for
the team sharing the vault. Env: `CHORUS_GROUP` / `CHORUS_MEMBER`. `config set`
gains `--group`/`--member` (with slug validation); `config`/`doctor` report both
with sources; an unconfigured member fails loud (`NOT CONFIGURED`, exit 78).
- **`author:` frontmatter on every agent write.** `capture` (`_build_note`) stamps
the configured member; bootstrap stamps seeded anchors via a new `{{MEMBER}}`
substitution; all 8 scaffold templates gain an `author:` line; the canonical
frontmatter block (vault-layout.md, SKILL.md) documents it.
- **`missing-author` lint check** — `/chorus-health` flags any `agent_written: true`
note without an `author:` (the plugin-owned bootstrap marker is exempt).
- **Member-attributed concurrency**: the advisory-lock owner id is now
`<member>-<client>-<pid>` (`auto_owner`), and offline-queue outbox records carry
a `member` field for audit.
- **Per-member baked builds**: `build.py --bake-key` now bakes group/member/endpoint/
key (`--group`/`--member` flags; member required + slug-validated), so each
delivered artifact knows who it writes as.
### Verified
- All suites green (25/25 unit incl. new config/member-validation checks, scaffold,
routing-sync, 4 mock e2e incl. a capture-stamps-author assertion, run_eval metrics
unchanged) plus 8 end-to-end smoke checks (bootstrap stamping, lint flagging,
doctor reporting, NOT-CONFIGURED without member, slug rejection).
## 2.0.0-alpha.1 — CHORUS fork, Phase 1 (mechanical rename)
CHORUS is a group-based fork of ECHO (`jason/echo`, v1.5.1, schema 4 — preserved at the