20 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.7 79be7a9aae seed example content so Bases render non-empty on first open
Five files across four note types so every new Obsidian Base has
something to display immediately when the vault is opened:

- daily/2026-04-19.md — today's journal entry, covering the PKB
  setup work. Wikilinks to the permanent note, project brief, and
  reading note below.
- notes/pkb-as-lens-substrate.md — the load-bearing design note
  capturing the PKB-as-substrate / Council-as-lens inversion that
  drove this whole extension.
- projects/mql/brief.md and log.md — active project tracking the
  companion Markdown-Query-Language CLI (sibling repo). First log
  entry records the Go-over-Rust decision and v0.1 scope.
- reading/audiopen-integration-research.md — marked done; captures
  the two-clouds distinction (AudioPen's processing cloud
  unavoidable; Obsidian Sync optional) and names Tailscale Funnel
  as the chosen webhook-exposure path.
- inbox/2026-04-19-1900_test-ingestion.md — hand-authored fleeting
  note (source: manual, distinguishable from AudioPen drops) so
  /triage-inbox has something to exercise on before the real voice
  pipeline is running.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:18:14 +02:00
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
jpmschweitzerandClaude Opus 4.7 2c8df9425b add AudioPen ingest pipeline and sync architecture setup docs
Voice-note capture as the primary mobile input channel. AudioPen
polishes on their cloud, POSTs to a self-hosted receiver on the
desktop (exposed via Tailscale Funnel so no router ports open and
nothing behind Authentik). The receiver writes to inbox/raw/; a bash
normaliser wraps each drop in frontmatter and moves it to inbox/;
/triage-inbox routes them from there.

scripts/audiopen-ingest.sh — 80-line bash normaliser. Idempotent;
safe to re-run. Extracts title, slugifies, computes capture timestamp
from mtime, rewrites with fleeting-note frontmatter.

scripts/audiopen-webhook/main.py — stdlib-only Python HTTP server.
Zero pip deps; binds to 127.0.0.1 by default. Accepts flexible
payload shapes (title/name + body/output/summary/polished/
orig_transcript) so AudioPen version drift is logged rather than
silently dropped.

scripts/audiopen-webhook/*.example — systemd user-unit templates for
the receiver and the path/service pair that fires the ingest wrapper
on inbox/raw/ changes.

scripts/pyproject.toml + README.md — Python venv convention. Zero
deps today; venv location reserved at scripts/.venv/ (gitignored),
manifest at scripts/pyproject.toml, bootstrap documented for both
plain pip and uv. Optional-dependencies groups let individual tools
pull what they need without bloating the whole env.

docs/setup/audiopen.md — full setup guide: generating the shared
secret, installing the systemd units, pairing with Tailscale Funnel,
configuring AudioPen's webhook, and the IMAP-fallback path for
setups that can't run a public-reachable receiver.

docs/setup/sync.md — companion guide: Gitea SSH remote (works even
with Authentik gating HTTPS), obsidian-git plugin configuration,
Syncthing desktop↔phone pairing with the critical .stignore patterns,
and the three phone-role tiers so the user can pick Tier 1 / 2 / 3
at their own pace.

.gitignore gains **/.venv/, **/venv/, **/__pycache__/, and *.pyc so
nobody accidentally commits a materialised environment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:17:48 +02:00
jpmschweitzerandClaude Opus 4.7 2d5615b1ba add /reflect, /triage-inbox, and weekly / monthly review commands
Four meta-lens commands that operate across the PKB rather than on a
single note.

/reflect — single member (default Vale) reads the last N daily notes
(default 7) plus any intersecting open threads from members/*/revisit
files and surfaces patterns, recurring questions, tensions, and
intersections. Reflective, not prescriptive. Output lands in
reflections/YYYY-MM-DD_reflect-<member>.md.

/triage-inbox — a member (default Koskela) reads every file in inbox/
and proposes a destination per note (daily/, notes/<slug>.md,
projects/<slug>/log.md, reading/<slug>.md, keep, delete). Proposals
are shown via AskUserQuestion in batches of 4 for user approval;
approved moves preserve provenance via source: inbox/<original> in
frontmatter.

/review-week — three complementary lenses (Koskela practice,
Vale meaning, Prochazka execution) read the ISO week's daily notes +
project logs + sessions + all revisit files in parallel. Moderator
composes a synthesis. Output at reviews/YYYY-WNN_week.md.

/review-month — five lenses (Okafor trajectory, Vale what-it-was-
about, Holt brittleness, Vaasa minimal-model, Vire foreshadowing)
zoom out across the month's weekly reviews, sessions, project
trajectories, and reflections. Output at reviews/YYYY-MM_month.md.

Neither review runs auto-scheduled — commands are always explicit.
Pair with the schedule skill to automate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:17:28 +02:00
jpmschweitzerandClaude Opus 4.7 97d71c4c49 add /ask-<member> single-agent consult commands
Eleven thin orchestration scripts — ten for the voting members
(ask-tavsan, ask-okafor, …, ask-koskela) plus ask-researcher for
Naima. Each spawns exactly that sub-agent with the user's question
and any referenced note paths; no research phase, no debate, no vote.
Keeps /council reserved for formal deliberation so the tool doesn't
dilute into a chatbot.

Supports optional wikilinks or path fragments in the question (the
Moderator strips them out and forwards them as reference reads to
the member). The --save flag writes the consult to
reflections/YYYY-MM-DD_ask-<slug>.md so substantive single-agent
answers become part of the reflections.base view.

Members may opportunistically append to their own on-the-user.md if
a consult surfaces something non-obvious about the user — same
discipline as the Phase-5 memory batch in /council runs.

The researcher variant differs: she retains web access and produces
an analytic research output (Summary / Evidence / Uncertainty), with
a --depth flag to scale effort.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:17:12 +02:00
jpmschweitzerandClaude Opus 4.7 3483c8bead grant Council agents read access to the personal knowledge base
Every voting member's persona now documents that the PKB (daily/,
inbox/, notes/, projects/, reading/, reflections/, reviews/, all of
sessions/) is readable. Write access stays unchanged: voting members
write only to their own members/<slug>/ directory; the Researcher
writes only to sessions/<slug>/research/.

The read-scope block distinguishes the two invocation contexts:
/council runs stay bounded to the brief + research package + debate
packet (the PKB isn't pulled into formal deliberation unless the
Moderator explicitly points at a note), while /ask-*, /reflect,
/triage-inbox, /review-week, and /review-month may pull PKB context
selectively as the lens requires.

Researcher gets a parallel note that PKB content is now legitimate
primary-source material alongside web searches during Phase-1
research, flagged as source: pkb in the resulting research files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:16:59 +02:00
jpmschweitzerandClaude Opus 4.7 3965bc2938 scaffold PKB directories, templates, and Obsidian Bases
Establishes the knowledge-base substrate the Council now sits on top of:
daily/, inbox/ (+ raw/ for AudioPen drops), notes/, projects/,
reading/, reflections/, reviews/, _templates/. Each folder seeded with
a .gitkeep so the structure is committed even when empty.

Six templates under _templates/ define the canonical shape for each
note type (daily, permanent, project, reading, reflection, fleeting).
Frontmatter includes the type: field so the Bases below can filter on
it without collision with the existing council-* vocabulary.

Five new Obsidian Bases at repo root: notes.base, projects.base (with
active / all views), reading.base (to-read / reading / done views),
reflections.base (combined reflections + weekly + monthly reviews),
and inbox.base (fleeting notes awaiting triage).

Expanded .obsidian/app.json userIgnoreFilters to hide _templates and
scripts from the vault index so they don't clutter the graph, search,
or file explorer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:16:47 +02:00
jpmschweitzerandClaude Opus 4.7 d474d9edff update member memory from first Council session
All ten voting members now have a first entry in journal.md referencing
the Volt NL fit session, plus first substantive content in
on-the-user.md. Common threads captured independently across several
members: the user's standing rejection of strategic voting, EU
federalism and democracy/digital-rights as co-foundational pair, and
SMR-positive climate pragmatism.

revisit.md left untouched across all ten — every member reported the
session closed cleanly with no dangling threads worth future attention.
Researcher and Scribe have no journals by design.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 18:20:19 +02:00
jpmschweitzerandClaude Opus 4.7 2a1101d172 log first Council session on Volt NL party fit
Full session artefacts for the question "Is Volt the correct political
party for me in the Netherlands?" — brief with Phase-0 interview and
Phase-2 clarification additions, five round-1 research files from Naima
Quéré, verbatim initial answers and revised answers from all ten
members, transparent vote transcript with rationales, canonical outcome
file, and narrative summary.

Exercises the clarification-flag machinery: nine of ten members raised
Phase-2 clarifications which consolidated to four user questions; all
four resolved in Volt's direction. No research-gap round fired, no
Phase-3 clarifications, no round-2 revision. Four-way vote split
(Koskela 4, Tavşan 3, Vaasa 2, Vire 1); no user tie-break required.

This is the reference fixture for the mql CLI's first integration test
corpus — real frontmatter, wikilinks, and Obsidian Bases targets across
eleven files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 18:20:08 +02:00
jpmschweitzerandClaude Opus 4.7 275daf9e26 add summary.md artefact to /council output
New Phase-5d step: the Moderator writes sessions/<slug>/summary.md
directly (no sub-agent), producing an 11-section readable summary —
TL;DR, winning answer verbatim, vote distribution with ASCII bar chart,
phrases that crystallized, per-member Phase-2-to-Phase-3 posture
shifts, confidence trajectory chart, influence map (positive-citation
counts), non-winning readings preserved as distinct lenses, watch
items flagged across multiple members, session mechanics stats, and
full artefact wikilinks.

outcome.md stays as the machine-structured record for the sessions
Base; summary.md is the artefact you actually reread a week later.
Phase-5f terminal output retires the full vote table in favour of a
one-line verdict, condensed ASCII vote chart, full winning answer,
and a pointer at summary.md.

CLAUDE.md and docs/structure/initial-plan.md updated to mention the
new file in the session directory layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 18:19:58 +02:00
jpmschweitzerandClaude Opus 4.7 1acf635bab normalize Obsidian base property syntax
Linter-driven: base views referenced property names with a redundant
note. prefix in the order and sort arrays. The properties map still
declares note.<key>, but inside order/sort the bare key is idiomatic
and renders correctly. No functional change; both bases continue to
filter and display as intended.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 18:19:46 +02:00
jpmschweitzerandClaude Opus 4.7 24237d2217 add project permissions: allow git add/commit, deny destructive patterns
Shared-scope permissions so anyone cloning the repo inherits the same
safety net. Allow list covers only the two explicit asks (git add, git
commit). Deny list covers the usual destructive-command patterns:
rm -rf on root/home, sudo rm/chmod/chown, mkfs, dd if=, git push --force
variants, git reset --hard, git clean -fd/fdx, git branch -D, chmod 777.

.claude/settings.local.json remains the empty per-user stub.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 18:19:40 +02:00
jpmschweitzerandClaude Opus 4.7 21a10a1de0 hide member memory from Obsidian graph view
Add a graph-view search filter (-path:members -path:.base) so the
30+ journal/on-the-user/revisit nodes drop out of the visualization.
View-only — the files stay in the vault index, so council-members.base
keeps rendering the roster and search keeps finding them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:04:18 +02:00
jpmschweitzerandClaude Opus 4.7 5c0588a1c9 add councilClaudeTmux terminal profile and set as default
Opens a "council" tmux session scoped to this repo and launches
Claude Code in it. -A on new-session means a second Obsidian terminal
pane attaches to the same session rather than spawning a duplicate.

Assumes Obsidian is running outside a sandbox so /usr/bin/tmux and
the host claude binary are reachable directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:44:22 +02:00
jpmschweitzerandClaude Opus 4.7 14ca917e1b add member memory scaffolding and Obsidian Bases
One directory per member under members/, each with persona.md carrying
the queryable frontmatter the Bases filter on. Voting members also
have empty-with-header journal.md, on-the-user.md, and revisit.md —
seeded so the Phase-5 memory batch always has a target file to append
to without creating it from scratch. Researcher and Scribe have
persona only (they write session files, not journals).

council-sessions.base indexes sessions/<slug>/outcome.md files by date,
winner, tied, and per-phase clarification flags.

council-members.base renders the roster with prior job, lens, and
voting status.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:26:31 +02:00
jpmschweitzerandClaude Opus 4.7 83e69ee1bc add Council agents and /council orchestration command
Ten voting members with distinct prior-job personas (magician, marine
biologist, bankruptcy lawyer, hospice counselor, cosmonaut trainer,
theoretical physicist, skateboarder, SF novelist, prison-guard painter,
maritime-labour anthropologist), plus Naima Quéré as Researcher (only
sub-agent with WebSearch/WebFetch) and Ansel Voss as Scribe on Haiku.

/council drives a six-phase run: context interview, pre-session
research, initial answers, debate + bounded revision, transparent vote,
tally and archive. Any sub-agent can raise User-clarification-needed at
any phase; the Moderator batches the questions back to the user. Vote
ties are broken by the user via AskUserQuestion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:26:21 +02:00
jpmschweitzerandClaude Opus 4.7 7cc85d2f0a add git-commit skill with repo commit conventions
Auto-triggers on commit-related prompts so the rules apply whenever
Claude is about to check work in. Covers message style (imperative,
no emojis, no Conventional Commits prefixes), HEREDOC discipline,
attribution trailer, and logically-separated-commits guidance.

Also reinforces the global Claude Code git-safety protocol (no
--no-verify, no amend-without-ask, no force-push to main) so it sits
in one place next to the repo-specific style rules.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:26:10 +02:00
jpmschweitzerandClaude Opus 4.7 fc8f6ae0cf import general-purpose skills: d2-diagram, frame0-wireframe, skill-create
These are reusable skills not tied to the Council — d2 for text-to-
diagram generation, Frame0 for wireframe authoring and export, and a
meta-skill that guides creation of new skills.

Scripts retain their execute bits; references and assets are bundled
alongside each SKILL.md per the standard skill layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:26:00 +02:00
jpmschweitzerandClaude Opus 4.7 7a20b7f4ae add project documentation and archived design plan
CLAUDE.md so future Claude Code sessions have the five-phase workflow,
web-access rule, clarification-flag rules, tool permissions per agent,
and modification conventions at hand on session start.

README.md as the vault-facing overview for anyone opening this repo in
Obsidian, including the roster and where to find session artefacts.

docs/structure/initial-plan.md archives the design decisions that shaped
the current scaffolding — useful context when extending the system.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:25:51 +02:00
jpmschweitzerandClaude Opus 4.7 a86b84ef61 add gitignore and commit Obsidian vault config
Exclude .env (a GOOGLE_CLOUD_PROJECT value was present at the repo root),
.claude/settings.local.json, OS cruft, and personal Obsidian workspace
state (workspace.json, workspace-mobile.json, cache). Commit the rest of
.obsidian/ so the vault reopens with the same plugins, graph settings,
and daily-notes config on any machine.

Also expand Obsidian's userIgnoreFilters so .claude, .env, and .gitignore
don't pollute the file explorer, search, or graph view.

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