diff --git a/daily/2026-04-19.md b/daily/2026-04-19.md new file mode 100644 index 0000000..7a7d4c9 --- /dev/null +++ b/daily/2026-04-19.md @@ -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]] diff --git a/inbox/2026-04-19-1900_test-ingestion.md b/inbox/2026-04-19-1900_test-ingestion.md new file mode 100644 index 0000000..9c0051e --- /dev/null +++ b/inbox/2026-04-19-1900_test-ingestion.md @@ -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. diff --git a/notes/pkb-as-lens-substrate.md b/notes/pkb-as-lens-substrate.md new file mode 100644 index 0000000..86a6db4 --- /dev/null +++ b/notes/pkb-as-lens-substrate.md @@ -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-`), 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 diff --git a/projects/mql/brief.md b/projects/mql/brief.md new file mode 100644 index 0000000..3bad8f6 --- /dev/null +++ b/projects/mql/brief.md @@ -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/.sqlite`. +- `mql 'LIST FROM "sessions" WHERE winner = "vaasa"'` returns JSON. +- `mql base ` 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. diff --git a/projects/mql/log.md b/projects/mql/log.md new file mode 100644 index 0000000..f5353e4 --- /dev/null +++ b/projects/mql/log.md @@ -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. diff --git a/reading/audiopen-integration-research.md b/reading/audiopen-integration-research.md new file mode 100644 index 0000000..22aebee --- /dev/null +++ b/reading/audiopen-integration-research.md @@ -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