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>
- docs/history/echo-improvements-prompt.md (ROADMAP-2.0 §5 box ticked)
- README repository layout brought to 1.5.1 reality: root docs
(CHANGELOG/TODO-1.6/ROADMAP-2.0/docs/history), build.py + dist/
(gitignored, secret-bearing), current eval harness contents, hooks/,
and the full scripts/ roster (recall/reflect/triage/queue/
concurrency/quality/output/doctor/hook modules) with the legacy
commands/ dir annotated as the TODO-1.6 migration target. Also
restores the eval-descriptor fix lost in the prior commit (edit was
applied in memory but never written back).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live 1.5.0 use caught the gate blocking a decision note over the single
vault-common token "echo" (min-normalized overlap gives any one-token
entity a 1.0 score). New echo_index.gate_candidates() + token_df():
- gate blocks same-kind candidates only; cross-kind name collisions
(a decision titled after its project) warn instead of blocking
- a lone shared token blocks only when unique to that entity (df == 1);
multi-token overlaps still block
fuzzy_candidates (advisory warnings) and exit-76/--merge-into/--force
semantics unchanged. +3 offline unit tests, gate e2e cases restructured
+2 new; verified live both directions. All suites green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>