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>
This commit is contained in:
2026-04-19 20:18:14 +02:00
co-authored by Claude Opus 4.7
parent 8876659e98
commit 79be7a9aae
6 changed files with 161 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
---
type: daily-note
date: 2026-04-19
mood:
tags: [setup, pkb]
---
# 2026-04-19
## What's on today
Extended the Council repo into a personal knowledge base with the Council as a built-in advisory layer. Scaffolded `daily/`, `notes/`, `projects/`, `reading/`, `inbox/`, `reflections/`, `reviews/`, `_templates/`, and `scripts/`. Shipped the full command suite (/ask-*, /reflect, /triage-inbox, /review-week, /review-month). Set up the AudioPen → webhook → inbox pipeline with a stdlib-only Python receiver and the bash normaliser.
## Mood / state of mind
The Council now sees my actual work, not just discrete questions.
## Fleeting thoughts
- The difference between /council (formal) and /ask-* (casual consult) matters. Keeping /council reserved preserves its weight; if every question became a /council run the tool would dilute.
- [[notes/pkb-as-lens-substrate|The PKB-as-substrate reframe]] was the load-bearing design move.
## Questions for the Council
## Links
- [[projects/mql/brief]] — the companion Markdown-Query-Language CLI
- [[notes/pkb-as-lens-substrate]]
- [[reading/audiopen-integration-research]]
+12
View File
@@ -0,0 +1,12 @@
---
type: fleeting
source: manual
captured: 2026-04-19T19:00:00+02:00
slug: test-ingestion
---
# Test: manual inbox entry
Seeded as a fleeting note so `/triage-inbox` has something to exercise on. Not from AudioPen — the `source: manual` field distinguishes hand-authored drops from voice-captured ones.
When `/triage-inbox` runs, Koskela should propose either: promote to `daily/2026-04-19.md` as a sidebar about the setup, or delete (since it's purely a test). Either verdict is fine.
+25
View File
@@ -0,0 +1,25 @@
---
type: note
title: "PKB as substrate; Council as lens"
tags: [design, council, pkb]
created: 2026-04-19
updated: 2026-04-19
---
# PKB as substrate; Council as lens
The load-bearing design move for the journaling extension was inverting what is central and what is applied. Rather than: "Council is the thing, notes are added alongside," it became: "the personal knowledge base is the substrate holding thinking over time; the Council (and `/ask-*`, `/reflect`, reviews) are lenses applied to that substrate."
## Supporting
Consequences of the inversion:
- **Notes have primacy.** Daily journal, permanent notes, project logs, reading notes, and fleeting captures are where the user's thinking accumulates. The Council's advisory output (`sessions/`, `reflections/`, `reviews/`) is derivative — it depends on the notes existing.
- **Multiple lens modalities make sense.** Formal deliberation (`/council`), lightweight single-agent consult (`/ask-<member>`), journal pattern-surfacing (`/reflect`), structured reviews (`/review-week`, `/review-month`) — all are lenses over the same substrate. If the substrate didn't exist, most of these would be hollow.
- **Council members need PKB read access.** Previously they read only the session brief + their own memory. Now they can pull context from the user's actual thinking, with the discipline to read selectively.
- **`on-the-user.md` becomes richer.** Every lens invocation is an opportunity to notice something non-obvious about the user and record it. Previously these files grew only during `/council` Phase-5 updates; now they can grow from `/ask-*` and `/reflect` too.
## Related
- [[projects/mql/brief|mql CLI]] — structural queries over the substrate (future lens for when grep+read becomes too coarse)
- [[sessions/2026-04-19_volt-nl-fit/outcome|first Council session]] — predates the PKB but structurally compatible
+40
View File
@@ -0,0 +1,40 @@
---
type: project
title: "mql — Markdown Query Language CLI"
status: active
started: 2026-04-19
tags: [tooling, go, pkb]
---
# mql — Markdown Query Language CLI
## Why
The Council's members currently reach for Grep + Read to find patterns across `daily/`, `notes/`, `projects/`, `reading/`. Grep is stringly-typed; it doesn't understand YAML frontmatter, wikilinks, tags, or Obsidian Bases. As the PKB grows, "find all sessions where winner = X" or "list permanent notes tagged with Y linked to project Z" will be load-bearing queries, and a proper query tool pays off.
`mql` is a Go CLI that indexes and queries any repo with Markdown + YAML frontmatter + wikilinks + tags + Obsidian Bases, exposing a Dataview-compatible query language from outside Obsidian.
## Outcome definition
v0.1 shipped and installed in `~/.local/bin/mql`:
- Cold-scan builds a SQLite index under `~/.cache/mql/<vault-hash>.sqlite`.
- `mql 'LIST FROM "sessions" WHERE winner = "vaasa"'` returns JSON.
- `mql base <name>` executes an Obsidian `.base` file as a query.
- Researcher and `/ask-*`-invoked members can shell out to `mql` instead of grep-walking directories.
## Constraints
- Go (single static binary across Linux/macOS/Windows).
- Pure-Go SQLite (modernc.org/sqlite) — no cgo, no C toolchain at build time.
- MIT or Apache-2.0 license (open-source candidate).
- Dataview-compatible subset; `GROUP BY`, `FLATTEN`, `TASK`/`CALENDAR`, inline fields in prose, and `dataviewjs` are explicitly out for v0.1.
## Log
See [[log]].
## Links
- Sibling repo: `~/projects/mql/` (separate from this repo).
- Design: `~/projects/mql/docs/structure/initial-plan.md`.
- First customer: this vault. `/var/mnt/data/projects/council/` is the v0.1 integration-test fixture.
+17
View File
@@ -0,0 +1,17 @@
---
type: project-log
title: "mql — log"
project: mql
tags: [tooling, go, pkb]
---
# mql — project log
## 2026-04-19 — project started
- Scaffolded `~/projects/mql/` as a sibling repo (Go module planned; no code yet).
- Archived the design plan at `~/projects/mql/docs/structure/initial-plan.md`.
- Decided: Go over Rust (single-binary cross-compile story, pure-Go SQLite via `modernc.org/sqlite`, development velocity for the target scope).
- Decided: Dataview-compatible query dialect from the start, not a narrower `--where` expression. Grows cleanly over time.
- First milestone (v0.1): indexer + `files`, `meta`, `tags`, `schema` commands — no DQL parser yet.
- Council PKB (this repo) is the v0.1 fixture corpus.
+37
View File
@@ -0,0 +1,37 @@
---
type: reading
title: "AudioPen integration paths — self-hosted research"
author: "various"
source: "web (conversation notes during PKB planning, 2026-04-19)"
status: done
started: 2026-04-19
finished: 2026-04-19
tags: [audiopen, self-hosting, pkb, tailscale]
---
# AudioPen integration paths — self-hosted research
## Summary
AudioPen ships several output integrations: email, webhooks, direct-to-Obsidian (which routes through Obsidian's sync cloud), clipboard, and a few third-party automation platforms. The "direct to Obsidian" path is the one an earlier investigation surfaced, and it implicitly sends content through Obsidian Sync. For a self-hosted setup, that path is the wrong choice.
The cleaner architecture routes AudioPen's polished prose into user-controlled infrastructure via either a webhook (to a self-hosted receiver exposed via Tailscale Funnel) or email with IMAP pull on the desktop. Both fully avoid Obsidian's sync cloud.
The distinction worth holding: AudioPen's *processing* cloud (audio → polished prose) is unavoidable with AudioPen. The *storage/sync* cloud (Obsidian's paid service) is optional. This document is about the second.
## Highlights
- **Tailscale Funnel is the right tool for the webhook path.** Outbound-initiated; `*.ts.net` endpoint; no router ports opened; bypasses Authentik (which is gating Gitea's HTTPS in this setup).
- **Email+IMAP is the no-open-ports fallback.** Works if running a public-reachable receiver isn't feasible. Fully outbound.
- **Raw → normalised is a two-step pipeline.** AudioPen produces bare prose; a small bash wrapper wraps it in frontmatter and moves it from `inbox/raw/` to `inbox/`. Keeps the receiver stupid; all schema decisions live in one shell script.
## My notes
- AudioPen's payload shape varies slightly across versions. The receiver accepts multiple possible body keys (`body`, `output`, `summary`, `polished`) to avoid fragility; the raw payload is logged to stderr so you can inspect drift.
- If AudioPen's pricing or terms ever change, the documented escape hatch is whisper.cpp + a local polishing LLM + a phone-side Tasker/Shortcut. Out of scope for v1 but noted.
## Connections
- [[projects/mql/brief|mql CLI]] — separate but related self-hosted tooling push
- [[notes/pkb-as-lens-substrate|PKB as substrate]] — the overall architecture frame
- [[daily/2026-04-19|today's daily note]] — where the decision to go webhook-via-Funnel was made