From b3bc5272d5857f496764466469d16506827dd1ef Mon Sep 17 00:00:00 2001 From: Jason Stedwell Date: Tue, 21 Jul 2026 14:00:59 -0500 Subject: [PATCH] =?UTF-8?q?Phase=202:=20identity=20plumbing=20=E2=80=94=20?= =?UTF-8?q?group/member=20config,=20author:=20attribution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: 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 -- (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 --- CHANGELOG.md | 30 ++++ CHORUS-PLAN.md | 17 ++- README.md | 2 +- build.py | 38 ++--- chorus-memory.config.template.json | 3 +- chorus-memory.plugin | Bin 184485 -> 186728 bytes .../.claude-plugin/plugin.json | 2 +- chorus-memory.plugin.src/README.md | 11 +- .../skills/chorus-memory/SKILL.md | 21 +-- .../chorus-memory/references/vault-layout.md | 12 +- .../scaffold/anchors/current-context.seed.md | 1 + .../anchors/operator-preferences.seed.md | 1 + .../templates/context-bundle-template.md | 1 + .../templates/semantic-memory-template.md | 1 + .../_agent/templates/session-log-template.md | 1 + .../templates/working-memory-template.md | 1 + .../templates/decisions/decision-template.md | 1 + .../journal/templates/daily-note-template.md | 1 + .../templates/weekly-review-template.md | 1 + .../templates/projects/project-template.md | 1 + .../skills/chorus-memory/scripts/bootstrap.py | 4 +- .../skills/chorus-memory/scripts/chorus.py | 54 ++++--- .../scripts/chorus_concurrency.py | 7 +- .../chorus-memory/scripts/chorus_config.py | 133 +++++++++++------- .../chorus-memory/scripts/chorus_doctor.py | 22 +-- .../scripts/chorus_hook_session_start.py | 2 +- .../chorus-memory/scripts/chorus_ops.py | 8 +- .../chorus-memory/scripts/chorus_queue.py | 11 ++ .../chorus-memory/scripts/test_v1_scaffold.py | 33 ++++- .../chorus-memory/scripts/vault_lint.py | 8 ++ eval/run_eval.py | 2 +- eval/test_features.py | 12 +- eval/test_offline_queue.py | 2 +- eval/test_patch_semantics.py | 2 +- eval/test_reflect.py | 2 +- 35 files changed, 304 insertions(+), 144 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89ced88..78a4967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 + `--` (`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 diff --git a/CHORUS-PLAN.md b/CHORUS-PLAN.md index fca0daf..7225f61 100644 --- a/CHORUS-PLAN.md +++ b/CHORUS-PLAN.md @@ -186,13 +186,16 @@ fresh vaults on fresh machines for new users, so no ECHO back-compat: legacy `_agent/echo-vault.md` markers are all ignored. Shims briefly existed and were removed.)* -### Phase 2 — Identity plumbing (1–2 days) -`member` in config (+ `CHORUS_MEMBER`, baked-tier support, `config set --member`), -`MEMBER` global in `chorus.py`, `author:` stamping in `_build_note`, canonical -frontmatter + `KIND_REQUIRED_FM` + lint + sweep backfill, member-aware lock -owner and queue entries, `doctor` reports resolved member. Vault layout -untouched. **Deliverable:** every new write is attributed; single-user behavior -otherwise identical. +### Phase 2 — Identity plumbing (1–2 days) — DONE +`member` in config (+ `CHORUS_MEMBER`, baked-tier support, `config set --member` +with slug validation; `owner` → `group`; member REQUIRED for is_configured), +`MEMBER` global in `chorus.py`, `author:` stamping in `_build_note` + bootstrap +`{{MEMBER}}` anchor stamping + templates, canonical frontmatter docs + a +`missing-author` lint check (agent_written notes must carry `author:`; sweep +does NOT backfill — attribution can't be guessed), member-aware lock owner +(`--`) and queue records, `doctor` reports member/group. +Vault layout untouched. **Deliverable:** every new write is attributed; +single-user behavior otherwise identical. ### Phase 3 — Per-member namespacing (3–5 days — the core) Schema 5. New `LEAVES` + seeds (`members//…`, `group-profile.md`), diff --git a/README.md b/README.md index a0fa23c..2f73923 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# chorus-memory — v2.0.0-alpha.1 +# chorus-memory — v2.0.0-alpha.2 > **CHORUS is a group-based fork of [ECHO](https://git.alwisp.com/jason/echo)** — one shared > Obsidian vault serving a group of members instead of a single operator. The conversion diff --git a/build.py b/build.py index a9a93a9..bf09211 100644 --- a/build.py +++ b/build.py @@ -52,7 +52,8 @@ MAX_DESCRIPTION = 500 # plugin-marketplace cap: plugin.json "description" must # (it has silently regressed past the limit before — fail the build now) # field name -> the constant assigned in chorus_config.py -_CONSTS = {"owner": "DEFAULT_OWNER", "endpoint": "DEFAULT_BASE", "key": "DEFAULT_KEY"} +_CONSTS = {"group": "DEFAULT_GROUP", "member": "DEFAULT_MEMBER", + "endpoint": "DEFAULT_BASE", "key": "DEFAULT_KEY"} def _const_re(const: str) -> re.Pattern: @@ -113,8 +114,8 @@ def build(out: Path, files: list[Path], bake: dict | None, strip_key: bool) -> i def bake_values(args) -> dict: - """Resolve owner/endpoint/key for --bake-key from --owner/--endpoint/--key, - else --from , else CHORUS_OWNER/CHORUS_BASE/CHORUS_KEY env.""" + """Resolve group/member/endpoint/key for --bake-key from the CLI flags, + else --from , else CHORUS_GROUP/CHORUS_MEMBER/CHORUS_BASE/CHORUS_KEY env.""" src = {} if args.from_file: fp = Path(args.from_file).expanduser() @@ -127,28 +128,33 @@ def bake_values(args) -> dict: if isinstance(loaded, dict): src = loaded vals = { - "owner": args.owner or src.get("owner") or os.environ.get("CHORUS_OWNER") or "", + "group": args.group or src.get("group") or os.environ.get("CHORUS_GROUP") or "", + "member": args.member or src.get("member") or os.environ.get("CHORUS_MEMBER") or "", "endpoint": (args.endpoint or src.get("endpoint") or os.environ.get("CHORUS_BASE") or "").rstrip("/"), "key": args.key or src.get("key") or os.environ.get("CHORUS_KEY") or "", } - missing = [f for f in ("endpoint", "key") if not vals[f]] + missing = [f for f in ("endpoint", "key", "member") if not vals[f]] if missing: raise RuntimeError( - "build: --bake-key needs a real endpoint and key — missing " - + ", ".join(missing) + ". Provide --from , the --owner/" - "--endpoint/--key flags, or set CHORUS_OWNER/CHORUS_BASE/CHORUS_KEY.") - if "your-obsidian-rest-endpoint" in vals["endpoint"] or vals["key"].startswith("<"): + "build: --bake-key needs a real endpoint, key, and member — missing " + + ", ".join(missing) + ". Provide --from , the --group/--member/" + "--endpoint/--key flags, or set CHORUS_GROUP/CHORUS_MEMBER/CHORUS_BASE/CHORUS_KEY.") + if "your-obsidian-rest-endpoint" in vals["endpoint"] or vals["key"].startswith("<") \ + or vals["member"].startswith("<"): raise RuntimeError("build: --bake-key got the template placeholders, not real values.") + if not re.match(r"^[a-z0-9][a-z0-9-]{0,31}$", vals["member"]): + raise RuntimeError(f"build: baked member must be a kebab-case slug, got {vals['member']!r}") return vals def main(argv: list[str] | None = None) -> int: ap = argparse.ArgumentParser(description="Build the chorus-memory .plugin artifact") ap.add_argument("--bake-key", action="store_true", - help="bake a user's owner/endpoint/key into the artifact (secret-bearing — never commit)") + help="bake a member's group/member/endpoint/key into the artifact (secret-bearing — never commit)") ap.add_argument("--from", dest="from_file", metavar="FILE", - help="config.json to read owner/endpoint/key from when baking") - ap.add_argument("--owner", help="baked owner (overrides --from / env)") + help="config.json to read group/member/endpoint/key from when baking") + ap.add_argument("--group", help="baked group name (overrides --from / env)") + ap.add_argument("--member", help="baked member id (kebab-case; overrides --from / env)") ap.add_argument("--endpoint", help="baked endpoint (overrides --from / env)") ap.add_argument("--key", help="baked key (overrides --from / env)") ap.add_argument("--label", help="suffix for the artifact name, e.g. --label alice") @@ -206,12 +212,12 @@ def main(argv: list[str] | None = None) -> int: print(f"built {out.name} ({len(files)} entries, {size:,} bytes)") if bake: - who = bake.get("owner") or "(no owner)" - print(f"note: --bake-key baked credentials for {who} into {CONFIG_PY}.") + who = bake.get("member") or "(no member)" + print(f"note: --bake-key baked credentials for member '{who}' into {CONFIG_PY}.") print("WARNING: this artifact carries a vault key — deliver it directly to that one " - "user and NEVER commit, push, or publish it (dist/ is gitignored).") + "member and NEVER commit, push, or publish it (dist/ is gitignored).") elif args.strip_key: - print("note: --strip-key set — artifact is token-free; user configures owner/endpoint/key at runtime.") + print("note: --strip-key set — artifact is token-free; member configures group/member/endpoint/key at runtime.") elif token_present(SRC / "skills" / "chorus-memory" / "scripts" / "chorus_config.py"): print("WARNING: a DEFAULT_* constant in chorus_config.py is non-empty — this artifact carries a " "secret. Do not commit it. Build from a clean source tree, or use --strip-key.") diff --git a/chorus-memory.config.template.json b/chorus-memory.config.template.json index 6324f3f..7bdf626 100644 --- a/chorus-memory.config.template.json +++ b/chorus-memory.config.template.json @@ -1,5 +1,6 @@ { - "owner": "Full Name — how the agent should refer to the vault owner (third person)", + "group": "Group Name — the team/group sharing this vault", + "member": "", "endpoint": "https://your-obsidian-rest-endpoint.example.com", "key": "" } diff --git a/chorus-memory.plugin b/chorus-memory.plugin index 5f32fb18f88a040ad660d64f437a978526d7b83f..902cf5868aa09636e402633069567ef7cc72bf3a 100644 GIT binary patch delta 73641 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 Bu{;0( delta 71279 zcmV(|K+(VGvJ0i53mZ^N0|XQR000O8001Fe&xH^u$pHWW;sO8w8kdZ`0v(Y!4}ZG? zyY#kZ!PcQ`i)K9yJung-Ymr5dl9Cxk|NH1TDSC-RzDK@CiqB^NvxptdE@5U{mXb_I z9m_DQMrcQpJjW5en4izj4TiqO`KJkWl&ttZ9~s|-OK;Yg$U#3Arc5!z)DLzZA-4pn zMNz`y``yFi3hvg)JC6}|SV9I?!G8nmHGjhv13WBOzu?RL^&A$$DVaWCZdf|FA9BkP zZ15^|2^`5NKY+zP7ol1xaoCODF^MPnl7NVN>GCZ{TSP{miukB{hN3RiDyXlRbxO4y9n{C8_%NF6G?V7j z+hftii$43aMsJSj2PXBp%75hc6v9lwmjho1rkD00bxi z00{s908&LkL`_95ZDgfd-HzKxcD~nB6xxeKlEoIVgH0Cg!2tf-wSRX#(?++Q!6FE( z5?PXJnqqNSWOr-U8w_%>*Fj)lZ*rX%$(#5|@_na@6e+2V!KN|eZvNCcr_S$pPVtdS zH?C@YvNc;*?M9=wrt;R;rl?i8rB<#|&vV^mM%`Mi>Wxv;>GM~YSMRTgDx2_4MuQe;aS=y7U+G`P$Z-W_g~v?L2i^hK02& zmPS`|7ndeEmnN0*b)riF($om-vTO!HZqTO{gZyzpsd%i7O_&d$r- zVuFRbR=(CXl$dTzdgGP3HPD-gcdnCV11*1pkXxNzUe9FLZ*0-rtFbHaijGv&SIQQ( zsmjXWUot6-$sqaXpFcrAYN`EZ5=1HUX5GrscvB^MT{sV()9HnnP3)-LU16%3GDTK8 zkPfV2JauEh7UDze%5Q90f(z-@!prD%Lt!_zFv>S&3C&UaX4_M+*i@yiSlP8&+1xv* zu{YvWa;vFyZK)Yr`)LJQHEaep%N^eNgZ9|(HLmYWo=>NEXF45jjJu#0g0Oc@l^W$% zs;-)Pa}JYC1Ry`#I)xHyeeVjl-Obdh!p*I&sct;KrP<(UK~EGQ)rBi)N%2orn{AnE zIx4wQaWHlPC&!}=WRB9q^+0gpZ!D9m1Ryl={LRz%FJ7K+vxS#*_fUZuJe5{{%FDc+OB%>PIzEKs_t z*2|ochik+VbrRly!#sMVzGu{eeddfGjS{3NW|d%bN34r_aBf}d1gyxW84bb48sgu$*BsV=$W1sqfo z5-7D?`L||z@I8mxxUHFy#kQpFkv_{DagU{auN>dNl1XM(qU}Y

Y$8+dia+MXlF< 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 RafB&-0+2)*ub}%I_CJfEHVps( diff --git a/chorus-memory.plugin.src/.claude-plugin/plugin.json b/chorus-memory.plugin.src/.claude-plugin/plugin.json index c6455a7..ecb4e37 100644 --- a/chorus-memory.plugin.src/.claude-plugin/plugin.json +++ b/chorus-memory.plugin.src/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "chorus-memory", - "version": "2.0.0-alpha.1", + "version": "2.0.0-alpha.2", "description": "Group-based persistent memory via the shared CHORUS Obsidian vault over the Obsidian Local REST API. Cross-platform Python client: one-call capture/resolve/recall/link/triage over an entity index, hybrid BM25 + graph recall spanning entities + sessions/journal (recency/status-aware), a pre-write duplicate gate, complete-frontmatter capture, session hooks that self-fire load/reflect, offline write-ahead queue, lock-guarded concurrency, linter-enforced routing, and /chorus-* commands.", "author": { "name": "Jason Stedwell" diff --git a/chorus-memory.plugin.src/README.md b/chorus-memory.plugin.src/README.md index 3c63684..33018f2 100644 --- a/chorus-memory.plugin.src/README.md +++ b/chorus-memory.plugin.src/README.md @@ -20,26 +20,29 @@ Architected by **Jason Stedwell**. ## Configuration -The plugin ships **no** owner, endpoint, or key. On each machine it installs on, provide a machine-local JSON config: +The plugin ships **no** group, member, endpoint, or key. On each machine it installs on, provide a machine-local JSON config: ``` ~/.claude/chorus-memory/config.json (honors $CLAUDE_CONFIG_DIR; file path overridable with $CHORUS_CONFIG) { - "owner": "Full Name — how the agent refers to the vault owner (third person)", + "group": "Group Name — the team/group sharing this vault", + "member": "", "endpoint": "https://your-obsidian-rest-endpoint.example.com", "key": "" } ``` +`member` is **required** — it is stamped as `author:` on every agent write, so the shared vault always knows which member's session wrote what. + Set it up on a fresh install by copying the bundled template and filling it in, or via the client: ```bash python3 skills/chorus-memory/scripts/chorus.py config init # writes the template if absent → edit it -python3 skills/chorus-memory/scripts/chorus.py config set --owner "…" --endpoint "https://…" --key "…" +python3 skills/chorus-memory/scripts/chorus.py config set --group "…" --member "your-id" --endpoint "https://…" --key "…" python3 skills/chorus-memory/scripts/chorus.py config # show resolved config (key redacted) + source ``` -Per field, an environment variable overrides the file: `CHORUS_OWNER`, `CHORUS_BASE` (endpoint), `CHORUS_KEY`. `config init` writes the template (shown above) when the file is absent; a copy also ships at the repo root (`chorus-memory.config.template.json`). The config is **never committed** and **never written into a vault note**; the bearer key stays out of the plugin tree entirely. +Per field, an environment variable overrides the file: `CHORUS_GROUP`, `CHORUS_MEMBER`, `CHORUS_BASE` (endpoint), `CHORUS_KEY`. `config init` writes the template (shown above) when the file is absent; a copy also ships at the repo root (`chorus-memory.config.template.json`). The config is **never committed** and **never written into a vault note**; the bearer key stays out of the plugin tree entirely. ## Vault layout (root-addressed) diff --git a/chorus-memory.plugin.src/skills/chorus-memory/SKILL.md b/chorus-memory.plugin.src/skills/chorus-memory/SKILL.md index 3923ce9..e90a5dc 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/SKILL.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/SKILL.md @@ -7,18 +7,19 @@ description: Use the CHORUS Obsidian vault as the operator's persistent memory a Use the **CHORUS** Obsidian vault as persistent memory. Read context accumulated across sessions; write things the operator asks to be remembered. -The vault belongs to a single **owner**, configured per machine (the `owner` field in `~/.claude/chorus-memory/config.json`) — this is that person's personal memory substrate. Write memory in third person about the owner ("the operator prefers X", not "I prefer X") so the vault stays readable by humans and other agents. +The vault is shared **group memory**: one vault, many members. Each machine is configured with the **group** (who shares the vault) and this machine's **member id** (who is writing — stamped as `author:` on every agent write), in `~/.claude/chorus-memory/config.json`. Write memory in third person about people ("Jason prefers X", not "I prefer X") so the vault stays readable by every member and agent. ## API Configuration -The owner, endpoint, and API key are **machine-local** — the committed plugin ships none of them. `chorus.py` (via `chorus_config`) resolves each field from `~/.claude/chorus-memory/config.json`, with an environment override per field (`CHORUS_OWNER`, `CHORUS_BASE`, `CHORUS_KEY`). Never paste the key into a vault note or a doc. +The group, member, endpoint, and API key are **machine-local** — the committed plugin ships none of them. `chorus.py` (via `chorus_config`) resolves each field from `~/.claude/chorus-memory/config.json`, with an environment override per field (`CHORUS_GROUP`, `CHORUS_MEMBER`, `CHORUS_BASE`, `CHORUS_KEY`). Never paste the key into a vault note or a doc. -Exception — **per-user baked builds:** a `build.py --bake-key` artifact carries the owner/endpoint/key inside the plugin. When a *complete* baked set is present it is **authoritative** — it wins over env vars and the config file and can't be shadowed (so a baked install just works, even on a machine with a stale or placeholder config). The committed source stays credential-free. +Exception — **per-member baked builds:** a `build.py --bake-key` artifact carries the group/member/endpoint/key inside the plugin. When a *complete* baked set is present it is **authoritative** — it wins over env vars and the config file and can't be shadowed (so a baked install just works, even on a machine with a stale or placeholder config). The committed source stays credential-free. ``` endpoint = key = -owner = +member = +group = ``` ### First run — set up the machine if it isn't configured @@ -26,10 +27,10 @@ owner = ` (validates it and writes `~/.claude/chorus-memory/config.json`). - - They paste values → `python3 "$CHORUS" config set --owner "…" --endpoint "https://…" --key "…"`. + - They paste values → `python3 "$CHORUS" config set --group "…" --member "their-id" --endpoint "https://…" --key "…"`. - Inspect with `python3 "$CHORUS" config` (key redacted); then re-run `load`. If the vault is simply unreachable (network/`502`) *after* config exists, that's the **Vault Unreachable** path below, not a setup problem — don't re-ask for the key. @@ -88,7 +89,7 @@ python3 "$CHORUS" link [--json] # add reciprocal [[Relate python3 "$CHORUS" triage --list --json # structured inbox listing (see Inbox Triage) ``` -- **`capture` is the default write.** Given a title + `--kind`, it: resolves the entity via the index (create-vs-update, no manual search-first), derives the canonical path, stamps **complete** canonical frontmatter (`type/status/created/updated/tags/aliases/agent_written/source_notes` — a kind-appropriate default `status` and the kind seeded as a baseline tag, enriched by `--tags`), updates the index, **auto-links** any known entity mentioned in the body (bidirectionally), and appends today's Agent Log line — one call instead of search→put→bump→log. It also **auto-derives aliases** from the title and **learns the mention as an alias** when updating an entity under a different name. Updating an existing entity appends the **whole body** as a dated block (first line on the bullet, the rest indented under it) — nothing is truncated. `--kind` ∈ `person, company, concept, reference, meeting, project, area, semantic, episodic, working, skill, decision`. Use `--inbox` (or omit `--kind`) only when the home is genuinely unknown. +- **`capture` is the default write.** Given a title + `--kind`, it: resolves the entity via the index (create-vs-update, no manual search-first), derives the canonical path, stamps **complete** canonical frontmatter (`type/status/created/updated/tags/aliases/agent_written/author/source_notes` — a kind-appropriate default `status` and the kind seeded as a baseline tag, enriched by `--tags`), updates the index, **auto-links** any known entity mentioned in the body (bidirectionally), and appends today's Agent Log line — one call instead of search→put→bump→log. It also **auto-derives aliases** from the title and **learns the mention as an alias** when updating an entity under a different name. Updating an existing entity appends the **whole body** as a dated block (first line on the bullet, the rest indented under it) — nothing is truncated. `--kind` ∈ `person, company, concept, reference, meeting, project, area, semantic, episodic, working, skill, decision`. Use `--inbox` (or omit `--kind`) only when the home is genuinely unknown. - **Duplicate gate (create path).** When a new title strongly resembles an existing entity (fuzzy score ≥ 0.6, env `CHORUS_DUP_GATE`), `capture` **stops before writing** and exits `76` with the candidate list, instead of creating a near-duplicate and warning afterwards. Two precision rules (1.5.1) keep it from over-firing: the gate only blocks on a **same-kind** candidate (a decision or meeting named after a project/person is intentional naming — those surface as warnings only), and a **single shared token blocks only when it's unique to that entity** (a vault-common word like a project family name can't gate everything that mentions it; multi-token overlaps still block). Resolve a gate stop deliberately: `--merge-into ` routes the capture as an update to the existing entity (the new name is learned as an alias), or `--force` creates anyway after you've confirmed they're genuinely distinct. Weak resemblances still create + warn as before. - **`resolve` before constructing any path by hand** — it returns the canonical note (matching slug/title/alias, so *Bob/Robert/RS* converge) or, when nothing matches exactly, a ranked list of **`candidates`** (entities sharing a distinctive token — e.g. "chorus memory" surfaces the project `chorus`). Always check candidates before creating a new note; a shortened name not matching exactly is the classic way a duplicate gets made. This replaces the two-search "search-first" dance for slug-addressed notes. - **`recall` for "what do we know about X"** — it returns the matching notes *and* their one-hop neighbourhood (Related links, `source_notes`), so recall surfaces the web around a topic, not an isolated note. The corpus covers the entity graph **plus session logs and journal notes** (down-weighted, so entity notes win ties) — past discussions and decisions are findable even when nobody promoted them into an entity note. Ranking fuses BM25 with **freshness** (`updated:` half-life decay) and **status** (`active` boosted, `archived` demoted), and each hit prints its `updated:`/`status:` so staleness is visible. `--json` emits structured hits (`path/score/type/updated/status/excerpt`) instead of prose. @@ -214,7 +215,7 @@ Write when the operator: - Says "remember that", "save this", "log this", "add to memory", "note that" - Finishes a meaningful working session future sessions should pick up -Write in third person about the operator. Every note carries the canonical frontmatter (see below). Agent-generated notes set `agent_written: true`. +Write in third person about the operator. Every note carries the canonical frontmatter (see below). Agent-generated notes set `agent_written: true` and `author: ` (your configured member id). **Default write path: `capture`.** For a routed memory (a fact about a person/company/project/concept/etc.), prefer `python3 "$CHORUS" capture "" <bodyfile> --kind <kind>` — it does the search-first, path derivation, frontmatter, indexing, auto-linking, and Agent-Log line in one call (see **High-level memory ops**). Drop to the lower-level `put`/`patch`/`append` verbs below only for shapes `capture` doesn't model (a project `## Status` replacement, an ADR mirror, a daily-note edit) or to inspect/repair. @@ -269,7 +270,7 @@ python3 "$CHORUS" fm <path> status active python3 "$CHORUS" search <terms...> ``` -Every PUT body needs the canonical YAML frontmatter (see `references/vault-layout.md`); set `agent_written: true` and `source_notes`. Bump `updated:` on substance, not on heartbeat — adding an Agent Log line, an inbox capture, or a timestamped Observations bullet is not a meaningful content change. Raw curl mechanics for every verb live in `references/api-reference.md`. +Every PUT body needs the canonical YAML frontmatter (see `references/vault-layout.md`); set `agent_written: true`, `author: <your-member-id>`, and `source_notes`. Bump `updated:` on substance, not on heartbeat — adding an Agent Log line, an inbox capture, or a timestamped Observations bullet is not a meaningful content change. Raw curl mechanics for every verb live in `references/api-reference.md`. ## Scope Switching (`current-context.md`) @@ -431,7 +432,7 @@ If the API returns a connection error, timeout, or `502`, tell the operator once - This vault holds only its own owner's memory. Do not cross-write between distinct vaults/owners — another person's vault and preferences belong in their own vault, not here. - **Anchor relative dates on the conversation's `currentDate`** before writing. "Today" → `currentDate`. "Thursday" / "next week" → resolve to an absolute `YYYY-MM-DD`. Never guess from training-data knowledge of the current year. - Every memory file has canonical YAML frontmatter — see `references/vault-layout.md`. -- Set `agent_written: true` on agent-generated notes and list `source_notes` (plain relative paths, not links). +- Set `agent_written: true` and `author: <your-member-id>` on agent-generated notes and list `source_notes` (plain relative paths, not links). - **`created:` is the earliest known date the entity was tracked anywhere in the vault, not "today".** When merging notes (e.g. promoting `on-hold/` → `active/`), preserve the earliest `created:` and only bump `updated:`. - **`source_notes` lists the note(s) that *triggered* or *supplied content for* this one** — e.g. the session log that produced a project update, or the daily note where a captured fact originated. It is a *backward* link to inputs. Forward links (this note → other notes it references) belong in the `## Related` section in the note body, never in frontmatter. - **Never put `[[wikilinks]]` in frontmatter** — YAML parses them as nested lists and the links break in Obsidian's reading view. Put all cross-references in a `## Related` section in the note **body** as a bulleted list of `[[links]]`. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/vault-layout.md b/chorus-memory.plugin.src/skills/chorus-memory/references/vault-layout.md index 8eeee56..2d18c2c 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/vault-layout.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/vault-layout.md @@ -73,6 +73,9 @@ tags: [] # REQUIRED (non-empty) on entity notes — capture seeds the ki aliases: [] # optional — other names this entity is called (Obsidian-native). Folded # into the entity index so a shortened/expanded name resolves to this note. agent_written: false +author: # member id of the session that wrote this note — REQUIRED when + # agent_written is true (capture stamps the configured member; + # /chorus-health flags missing-author) source_notes: [] # plain relative paths as strings — NEVER [[wikilinks]] --- ``` @@ -80,9 +83,12 @@ source_notes: [] # plain relative paths as strings — NEVER [[wikilinks]] `aliases:` is the **durable, Obsidian-native home for alternate names** of an entity (e.g. the project `chorus` is also "chorus-memory" / "chorus plugin"). `capture` auto-derives the obvious case/punctuation variants of the title and writes them here; `sweep` folds frontmatter aliases back into the entity index, so they survive an index rebuild. List plain strings, never `[[wikilinks]]`. `agent_written: true` + a populated `source_notes` is the key signal separating -agent-managed content from human-authored content. When appending with POST, do -not rewrite frontmatter — the append goes after existing content. To change -`updated:` or `status:`, use PATCH with `Target-Type: frontmatter`. +agent-managed content from human-authored content. `author:` records **which +member's session** wrote the note — CHORUS is group memory, so every agent write +is attributed (`capture` stamps it from the machine's configured `member`; when +writing a note by hand with PUT, set it to your member id). When appending with +POST, do not rewrite frontmatter — the append goes after existing content. To +change `updated:` or `status:`, use PATCH with `Target-Type: frontmatter`. **Frontmatter field semantics:** diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/current-context.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/current-context.seed.md index 5c6e56d..40c2623 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/current-context.seed.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/current-context.seed.md @@ -5,6 +5,7 @@ created: {{DATE}} updated: {{DATE}} tags: [agent, context] agent_written: true +author: {{MEMBER}} source_notes: [] scope: scope_updated: {{DATE}} diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md index cde04d4..9b200ba 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md @@ -5,6 +5,7 @@ created: {{DATE}} updated: {{DATE}} tags: [agent, semantic-memory, operator] agent_written: true +author: {{MEMBER}} source_notes: [] confidence: low last_reviewed: {{DATE}} diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/context-bundle-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/context-bundle-template.md index 0d64b5b..74a10c2 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/context-bundle-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/context-bundle-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DD}} updated: {{date:YYYY-MM-DD}} tags: [agent, context] agent_written: true +author: source_notes: [] scope: refresh_strategy: on-demand diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/semantic-memory-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/semantic-memory-template.md index 45f6988..55532be 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/semantic-memory-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/semantic-memory-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DD}} updated: {{date:YYYY-MM-DD}} tags: [agent, semantic-memory] agent_written: true +author: source_notes: [] confidence: high last_reviewed: {{date:YYYY-MM-DD}} diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/session-log-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/session-log-template.md index 05e0982..63494af 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/session-log-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/session-log-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DDTHH:mm}} updated: {{date:YYYY-MM-DDTHH:mm}} tags: [agent, session] agent_written: true +author: source_notes: [] session_date: {{date:YYYY-MM-DD}} client: claude-code diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/working-memory-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/working-memory-template.md index ca0dc65..558be07 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/working-memory-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/_agent/templates/working-memory-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DDTHH:mm}} updated: {{date:YYYY-MM-DDTHH:mm}} tags: [agent, working-memory] agent_written: true +author: source_notes: [] expires_after: 48h --- diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/decisions/decision-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/decisions/decision-template.md index 88b014e..521f7ed 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/decisions/decision-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/decisions/decision-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DD}} updated: {{date:YYYY-MM-DD}} tags: [decision] agent_written: true +author: source_notes: [] decision_date: {{date:YYYY-MM-DD}} impact: medium diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/daily-note-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/daily-note-template.md index 5bbe593..f97fa7f 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/daily-note-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/daily-note-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DD}} updated: {{date:YYYY-MM-DD}} tags: [daily, journal] agent_written: false +author: source_notes: [] --- diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/weekly-review-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/weekly-review-template.md index dbfd00a..3c42a1f 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/weekly-review-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/journal/templates/weekly-review-template.md @@ -5,6 +5,7 @@ created: {{date:gggg-[W]WW}} updated: {{date:gggg-[W]WW}} tags: [review, weekly] agent_written: true +author: source_notes: [] period: weekly --- diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/projects/project-template.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/projects/project-template.md index 0b08cc3..eaa38c4 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/projects/project-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/templates/projects/project-template.md @@ -5,6 +5,7 @@ created: {{date:YYYY-MM-DD}} updated: {{date:YYYY-MM-DD}} tags: [project] agent_written: false +author: source_notes: [] owner: review_cycle: weekly diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py index ce41dec..81ac47d 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py @@ -59,7 +59,9 @@ def seed(path: str, source: Path, dry_run: bool) -> None: if dry_run: print(f"bootstrap: would seed {path} <- {source.relative_to(SKILL_DIR)}") return - text = source.read_text(encoding="utf-8").replace("{{DATE}}", chorus.today()) + text = (source.read_text(encoding="utf-8") + .replace("{{DATE}}", chorus.today()) + .replace("{{MEMBER}}", chorus.MEMBER or "")) put_text(path, text) print(f"bootstrap: seeded {path}") diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py index 4a92eb0..c343b61 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py @@ -19,11 +19,11 @@ reused across requests), and `read_many` fans bulk GETs across a thread pool — full-vault scripts (sweep, lint, recall rebuild) make a handful of warm round-trips instead of hundreds of fresh TLS handshakes, and no longer blow past tool timeouts. -Config (owner/endpoint/key are machine-local — see chorus_config; the plugin ships none): - owner/endpoint/key resolved by chorus_config from ~/.claude/chorus-memory/config.json - (env CHORUS_OWNER / CHORUS_BASE / CHORUS_KEY override per field). +Config (group/member/endpoint/key are machine-local — see chorus_config; the plugin ships none): + group/member/endpoint/key resolved by chorus_config from ~/.claude/chorus-memory/config.json + (env CHORUS_GROUP / CHORUS_MEMBER / CHORUS_BASE / CHORUS_KEY override per field). Set up a machine with `chorus.py config init` then edit, or - `chorus.py config set --owner ... --endpoint ... --key ...`. + `chorus.py config set --group ... --member ... --endpoint ... --key ...`. CHORUS_VERIFY default 1 — read-back verify after a PUT CHORUS_LOCK_TTL default 900 — seconds before an advisory lock is considered stale CHORUS_TIMEOUT default 30 — per-request socket timeout (seconds) @@ -48,7 +48,7 @@ Usage: chorus.py unlock <owner-id> # release advisory lock if owned by <owner-id> chorus.py scope show # print active scope, its freshness, and sessions-since chorus.py scope set "<text>" # switch scope atomically (history + replace + stamp scope_updated) - chorus.py config [show|init|set|import] # machine-local owner/endpoint/key (config import <file> adopts a provided file) + chorus.py config [show|init|set|import] # machine-local group/member/endpoint/key (config import <file> adopts a provided file) Exit codes: 0 ok · 44 not-found(404) · 75 lock-held/lost · 76 duplicate-gate (capture) · 78 config-required · 2 usage · 1 other HTTP/transport error. @@ -80,7 +80,7 @@ for _stream in (sys.stdout, sys.stderr): pass # Owner / endpoint / key are machine-local and resolved by chorus_config from -# ~/.claude/chorus-memory/config.json (env CHORUS_OWNER / CHORUS_BASE / CHORUS_KEY override). +# ~/.claude/chorus-memory/config.json (env CHORUS_GROUP / CHORUS_MEMBER / CHORUS_BASE / CHORUS_KEY override). # The plugin ships none of them; load() returns "" for anything unset so --help, # `config`, and `doctor` stay usable. Network ops raise a clear error if endpoint/key # are missing (see _require_endpoint / request). @@ -89,7 +89,8 @@ import chorus_config # noqa: E402 _CFG = chorus_config.load() BASE = _CFG["endpoint"] KEY = _CFG["key"] -OWNER = _CFG["owner"] +GROUP = _CFG["group"] +MEMBER = _CFG["member"] # this machine's member id — stamped as author: on writes VERIFY = os.environ.get("CHORUS_VERIFY", "1") != "0" LOCK_TTL = int(os.environ.get("CHORUS_LOCK_TTL", "900")) # Per-request socket timeout. A single stuck file fails fast instead of stalling a @@ -141,11 +142,11 @@ def _require_config() -> None: untouched `config init` template (placeholder endpoint/key).""" if not chorus_config.is_configured(_CFG): raise ChorusError( - "chorus: NOT CONFIGURED — no usable CHORUS key file on this machine. Ask the " - f"operator for their config (owner/endpoint/key) and install it at " + "chorus: NOT CONFIGURED — no usable CHORUS config on this machine. Ask the " + f"member for their config (group/member/endpoint/key) and install it at " f"{chorus_config.config_path()}: `chorus.py config import <file>`, or " - "`chorus.py config set --owner ... --endpoint ... --key ...` " - "(or set CHORUS_BASE / CHORUS_KEY).", 2) + "`chorus.py config set --group ... --member ... --endpoint ... --key ...` " + "(or set CHORUS_BASE / CHORUS_KEY / CHORUS_MEMBER).", 2) def _new_connection() -> http.client.HTTPConnection: @@ -613,10 +614,10 @@ def cmd_load() -> int: if not chorus_config.is_configured(_CFG): print("chorus: NOT CONFIGURED — this machine has no usable CHORUS key file yet.") print(f"Expected at: {chorus_config.config_path()}") - print("ACTION: ask the operator for their chorus-memory config file (it holds the") - print(" vault owner, endpoint, and API key), then install it with ONE of:") + print("ACTION: ask the member for their chorus-memory config file (it holds the") + print(" group, member id, endpoint, and API key), then install it with ONE of:") print(" python3 chorus.py config import <path-to-their-file>") - print(" python3 chorus.py config set --owner \"…\" --endpoint \"https://…\" --key \"…\"") + print(" python3 chorus.py config set --group \"…\" --member \"…\" --endpoint \"https://…\" --key \"…\"") print("Then re-run load. (Memory is unavailable until configured.)") return 78 # distinct: configuration required targets = [ @@ -694,17 +695,17 @@ def cmd_load() -> int: def cmd_config(args) -> int: - """show | init | set the machine-local owner/endpoint/key config.""" + """show | init | set the machine-local group/member/endpoint/key config.""" path = chorus_config.config_path() if args.action == "init": p, created = chorus_config.init_template() - print(f"ok: wrote config template to {p} — edit it with your owner/endpoint/key" + print(f"ok: wrote config template to {p} — edit it with your group/member/endpoint/key" if created else f"config already exists at {p} (left unchanged)") return 0 if args.action == "import": if not args.path: print("config import: pass the path to a config file " - "(JSON with owner/endpoint/key)", file=sys.stderr) + "(JSON with group/member/endpoint/key)", file=sys.stderr) return 2 try: p = chorus_config.import_file(args.path) @@ -714,10 +715,15 @@ def cmd_config(args) -> int: print(f"ok: imported config to {p} (chmod 600 best-effort)") return 0 if args.action == "set": - if args.owner is None and args.endpoint is None and args.key is None: - print("config set: pass at least one of --owner / --endpoint / --key", file=sys.stderr) + if args.group is None and args.member is None and args.endpoint is None and args.key is None: + print("config set: pass at least one of --group / --member / --endpoint / --key", + file=sys.stderr) return 2 - p = chorus_config.write_config(args.owner, args.endpoint, args.key) + if args.member is not None and not chorus_config.member_valid(args.member): + print(f"config set: --member must be a kebab-case slug " + f"(^[a-z0-9][a-z0-9-]{{0,31}}$), got: {args.member!r}", file=sys.stderr) + return 2 + p = chorus_config.write_config(args.group, args.member, args.endpoint, args.key) print(f"ok: updated {p} (chmod 600 best-effort)") return 0 # show — never prints the key in the clear @@ -725,7 +731,8 @@ def cmd_config(args) -> int: key = cfg["key"] redacted = (key[:4] + "…" + key[-4:]) if len(key) >= 12 else ("set" if key else "") print(f"config file: {path}" + ("" if path.exists() else " (absent)")) - for field, shown in (("owner", cfg["owner"]), ("endpoint", cfg["endpoint"]), ("key", redacted)): + for field, shown in (("group", cfg["group"]), ("member", cfg["member"]), + ("endpoint", cfg["endpoint"]), ("key", redacted)): src = chorus_config.source(field) print(f" {field:9} {shown or '(unset)'} [{src}]") return 0 @@ -752,10 +759,11 @@ def build_parser() -> argparse.ArgumentParser: sub.add_parser("delete").add_argument("path") sub.add_parser("lock").add_argument("owner") sub.add_parser("unlock").add_argument("owner") - p = sub.add_parser("config") # machine-local owner/endpoint/key (see chorus_config) + p = sub.add_parser("config") # machine-local group/member/endpoint/key (see chorus_config) p.add_argument("action", nargs="?", default="show", choices=["show", "init", "set", "import"]) p.add_argument("path", nargs="?") # for `config import <path>` - p.add_argument("--owner"); p.add_argument("--endpoint"); p.add_argument("--key") + p.add_argument("--group"); p.add_argument("--member") + p.add_argument("--endpoint"); p.add_argument("--key") p = sub.add_parser("scope") p.add_argument("subcommand", nargs="?", default="show", choices=["show", "set"]) p.add_argument("text", nargs="?") diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_concurrency.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_concurrency.py index 317ec76..a582685 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_concurrency.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_concurrency.py @@ -31,10 +31,13 @@ import chorus_index as idx_mod # noqa: E402 def auto_owner() -> str: - """A stable-per-process owner id: client tag + pid. Avoids Math.random/time-based + """A stable-per-process owner id: member + client tag + pid, so lock contention + is attributable to a person, not just a process. Avoids Math.random/time-based ids; pid is unique enough for cooperative locking and is reproducible in tests.""" tag = os.environ.get("CHORUS_CLIENT", "cc") - return f"{tag}-{os.getpid()}" + member = getattr(chorus, "MEMBER", "") or "" + prefix = f"{member}-" if member else "" + return f"{prefix}{tag}-{os.getpid()}" @contextlib.contextmanager diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py index c56d46b..fdaad22 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_config.py @@ -1,12 +1,15 @@ #!/usr/bin/env python3 -"""chorus_config.py — resolve the vault owner, endpoint, and API key for CHORUS. +"""chorus_config.py — resolve the group, member, endpoint, and API key for CHORUS. -The plugin ships NO owner, endpoint, or key — it is fully user-agnostic. On each -machine, a machine-local JSON config supplies them: +CHORUS is GROUP memory: one shared vault, many members. Every machine therefore +supplies four values — who the group is, who *this* member is, and how to reach +the vault. The plugin ships NONE of them. On each machine, a machine-local JSON +config supplies them: ~/.claude/chorus-memory/config.json { - "owner": "Full Name (how the agent refers to the vault owner, third person)", + "group": "Display name for the group/team that shares the vault", + "member": "this-members-id (kebab-case slug, e.g. \"jason\" — stamped as author: on writes)", "endpoint": "https://your-obsidian-rest-endpoint.example.com", "key": "<obsidian-local-rest-api-bearer-token>" } @@ -14,48 +17,58 @@ machine, a machine-local JSON config supplies them: This file is per-machine: it must be created on each fresh install, is never committed, and is never written into a vault note. To create it, run `python3 chorus.py config init` (writes a placeholder template when absent) and edit -it, or `python3 chorus.py config set --owner ... --endpoint ... --key ...`. +it, or `python3 chorus.py config set --group ... --member ... --endpoint ... --key ...`. Resolution — a COMPLETE baked credential set wins unconditionally: - If the artifact carries both a baked endpoint AND key (a per-user build), those - baked values are used as-is and CANNOT be shadowed by env vars or a config file. - This is the default path: a delivered per-user plugin "just works" with no setup, - and a stale CHORUS_* env var or a leftover/placeholder ~/.claude config.json can - never override or break it. + If the artifact carries a baked endpoint AND key AND member (a per-member build), + those baked values are used as-is and CANNOT be shadowed by env vars or a config + file. This is the default path: a delivered per-member plugin "just works" with no + setup, and a stale CHORUS_* env var or a leftover/placeholder ~/.claude config.json + can never override or break it. Otherwise (nothing baked — the generic published plugin), fall back per-field, first hit wins: - owner env CHORUS_OWNER -> config "owner" - endpoint env CHORUS_BASE -> config "endpoint" - key env CHORUS_KEY -> config "key" + group env CHORUS_GROUP -> config "group" + member env CHORUS_MEMBER -> config "member" + endpoint env CHORUS_BASE -> config "endpoint" + key env CHORUS_KEY -> config "key" The config directory honors $CLAUDE_CONFIG_DIR (defaults to ~/.claude); the config file path itself can be overridden with $CHORUS_CONFIG. Pure stdlib only. +MEMBER IDs are kebab-case slugs (^[a-z0-9][a-z0-9-]{0,31}$): they are stamped into +`author:` frontmatter on every agent write and (from schema 5) become path segments +(`_agent/members/<member>/…`), so they must be filesystem- and wikilink-safe. + BAKED CREDENTIALS (the default tier): the DEFAULT_* constants below are EMPTY in source — the committed plugin ships zero credentials. `build.py --bake-key` -substitutes a specific user's owner/endpoint/key into them at package time, -producing a per-user artifact that needs no config file. This is how the plugin +substitutes one member's group/member/endpoint/key into them at package time, +producing a per-member artifact that needs no config file. This is how the plugin works in the CoWork sandbox, where the user's ~/.claude is not bridged: the plugin itself (mounted read-only every session) carries the values. A baked artifact is -secret-bearing — deliver it directly to that one user, NEVER commit or publish it. +secret-bearing — deliver it directly to that one member, NEVER commit or publish it. On a normal host the empty defaults mean the env/config-file path takes over. """ from __future__ import annotations import json import os +import re from pathlib import Path # Build-time injection targets — MUST stay empty string literals in source so the # committed tree ships no secret. `build.py --bake-key` rewrites these lines. -DEFAULT_OWNER = "" +DEFAULT_GROUP = "" +DEFAULT_MEMBER = "" DEFAULT_BASE = "" DEFAULT_KEY = "" +MEMBER_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,31}$") + TEMPLATE = { - "owner": "Full Name — how the agent should refer to the vault owner (third person)", + "group": "Group Name — the team/group sharing this vault", + "member": "<your-member-id — kebab-case slug, e.g. jason>", "endpoint": "https://your-obsidian-rest-endpoint.example.com", "key": "<obsidian-local-rest-api-bearer-token>", } @@ -86,31 +99,34 @@ def _from_file() -> dict: def baked_complete() -> bool: - """True when the artifact carries a usable baked endpoint AND key — i.e. a - per-user `--bake-key` build. When True, the baked values win unconditionally.""" - return bool(DEFAULT_BASE and DEFAULT_KEY) + """True when the artifact carries a usable baked endpoint AND key AND member — + i.e. a per-member `--bake-key` build. When True, the baked values win + unconditionally.""" + return bool(DEFAULT_BASE and DEFAULT_KEY and DEFAULT_MEMBER) def load() -> dict: - """Return {owner, endpoint, key}. A complete baked set wins unconditionally; - otherwise env overrides the file, missing -> "". + """Return {group, member, endpoint, key}. A complete baked set wins + unconditionally; otherwise env overrides the file, missing -> "". - Never raises — callers that REQUIRE a field use resolve_endpoint()/resolve_key(), - which raise a helpful error. This keeps `--help`, `config`, and `doctor` usable - even when nothing is configured yet.""" + Never raises — callers that REQUIRE a field use resolve_endpoint()/resolve_key()/ + resolve_member(), which raise a helpful error. This keeps `--help`, `config`, and + `doctor` usable even when nothing is configured yet.""" f = _from_file() if baked_complete(): - # Per-user artifact: baked creds are authoritative and must not be shadowed - # by a stale env var or a leftover/placeholder config file. Owner is purely - # descriptive, so it may still fall back when not baked. + # Per-member artifact: baked values are authoritative and must not be + # shadowed by a stale env var or a leftover/placeholder config file. Group + # is purely descriptive, so it may still fall back when not baked. return { - "owner": DEFAULT_OWNER or os.environ.get("CHORUS_OWNER") or f.get("owner") or "", + "group": DEFAULT_GROUP or os.environ.get("CHORUS_GROUP") or f.get("group") or "", + "member": DEFAULT_MEMBER, "endpoint": DEFAULT_BASE.rstrip("/"), "key": DEFAULT_KEY, } endpoint = (os.environ.get("CHORUS_BASE") or f.get("endpoint") or "").rstrip("/") return { - "owner": os.environ.get("CHORUS_OWNER") or f.get("owner") or "", + "group": os.environ.get("CHORUS_GROUP") or f.get("group") or "", + "member": os.environ.get("CHORUS_MEMBER") or f.get("member") or "", "endpoint": endpoint, "key": os.environ.get("CHORUS_KEY") or f.get("key") or "", } @@ -120,7 +136,7 @@ def _missing(field: str, env: str) -> RuntimeError: return RuntimeError( f"chorus: no {field} configured. Set {env}, or create {config_path()} " f"(run `chorus.py config init` to scaffold it, then edit). " - f'Expected JSON keys: "owner", "endpoint", "key".' + f'Expected JSON keys: "group", "member", "endpoint", "key".' ) @@ -138,32 +154,49 @@ def resolve_key() -> str: return k -def resolve_owner() -> str: - """The owner display name. Descriptive only, so an empty value is tolerated.""" - return load()["owner"] +def resolve_member() -> str: + """This machine's member id — required for attribution (author: stamping).""" + m = load()["member"] + if not member_valid(m): + raise _missing("member", "CHORUS_MEMBER") + return m + + +def resolve_group() -> str: + """The group display name. Descriptive only, so an empty value is tolerated.""" + return load()["group"] + + +def member_valid(member: str) -> bool: + """True when the member id is a usable kebab-case slug (not empty, not the + template placeholder). Member ids become author: stamps and path segments.""" + return bool(member) and bool(MEMBER_RE.match(member)) def is_configured(cfg: dict | None = None) -> bool: - """True only when endpoint AND key are present and NOT the untouched template - placeholders — so a freshly `config init`-ed (but unedited) file reads as not yet - configured, which is what triggers the first-run "ask for the key file" prompt.""" + """True only when endpoint, key, AND member are present and NOT the untouched + template placeholders — so a freshly `config init`-ed (but unedited) file reads + as not yet configured, which is what triggers the first-run "ask for the config + file" prompt. Member is required: group memory without attribution is broken.""" c = cfg if cfg is not None else load() ep, key = c.get("endpoint", ""), c.get("key", "") if not ep or not key: return False if "your-obsidian-rest-endpoint" in ep or key.startswith("<"): return False - return True + return member_valid(c.get("member", "")) def source(field: str) -> str: """Where a field is currently coming from — for `config`/`doctor` reporting.""" - baked = {"owner": DEFAULT_OWNER, "endpoint": DEFAULT_BASE, "key": DEFAULT_KEY}[field] - # A complete baked set wins unconditionally (see load()): endpoint/key always - # come from the artifact, and owner too whenever it was baked. - if baked_complete() and (field in ("endpoint", "key") or baked): + baked = {"group": DEFAULT_GROUP, "member": DEFAULT_MEMBER, + "endpoint": DEFAULT_BASE, "key": DEFAULT_KEY}[field] + # A complete baked set wins unconditionally (see load()): member/endpoint/key + # always come from the artifact, and group too whenever it was baked. + if baked_complete() and (field in ("member", "endpoint", "key") or baked): return "baked-in (plugin)" - env = {"owner": "CHORUS_OWNER", "endpoint": "CHORUS_BASE", "key": "CHORUS_KEY"}[field] + env = {"group": "CHORUS_GROUP", "member": "CHORUS_MEMBER", + "endpoint": "CHORUS_BASE", "key": "CHORUS_KEY"}[field] if os.environ.get(env): return f"{env} env" if config_path().exists() and _from_file().get(field): @@ -184,11 +217,12 @@ def _secure(p: Path) -> None: pass -def write_config(owner: str, endpoint: str, key: str) -> Path: +def write_config(group: str, member: str, endpoint: str, key: str) -> Path: """Persist a filled-in config (merging over any existing values), chmod 0600.""" cur = _from_file() merged = { - "owner": owner if owner is not None else cur.get("owner", ""), + "group": group if group is not None else cur.get("group", ""), + "member": member if member is not None else cur.get("member", ""), "endpoint": (endpoint if endpoint is not None else cur.get("endpoint", "")).rstrip("/"), "key": key if key is not None else cur.get("key", ""), } @@ -211,9 +245,10 @@ def import_file(src) -> Path: raise RuntimeError(f"config import: {p} is not valid JSON ({exc})") if not isinstance(data, dict) or not is_configured(data): raise RuntimeError( - 'config import: file must be JSON with a real "endpoint" and "key" ' - '(and ideally "owner") — not the template placeholders.') - return write_config(data.get("owner", ""), data["endpoint"], data["key"]) + 'config import: file must be JSON with a real "endpoint", "key", and ' + '"member" (kebab-case slug; and ideally "group") — not the template ' + 'placeholders.') + return write_config(data.get("group", ""), data["member"], data["endpoint"], data["key"]) def init_template() -> tuple[Path, bool]: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py index b1dd3a8..2d7958a 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_doctor.py @@ -38,11 +38,13 @@ def run() -> int: line(sys.version_info >= MIN_PY, f"python >= {MIN_PY[0]}.{MIN_PY[1]}", f"running {sys.version_info.major}.{sys.version_info.minor}") - # 2. machine-local config (owner/endpoint/key). Without a usable endpoint+key - # nothing else can run, so report it clearly before touching the network. - # A still-placeholder `config init` template counts as not configured. + # 2. machine-local config (group/member/endpoint/key). Without a usable + # endpoint+key+member nothing else can run, so report it clearly before + # touching the network. A still-placeholder `config init` template counts + # as not configured. ep_real = bool(cfg["endpoint"]) and "your-obsidian-rest-endpoint" not in cfg["endpoint"] key_real = bool(cfg["key"]) and not cfg["key"].startswith("<") + member_real = chorus_config.member_valid(cfg["member"]) line(ep_real, "endpoint configured", f"[{chorus_config.source('endpoint')}]" if ep_real else (f"placeholder — edit {chorus_config.config_path()}" if cfg["endpoint"] @@ -50,12 +52,16 @@ def run() -> int: line(key_real, "API key configured", f"[{chorus_config.source('key')}]" if key_real else ("placeholder — not yet filled in" if cfg["key"] else "missing — see `chorus.py config`")) - line(bool(cfg["owner"]), "vault owner set", - cfg["owner"] if cfg["owner"] else "optional, but recommended for third-person writes") + line(member_real, "member id configured", + f"{cfg['member']} [{chorus_config.source('member')}]" if member_real + else (f"invalid — must be a kebab-case slug, got {cfg['member']!r}" if cfg["member"] + else "missing — required for attribution (author: stamping)")) + line(bool(cfg["group"]), "group name set", + cfg["group"] if cfg["group"] else "optional, but recommended (describes who shares the vault)") if not chorus_config.is_configured(cfg): - print("\ndoctor: not configured — ask the operator for their key file and install it " - "(`chorus.py config import <file>`, or `config set --owner … --endpoint … --key …`), " - "then re-run.") + print("\ndoctor: not configured — ask the member for their config file and install it " + "(`chorus.py config import <file>`, or " + "`config set --group … --member … --endpoint … --key …`), then re-run.") return 1 # 3. reachability + auth + marker, in one GET of the bootstrap marker diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_session_start.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_session_start.py index 3f243b1..8066416 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_session_start.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_hook_session_start.py @@ -47,7 +47,7 @@ def main() -> int: if rc == 78: context = ("[chorus-memory] CHORUS is NOT CONFIGURED on this machine. Before " "doing memory work, ask the operator for their chorus-memory config " - "(owner/endpoint/key) and install it via `chorus.py config import " + "(group/member/endpoint/key) and install it via `chorus.py config import " "<file>` — see the skill's First-run section.") elif rc == 0 and text.strip(): if len(text) > MAX_CONTEXT: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_ops.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_ops.py index 280fa9d..8edd18b 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_ops.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_ops.py @@ -126,7 +126,13 @@ def _build_note(fm_type: str, status_v: str, today_s: str, title: str, if aliases: # Obsidian-native, durable home for aliases; sweep folds these back into the index. fm.append("aliases: [" + ", ".join(json.dumps(a) for a in aliases) + "]") - fm += ["agent_written: true", f"source_notes: {src}", "---", "", f"# {title}", ""] + fm.append("agent_written: true") + # Group attribution: every agent-written note records WHICH member's session + # created it. chorus.MEMBER is required config (is_configured), so this is + # only absent in unconfigured/mock edge cases. + if chorus.MEMBER: + fm.append(f"author: {chorus.MEMBER}") + fm += [f"source_notes: {src}", "---", "", f"# {title}", ""] out = "\n".join(fm) if body_text.strip(): out += body_text.strip() + "\n" diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py index 872c1ce..24a3499 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_queue.py @@ -63,6 +63,16 @@ def _key(method: str, url: str, data: bytes | None) -> str: return h.hexdigest() +def _member() -> str: + """The configured member id, for outbox attribution. Never raises — the queue + must keep working (that's its whole job) even half-configured.""" + try: + import chorus_config + return chorus_config.load().get("member", "") + except Exception: + return "" + + # --------------------------------------------------------------------- outbox def enqueue(method: str, url: str, data: bytes | None, headers: dict, idem_key: str | None = None) -> None: """Append one intended write to the outbox (NDJSON; base64 body for binary safety). @@ -75,6 +85,7 @@ def enqueue(method: str, url: str, data: bytes | None, headers: dict, idem_key: "method": method.upper(), "url": url, "body_b64": base64.b64encode(data).decode() if data else None, "headers": headers or {}, "idem_key": idem_key, + "member": _member(), # audit: whose session queued this write # No wall-clock: replay order is file order, not a timestamp (keeps this testable). } with outbox_path().open("a", encoding="utf-8") as fh: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/test_v1_scaffold.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/test_v1_scaffold.py index 31b72d1..90b388a 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/test_v1_scaffold.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/test_v1_scaffold.py @@ -76,10 +76,12 @@ def main() -> int: check("H5 classify/preview/apply wired", all(callable(getattr(rf, n, None)) for n in ("classify", "preview", "apply"))) - # Config — owner/endpoint/key resolve from env -> machine-local config.json (no baked - # defaults). Env wins per field; the file fills the rest; missing required -> raises. + # Config — group/member/endpoint/key resolve from env -> machine-local config.json + # (no baked defaults). Env wins per field; the file fills the rest; missing + # required -> raises. import chorus_config as cfg - saved_env = {k: os.environ.get(k) for k in ("CHORUS_KEY", "CHORUS_BASE", "CHORUS_OWNER", "CHORUS_CONFIG")} + saved_env = {k: os.environ.get(k) for k in + ("CHORUS_KEY", "CHORUS_BASE", "CHORUS_GROUP", "CHORUS_MEMBER", "CHORUS_CONFIG")} try: for k in saved_env: os.environ.pop(k, None) @@ -92,23 +94,40 @@ def main() -> int: p2, created2 = cfg.init_template() check("config init is idempotent (no clobber)", created2 is False) # write_config persists a filled-in config; load() reads it back. - cfg.write_config("Owner Name", "https://obsidian.example.com/", "file-key-xyz") + cfg.write_config("Group Name", "test-member", "https://obsidian.example.com/", "file-key-xyz") loaded = cfg.load() - check("config file round-trips owner/endpoint/key", - loaded == {"owner": "Owner Name", + check("config file round-trips group/member/endpoint/key", + loaded == {"group": "Group Name", + "member": "test-member", "endpoint": "https://obsidian.example.com", # trailing / stripped "key": "file-key-xyz"}) + check("configured with valid member", cfg.is_configured(loaded)) # env overrides the file, per field. os.environ["CHORUS_KEY"] = "env-key-123" check("env CHORUS_KEY overrides config", cfg.resolve_key() == "env-key-123") os.environ.pop("CHORUS_KEY", None) + os.environ["CHORUS_MEMBER"] = "env-member" + check("env CHORUS_MEMBER overrides config", cfg.resolve_member() == "env-member") + os.environ.pop("CHORUS_MEMBER", None) + # member validation: bad slugs and placeholders are not configured. + check("member_valid rejects bad slugs", + not cfg.member_valid("Jason S") and not cfg.member_valid("<your-member-id>") + and cfg.member_valid("jason")) + cfg.write_config("Group Name", "Not A Slug", "https://obsidian.example.com/", "k") + check("invalid member -> not configured", not cfg.is_configured(cfg.load())) # missing required field raises a helpful error. - cfg.write_config("Owner Name", "", "") + cfg.write_config("Group Name", "test-member", "", "") try: cfg.resolve_key() check("missing key raises", False) except RuntimeError: check("missing key raises", True) + cfg.write_config("Group Name", "", "https://obsidian.example.com/", "k") + try: + cfg.resolve_member() + check("missing member raises", False) + except RuntimeError: + check("missing member raises", True) finally: for k, v in saved_env.items(): if v is None: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py index db451f4..5cfe2aa 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/vault_lint.py @@ -196,6 +196,13 @@ def main() -> int: if not fm_field_populated(raw, fm, field): what = f"missing {field}" if field not in fm else f"empty {field}" flag("incomplete-frontmatter", f"{path}: {what}") + # Group attribution: every agent-written note must say WHICH member's + # session wrote it (capture stamps `author:` from the configured member). + # The bootstrap marker is plugin-owned, not member content — exempt. + if fm and path != "_agent/chorus-vault.md" \ + and str(fm.get("agent_written", "")).strip().lower() == "true" \ + and not str(fm.get("author", "")).strip(): + flag("missing-author", f"{path}: agent_written note has no author") created, updated = parse_date(fm.get("created")), parse_date(fm.get("updated")) if created and updated and updated < created: flag("date-order", f"{path}: updated {updated} is before created {created}") @@ -333,6 +340,7 @@ def main() -> int: "retired-path": "Write to a retired/dead path", "missing-frontmatter": "Missing required frontmatter field", "incomplete-frontmatter": "Incomplete entity frontmatter (status/tags) — sweep.py --apply backfills", + "missing-author": "agent_written note lacks author: (member attribution)", "date-order": "updated earlier than created", "future-date": "updated date is in the future", "source-notes-wikilink": "Wikilink in source_notes (must be plain paths)", diff --git a/eval/run_eval.py b/eval/run_eval.py index 2aacf19..efe6716 100644 --- a/eval/run_eval.py +++ b/eval/run_eval.py @@ -76,7 +76,7 @@ class Harness: return None if body == "<<MISSING>>" else body def run(self, script, *args, env_extra=None, base=None): - env = dict(os.environ, CHORUS_BASE=base or self.base, CHORUS_KEY=KEY, + env = dict(os.environ, CHORUS_BASE=base or self.base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_VERIFY="1", CHORUS_TODAY=TODAY, CHORUS_STATE_DIR=self.state_dir, **(env_extra or {})) return subprocess.run([sys.executable, str(script), *args], diff --git a/eval/test_features.py b/eval/test_features.py index de7990c..813a1eb 100644 --- a/eval/test_features.py +++ b/eval/test_features.py @@ -52,7 +52,7 @@ class Harness: return None if body == "<<MISSING>>" else body def chorus(self, *args): - env = dict(os.environ, CHORUS_BASE=self.base, CHORUS_KEY=KEY, CHORUS_VERIFY="1", + env = dict(os.environ, CHORUS_BASE=self.base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_VERIFY="1", CHORUS_TODAY="2026-06-21") return subprocess.run([sys.executable, str(args[0]), *args[1:]], capture_output=True, text=True, env=env) @@ -80,6 +80,8 @@ def main(): note = h.ground("resources/people/bob-smith.md") check("capture person creates note", note is not None and "type: person" in note, r.stderr) check("capture stamps agent_written", note and "agent_written: true" in note) + check("capture stamps author with configured member", + note and "author: eval-member" in note) idx = h.ground("_agent/index/entities.json") check("index records entity", idx and "bob-smith" in idx and '"bob"' in idx) @@ -91,7 +93,7 @@ def main(): # 3. capture a company whose body mentions Bob Smith -> auto bidirectional link r = subprocess.run([sys.executable, str(CHORUS), "capture", "MPM", "--kind", "company", "-"], input="Bob Smith is the principal here.\n", capture_output=True, text=True, - env=dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_TODAY="2026-06-21")) + env=dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_TODAY="2026-06-21")) mpm = h.ground("resources/companies/mpm.md") bob = h.ground("resources/people/bob-smith.md") check("auto-link forward (mpm -> bob)", mpm and "[[resources/people/bob-smith]]" in mpm, r.stdout + r.stderr) @@ -140,7 +142,7 @@ def main(): '{"schema":1,"updated":"2026-06-21","entities":{"ext-entity":' '{"path":"resources/concepts/ext-entity.md","kind":"concept","title":"Ext",' '"aliases":[],"last_seen":"2026-06-21"}}}') - env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_TODAY="2026-06-21", PYTHONPATH=str(SCRIPTS)) + env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_TODAY="2026-06-21", PYTHONPATH=str(SCRIPTS)) snippet = ("import chorus_index as ix, chorus_concurrency as c; " "c.atomic_index_update(lambda d: ix.upsert(d,'mine'," "'resources/concepts/mine.md','concept','Mine'))") @@ -184,7 +186,7 @@ def main(): r = subprocess.run([sys.executable, str(CHORUS), "capture", "Bob Smith", "-", "--kind", "person"], input="met at expo\nsecond line survives\nthird line too\n", capture_output=True, text=True, - env=dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_TODAY="2026-06-21")) + env=dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_TODAY="2026-06-21")) bob3 = h.ground("resources/people/bob-smith.md") or "" check("v1.5 update keeps the dated bullet", "- 2026-06-21: met at expo" in bob3, r.stdout + r.stderr) check("v1.5 update keeps EVERY body line", @@ -304,7 +306,7 @@ def main(): transcript = tdir / "t.jsonl" turns = [json.dumps({"type": "user", "message": {"content": f"user turn {i}"}}) for i in range(6)] transcript.write_text("\n".join(turns), encoding="utf-8") - hook_env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_STATE_DIR=str(tdir)) + hook_env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_STATE_DIR=str(tdir)) payload = json.dumps({"session_id": "s1", "transcript_path": str(transcript), "stop_hook_active": False}) HOOK_STOP = SCRIPTS / "chorus_hook_stop.py" diff --git a/eval/test_offline_queue.py b/eval/test_offline_queue.py index f15b22b..99a3a98 100644 --- a/eval/test_offline_queue.py +++ b/eval/test_offline_queue.py @@ -59,7 +59,7 @@ def main(): state = tempfile.mkdtemp() def chorus(base, *args): - env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_STATE_DIR=state, + env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_STATE_DIR=state, CHORUS_VERIFY="0", CHORUS_TODAY="2026-06-22") return subprocess.run([sys.executable, str(CHORUS), *args], capture_output=True, text=True, env=env) diff --git a/eval/test_patch_semantics.py b/eval/test_patch_semantics.py index 13a62f6..4b9922a 100644 --- a/eval/test_patch_semantics.py +++ b/eval/test_patch_semantics.py @@ -59,7 +59,7 @@ def main(): stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) def chorus(*args): - env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_VERIFY="0") + env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_VERIFY="0") return subprocess.run([sys.executable, str(CHORUS), *args], capture_output=True, text=True, env=env) def ground(path): diff --git a/eval/test_reflect.py b/eval/test_reflect.py index 4b56084..d0c8ae3 100644 --- a/eval/test_reflect.py +++ b/eval/test_reflect.py @@ -51,7 +51,7 @@ def main(): return getattr(e, "code", 0), "" def chorus(*args, stdin=None): - env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_VERIFY="1", CHORUS_TODAY="2026-06-22") + env = dict(os.environ, CHORUS_BASE=base, CHORUS_KEY=KEY, CHORUS_MEMBER="eval-member", CHORUS_VERIFY="1", CHORUS_TODAY="2026-06-22") return subprocess.run([sys.executable, str(CHORUS), *args], input=stdin, capture_output=True, text=True, env=env)