Files
jpmschweitzerandClaude Opus 4.7 8876659e98 reframe CLAUDE.md around PKB-as-substrate with Council as lens
The repo is now a personal knowledge base with the Council built in
as a high-power advisory layer, not a Council-first project that
happens to have an Obsidian vault. The "What this repo is" section
leads with the six lenses (/council, /ask-<member>, /reflect,
/triage-inbox, /review-week, /review-month) rather than just /council.

Directory map expanded to include daily/, inbox/ (+ raw/), notes/,
projects/, reading/, reflections/, reviews/, _templates/, scripts/,
and the five new Obsidian Bases. Setup docs pointed at from the
directory list.

Memory protocol gains a note that lightweight commands (/ask-*,
/reflect) may opportunistically append to on-the-user.md — same
"only if genuinely non-obvious" discipline as the Phase-5 memory
batch, applied at smaller scale.

Added a dedicated PKB-access section describing the sub-agent read
rules and when PKB context is pulled vs. stayed-out-of (/council
stays bounded; the lens commands pull selectively).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:18:00 +02:00

110 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## What this repo is
A personal knowledge base (PKB) with a **Council of 10** high-power advisory system built in. The repo root is an Obsidian vault. Content substrate = daily journal + permanent notes + project logs + reading notes + voice-capture inbox. The Council is one of several lenses applied to that substrate.
Available lenses:
- **`/council <question>`** — full multi-agent deliberation with research, debate, revision, vote. Archived at `sessions/<slug>/`.
- **`/ask-<member> <question>`** — single-agent consult, 11 variants (10 voting members + `/ask-researcher` for Naima). Lightweight; no research, no debate, no vote.
- **`/reflect [--member <slug>] [--days <N>] [--on <path>]`** — single-agent pattern-surface over recent daily notes or a specific note. Reflective, not prescriptive. Default reflector: Vale.
- **`/triage-inbox`** — a member (default Koskela) reviews fleeting notes in `inbox/` and proposes destinations (`daily/`, `notes/`, `projects/<slug>/log.md`, `reading/`); you approve in batch.
- **`/review-week`** — three-member (Koskela / Vale / Prochazka) structured weekly review archived at `reviews/YYYY-WNN_week.md`.
- **`/review-month`** — five-member (Okafor / Vale / Holt / Vaasa / Vire) monthly zoom-out at `reviews/YYYY-MM_month.md`.
Full design archived at `docs/structure/initial-plan.md`.
## Running a council session
`/council <problem>` — the only entry point. Orchestration lives in `.claude/commands/council.md`. Phases:
- **0. Context interview** — Moderator ↔ user via `AskUserQuestion`. Moderator writes `sessions/<slug>/brief.md`.
- **1. Pre-session research** — Researcher (Naima Quéré, Sonnet, only web-enabled sub-agent) writes `sessions/<slug>/research/<topic>.md` files off the brief. May flag `User clarification needed` before or during researching.
- **2. Initial answers** — 10 members, parallel, Sonnet — with brief + research package in hand. Members may flag `User clarification needed`; answers append to `brief.md` and flow into Phase 3 (Phase 2 is not re-run).
- **3. Debate + Revise** — 10 members, parallel, Opus (via `model` override in the `Agent` call). Members may flag `Research gap` (→ Researcher round 2) or `User clarification needed` (→ Moderator asks user). If either fires, **one bounded** second revision round happens.
- **4. Vote** — 10 members, parallel, Sonnet. Ballot is **transparent** (attributed by name). Self-votes allowed. Any last clarification flags are surfaced in `outcome.md` as open questions without re-running earlier phases.
- **5. Tally + Tie-break + Archive** — Moderator tallies. On tie: `AskUserQuestion` with tied full answers as option previews. Scribe (Haiku) writes `outcome.md`. Moderator writes `summary.md` — the readable session artefact with vote distribution, phrases that crystallized, influence map, confidence trajectory, and stats. Final Sonnet batch updates each member's `journal.md`.
## Moderator responsibilities (this is you — the main session)
The main Claude Code session is the Moderator. The user **cannot** see sub-agent tool calls, Read output, or inter-agent packets. You are their only window.
1. Narrate between phases — ≤ ~10 lines per update. State what just happened and what's next.
2. Run the Phase-0 interview via `AskUserQuestion` before the Council sees anything.
3. Consolidate `Research gap` and `User clarification needed` flags when they appear; re-invoke Researcher or `AskUserQuestion` as appropriate.
4. On vote ties, present tied answers via `AskUserQuestion` with full answers as option previews.
5. Never dump raw sub-agent output into user-facing text — always distil.
## Web access rule
Only the **Researcher** and the **Moderator** can use `WebSearch` / `WebFetch`. Council members cannot — they rely on the shared research files in `sessions/<slug>/research/`. Members who need more info raise `## Research gap` in Phase 3.
## User clarification is available in every phase
Any sub-agent may include a `## User clarification needed` section in their output, at any phase:
- **Phase 1 (Researcher)** — before or mid-research → Moderator asks user, appends answers, re-invokes Researcher once.
- **Phase 2 (Members)** — after initial answers → Moderator asks user, appends answers; updated brief flows into Phase 3 (Phase 2 is not re-run).
- **Phase 3 (Members)** — during debate → one bounded follow-up revision round.
- **Phase 4 (Voters)** — informational only; surfaced in `outcome.md` as "Open questions raised at vote" without re-running.
Hard cap: at most **one** follow-up revision round per session.
## Directory map
- `.claude/agents/council-*.md` — 10 voting members + `council-researcher.md` + `council-scribe.md`
- `.claude/commands/``council.md`, `ask-<slug>.md` × 11, `reflect.md`, `triage-inbox.md`, `review-week.md`, `review-month.md`
- `members/<slug>/` — per-member memory (`persona.md`, `journal.md`, `on-the-user.md`, `revisit.md`)
- `sessions/<slug>/` — formal deliberation archive (`brief.md`, `research/`, `initial-answers.md`, `revised-answers.md`, `votes.md`, `outcome.md`, `summary.md`)
- `daily/` — daily journal notes (one file per day)
- `inbox/` — fleeting-note landing zone (AudioPen drops, quick captures); `inbox/raw/` holds un-normalised input
- `notes/` — permanent notes (Zettelkasten-atomic)
- `projects/<slug>/` — project briefs and logs
- `reading/` — reading notes + highlights
- `reflections/` — output of `/reflect` and `/ask-* --save`
- `reviews/` — weekly and monthly review outputs
- `_templates/` — Obsidian note templates (ignored by Obsidian's graph)
- `scripts/` — operational scripts (AudioPen ingest, webhook receiver, systemd units) — ignored by Obsidian's graph
- `*.base` — Obsidian Bases at root (`council-sessions`, `council-members`, `notes`, `projects`, `reading`, `reflections`, `inbox`)
- `docs/structure/initial-plan.md` — archived design document
- `docs/setup/audiopen.md`, `docs/setup/sync.md` — out-of-repo setup guides (Tailscale Funnel, Syncthing, Gitea SSH)
## Memory protocol
Each voting member reads every file in its `members/<slug>/` directory at the start of every invocation. Every `/council` run produces:
- One `journal.md` entry per voting member (mandatory, via the Phase-5 memory batch).
- Updates to `on-the-user.md` and `revisit.md` only when something non-obvious comes up.
- One full session directory at `sessions/<slug>/`.
Lighter-weight commands (`/ask-*`, `/reflect`) may opportunistically append to a member's `on-the-user.md` if something non-obvious surfaced — no obligation.
Researcher and Scribe have persona files only — no journals.
## PKB access for sub-agents
Every voting member (and the Researcher) has **read access to the user's full knowledge base**`daily/`, `inbox/`, `notes/`, `projects/`, `reading/`, `reflections/`, `reviews/`, all of `sessions/`. Write access remains scoped to each agent's own `members/<slug>/` directory (or `sessions/<slug>/research/` for the Researcher, `sessions/<slug>/` for the Scribe).
When invoked via `/council`, members stick to the brief + research package + debate packet. The PKB is for `/ask-*`, `/reflect`, `/triage-inbox`, `/review-week`, `/review-month`.
## Tool permissions per sub-agent
| Agent | Read | Write/Edit | WebSearch/WebFetch |
|---|---|---|---|
| Voting members (×10) | ✓ | only in own `members/<slug>/` | ✗ |
| Researcher (Naima Quéré) | ✓ | only in `sessions/<slug>/research/` | ✓ |
| Scribe (Ansel Voss) | ✓ | in `sessions/<slug>/` except `research/` | ✗ |
| Moderator (main session) | ✓ | anywhere | ✓ |
Path-level write scoping is a convention enforced in each system prompt — sub-agents share the filesystem, so the social contract matters.
## Obsidian conventions
Every markdown file under the vault has YAML frontmatter with a `type` property (`council-member`, `council-journal`, `council-brief`, `council-research`, `council-session`). Inter-document references use folder-qualified wikilinks (e.g. `[[members/vaasa/persona|Dr. Ingrid Vaasa]]`). Two `.base` files at the root provide table views.
## Modifying the council
- **Swap a voting member:** edit both `.claude/agents/council-<slug>.md` and `members/<slug>/persona.md` (mirror the changes).
- **Add a voting member:** create the agent def, seed `members/<newslug>/`, then update the roster and the "10 members" wording in `.claude/commands/council.md`.
- **Researcher and Scribe are singletons** — edit their files directly.