From 33a2d73a2226e37cd054b6ab34dfe69928802817 Mon Sep 17 00:00:00 2001 From: Jason Stedwell Date: Tue, 21 Jul 2026 15:16:13 -0500 Subject: [PATCH] =?UTF-8?q?Phase=203:=20per-member=20namespacing=20?= =?UTF-8?q?=E2=80=94=20schema=205=20(the=20core=20group=20conversion)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One shared vault, per-member namespaces for all churn-prone state: - _agent/members//{preferences,current-context,heartbeat,inbox}.md + _agent/sessions// 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 --- CHANGELOG.md | 47 +++++++++++ CHORUS-PLAN.md | 2 +- README.md | 6 +- chorus-memory.plugin | Bin 186728 -> 192337 bytes .../.claude-plugin/plugin.json | 2 +- .../skills/chorus-memory/SKILL.md | 63 ++++++++------- .../chorus-memory/references/api-reference.md | 26 +++---- .../chorus-memory/references/bootstrap.md | 30 +++++-- .../references/operating-contract.md | 2 +- .../chorus-memory/references/routing-map.md | 23 ++++-- .../references/session-log-template.md | 2 +- .../chorus-memory/references/vault-layout.md | 18 +++-- .../scaffold/anchors/group-inbox.seed.md | 3 + .../scaffold/anchors/group-profile.seed.md | 28 +++++++ .../scaffold/anchors/inbox.seed.md | 3 - ...context.seed.md => member-context.seed.md} | 0 .../scaffold/anchors/member-inbox.seed.md | 3 + .../anchors/member-preferences.seed.md | 35 +++++++++ .../anchors/operator-preferences.seed.md | 32 -------- .../chorus-memory/scaffold/chorus-vault.md | 2 +- .../skills/chorus-memory/scripts/bootstrap.py | 63 +++++++++++++-- .../skills/chorus-memory/scripts/chorus.py | 73 ++++++++++++++---- .../chorus-memory/scripts/chorus_ops.py | 21 +++-- .../chorus-memory/scripts/chorus_triage.py | 37 +++++---- .../skills/chorus-memory/scripts/migrate.py | 31 +++++++- .../skills/chorus-memory/scripts/routing.json | 15 ++-- .../skills/chorus-memory/scripts/sweep.py | 4 +- .../chorus-memory/scripts/vault_lint.py | 40 ++++++---- eval/run_eval.py | 10 +-- eval/test_features.py | 10 +-- eval/test_reflect.py | 2 +- 31 files changed, 449 insertions(+), 184 deletions(-) create mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-inbox.seed.md create mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-profile.seed.md delete mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/inbox.seed.md rename chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/{current-context.seed.md => member-context.seed.md} (100%) create mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-inbox.seed.md create mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-preferences.seed.md delete mode 100644 chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 78a4967..3b2625d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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//`** — 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//YYYY-MM-DD-HHMM-.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). diff --git a/CHORUS-PLAN.md b/CHORUS-PLAN.md index 7225f61..4ea0179 100644 --- a/CHORUS-PLAN.md +++ b/CHORUS-PLAN.md @@ -197,7 +197,7 @@ does NOT backfill — attribution can't be guessed), member-aware lock owner Vault layout untouched. **Deliverable:** every new write is attributed; single-user behavior otherwise identical. -### Phase 3 — Per-member namespacing (3–5 days — the core) +### Phase 3 — Per-member namespacing (3–5 days — the core) — DONE Schema 5. New `LEAVES` + seeds (`members//…`, `group-profile.md`), member-parameterized bootstrap (bootstraps *your* member subtree on first load if the vault exists but your namespace doesn't — new members self-onboard), diff --git a/README.md b/README.md index 2f73923..833967c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# chorus-memory — v2.0.0-alpha.2 +# chorus-memory — v2.0.0-alpha.3 > **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 > plan and settled design decisions live in [CHORUS-PLAN.md](CHORUS-PLAN.md). The pre-fork -> ECHO v1.5.1 state is preserved at the `echo-fork-point` tag. **Phase 1 (mechanical -> rename) is done**; the body of this README below the fold still describes the +> ECHO v1.5.1 state is preserved at the `echo-fork-point` tag. **Phases 1–3 (through per-member +> namespacing) are done**; the body of this README below the fold still describes the > inherited single-operator behavior and is rewritten in Phase 5. > Deployment endpoint: `https://chorusapi.mpm.to`. CHORUS is a **clean break** from > ECHO — fresh vaults on fresh machines; it carries no ECHO back-compat and never diff --git a/chorus-memory.plugin b/chorus-memory.plugin index 902cf5868aa09636e402633069567ef7cc72bf3a..6176a54677704391a273a3904b5967aaf223b4f1 100644 GIT binary patch delta 85969 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 z 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

hD|H<6kVDDdR;SG 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Κ*?&+-g=ciq53?GZB3nvKM5L{%^&*8& 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μ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 ... [ -f "$CHORUS" ] || CHORUS=$(ls /sessions/*/mnt/.remote-plugins/*/skills/chorus-memory/scripts/chorus.py 2>/dev/null | head -1) # CoWork sandbox fallback -python3 "$CHORUS" load # cold-start: the 6 orientation reads in one call +python3 "$CHORUS" load # cold-start: the 8 orientation reads in one call python3 "$CHORUS" get # 404 -> exit 44 python3 "$CHORUS" ls

; python3 "$CHORUS" map # listing / document-map python3 "$CHORUS" search @@ -101,7 +101,7 @@ The index is maintained automatically by `capture`; `sweep.py` rebuilds it and b ### Concurrency — the vault is shared, so coordinate writes -CHORUS is read/written by multiple clients (Claude Code **and** CoWork sessions). The single-line files (`heartbeat/last-session.md`, `current-context.md::Scope`, `inbox.md`) assume a single writer at a time. Before a burst of writes in a session that may overlap another, take the **advisory lock**, and release it at session end: +CHORUS is read/written by **every member's** clients (Claude Code **and** CoWork sessions). The schema-5 member namespaces remove most contention by design — your scope/heartbeat/preferences/inbox are yours alone. What remains genuinely shared-write: the daily note's `## Agent Log` (member-tagged idempotent appends make interleaving safe), the group inbox, shared entity notes, and the machine indexes. Before a burst of writes that may overlap another member's session, take the **advisory lock**, and release it at session end: ```bash python3 "$CHORUS" lock "cc-" # exit 75 if another session holds a fresh lock, or you lost the race @@ -141,22 +141,24 @@ Load at the start of any substantive conversation — anything beyond a single q ### Loading procedure -**Run `python3 "$CHORUS" load`** — one call that performs the six orientation reads below and prints each labeled section (404s on today's note / inbox show as absent, not errors; an absent marker is flagged). This replaces issuing six separate GETs by hand. The table documents what `load` reads and why: +**Run `python3 "$CHORUS" load`** — one call that performs the eight orientation reads below and prints each labeled section (404s on today's note / inboxes show as absent, not errors; an absent marker is flagged). If the vault is set up but YOUR member namespace isn't, `load` **self-onboards** it (seeds your `_agent/members//` anchors and sessions folder, and adds you to the group-profile roster). The table documents what `load` reads and why: | # | GET | Notes | |---|-----|-------| | 1 | `/vault/_agent/chorus-vault.md` | The bootstrap marker. 404 → vault not set up; follow `references/bootstrap.md`. 200 → check its `schema_version` and migrate if older. | -| 2 | `/vault/_agent/memory/semantic/operator-preferences.md` | the operator's profile | -| 3 | `/vault/_agent/context/current-context.md` | Active scope + Scope History | -| 4 | `/vault/_agent/heartbeat/last-session.md` → then `/vault/_agent/sessions/` | **Read the heartbeat first** — a one-line pointer (` @ `) written at the end of the previous session. It's an O(1) jump to the latest log, so you can skip or shortcut the full listing. Fall back to the `sessions/` listing only if the pointer is missing or looks stale; then pick the ~5 most recent by reverse lex sort (filenames `YYYY-MM-DD-HHMM-.md`, so lex == chrono) and read only the relevant ones. | -| 5 | `/vault/journal/daily/YYYY-MM-DD.md` | Today's note; 404 is fine — it's created on first agent activity | -| 6 | `/vault/inbox/captures/inbox.md` | Inbox depth probe — feeds the load-time reconcile below. 404 is fine (empty inbox). | +| 2 | `/vault/_agent/memory/semantic/group-profile.md` | Shared facts about the group — what the team is, member roster, conventions | +| 3 | `/vault/_agent/members//preferences.md` | THIS member's profile/preferences | +| 4 | `/vault/_agent/members//current-context.md` | THIS member's active scope + Scope History | +| 5 | `/vault/_agent/members//heartbeat.md` → then `/vault/_agent/sessions//` | **Read the heartbeat first** — a one-line pointer (` @ `) written at the end of the member's previous session. It's an O(1) jump to their latest log. Fall back to the member's `sessions/` listing only if the pointer is missing or stale; then pick the ~5 most recent by reverse lex sort (filenames `YYYY-MM-DD-HHMM-.md`, so lex == chrono) and read only the relevant ones. | +| 6 | `/vault/journal/daily/YYYY-MM-DD.md` | Today's SHARED note (the whole group's timeline); 404 is fine — created on first agent activity | +| 7 | `/vault/_agent/members//inbox.md` | MY inbox depth probe — feeds the load-time reconcile below. 404 is fine (empty inbox). | +| 8 | `/vault/inbox/captures/group.md` | GROUP inbox depth probe — unowned items any member may triage. 404 is fine. | Do not read every session log — older sessions are reachable via `POST /search/simple/?query=...` when needed. **Reconcile at load (do this every cold start, after the batch returns).** The batch already fetched everything needed for a cheap self-check — run it before diving into the work so memory maintains itself instead of drifting: -1. **Inbox depth (Inbox Triage).** If `inbox/captures/inbox.md` (GET #6) holds dated capture lines older than ~7 days that were never routed, surface the count once and offer to triage — see **Inbox Triage** below. This is the load-time trigger that makes triage self-firing rather than something you only run when asked. +1. **Inbox depth (Inbox Triage).** If your inbox (GET #7) or the group inbox (GET #8) holds dated capture lines older than ~7 days that were never routed, surface the count once and offer to triage — see **Inbox Triage** below. This is the load-time trigger that makes triage self-firing rather than something you only run when asked. 2. **Scope drift (state it, don't just check it).** Scope is the most churn-prone state — the operator runs several sessions a day across different topics, so the recorded `## Scope` is frequently stale at load. **Silently working under a stale scope is the default failure mode.** To prevent it, at load read the active scope and its freshness in one call — `python3 "$CHORUS" scope show` (prints `## Scope`, `scope_updated`, and how many sessions have been logged since) — and form a one-line judgment: *does this session's request match the recorded scope?* If it diverges, switch **before** doing the work via `python3 "$CHORUS" scope set ""` (see **Scope Switching**). If `scope show` reports several sessions logged since the last switch, treat the recorded scope as suspect and confirm with the operator rather than trusting it. Keep the reconcile to a single short line to the operator (e.g. "3 inbox captures from last week are still un-routed — triage now?"); don't let it crowd out the actual request. @@ -173,9 +175,9 @@ Do NOT narrate this loading. Reading memory is expected behavior. ## Inbox Triage (one-tap: `chorus.py triage`) -`inbox/captures/inbox.md` is the catch-all for "save this somewhere — figure out where later." Without triage it grows forever and durable facts get stranded there. +There are TWO inboxes: `_agent/members//inbox.md` (YOUR catch-all for "save this somewhere — figure out where later") and `inbox/captures/group.md` (unowned group-wide items, as member-tagged lines `- YYYY-MM-DD []: …` — whoever triages first routes them). `triage --list` covers both. Without triage they grow forever and durable facts get stranded. -At the start of a substantive session, check the inbox. If it holds lines older than ~7 days that haven't been routed elsewhere, surface them once: +At the start of a substantive session, check both inboxes (`load` probes them). If either holds lines older than ~7 days that haven't been routed elsewhere, surface them once: > "Three captures from last week are still in the inbox — want to route them now or leave them?" @@ -189,7 +191,7 @@ python3 "$CHORUS" triage proposals.json # dry-run: classify + previe python3 "$CHORUS" triage proposals.json --apply # route via capture + log each move ``` -Routing targets are the usual homes (preference/pattern → `operator-preferences.md::Observations` via a `semantic` proposal or a direct PATCH; project idea → `project` with `--status incubating`; durable fact → `semantic`; person fact → `person`). `--apply` records each move in `inbox/processing-log/YYYY-MM-DD.md` (`- `) automatically. Originals are **never deleted** unless the operator explicitly asks — the processing log is the audit trail. +Routing targets are the usual homes (a preference/pattern about YOU → your own `_agent/members//preferences.md` under `Preferences::Observations` via a direct PATCH; project idea → `project` with `--status incubating`; durable group fact → `semantic`; person fact → `person`). Never route another member's preference into your own preferences file — put it in theirs only if their own session confirms it, else `resources/people/`. `--apply` records each move in `inbox/processing-log/YYYY-MM-DD.md` (`- `) automatically. Originals are **never deleted** unless the operator explicitly asks — the processing log is the audit trail. ## Project Lifecycle @@ -239,7 +241,7 @@ Only after the search comes back empty (or you've decided to merge) is it safe t ### Before you append — read first (idempotency) -`chorus.py append` is **whole-line idempotent**: it GETs the file and skips the POST when the exact line already exists, so a retry, replay, or overlapping session can't grow duplicate lines. Use it for single-line additions to `inbox/captures/inbox.md`, a daily note's `## Agent Log`, or a `## Fact / Pattern` / `## Observations` / `## Log` heading. (A raw POST is **not** idempotent — if you must use curl, GET first and whole-line-match the entry yourself; see `references/api-reference.md`.) This does **not** apply to PUT or PATCH `replace`, which overwrite by design. +`chorus.py append` is **whole-line idempotent**: it GETs the file and skips the POST when the exact line already exists, so a retry, replay, or overlapping session can't grow duplicate lines. Use it for single-line additions to `_agent/members//inbox.md`, a daily note's `## Agent Log`, or a `## Fact / Pattern` / `## Observations` / `## Log` heading. (A raw POST is **not** idempotent — if you must use curl, GET first and whole-line-match the entry yourself; see `references/api-reference.md`.) This does **not** apply to PUT or PATCH `replace`, which overwrite by design. ### Append, patch, put — via the client @@ -247,14 +249,14 @@ Write multi-line bodies to a file first (use the Write tool — cross-platform, ```bash # additive line (idempotent). Anchor the date on the conversation's currentDate. -python3 "$CHORUS" append inbox/captures/inbox.md "- : " +python3 "$CHORUS" append _agent/members//inbox.md "- : " # targeted heading append/replace. The heading Target is the FULL `::`-delimited path # from the H1 — a bare subheading returns 400 invalid-target and the write is LOST. # If unsure of the exact path, GET the document map first and copy the heading verbatim: -python3 "$CHORUS" map _agent/memory/semantic/operator-preferences.md -python3 "$CHORUS" patch _agent/memory/semantic/operator-preferences.md \ - append heading "Operator Preferences::Fact / Pattern" +python3 "$CHORUS" map _agent/members//preferences.md +python3 "$CHORUS" patch _agent/members//preferences.md \ + append heading "Preferences::Fact / Pattern" # `replace` (instead of `append`) overwrites a section entirely (e.g. a project's "Name::Status"). # create/overwrite a whole file (read-back verified; intermediate dirs auto-created) @@ -274,7 +276,7 @@ Every PUT body needs the canonical YAML frontmatter (see `references/vault-layou ## Scope Switching (`current-context.md`) -`_agent/context/current-context.md` tracks a single active scope. The operator routinely shifts scope within a day (one project → another → docs), so this is high-churn — switch deliberately, every time the work changes topic. +`_agent/members//current-context.md` tracks a single active scope. The operator routinely shifts scope within a day (one project → another → docs), so this is high-churn — switch deliberately, every time the work changes topic. **Preferred — one command:** @@ -321,7 +323,7 @@ CHORUS_TODAY= python3 "$LINT" Exit codes: `0` clean · `1` violations · `2` unreachable · `3` not bootstrapped. Checks (the linter asserts each and prints violations): 1. **Stale active projects** — for each note in `projects/active/`, check `updated:` >30 days. Likely belongs in `on-hold/`. -2. **Unprocessed inbox** — GET `inbox/captures/inbox.md`. List items older than 14 days that never moved through the triage protocol. +2. **Unprocessed inbox** — GET `_agent/members//inbox.md`. List items older than 14 days that never moved through the triage protocol. 3. **Duplicate slugs across lifecycle folders** — any slug appearing in more than one of `active/`, `incubating/`, `on-hold/`, `archived/` is broken state. 4. **Folder ↔ `status:` mismatch** — any `projects//` note whose `status:` frontmatter disagrees with its folder. 5. **Wikilinks in frontmatter** — any `[[...]]` inside a YAML frontmatter block (breaks Obsidian reading view), swept across all folders. @@ -350,7 +352,7 @@ The pass is cheap and pays for itself by catching drift before it requires a reo ## Daily Note — Agent Log -After substantive activity, write a one-line entry to today's daily note's `## Agent Log` heading. The daily-note **template** (`journal/templates/daily-note-template.md`) defines this heading, but ad-hoc daily notes created without the template don't have it — so PATCH can fail with `invalid-target` if the note exists but lacks the heading. +After substantive activity, write a one-line entry to today's daily note's `## Agent Log` heading. The daily note is the **group's shared timeline** — every member's sessions append to the same heading — so **every line is member-tagged**: `- YYYY-MM-DD []: `. (`capture` writes its log line in this form automatically.) The daily-note **template** (`journal/templates/daily-note-template.md`) defines this heading, but ad-hoc daily notes created without the template don't have it — so PATCH can fail with `invalid-target` if the note exists but lacks the heading. **Procedure (resilient)** — all dates are the conversation's `currentDate`, not the machine clock: @@ -367,13 +369,14 @@ python3 "$CHORUS" patch journal/daily/.md append heading ".md` | PUT | +| Unsure where it goes / quick capture (mine) | `_agent/members//inbox.md` (date-prefixed line) | POST | +| Unowned group-wide capture ("someone should look at this") | `inbox/captures/group.md` (member-tagged line `- YYYY-MM-DD []: …`) | POST | +| MY preference or personal pattern | `_agent/members//preferences.md` (append under the right heading) | PATCH | +| Durable group facts / patterns (incl. `group-profile.md`) | `_agent/memory/semantic/.md` | PUT | | What happened (event record) | `_agent/memory/episodic/.md` | PUT | | Short-lived working state | `_agent/memory/working/.md` | PUT | -| Task-scoped context / focus | `_agent/context/current-context.md` | PATCH / PUT | -| Working session ended with substance | `_agent/sessions/YYYY-MM-DD-HHMM-.md` | PUT | +| Task-scoped context / focus | `_agent/members//current-context.md` | PATCH / PUT | +| Working session ended with substance | `_agent/sessions//YYYY-MM-DD-HHMM-.md` | PUT | | Long-running project state | `projects//.md` (see Project Lifecycle) | PUT + PATCH | | Ongoing area of responsibility (standing domain, no end state) | `areas//.md` (domain: `business`/`personal`/`learning`/`systems`) | PUT | | Non-obvious decision (ADR) | `decisions/by-date/YYYY-MM-DD-.md` (see mirror note below) | PUT | @@ -386,7 +389,7 @@ python3 "$CHORUS" patch journal/daily/.md append heading " @ `) | PUT | +| Session-end orientation pointer | `_agent/members//heartbeat.md` (one line: ` @ `) | PUT | > **The complete, audited routing map lives in `references/routing-map.md`** — every write destination with its trigger, what lands there, and why it's distinct from its neighbors. This table is the quick-reference; the map is the authority. If a path isn't in the map, it shouldn't be written to. @@ -404,7 +407,7 @@ Never delete files unless the operator explicitly asks. Memory is append-friendl At the end of substantive conversations (ones that produced decisions, artifacts, or commitments), create a session log. Ask once if unsure: "Want me to log a session note for this?" -**Filename format is canonical: `_agent/sessions/YYYY-MM-DD-HHMM-.md`.** Always include the four-digit local-time HHMM component — it makes filenames lexically sort in true chronological order, which is what Step 3 of loading relies on. Older session logs without the HHMM part exist; leave them alone, but every new one must use the full form. +**Filename format is canonical: `_agent/sessions//YYYY-MM-DD-HHMM-.md`.** Always include the four-digit local-time HHMM component — it makes filenames lexically sort in true chronological order, which is what Step 3 of loading relies on. Older session logs without the HHMM part exist; leave them alone, but every new one must use the full form. Write the body (see `references/session-log-template.md`) to a file with the Write tool, then: @@ -417,7 +420,7 @@ Then add a one-line entry to today's daily note via the **Daily Note — Agent L Finally, update the heartbeat pointer so the next session can orient in one read (this closes the loop with loading-procedure Step 4 — a pointer nobody writes is a pointer nobody can read). It is a single line, ` @ `; write it to a file and PUT it: ```bash -python3 "$CHORUS" put _agent/heartbeat/last-session.md +python3 "$CHORUS" put _agent/members//heartbeat.md ``` `last-session.md` is overwritten (PUT) each session end — never appended, so it can't grow or duplicate. @@ -429,7 +432,7 @@ If the API returns a connection error, timeout, or `502`, tell the operator once ## Style Rules - Write in third person about the operator: "the operator prefers X", not "I prefer X". -- 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. +- This vault holds the GROUP's shared memory — every member reads and writes it, and everything in it is visible to the whole group. Do not edit another member's `_agent/members//` namespace (their preferences/scope/heartbeat/inbox belong to their sessions); facts about them as a person go in `resources/people/`. Do not cross-write with vaults outside this group. - **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` and `author: ` on agent-generated notes and list `source_notes` (plain relative paths, not links). @@ -442,7 +445,7 @@ If the API returns a connection error, timeout, or `502`, tell the operator once ## operator-preferences.md — Rules vs Observations -`_agent/memory/semantic/operator-preferences.md` separates two kinds of content: +`_agent/members//preferences.md` separates two kinds of content: - `## Fact / Pattern` — **promoted, deduped rules.** No date prefix. These are timeless: "the operator prefers concise communication." Append here only when a rule is stable. - `## Observations` — **timestamped raw observations.** Date-prefixed: `- 2026-06-06: the operator chose X over Y because Z.` This is where new evidence goes by default. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/api-reference.md b/chorus-memory.plugin.src/skills/chorus-memory/references/api-reference.md index 88dbef4..0a13fa1 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/api-reference.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/api-reference.md @@ -29,7 +29,7 @@ For a vault large enough that even the concurrent pass approaches the tool timeo # Read any file by vault path curl -s \ -H "Authorization: Bearer $CHORUS_KEY" \ - "$CHORUS_BASE/vault/_agent/context/current-context.md" + "$CHORUS_BASE/vault/_agent/members//current-context.md" ``` Returns raw file content (text/markdown). On 404, the file does not exist. @@ -38,7 +38,7 @@ Returns raw file content (text/markdown). On 404, the file does not exist. # Read a specific heading's content only curl -s \ -H "Authorization: Bearer $CHORUS_KEY" \ - "$CHORUS_BASE/vault/_agent/memory/semantic/operator-preferences.md/heading/Operator" + "$CHORUS_BASE/vault/_agent/members//preferences.md/heading/Operator" ``` Nested headings: separate levels with `::` (URL-encode spaces as `%20`): @@ -74,7 +74,7 @@ curl -s -X POST \ -H "Authorization: Bearer $CHORUS_KEY" \ -H "Content-Type: text/markdown" \ --data-binary @/tmp/obs_entry.md \ - "$CHORUS_BASE/vault/inbox/captures/inbox.md" + "$CHORUS_BASE/vault/_agent/members//inbox.md" ``` --- @@ -116,7 +116,7 @@ curl -s -X PUT \ ### Append under a heading -**Heading targets must be the FULL heading path, `::`-delimited from the top-level heading.** A bare subheading name returns `400 invalid-target` (errorCode 40080). Example: `## Fact / Pattern` nested under `# Operator Preferences` → `Target: Operator Preferences::Fact / Pattern`. Percent-encode non-ASCII characters (e.g. `H%C3%A9llo`); spaces are fine. +**Heading targets must be the FULL heading path, `::`-delimited from the top-level heading.** A bare subheading name returns `400 invalid-target` (errorCode 40080). Example: `## Fact / Pattern` nested under `# Operator Preferences` → `Target: Preferences::Fact / Pattern`. Percent-encode non-ASCII characters (e.g. `H%C3%A9llo`); spaces are fine. ```bash cat > /tmp/obs_patch.md << 'OBSEOF' @@ -127,10 +127,10 @@ curl -s -X PATCH \ -H "Authorization: Bearer $CHORUS_KEY" \ -H "Operation: append" \ -H "Target-Type: heading" \ - -H "Target: Operator Preferences::Fact / Pattern" \ + -H "Target: Preferences::Fact / Pattern" \ -H "Content-Type: text/markdown" \ --data-binary @/tmp/obs_patch.md \ - "$CHORUS_BASE/vault/_agent/memory/semantic/operator-preferences.md" + "$CHORUS_BASE/vault/_agent/members//preferences.md" ``` ### Discover heading / block / frontmatter targets @@ -141,7 +141,7 @@ When unsure of the exact heading path, GET the note with the document-map Accept curl -s \ -H "Authorization: Bearer $CHORUS_KEY" \ -H "Accept: application/vnd.olrapi.document-map+json" \ - "$CHORUS_BASE/vault/_agent/memory/semantic/operator-preferences.md" + "$CHORUS_BASE/vault/_agent/members//preferences.md" ``` Returns `{ "headings": [...], "blocks": [...], "frontmatterFields": [...] }`. Copy the heading string verbatim into `Target`. @@ -211,7 +211,7 @@ Only on explicit operator request. Deletion is destructive. - Path separators (`/`) in the vault path are **literal** — do not encode them. - Spaces in filenames or heading targets in a URL: use `%20`. - Nested heading levels in a URL path: use `%3A%3A` for `::`. -- Heading text in the `Target:` header: the **full heading path** joined by `::` (e.g. `Operator Preferences::Fact / Pattern`), no `#`; spaces are fine; percent-encode non-ASCII. +- Heading text in the `Target:` header: the **full heading path** joined by `::` (e.g. `Preferences::Fact / Pattern`), no `#`; spaces are fine; percent-encode non-ASCII. --- @@ -219,14 +219,14 @@ Only on explicit operator request. Deletion is destructive. | Situation | Vault path | Method | |-----------|-----------|--------| -| Quick capture / unsorted | `inbox/captures/inbox.md` (date-prefixed line) | POST | +| Quick capture / unsorted | `_agent/members//inbox.md` (date-prefixed line) | POST | | Raw imported material | `inbox/imports/` | PUT | -| Operator preference / durable fact | `_agent/memory/semantic/operator-preferences.md` | PATCH | +| Operator preference / durable fact | `_agent/members//preferences.md` | PATCH | | Other durable facts, patterns | `_agent/memory/semantic/.md` | PUT | | Event record (what happened) | `_agent/memory/episodic/.md` | PUT | | Short-lived, time-boxed state | `_agent/memory/working/.md` | PUT | -| Task-scoped context / focus | `_agent/context/current-context.md` | PATCH / PUT | -| Working-session log | `_agent/sessions/YYYY-MM-DD-HHMM-.md` | PUT | +| Task-scoped context / focus | `_agent/members//current-context.md` | PATCH / PUT | +| Working-session log | `_agent/sessions//YYYY-MM-DD-HHMM-.md` | PUT | | Long-running project state | `projects//.md` (lifecycle: `incubating` → `active` → `on-hold`/`archived`; folder and `status:` MUST agree) | PUT + PATCH | | Ongoing area of responsibility (standing domain, no end state) | `areas//.md` (``: `business`/`personal`/`learning`/`systems`) | PUT | | Non-obvious decision (ADR) | `decisions/by-date/YYYY-MM-DD-.md` (mirror only into an existing project note's `## Key Decisions`; otherwise skip) | PUT | @@ -238,7 +238,7 @@ Only on explicit operator request. Deletion is destructive. | Daily activity / Agent Log | `journal/daily/YYYY-MM-DD.md` | POST / PATCH | | Journal rollup | `journal/{weekly/YYYY-Www,monthly/YYYY-MM,quarterly/YYYY-Qn,annual/YYYY}.md` (weekly = opt-in on first session of a new ISO week; monthly = offered with Vault Health; quarterly/annual = manual) | PUT | | Vault-health audit (agent self-maintenance) | `_agent/health/YYYY-MM-vault-health.md` (monthly; NOT a journal entry) | PUT | -| Session-end orientation pointer | `_agent/heartbeat/last-session.md` (one line, overwritten each session end) | PUT | +| Session-end orientation pointer | `_agent/members//heartbeat.md` (one line, overwritten each session end) | PUT | | Bootstrap marker (plugin-owned) | `_agent/chorus-vault.md` (`schema_version`, bootstrap date) — the "is this vault set up?" probe | GET / PUT | **Slug rules:** kebab-case, ASCII, ~40 chars max. Every file carries canonical frontmatter (see `vault-layout.md`). diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/bootstrap.md b/chorus-memory.plugin.src/skills/chorus-memory/references/bootstrap.md index 9c0b61e..db4eaf7 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/bootstrap.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/bootstrap.md @@ -43,7 +43,7 @@ curl -s -o /dev/null -w "%{http_code}" -H "$AUTH" "$BASE/vault/_agent/chorus-vau Idempotent and additive. **Never overwrite an existing file** — GET-probe each path and skip any that already returns `200`. The marker is written **last**, so the vault is only flagged "set up" after every piece is in place. -Throughout, `{{DATE}}` means today's date (`YYYY-MM-DD`), resolved from the conversation's `currentDate`. Substitute it before PUTting any scaffold file or anchor seed. +Throughout, `{{DATE}}` means today's date (`YYYY-MM-DD`), resolved from the conversation's `currentDate`, and `{{MEMBER}}` means this machine's configured member id. Substitute both before PUTting any scaffold file or anchor seed. ### 1. Folder tree @@ -57,10 +57,13 @@ areas/business areas/personal areas/learning areas/systems resources/concepts resources/references resources/people resources/companies resources/meetings decisions/by-date _agent/context _agent/memory/working _agent/memory/episodic _agent/memory/semantic -_agent/sessions _agent/health _agent/templates _agent/heartbeat +_agent/sessions _agent/health _agent/templates _agent/members _agent/skills/active _agent/skills/archived ``` +Plus, per member (created by `bootstrap.py` for the configured member, and by `chorus.py load`'s +self-onboarding for any later member): `_agent/sessions/` (→ README). + > `decisions/by-project/` is intentionally **not** created — it is retired. A project-relevant decision is mirrored as a `[[wikilink]]` under that project's `## Key Decisions` heading instead. > > `reviews/` is **not** created — it is retired. Journal rollups (weekly/monthly/quarterly/annual) live under `journal/`; the monthly vault-health audit lives under `_agent/health/`. @@ -101,15 +104,28 @@ curl -s -X PUT -H "$AUTH" -H "Content-Type: text/markdown" \ ### 3. Anchor seeds (only if absent — no fabricated facts) -Substitute `{{DATE}}` → today, then PUT each: +Substitute `{{DATE}}` → today and `{{MEMBER}}` → the configured member, then PUT each. + +**Shared group anchors** (once per vault): | Scaffold file | Vault path | |---|---| -| `scaffold/anchors/operator-preferences.seed.md` | `_agent/memory/semantic/operator-preferences.md` | -| `scaffold/anchors/current-context.seed.md` | `_agent/context/current-context.md` | -| `scaffold/anchors/inbox.seed.md` | `inbox/captures/inbox.md` | +| `scaffold/anchors/group-profile.seed.md` | `_agent/memory/semantic/group-profile.md` | +| `scaffold/anchors/group-inbox.seed.md` | `inbox/captures/group.md` | -The operator-preferences seed is deliberately empty — **do not invent preferences.** Real facts accrue through use. +**Member anchors** (once per member — `bootstrap.py member_bootstrap()`, also invoked by +`chorus.py load`'s self-onboarding; a roster line `- (joined YYYY-MM-DD)` is appended +idempotently under the group profile's `## Members`): + +| Scaffold file | Vault path | +|---|---| +| `scaffold/anchors/member-preferences.seed.md` | `_agent/members//preferences.md` | +| `scaffold/anchors/member-context.seed.md` | `_agent/members//current-context.md` | +| `scaffold/anchors/member-inbox.seed.md` | `_agent/members//inbox.md` | + +`_agent/members//heartbeat.md` is deliberately NOT seeded — it appears at the first +session end. The preferences seed is deliberately empty — **do not invent preferences.** Real +facts accrue through use. ### 4. Vault README (human signpost) diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/operating-contract.md b/chorus-memory.plugin.src/skills/chorus-memory/references/operating-contract.md index 6349fcb..56ec1b9 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/operating-contract.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/operating-contract.md @@ -39,7 +39,7 @@ Assume clients may operate without filesystem access, through the Obsidian Local The vault is a **shared** substrate — Claude Code, CoWork, and other REST API clients may operate on it concurrently. The REST API offers no transactions, so writers coordinate cooperatively: -- Single-line, overwrite-style files (`_agent/heartbeat/last-session.md`, `current-context.md::Scope`) and append targets (`inbox.md`, `## Agent Log`) assume **one writer at a time**. Two sessions writing at once can clobber or duplicate. +- Single-line, overwrite-style files (`_agent/members//heartbeat.md`, `current-context.md::Scope`) and append targets (`inbox.md`, `## Agent Log`) assume **one writer at a time**. Two sessions writing at once can clobber or duplicate. - Before a burst of writes in a session that may overlap another, take the advisory lock (`chorus.py lock ` → `_agent/locks/vault.lock`) and release it at session end. The lock is read-back-confirmed and cooperative with a TTL (stale locks are reclaimable); it is a courtesy, not a hard mutex. - Idempotent append (read-before-POST, whole-line match, via `chorus.py append`) is the second line of defense against duplicate lines from retries or overlapping sessions. - Status-check every write. A write that returns `>= 400` did **not** land — surface it rather than assuming success. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md b/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md index 0b961fb..121b47c 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/routing-map.md @@ -17,8 +17,8 @@ Views of the same truth: `scripts/routing.json` is the **machine-readable canoni | Path | Trigger | What lands | Distinct because | Method | |------|---------|------------|------------------|--------| -| `inbox/captures/inbox.md` | "Save this, sort later" — destination genuinely unknown at capture time | One date-prefixed line | The only path whose contract is *deferred routing*; everything else here has a known home | POST | -| `inbox/imports/.md` | Raw external material dropped in wholesale (export, paste, dump) | The raw artifact, unedited | Holds un-triaged *bulk*, vs `captures` which holds single lines | PUT | +| `inbox/captures/group.md` | Unowned "someone should look at this" capture for the whole group | One date-prefixed **member-tagged** line (`- YYYY-MM-DD [member]: …`) | Shared deferred routing — whoever triages first routes it. Personal captures go to your own `_agent/members//inbox.md` | POST | +| `inbox/imports/.md` | Raw external material dropped in wholesale (export, paste, dump) | The raw artifact, unedited | Holds un-triaged *bulk*, vs captures which hold single lines | PUT | | `inbox/processing-log/YYYY-MM-DD.md` | An inbox item is routed to its real home | One line: `` | Audit trail of moves — never holds memory itself, only the record of routing | POST | Captures and imports are temporary by contract. Triage drains them into the homes below and logs the move; the original is left until the operator okays deletion. @@ -79,14 +79,16 @@ Lifecycle folders; `status:` frontmatter MUST equal the folder name (the linter | Path | Trigger | What lands | Distinct because | Method | |------|---------|------------|------------------|--------| | `_agent/chorus-vault.md` | Bootstrap / schema migration only | Marker: `schema_version`, bootstrap date | Plugin-owned probe; never hand-edited | GET / PUT | -| `_agent/context/current-context.md` | Active scope changes; task focus shifts | `## Scope`, `## Scope History`, priorities | Single *live* scope pointer, vs episodic which is a *past* record | PATCH / PUT | -| `_agent/memory/semantic/operator-preferences.md` | A preference/pattern about the operator | Append under `## Observations`; promote to `## Fact / Pattern` when stable | The one curated profile; distinct from ad-hoc semantic notes | PATCH | -| `_agent/memory/semantic/.md` | A durable fact/pattern that isn't an operator-preference | Semantic note | Timeless fact, vs episodic (time-stamped event) and working (transient) | PUT | +| `_agent/members//current-context.md` | THIS member's active scope changes; task focus shifts | `## Scope`, `## Scope History`, priorities | Per-member live scope pointer — members work on different things concurrently | PATCH / PUT | +| `_agent/members//preferences.md` | A preference/pattern about THIS member | Append under `## Observations`; promote to `## Fact / Pattern` when stable | The member's curated profile; only their own sessions edit it (group-visible by design) | PATCH | +| `_agent/members//heartbeat.md` | End of every session, after the session log is written | One line: ` @ ` | Per-member O(1) orientation pointer read first at load; overwritten, never grows | PUT | +| `_agent/members//inbox.md` | THIS member's "save this, sort later" capture | One date-prefixed line | Personal deferred routing — no cross-member append contention | POST | +| `_agent/context/.md` | Shared task bundles / reading lists for the group | Context bundle | Task-scoped shared context; the live scope itself is per member (`members/`) | PATCH / PUT | +| `_agent/memory/semantic/.md` | A durable group fact/pattern (incl. `group-profile.md`) | Semantic note | Timeless fact, vs episodic (time-stamped event) and working (transient) | PUT | | `_agent/memory/episodic/.md` | A record of *what happened, when* | Episodic note | Anchored to an event in time; not a standing fact | PUT | | `_agent/memory/working/.md` | Short-lived state needed only for the current effort | Working note | Explicitly transient/time-boxed; safe to go stale | PUT | -| `_agent/sessions/YYYY-MM-DD-HHMM-.md` | A substantive session ends (decisions/artifacts/commitments) | Session log (see template) | Per-session record; the unit loading Step 4 scans | PUT | -| `_agent/health/YYYY-MM-vault-health.md` | First substantive session of a month (Vault Health pass) | Health-audit findings | Agent self-maintenance about vault integrity — NOT the operator's work narrative, so not in `journal/` | PUT | -| `_agent/heartbeat/last-session.md` | End of every session, after the session log is written | One line: ` @ ` | O(1) orientation pointer read first at load (Step 4); overwritten, never grows | PUT | +| `_agent/sessions//YYYY-MM-DD-HHMM-.md` | A substantive session ends (decisions/artifacts/commitments) | Session log (see template) | Per-session record, namespaced by member; the unit loading's heartbeat fallback scans | PUT | +| `_agent/health/YYYY-MM-vault-health.md` | First substantive session of a month (Vault Health pass) | Health-audit findings | Agent self-maintenance about vault integrity — NOT a work narrative, so not in `journal/` | PUT | | `_agent/templates/` | Bootstrap only (seeded from plugin masters) | Canonical note templates | Holds templates, not memory; never a runtime routing target | PUT (seed) | | `_agent/skills/active/.md` | The operator authors/installs a skill and wants it catalogued | Skill capability entry | Catalogs a *capability*, vs `projects/` which tracks the *build effort* | PUT | | `_agent/skills/archived/.md` | A catalogued skill is retired | Skill entry (moved from `active/`) | Terminal state of the skill catalog | PUT | @@ -112,6 +114,11 @@ Listed so they are recognised as dead and never recreated. Any one of these appe | Path | Status | Where it went instead | |------|--------|-----------------------| +| `inbox/captures/inbox.md` (single shared inbox) | Retired in schema 5 | Personal captures → `_agent/members//inbox.md`; unowned items → `inbox/captures/group.md` | +| `_agent/memory/semantic/operator-preferences.md` | Retired in schema 5 | Per-member `_agent/members//preferences.md` | +| `_agent/context/current-context.md` (single shared scope) | Retired in schema 5 | Per-member `_agent/members//current-context.md` | +| `_agent/heartbeat/` (single shared pointer) | Retired in schema 5 | Per-member `_agent/members//heartbeat.md` | +| `_agent/sessions/YYYY-MM-DD-HHMM-.md` (flat, unattributed) | Retired in schema 5 | Member-namespaced `_agent/sessions//YYYY-MM-DD-HHMM-.md` | | `reviews/` (weekly/monthly/quarterly/annual) | Retired in schema 2 | Journal rollups → `journal/{weekly,monthly,quarterly,annual}/`; vault-health → `_agent/health/` | | `decisions/by-project/` | Retired in schema 1 | ADR mirrored as a `[[wikilink]]` under the project's `## Key Decisions` | | `archive/` (top-level) | Never existed | Project archival → `projects/archived/`; skill archival → `_agent/skills/archived/` | diff --git a/chorus-memory.plugin.src/skills/chorus-memory/references/session-log-template.md b/chorus-memory.plugin.src/skills/chorus-memory/references/session-log-template.md index ff5e4a1..9c562e5 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/references/session-log-template.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/references/session-log-template.md @@ -1,6 +1,6 @@ # Session Log Template -Session logs go in: `_agent/sessions/YYYY-MM-DD-HHMM-.md` +Session logs go in: `_agent/sessions//YYYY-MM-DD-HHMM-.md` **Filename format is canonical and not optional.** The four-digit local-time HHMM component is what makes session filenames lex-sort in true chronological order — the loading procedure depends on it. Before PUT-ing a new session log, validate the filename matches `^\d{4}-\d{2}-\d{2}-\d{4}-[a-z0-9-]+\.md$`. Legacy session logs without HHMM exist in the vault; do not edit their names, but every new write must use the full form. 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 2d18c2c..f92e760 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 @@ -8,7 +8,8 @@ /vault/ ├── README.md ← thin human signpost (NOT read for routing) ├── inbox/ -│ ├── captures/ ← quick captures (inbox.md), date-prefixed lines +│ ├── captures/ ← group.md — unowned group-wide captures (member-tagged lines); +│ │ personal captures live in _agent/members//inbox.md │ ├── imports/ ← raw imported material │ └── processing-log/ ├── journal/ ← one append-only time-series stream; rollups are coarser journal entries, NOT a separate reviews/ tree @@ -37,23 +38,28 @@ │ (reviews/ is retired — journal rollups live under journal/; vault-health audits under _agent/health/) └── _agent/ ├── chorus-vault.md ← bootstrap marker: schema_version + bootstrap date (plugin-owned; the "is this vault set up?" probe) - ├── context/ ← current-context.md and task bundles + ├── members/ ← PER-MEMBER namespaces (schema 5) — each member's churn-prone state + │ └── / + │ ├── preferences.md ← this member's profile/preferences (group-visible) + │ ├── current-context.md ← this member's active scope + Scope History + │ ├── heartbeat.md ← this member's last-session pointer (written at session end) + │ └── inbox.md ← this member's quick captures + ├── context/ ← shared task bundles / reading lists (scope itself is per member) ├── memory/ │ ├── working/ ← transient, time-boxed │ ├── episodic/ ← what happened, when - │ └── semantic/ ← durable facts/patterns (operator-preferences.md) - ├── sessions/ ← YYYY-MM-DD-HHMM-.md + │ └── semantic/ ← durable group facts/patterns (group-profile.md) + ├── sessions/ ← /YYYY-MM-DD-HHMM-.md (member-namespaced session logs) ├── health/ ← YYYY-MM-vault-health.md (monthly self-maintenance audit; NOT a journal entry) ├── templates/ ← canonical note templates ├── skills/ ← active / archived - ├── heartbeat/ ← single-line pointers (e.g. last-session.md → most-recent session log path) ├── index/ ← entities.json — machine-maintained slug→{path,kind,title,aliases} registry └── locks/ ← vault.lock — cooperative advisory multi-writer lock ``` **Entity index:** `_agent/index/entities.json` is a machine-maintained registry mapping each entity slug to its `{path, kind, title, aliases, last_seen}`. It makes routing/resolve an O(1), alias-aware lookup and supplies the name→path map for cross-linking and recall. `resolve` matches slug/title/alias exactly; when nothing matches exactly it falls back to **fuzzy candidates** — entities sharing a distinctive token with the mention — so a shortened name ("chorus memory" → the project `chorus`) surfaces the existing note instead of spawning a duplicate. Aliases are auto-derived from titles, learned from mentions on update, and re-folded from note frontmatter on `sweep`. It is rebuilt automatically by `chorus.py capture` and by `sweep.py`; do not hand-edit. The only JSON file in the vault. -**Heartbeat:** `_agent/heartbeat/last-session.md` is a one-line pointer (` @ `) the **session-logging procedure writes (PUT, overwrite) at session end** and the **loading procedure reads first (Step 4)** as an O(1) shortcut to the latest session log. It is a hint, not a source of truth — fall back to the `sessions/` directory listing if it's missing or stale. Because it's PUT-overwritten, it never grows or duplicates. +**Heartbeat:** `_agent/members//heartbeat.md` is a one-line pointer (` @ `) the **session-logging procedure writes (PUT, overwrite) at session end** and the **loading procedure reads first (Step 4)** as an O(1) shortcut to the latest session log. It is a hint, not a source of truth — fall back to the `sessions/` directory listing if it's missing or stale. Because it's PUT-overwritten, it never grows or duplicates. **Slug rules:** kebab-case, ASCII only, truncate to ~40 chars. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-inbox.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-inbox.seed.md new file mode 100644 index 0000000..4433ecf --- /dev/null +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-inbox.seed.md @@ -0,0 +1,3 @@ +# Inbox — Group + +Unowned "someone should look at this" captures for the whole group, as date-prefixed **member-tagged** lines (`- {{DATE}} [member]: `), one per line, via idempotent append. Any member's triage may route these; the processing log records who routed what. Personal captures belong in your own `_agent/members//inbox.md`. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-profile.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-profile.seed.md new file mode 100644 index 0000000..3d44db1 --- /dev/null +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/group-profile.seed.md @@ -0,0 +1,28 @@ +--- +type: semantic-memory +status: active +created: {{DATE}} +updated: {{DATE}} +tags: [agent, group, profile] +agent_written: true +author: {{MEMBER}} +source_notes: [] +--- + +# Group Profile + + + +## Group + + +## Members + + +## Conventions + + +## Related diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/inbox.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/inbox.seed.md deleted file mode 100644 index a8a031c..0000000 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/inbox.seed.md +++ /dev/null @@ -1,3 +0,0 @@ -# Inbox — Captures - -Quick captures land here as date-prefixed lines (`- {{DATE}}: `), one per line, via POST. Triage routes durable items to their proper home (see the chorus-memory skill's Inbox Triage). Don't delete originals on triage — the processing log is the audit trail. 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/member-context.seed.md similarity index 100% rename from chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/current-context.seed.md rename to chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-context.seed.md diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-inbox.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-inbox.seed.md new file mode 100644 index 0000000..94b5b7d --- /dev/null +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-inbox.seed.md @@ -0,0 +1,3 @@ +# Inbox — {{MEMBER}} + +{{MEMBER}}'s quick captures land here as date-prefixed lines (`- {{DATE}}: `), one per line, via POST. Triage routes durable items to their proper home (see the chorus-memory skill's Inbox Triage). Don't delete originals on triage — the processing log is the audit trail. Items for the whole group belong in `inbox/captures/group.md`. diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-preferences.seed.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-preferences.seed.md new file mode 100644 index 0000000..6a3d6b1 --- /dev/null +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/member-preferences.seed.md @@ -0,0 +1,35 @@ +--- +type: semantic-memory +status: active +created: {{DATE}} +updated: {{DATE}} +tags: [agent, member, preferences] +agent_written: true +author: {{MEMBER}} +source_notes: [] +confidence: low +last_reviewed: {{DATE}} +--- + +# Preferences + + + +## Member + + +## Fact / Pattern + + +## Observations + + +## Evidence + +## Recommendation or Implication + +## Review Notes +Seeded empty at member onboarding ({{DATE}}). Raise confidence once preferences are confirmed through day-to-day use. 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 deleted file mode 100644 index 9b200ba..0000000 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/anchors/operator-preferences.seed.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -type: semantic-memory -status: active -created: {{DATE}} -updated: {{DATE}} -tags: [agent, semantic-memory, operator] -agent_written: true -author: {{MEMBER}} -source_notes: [] -confidence: low -last_reviewed: {{DATE}} ---- - -# Operator Preferences - -## Operator - - -## Fact / Pattern - - -## Observations - - -## Evidence - -## Recommendation or Implication - -## Review Notes -Seeded empty at bootstrap ({{DATE}}). Raise confidence once preferences are confirmed through day-to-day use. - -## Related diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/chorus-vault.md b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/chorus-vault.md index b631eb6..cb08fe3 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scaffold/chorus-vault.md +++ b/chorus-memory.plugin.src/skills/chorus-memory/scaffold/chorus-vault.md @@ -6,7 +6,7 @@ updated: {{DATE}} tags: [agent, system, marker] agent_written: true source_notes: [] -schema_version: 4 +schema_version: 5 bootstrapped: {{DATE}} managed_by: chorus-memory-plugin --- 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 81ac47d..c78ffc6 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/bootstrap.py @@ -1,15 +1,23 @@ #!/usr/bin/env python3 -"""bootstrap.py — stand up (or repair) an CHORUS vault deterministically. +"""bootstrap.py — stand up (or repair) a CHORUS vault deterministically. Idempotent and additive: every write is probe-before-write and NEVER overwrites an existing file. The marker (_agent/chorus-vault.md) is written LAST, so the vault is only flagged "set up" once every piece is in place. Re-running is the repair path (it fills in only what is missing). Cross-platform: pure Python via chorus.py. +CHORUS is group memory, so bootstrap has two layers: + * the SHARED vault (folder tree, templates, group profile, group inbox, marker) + — created once, repaired by anyone; + * the MEMBER subtree (_agent/members// anchors + _agent/sessions//) + — created per member. `member_bootstrap()` is reusable: `chorus.py load` calls + it to SELF-ONBOARD a new member whose vault exists but whose namespace doesn't. + Usage: bootstrap.py [--dry-run] -Env: CHORUS_BASE, CHORUS_KEY (via chorus.py), CHORUS_TODAY (YYYY-MM-DD for {{DATE}}). +Env: CHORUS_BASE, CHORUS_KEY, CHORUS_MEMBER (via chorus.py), + CHORUS_TODAY (YYYY-MM-DD for {{DATE}}). """ from __future__ import annotations @@ -36,10 +44,13 @@ LEAVES = [ "decisions/by-date", "_agent/context", "_agent/memory/working", "_agent/memory/episodic", "_agent/memory/semantic", "_agent/sessions", "_agent/health", "_agent/templates", - "_agent/heartbeat", "_agent/skills/active", "_agent/skills/archived", "_agent/locks", + "_agent/members", "_agent/skills/active", "_agent/skills/archived", "_agent/locks", "_agent/index", ] +GROUP_PROFILE_PATH = "_agent/memory/semantic/group-profile.md" +GROUP_INBOX_PATH = "inbox/captures/group.md" + def exists(path: str) -> bool: status, _ = chorus.request("GET", chorus.vault_url(path)) @@ -78,8 +89,43 @@ def leaf_readme(folder: str, dry_run: bool) -> None: print(f"bootstrap: readme {path}") +def register_member(dry_run: bool) -> None: + """Idempotently add this member to the group profile's ## Members roster.""" + line = f"- {chorus.MEMBER} (joined {chorus.today()})" + if dry_run: + print(f"bootstrap: would roster {chorus.MEMBER} in {GROUP_PROFILE_PATH}") + return + status, body = chorus.request("GET", chorus.vault_url(GROUP_PROFILE_PATH)) + if status != 200: + return # no profile yet (dry-run orderings) — the roster line is best-effort + if any(ln.strip().startswith(f"- {chorus.MEMBER} ") for ln in body.decode(errors="replace").splitlines()): + return + chorus.request("PATCH", chorus.vault_url(GROUP_PROFILE_PATH), + data=chorus.normalize_patch_body((line + "\n").encode(), "append", "heading"), + headers={"Operation": "append", "Target-Type": "heading", + "Target": "Group Profile::Members", "Content-Type": "text/markdown"}) + print(f"bootstrap: rostered {chorus.MEMBER} in group profile") + + +def member_bootstrap(dry_run: bool = False) -> None: + """Stand up (or repair) the CONFIGURED member's namespace: leaf READMEs for + _agent/members// and _agent/sessions//, the three member anchors, and + the group-profile roster line. Idempotent; called by main() and by + `chorus.py load` when it detects an onboarded vault without this member.""" + if not chorus.MEMBER: + print("bootstrap: no member configured — cannot create a member namespace.", file=sys.stderr) + return + mdir = f"_agent/members/{chorus.MEMBER}" + leaf_readme(f"_agent/sessions/{chorus.MEMBER}", dry_run) + seed(f"{mdir}/preferences.md", SCAFFOLD / "anchors" / "member-preferences.seed.md", dry_run) + seed(f"{mdir}/current-context.md", SCAFFOLD / "anchors" / "member-context.seed.md", dry_run) + seed(f"{mdir}/inbox.md", SCAFFOLD / "anchors" / "member-inbox.seed.md", dry_run) + # heartbeat.md is deliberately NOT seeded — it appears at the first session end. + register_member(dry_run) + + def main(argv: list[str] | None = None) -> int: - parser = argparse.ArgumentParser(description="Bootstrap or repair an CHORUS vault") + parser = argparse.ArgumentParser(description="Bootstrap or repair a CHORUS vault") parser.add_argument("--dry-run", "-n", action="store_true") args = parser.parse_args(argv) @@ -104,14 +150,15 @@ def main(argv: list[str] | None = None) -> int: for source in sorted(templates.rglob("*.md")): seed(source.relative_to(templates).as_posix(), source, args.dry_run) - seed("_agent/memory/semantic/operator-preferences.md", SCAFFOLD / "anchors" / "operator-preferences.seed.md", args.dry_run) - seed("_agent/context/current-context.md", SCAFFOLD / "anchors" / "current-context.seed.md", args.dry_run) - seed("inbox/captures/inbox.md", SCAFFOLD / "anchors" / "inbox.seed.md", args.dry_run) + # Shared group anchors, then this member's namespace. + seed(GROUP_PROFILE_PATH, SCAFFOLD / "anchors" / "group-profile.seed.md", args.dry_run) + seed(GROUP_INBOX_PATH, SCAFFOLD / "anchors" / "group-inbox.seed.md", args.dry_run) + member_bootstrap(args.dry_run) seed("README.md", SCAFFOLD / "README.vault.md", args.dry_run) seed(chorus.MARKER_PATH, SCAFFOLD / "chorus-vault.md", args.dry_run) # marker LAST print(f"bootstrap: done ({'DRY-RUN ' if args.dry_run else ''}{chorus.today()}).") - print("bootstrap: next: create today's daily note + a bootstrap session log + heartbeat (see SKILL.md).") + print("bootstrap: next: create today's daily note + a bootstrap session log + your heartbeat (see SKILL.md).") return 0 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 c343b61..259d28a 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus.py @@ -31,7 +31,7 @@ Config (group/member/endpoint/key are machine-local — see chorus_config; the p CHORUS_TODAY YYYY-MM-DD to use as "today" (pass the conversation's currentDate) Usage: - chorus.py load # cold-start: the 6 orientation reads in one call + chorus.py load # cold-start: the 8 orientation reads in one call chorus.py get # print file contents (404 -> exit 44) chorus.py map # document-map JSON (headings/blocks/frontmatter) chorus.py ls # directory listing JSON @@ -103,6 +103,22 @@ LOCK_PATH = "_agent/locks/vault.lock" MARKER_PATH = "_agent/chorus-vault.md" +# --- member/group path helpers (schema 5) ------------------------------------- +# Per-member churn-prone state lives under _agent/members// so members +# never contend on each other's scope/heartbeat/preferences/inbox. Shared +# knowledge (projects, areas, resources, journal, semantic memory) stays communal. +GROUP_PROFILE_PATH = "_agent/memory/semantic/group-profile.md" +GROUP_INBOX_PATH = "inbox/captures/group.md" + + +def member_path(name: str, member: str | None = None) -> str: + """A file in a member's namespace, e.g. member_path('preferences.md').""" + return f"_agent/members/{member or MEMBER}/{name}" + + +def member_sessions_dir(member: str | None = None) -> str: + return f"_agent/sessions/{member or MEMBER}" + class ChorusError(RuntimeError): def __init__(self, message: str, code: int = 1) -> None: @@ -553,7 +569,9 @@ def extract_heading(markdown: str, heading: str) -> str: def cmd_scope(subcommand: str, text: str | None = None, as_json: bool = False) -> int: - path = "_agent/context/current-context.md" + # Scope is PER MEMBER (schema 5): each member's active scope lives in their + # own namespace, so members working on different things never clobber it. + path = member_path("current-context.md") status, body = request("GET", vault_url(path)) check(status, body, f"scope {subcommand}") current = body.decode(errors="replace") @@ -566,9 +584,9 @@ def cmd_scope(subcommand: str, text: str | None = None, as_json: bool = False) - scope_updated = line.split(":", 1)[1].strip().strip('"').strip("'") break sessions_since = None - # Count session logs dated after scope_updated (the drift signal). + # Count MY session logs dated after scope_updated (the drift signal). if scope_updated: - status, body = request("GET", vault_url("_agent/sessions/")) + status, body = request("GET", vault_url(member_sessions_dir() + "/")) if status == 200: try: files = json.loads(body).get("files", []) @@ -609,8 +627,11 @@ def cmd_scope(subcommand: str, text: str | None = None, as_json: bool = False) - def cmd_load() -> int: - """Cold-start orientation: the canonical 6 reads in one call. 404s on today's - daily note and the inbox are normal (printed as absent, not errors).""" + """Cold-start orientation: the canonical 8 reads in one call — the marker, the + GROUP profile, then MY member state (preferences/context/heartbeat/inbox), the + shared daily note, and the group inbox. 404s on today's daily note and the + inboxes are normal (printed as absent, not errors). If the vault is + bootstrapped but MY namespace is missing, self-onboard it.""" 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()}") @@ -621,12 +642,14 @@ def cmd_load() -> int: print("Then re-run load. (Memory is unavailable until configured.)") return 78 # distinct: configuration required targets = [ - ("marker", MARKER_PATH), - ("preferences", "_agent/memory/semantic/operator-preferences.md"), - ("context", "_agent/context/current-context.md"), - ("heartbeat", "_agent/heartbeat/last-session.md"), - ("today", f"journal/daily/{today()}.md"), - ("inbox", "inbox/captures/inbox.md"), + ("marker", MARKER_PATH), + ("group-profile", GROUP_PROFILE_PATH), + ("my-preferences", member_path("preferences.md")), + ("my-context", member_path("current-context.md")), + ("my-heartbeat", member_path("heartbeat.md")), + ("today", f"journal/daily/{today()}.md"), + ("my-inbox", member_path("inbox.md")), + ("group-inbox", GROUP_INBOX_PATH), ] import chorus_queue # H2: sync any writes queued during a prior outage, best-effort and quiet on empty. @@ -639,6 +662,7 @@ def cmd_load() -> int: marker_missing = False heartbeat_absent = False + prefs_absent = False offline = False for label, path in targets: status, body = request("GET", vault_url(path)) @@ -654,8 +678,10 @@ def cmd_load() -> int: print("(absent — fine)") if label == "marker": marker_missing = True - if label == "heartbeat": + if label == "my-heartbeat": heartbeat_absent = True + if label == "my-preferences": + prefs_absent = True elif status == 0: # vault unreachable -> degrade to last-known-good cache offline = True cached = chorus_queue.cache_get(path) @@ -671,10 +697,23 @@ def cmd_load() -> int: print(f"===== {label}: {path} (HTTP {status}) =====") print(f"(error HTTP {status}: {body.decode(errors='replace')[:200]})") print() - # M3: heartbeat pointer missing/stale -> fall back to the recent sessions listing + # Self-onboarding: the vault is bootstrapped but THIS member has no namespace + # yet (fresh member, existing group). Stand up their subtree right now so the + # session starts with real anchors instead of 404s. + if prefs_absent and not marker_missing and not offline: + print(f"===== self-onboarding: member '{MEMBER}' is new to this vault =====") + try: + import bootstrap + bootstrap.member_bootstrap(dry_run=False) + print(f"(created _agent/members/{MEMBER}/ anchors + {member_sessions_dir()}/ — " + "ask the member to confirm their preferences when convenient)") + except Exception as exc: # noqa: BLE001 — onboarding must never kill a load + print(f"(self-onboarding failed: {exc} — run bootstrap.py manually)") + print() + # M3: heartbeat pointer missing/stale -> fall back to MY recent sessions listing # (matches the documented loading procedure) so orientation works without the pointer. if heartbeat_absent and not offline: - st, body = request("GET", vault_url("_agent/sessions/")) + st, body = request("GET", vault_url(member_sessions_dir() + "/")) if st == 200: try: files = sorted((f for f in json.loads(body).get("files", []) if f.endswith(".md")), @@ -682,9 +721,9 @@ def cmd_load() -> int: except json.JSONDecodeError: files = [] if files: - print("===== recent sessions (heartbeat absent — fallback) =====") + print("===== my recent sessions (heartbeat absent — fallback) =====") for f in files[:5]: - print(f" _agent/sessions/{f}") + print(f" {member_sessions_dir()}/{f}") print() if offline: print("NOTE: vault unreachable — context above is last-known-good cache; writes this " 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 8edd18b..bbe8cb3 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 @@ -146,7 +146,10 @@ def _dated_block(today_s: str, body_text: str) -> tuple[str, str]: a markdown continuation. Returns (bullet, full_block) — the bullet alone is the idempotency key (same first-line-per-day semantics as before).""" lines = [ln.rstrip() for ln in body_text.strip().splitlines()] - bullet = f"- {today_s}: {lines[0] if lines else '(update)'}" + # Member-tagged: shared entities are updated by many members' sessions, so + # each dated block records who added it. + who = f" [{chorus.MEMBER}]" if chorus.MEMBER else "" + bullet = f"- {today_s}{who}: {lines[0] if lines else '(update)'}" block = bullet for ln in lines[1:]: block += "\n" + (f" {ln}" if ln else "") @@ -207,16 +210,19 @@ def capture(kind: str | None, title: str, file_arg: str | None, status_v: str = sources = [s.strip() for s in (sources or []) if s.strip()] tags = [t.strip() for t in (tags or []) if t.strip()] - # Unknown home -> defer to the inbox (a single idempotent capture line). + # Unknown home -> defer to MY inbox (a single idempotent capture line). + # (Group-wide "someone should look at this" items go to inbox/captures/group.md + # as member-tagged lines via a plain append — see the skill's Inbox Triage.) if inbox or not kind: + inbox_path = chorus.member_path("inbox.md") if dry_run: - return done("inbox", "inbox/captures/inbox.md", dry=True) + return done("inbox", inbox_path, dry=True) line = f"- {today_s}: {title}" if body_text.strip(): line += f" — {body_text.strip().splitlines()[0]}" with quiet(): - rc = chorus.cmd_append("inbox/captures/inbox.md", line) - return done("inbox", "inbox/captures/inbox.md", ok=rc == 0) + rc = chorus.cmd_append(inbox_path, line) + return done("inbox", inbox_path, ok=rc == 0) slug = idx_mod.slugify(title) index = idx_mod.load() @@ -339,7 +345,10 @@ def capture(kind: str | None, title: str, file_arg: str | None, status_v: str = print(f"chorus_ops: recall-index update skipped ({exc})", file=sys.stderr) if not no_log: - ensure_daily_log(f"- {today_s}: {action} {kind} [[{links.link_token(path)}]]") + # The daily Agent Log is the GROUP's shared timeline — every line is + # member-tagged so interleaved activity stays attributable. + who = f" [{chorus.MEMBER}]" if chorus.MEMBER else "" + ensure_daily_log(f"- {today_s}{who}: {action} {kind} [[{links.link_token(path)}]]") if as_json: done(action, path, links=linked, near=near_dupes) diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_triage.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_triage.py index 7d3cf75..9a57db8 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_triage.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/chorus_triage.py @@ -28,7 +28,10 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) import chorus # noqa: E402 -INBOX_PATH = "inbox/captures/inbox.md" +# Triage covers BOTH inboxes: this member's personal captures and the shared +# group inbox (unowned items — whoever triages first routes them). +INBOX_PATH = chorus.member_path("inbox.md") +GROUP_INBOX_PATH = chorus.GROUP_INBOX_PATH LOG_DIR = "inbox/processing-log" _CAPTURE_LINE = re.compile(r"^\s*-\s*(\d{4}-\d{2}-\d{2})\s*:?\s*(.*\S)\s*$") @@ -55,26 +58,33 @@ def parse_inbox(text: str) -> list[dict]: return items -def list_inbox(as_json: bool = False) -> int: - status, body = chorus.request("GET", chorus.vault_url(INBOX_PATH)) +def _read_inbox(path: str) -> list[dict]: + status, body = chorus.request("GET", chorus.vault_url(path)) if status == 404: - items = [] - else: - chorus.check(status, body, f"triage list {INBOX_PATH}") - items = parse_inbox(body.decode(errors="replace")) + return [] + chorus.check(status, body, f"triage list {path}") + items = parse_inbox(body.decode(errors="replace")) + for it in items: + it["source"] = path + return items + + +def list_inbox(as_json: bool = False) -> int: + items = _read_inbox(INBOX_PATH) + _read_inbox(GROUP_INBOX_PATH) if as_json: import chorus_output - env = chorus_output.envelope("triage-list", {"path": INBOX_PATH, "items": items, - "count": len(items)}) + env = chorus_output.envelope("triage-list", {"paths": [INBOX_PATH, GROUP_INBOX_PATH], + "items": items, "count": len(items)}) print(json.dumps(env, ensure_ascii=False)) return 0 if not items: - print("triage: inbox is empty — nothing to route.") + print("triage: both inboxes are empty — nothing to route.") return 0 - print(f"triage: {len(items)} capture(s) in {INBOX_PATH}") + print(f"triage: {len(items)} capture(s) across {INBOX_PATH} + {GROUP_INBOX_PATH}") for it in items: age = f"{it['age_days']}d" if it["age_days"] is not None else "?" - print(f" [{age:>4}] {it['date']}: {it['text']}") + tag = "group" if it["source"] == GROUP_INBOX_PATH else "mine" + print(f" [{age:>4}][{tag:>5}] {it['date']}: {it['text']}") print("\nBuild a proposals JSON (reflect schema + optional \"line\") and run " "`chorus.py triage ` to preview, `--apply` to route.") return 0 @@ -124,8 +134,9 @@ def apply(proposals: list[dict], confirm: bool = False) -> int: continue applied += 1 original = (p.get("line") or p["title"]).strip() + who = f"[{chorus.MEMBER}] " if chorus.MEMBER else "" chorus.cmd_append(f"{LOG_DIR}/{today_s}.md", - f"- {original} → {p.get('_path', '?')}") + f"- {who}{original} → {p.get('_path', '?')}") print(f"triage: routed {applied}/{len(valid)} item(s); audit in {LOG_DIR}/{today_s}.md. " "Originals kept in the inbox (deletion is explicit-only)." + (f" {gated} stopped at the duplicate gate — re-propose with the existing " diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py index 354ecbe..bc6cb7f 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/migrate.py @@ -25,7 +25,7 @@ sys.path.insert(0, str(SCRIPT_DIR)) import chorus # noqa: E402 -CURRENT_SCHEMA = 4 +CURRENT_SCHEMA = 5 def get_text(path: str) -> str | None: @@ -146,6 +146,35 @@ def main(argv: list[str] | None = None) -> int: print("migrate: [3->4] _agent/index/ already exists (schema 3); no moves needed.") print("migrate: [3->4] then run `sweep.py --apply` to build _agent/index/recall-index.json.") + if start < 5: + # Schema 5 = per-member namespacing. This step exists for alpha CHORUS + # vaults stood up before Phase 3 — the pre-5 single-user anchors move into + # the CONFIGURED member's namespace (there is no ECHO adoption path). + print("migrate: [4->5] per-member namespacing — move single-user anchors into " + f"_agent/members/{chorus.MEMBER or ''}/") + if not chorus.MEMBER: + print("migrate: [4->5] ERROR: no member configured — set CHORUS_MEMBER first.", + file=sys.stderr) + return 2 + m = chorus.MEMBER + moves = [ + ("_agent/memory/semantic/operator-preferences.md", f"_agent/members/{m}/preferences.md"), + ("_agent/context/current-context.md", f"_agent/members/{m}/current-context.md"), + ("_agent/heartbeat/last-session.md", f"_agent/members/{m}/heartbeat.md"), + ("inbox/captures/inbox.md", f"_agent/members/{m}/inbox.md"), + ] + for src, dst in moves: + if get_text(src) is not None: + do_or_show(args.apply, f"move {src} -> {dst}", + lambda s=src, d=dst: move(s, d)) + for filename in list_files("_agent/sessions"): + if filename.endswith(".md") and filename != "README.md": + dst = f"_agent/sessions/{m}/{filename}" + do_or_show(args.apply, f"move _agent/sessions/{filename} -> {dst}", + lambda f=filename, d=dst: move(f"_agent/sessions/{f}", d)) + print("migrate: [4->5] then run `bootstrap.py` to seed the group profile, group " + "inbox, and any missing member anchors, and `sweep.py --apply` to reindex.") + do_or_show(args.apply, f"set _agent/chorus-vault.md schema_version -> {CURRENT_SCHEMA}", lambda: chorus.cmd_fm("_agent/chorus-vault.md", "schema_version", str(CURRENT_SCHEMA))) if args.apply: diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json b/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json index efb58be..f668bdd 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/routing.json @@ -2,7 +2,7 @@ "$comment": "CANONICAL machine-readable routing manifest for the CHORUS vault. This is the single source of truth for 'what paths may be written to'. The human-readable tables in SKILL.md, references/routing-map.md, and references/api-reference.md are DERIVED views of this file — when they disagree, this file wins. vault_lint.py consumes it to enforce the core rule (if a vault path matches no route here, and is not retired, nothing should be written to it); check_routing.py consumes it to verify the human routing docs stay in sync with this manifest. Patterns are Python regexes matched against vault-root-relative paths (no leading slash, no /vault/ prefix).", "schema_version": 2, "routes": [ - { "id": "inbox-captures", "pattern": "^inbox/captures/inbox\\.md$", "method": "POST", "trigger": "Destination unknown at capture time", "distinct_because": "Only path whose contract is deferred routing" }, + { "id": "inbox-group", "pattern": "^inbox/captures/group\\.md$", "method": "POST", "trigger": "Unowned group-wide capture (member-tagged line)", "distinct_because": "Shared deferred routing — any member's triage may route it" }, { "id": "inbox-imports", "pattern": "^inbox/imports/[^/]+\\.md$", "method": "PUT", "trigger": "Raw external material dropped wholesale", "distinct_because": "Bulk un-triaged material vs single-line captures" }, { "id": "inbox-processing-log", "pattern": "^inbox/processing-log/\\d{4}-\\d{2}-\\d{2}\\.md$", "method": "POST", "trigger": "An inbox item is routed to its real home", "distinct_because": "Audit trail of moves, not memory itself" }, @@ -31,13 +31,13 @@ { "id": "decisions-template", "pattern": "^decisions/decision-template\\.md$", "method": "PUT", "trigger": "Bootstrap seed only", "distinct_because": "Template, not a decision" }, { "id": "agent-marker", "pattern": "^_agent/chorus-vault\\.md$", "method": "PUT", "trigger": "Bootstrap / schema migration only", "distinct_because": "Plugin-owned probe; never hand-edited" }, - { "id": "agent-context", "pattern": "^_agent/context/[^/]+\\.md$", "method": "PATCH", "trigger": "Active scope changes / task bundles", "distinct_because": "Single live scope pointer + bundles" }, - { "id": "agent-semantic", "pattern": "^_agent/memory/semantic/[^/]+\\.md$", "method": "PUT", "trigger": "A durable fact/pattern (incl. operator-preferences.md)", "distinct_because": "Timeless fact" }, + { "id": "member-anchors", "pattern": "^_agent/members/[a-z0-9-]+/(preferences|current-context|heartbeat|inbox)\\.md$", "method": "PATCH", "trigger": "A member's own preferences / scope / heartbeat / captures", "distinct_because": "Per-member namespace — only that member's sessions write here" }, + { "id": "agent-context", "pattern": "^_agent/context/(?!current-context\\.md$)[^/]+\\.md$", "method": "PATCH", "trigger": "Shared task bundles / reading lists", "distinct_because": "Task-scoped context shared by the group (scope itself is per member)" }, + { "id": "agent-semantic", "pattern": "^_agent/memory/semantic/(?!operator-preferences\\.md$)[^/]+\\.md$", "method": "PUT", "trigger": "A durable fact/pattern (incl. group-profile.md)", "distinct_because": "Timeless fact shared by the group" }, { "id": "agent-episodic", "pattern": "^_agent/memory/episodic/[^/]+\\.md$", "method": "PUT", "trigger": "A record of what happened, when", "distinct_because": "Anchored to an event in time" }, { "id": "agent-working", "pattern": "^_agent/memory/working/[^/]+\\.md$", "method": "PUT", "trigger": "Short-lived state for the current effort", "distinct_because": "Explicitly transient" }, - { "id": "agent-sessions", "pattern": "^_agent/sessions/\\d{4}-\\d{2}-\\d{2}(-\\d{4})?-[^/]+\\.md$", "method": "PUT", "trigger": "A substantive session ends", "distinct_because": "Per-session record (new ones require HHMM)" }, + { "id": "agent-sessions", "pattern": "^_agent/sessions/[a-z0-9-]+/\\d{4}-\\d{2}-\\d{2}-\\d{4}-[^/]+\\.md$", "method": "PUT", "trigger": "A substantive session ends", "distinct_because": "Per-session record, namespaced by member (HHMM required)" }, { "id": "agent-health", "pattern": "^_agent/health/\\d{4}-\\d{2}-vault-health\\.md$", "method": "PUT", "trigger": "First substantive session of a month", "distinct_because": "Vault integrity, not work narrative" }, - { "id": "agent-heartbeat", "pattern": "^_agent/heartbeat/[^/]+\\.md$", "method": "PUT", "trigger": "End of every session", "distinct_because": "O(1) orientation pointer; overwritten, never grows" }, { "id": "agent-templates", "pattern": "^_agent/templates/.+\\.md$", "method": "PUT", "trigger": "Bootstrap seed only", "distinct_because": "Holds templates, not memory" }, { "id": "agent-skills-active", "pattern": "^_agent/skills/active/[^/]+\\.md$", "method": "PUT", "trigger": "A skill/plugin catalogued as a capability", "distinct_because": "Catalogs a capability vs the build effort" }, { "id": "agent-skills-archived","pattern": "^_agent/skills/archived/[^/]+\\.md$", "method": "PUT", "trigger": "A catalogued skill is retired", "distinct_because": "Terminal state of the skill catalog" }, @@ -47,6 +47,11 @@ { "id": "leaf-readme", "pattern": "^(.+/)?README\\.md$", "method": "PUT", "trigger": "Bootstrap leaf signpost / vault root README", "distinct_because": "Human signpost, not read for routing" } ], "retired": [ + { "pattern": "^inbox/captures/inbox\\.md$", "retired_in_schema": 5, "replacement": "_agent/members//inbox.md (personal) or inbox/captures/group.md (unowned)" }, + { "pattern": "^_agent/memory/semantic/operator-preferences\\.md$", "retired_in_schema": 5, "replacement": "_agent/members//preferences.md" }, + { "pattern": "^_agent/context/current-context\\.md$", "retired_in_schema": 5, "replacement": "_agent/members//current-context.md" }, + { "pattern": "^_agent/heartbeat/", "retired_in_schema": 5, "replacement": "_agent/members//heartbeat.md" }, + { "pattern": "^_agent/sessions/\\d{4}-\\d{2}-\\d{2}(-\\d{4})?-[^/]+\\.md$", "retired_in_schema": 5, "replacement": "_agent/sessions//YYYY-MM-DD-HHMM-.md" }, { "pattern": "^reviews/", "retired_in_schema": 2, "replacement": "journal/{weekly,monthly,quarterly,annual}/ and _agent/health/" }, { "pattern": "^decisions/by-project/", "retired_in_schema": 1, "replacement": "[[wikilink]] under the project's ## Key Decisions" }, { "pattern": "^archive/", "retired_in_schema": 0, "replacement": "projects/archived/ and _agent/skills/archived/" }, diff --git a/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py b/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py index c18220a..edd7715 100644 --- a/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py +++ b/chorus-memory.plugin.src/skills/chorus-memory/scripts/sweep.py @@ -15,7 +15,7 @@ backfill what older vaults don't have yet: 4. **symmetrize cross-links** — for every `## Related` link A -> B, ensure the reciprocal B -> A exists (it only adds the missing direction; it never invents new links from body text), and - 5. stamp the marker `schema_version` to the current schema (4). + 5. stamp the marker `schema_version` to the current schema (5). Dry-run by default; pass --apply to write. READ-ONLY without --apply. Cross-platform: pure Python via chorus.py. @@ -39,7 +39,7 @@ import chorus_index as idx_mod # noqa: E402 import chorus_links as links # noqa: E402 import chorus_recall # noqa: E402 -CURRENT_SCHEMA = 4 +CURRENT_SCHEMA = 5 TEMPLATE_RE = re.compile(r"(^|/)(templates/|.*-template\.md$)") SKIP_BASENAMES = {"README.md"} 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 5cfe2aa..550fe37 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 @@ -242,31 +242,43 @@ def main() -> int: if count > 1: flag("duplicate-agent-log", f"{path}: {count} '## Agent Log' headings") - # Inbox: captures aging past INBOX_DAYS - inbox = get("inbox/captures/inbox.md") or "" - for line in inbox.splitlines(): - match = re.match(r"^\s*-\s*(\d{4}-\d{2}-\d{2})\b", line) - date = parse_date(match.group(1)) if match else None - if date and (TODAY - date).days > INBOX_DAYS: - flag("aging-inbox", f"inbox capture {date} ({(TODAY - date).days}d): {line.strip()[:80]}") + # Members roster (schema 5): every per-member check below runs across ALL + # members found in the vault, not just the configured one. + members = [ + m for m in re.findall(r"^_agent/members/([a-z0-9-]+)/", "\n".join(all_files), re.M) + ] + members = sorted(set(members)) - # Scope freshness (drift detector) - context = get("_agent/context/current-context.md") - if context is not None: + # Inboxes: captures aging past INBOX_DAYS — each member's inbox + the group inbox + inboxes = [(f"_agent/members/{m}/inbox.md", m) for m in members] + inboxes.append(("inbox/captures/group.md", "group")) + for inbox_path, who in inboxes: + for line in (get(inbox_path) or "").splitlines(): + match = re.match(r"^\s*-\s*(\d{4}-\d{2}-\d{2})\b", line) + date = parse_date(match.group(1)) if match else None + if date and (TODAY - date).days > INBOX_DAYS: + flag("aging-inbox", f"[{who}] capture {date} ({(TODAY - date).days}d): {line.strip()[:80]}") + + # Scope freshness (drift detector) — per member, against THAT member's sessions + for m in members: + ctx_path = f"_agent/members/{m}/current-context.md" + context = get(ctx_path) + if context is None: + continue _, fm = parse_frontmatter(context) scope_updated = parse_date(fm.get("scope_updated")) if scope_updated is None: flag("scope-no-timestamp", - "_agent/context/current-context.md: no scope_updated frontmatter — scope drift cannot be detected; add it (bootstrap.py) and switch scope via `chorus.py scope set`") + f"{ctx_path}: no scope_updated frontmatter — scope drift cannot be detected; add it (bootstrap.py) and switch scope via `chorus.py scope set`") else: since = [ path for path in all_files - if (m := re.match(r"^_agent/sessions/(\d{4}-\d{2}-\d{2})", path)) - and (d := parse_date(m.group(1))) and d > scope_updated + if (mt := re.match(rf"^_agent/sessions/{re.escape(m)}/(\d{{4}}-\d{{2}}-\d{{2}})", path)) + and (d := parse_date(mt.group(1))) and d > scope_updated ] if len(since) >= SCOPE_STALE_SESSIONS: flag("scope-stale", - f"scope set {scope_updated}; {len(since)} session(s) logged since without a switch — confirm it still reflects current work (or run `chorus.py scope set`)") + f"[{m}] scope set {scope_updated}; {len(since)} session(s) logged since without a switch — confirm it still reflects current work (or run `chorus.py scope set`)") # ---- Graph health: broken wikilinks, orphans, index drift ---------------- # (md_files / md_set were built up top; reuse the shared `texts` cache.) diff --git a/eval/run_eval.py b/eval/run_eval.py index efe6716..d6fb6e8 100644 --- a/eval/run_eval.py +++ b/eval/run_eval.py @@ -287,9 +287,9 @@ def eval_write_safety(h): # replayed append -> whole-line idempotency, no duplicate ops += 1 - h.run(CHORUS, "append", "inbox/captures/inbox.md", f"- {TODAY}: replay me") - h.run(CHORUS, "append", "inbox/captures/inbox.md", f"- {TODAY}: replay me") - n = (h.ground("inbox/captures/inbox.md") or "").count("replay me") + h.run(CHORUS, "append", "_agent/members/eval-member/inbox.md", f"- {TODAY}: replay me") + h.run(CHORUS, "append", "_agent/members/eval-member/inbox.md", f"- {TODAY}: replay me") + n = (h.ground("_agent/members/eval-member/inbox.md") or "").count("replay me") if n != 1: silent += 1 @@ -303,13 +303,13 @@ def eval_durability(h, dead_base): h.seed("_agent/chorus-vault.md", "---\nschema_version: 4\n---\n# marker\n") queued_ok = 0 for i in range(3): - r = h.run(CHORUS, "append", "inbox/captures/inbox.md", + r = h.run(CHORUS, "append", "_agent/members/eval-member/inbox.md", f"- {TODAY}: offline capture {i}", base=dead_base) queued_ok += int(r.returncode == 0 and "queued" in r.stdout) # vault returns: flush replays; a second flush must not duplicate h.run(CHORUS, "flush") h.run(CHORUS, "flush") - inbox = h.ground("inbox/captures/inbox.md") or "" + inbox = h.ground("_agent/members/eval-member/inbox.md") or "" landed = sum(1 for i in range(3) if f"offline capture {i}" in inbox) dupes = sum(inbox.count(f"offline capture {i}") - 1 for i in range(3) if f"offline capture {i}" in inbox) diff --git a/eval/test_features.py b/eval/test_features.py index 813a1eb..85cda26 100644 --- a/eval/test_features.py +++ b/eval/test_features.py @@ -121,14 +121,14 @@ def main(): # 6. inbox capture (unknown home) h.chorus(CHORUS, "capture", "stray thought", "--inbox") - inbox = h.ground("inbox/captures/inbox.md") + inbox = h.ground("_agent/members/eval-member/inbox.md") check("inbox capture lands", inbox and "stray thought" in inbox) # 7. sweep --apply rebuilds the index, symmetrizes, stamps schema 3 r = h.chorus(SWEEP, "--apply") marker = h.ground("_agent/chorus-vault.md") check("sweep runs clean", r.returncode == 0, r.stdout + r.stderr) - check("sweep stamps schema 4", marker and "schema_version=4" in marker.replace(": ", "="), marker) + check("sweep stamps schema 5", marker and "schema_version=5" in marker.replace(": ", "="), marker) idx2 = h.ground("_agent/index/entities.json") check("sweep rebuilt index has all entities", idx2 and all(s in idx2 for s in ["bob-smith", "mpm", "alpha", "beta"])) @@ -188,7 +188,7 @@ def main(): capture_output=True, text=True, 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 the dated bullet", "- 2026-06-21 [eval-member]: met at expo" in bob3, r.stdout + r.stderr) check("v1.5 update keeps EVERY body line", " second line survives" in bob3 and " third line too" in bob3, bob3) @@ -259,7 +259,7 @@ def main(): and primary[0].get("status") == "active", json.dumps(primary[:1])) # 15. one-tap triage: structured list, then route with an audit trail. - h.seed("inbox/captures/inbox.md", + h.seed("_agent/members/eval-member/inbox.md", "- 2026-06-01: prefers uv over pip\n- 2026-06-20: try the new espresso place\n") r = h.chorus(CHORUS, "triage", "--list", "--json") try: @@ -282,7 +282,7 @@ def main(): check("v1.5 triage writes the processing-log audit line", "prefers uv over pip" in plog and "_agent/memory/semantic/prefers-uv-over-pip.md" in plog, plog) check("v1.5 triage keeps the original capture", - "prefers uv over pip" in (h.ground("inbox/captures/inbox.md") or "")) + "prefers uv over pip" in (h.ground("_agent/members/eval-member/inbox.md") or "")) # 16. lint flags incomplete entity frontmatter; sweep backfills it. h.seed("resources/companies/driftco.md", diff --git a/eval/test_reflect.py b/eval/test_reflect.py index d0c8ae3..83f22a5 100644 --- a/eval/test_reflect.py +++ b/eval/test_reflect.py @@ -89,7 +89,7 @@ def main(): (ground("resources/companies/acme-corp.md") or "").find("type: company") >= 0) check("apply creates the semantic note", ground("_agent/memory/semantic/use-uv-not-pip.md") is not None) - check("apply routes the inbox proposal", "half-formed idea" in (ground("inbox/captures/inbox.md") or "")) + check("apply routes the inbox proposal", "half-formed idea" in (ground("_agent/members/eval-member/inbox.md") or "")) check("apply still skips the low-confidence proposal", ground("resources/concepts/maybe-relevant.md") is None)