Architecture Decision Records
How this system is built and why. Every decision that changes the architecture gets written down. Generated with the adr-skill for Claude Code and Pi.
npx skills add skillrecordings/adr-skill --skill adr-skill --yes --global- 0081
Vault CLI & Agent Tool Access
implemented - 0080
Vault File Access from Voice Mode
implemented - 0079
Telnyx Voice & SMS Notification Channel
implemented - 0078
Opus Token Reduction Across joelclaw
accepted - 0077
Memory System — Next Phase
proposed - 0071
Notification Triage Classes
implemented - 0070
Telegram Rich Notifications with Inline Keyboards
proposed - 0069
Gateway Proactive Telegram Notifications
implemented - 0068
Memory Proposal Auto-Triage Pipeline
implemented - 0067
Integrate Community Skill Patterns
accepted - 0066
Inngest Monitor Pi Extension
accepted - 0065
Friction auto-fix — bias towards action
ADR-0021 Phase 4 (Friction) detects recurring friction patterns from Qdrant observations and creates Todoist tasks for Joel to review. The pipeline works — 10 patterns detected on first successful …
accepted - 0064
Evaluate Elixir/BEAM as joelclaw Backbone
proposed - 0063
Client-Side Search with Pagefind
joelclaw.com has ~80 pages of content (10 articles, 63 ADRs, 7 discoveries) with no search. Users can only browse by section (Writing, Cool, ADRs, Network) or scroll through listings. As the site g…
implemented - 0062
Heartbeat-Driven Task Triage
proposed - 0061
pi-tools Enhancement Cycle — Commit Tool, Web Extractors, MCQ
After evaluating oh-my-pi (`can1357/oh-my-pi`) as a potential replacement for stock pi, we decided to stay on stock pi and cherry-pick patterns into pi-tools (see ADR-0059 for LSP, ADR-0060 for swa…
proposed - 0060
Inngest-Backed Swarm/DAG Multi-Agent Orchestration
`ralph-loop` executes PRD stories **sequentially** — one codex session per story, linear chain. This works for implementation loops but can't express:
proposed - 0059
Multi-Language LSP Extension for pi-tools
The current `ts-check` extension in pi-tools is unreliable. It spawns a tsgo LSP process per project root but frequently fails to return useful diagnostics, hover info times out, and the JSON-RPC l…
proposed - 0058
58. Streamed NDJSON Protocol for Agent-First CLIs
accepted - 0057
Skill Pack Distribution — Install from Source
implemented - 0056
Personal Relationship Management — People as First-Class Entities
proposed - 0055
Granola Meeting Intelligence Pipeline
proposed - 0054
joelclaw Native App — iPhone, Watch, CarPlay
proposed - 0053
Event-emitter prompts and the Agency triage principle
The gateway extension delivers Inngest events to the pi session as user messages. Previously, ALL events were wrapped in a generic template:
implemented - 0052
Email Port — Hexagonal Architecture with Dual Adapters
implemented - 0051
Tailscale Funnel as Public Ingress for Webhooks
implemented - 0050
Gateway session resume via fixed file path and codex model pinning
Two operational issues were discovered simultaneously:
implemented - 0049
Gateway TUI via WebSocket
implemented - 0048
Webhook Gateway for External Service Integration
implemented - 0047
Todoist as Async Conversation Channel
implemented - 0046
TypeScript Things CLI via joelclaw Tasks Subcommand
proposed - 0045
Task Management via Ports and Adapters
implemented - 0044
Private-First PDS with Bento Bridge
accepted - 0043
Agent Voice Conversations via Self-Hosted LiveKit
accepted - 0042
Telegram Rich Replies, Outbound Media, and Agent Voice
accepted - 0041
First-Class Media Handling from Connected Channels
proposed - 0040
Google Workspace Access via gogcli
implemented - 0039
Self-host Convex as the real-time data layer for joelclaw.com
joelclaw.com is a statically-generated Next.js 16 site with MDX content. It has no database, no auth, no real-time features. Joel wants to add:
proposed - 0038
Embed pi as a library in a joelclaw gateway daemon
The current central gateway session (ADR-0036) runs pi inside tmux, managed by launchd. A gateway extension injects events via `sendUserMessage()`. This works for Redis-based notifications but has …
implemented - 0037
Layered watchdog for gateway heartbeat failure detection
The central gateway session (ADR-0036) receives heartbeats from an Inngest cron every 15 minutes. But if Inngest itself goes down — the server crashes, the worker dies, Redis becomes unreachable, o…
implemented - 0036
Run central gateway session as a launchd-managed daemon
ADR-0035 established a central + satellite routing model where one "gateway" session receives all heartbeats and system events. But that session needs to actually exist — it must be always-on, surv…
superseded - 0035
Central + satellite session routing for gateway events
ADR-0018 established a Redis event bridge between Inngest functions and pi sessions. The initial implementation pushed every event to a single shared `joelclaw:events:main` list. This worked for on…
implemented - 0034
Flux Operator for GitOps cluster management
Cluster state is currently applied manually via `kubectl apply -f`. The k8s manifests live in `~/Code/joelhooks/joelclaw/k8s/` and are applied by hand or by agents running kubectl commands. There's…
proposed - 0033
VictoriaMetrics + Grafana monitoring stack for Kubernetes
The Talos cluster has no monitoring. We observe the system via `kubectl get pods`, `talosctl dashboard`, and application logs. There's no metrics collection, no dashboards, no alerting.
proposed - 0032
Kubernetes persistent storage: Ceph Rook vs SeaweedFS vs local-path
The Talos cluster currently uses **local-path-provisioner** for PVCs. This was added manually (ADR-0029) because Talos doesn't bundle a storage provisioner. It works: Redis, Qdrant, and Inngest all…
proposed - 0031
Adopt Cilium Gateway API instead of Ingress
The cluster currently uses NodePort services directly — no Ingress controller at all. If/when we need proper HTTP routing (TLS termination, host-based routing, path routing), the traditional answer…
proposed - 0030
Replace Flannel + kube-proxy with Cilium
The Talos cluster (`joelclaw`) currently runs with the default CNI: **Flannel** + **kube-proxy**. This is the simplest path — Talos bundles Flannel out of the box and it works with zero config.
proposed - 0029
Replace Docker Desktop with Colima + Talos for container runtime
`panda` (Mac Mini M4 Pro, 64 GB) runs 24/7 as a headless server managed via Tailscale SSH. The container runtime powers the k3d cluster (`joelclaw`), which runs Redis, Qdrant, and Inngest as Kubern…
implemented - 0028
Align Inngest Rig with SDK Best Practices
implemented - 0027
Video Content Pipeline Expansion — Clip Segmentation + Content Repurposing
joelclaw's video pipeline currently handles **ingest only**: download → transcribe → enrich vault note. The output is a single vault note with a wall-of-text transcript and an AI-generated summary.…
proposed - 0026
Background agents: async task dispatch via Inngest with file inbox notifications
proposed - 0025
Network architecture: start with what works, grow as needed
implemented - 0024
Taxonomy-enhanced session search with SKOS concept layer
590 agent sessions were generated in 48 hours (37 Pi, 381 Claude Code, 172 Codex). These contain every decision, debugging insight, architecture discussion, and configuration change that happened o…
proposed - 0023
Docker Sandbox for Agent Loops
Agent loop iterations (IMPLEMENTOR, TEST-WRITER) currently spawn `codex exec` and `claude -p` directly on the host machine via `Bun.spawn()`. This means:
implemented - 0022
Adopt webhook-to-system-event pipeline for external signal ingestion
ADR-0018 established the Redis event bridge as the inbound path for system events: external signals → Redis list → pi extension drains → agent acts. It defined the schema (`SystemEvent`), the keys …
superseded - 0021
Adopt comprehensive agent memory system
Agents on this system lose conversational nuance between sessions. Memory is the critical missing capability — without it, every session starts from zero, hard-won debugging insights evaporate, use…
accepted - 0020
Observational memory pipeline
Agents on this system lose conversational nuance between sessions. ADR-0014 established the memory workspace (`MEMORY.md` + daily logs), and the session-lifecycle pi extension (pi-tools v0.3.0) aut…
superseded - 0019
Rename events from imperative commands to past-tense notifications
The system-bus event names are a mix of two styles:
implemented - 0018
Adopt pi-native gateway pattern with Redis event bridge for system orchestration
ADR-0010 established the need for a central system loop gateway — an autonomous orchestrator that runs SENSE→ORIENT→DECIDE→ACT→LEARN and chose a hybrid event-driven + cron heartbeat approach. It le…
implemented - 0017
Parallel Story and Subtask Execution in Agent Loops
The current agent loop (ADR-0015) is rigidly sequential: one story at a time, one agent per step, pipeline flow. The planner picks the next unpassed story, the chain runs plan→test→implement→review…
proposed - 0016
Idempotency Guards for Loop Event Chain
The agent loop event chain (ADR-0015) has no protection against parallel execution. Duplicate `agent/loop.start` events — from accidental double-fires, CLI retries, or stale Inngest replays — creat…
implemented - 0015
Loop architecture: TDD flow with separated roles
The current agent loop (ADR-0005) has a backwards flow: implement → write tests → check results. This causes systemic failures:
implemented - 0014
Agent memory workspace
Agents lose all context between sessions. Shared instructions (`AGENTS.md`) tell agents what to do but not what happened. Without persistent memory files, every session starts from zero.
superseded - 0013
LLM-powered judge evaluation
The judge function (ADR-0005) makes pass/fail decisions based solely on whether typecheck + lint + tests succeed. It has no understanding of whether the implementation actually satisfies the accept…
implemented - 0012
Planner generates PRD from goal
The agent loop requires a hand-crafted `prd.json` before it can start. Writing PRDs is the bottleneck — each one requires understanding the codebase, scoping stories to be small enough for a single…
implemented - 0011
Redis-Backed PRD State for Agent Loops
The agent loop pipeline (ADR-0005) runs a PLANNER → IMPLEMENTOR → REVIEWER → JUDGE cycle across stories defined in a PRD. Originally, loop state — which stories have passed, which are being retried…
implemented - 0010
Establish a central system loop gateway for autonomous orchestration
The system already has meaningful execution capability, but orchestration is still manual. ADR-0005 established durable coding loops with role-based execution and event-driven handoffs. ADR-0007 im…
superseded - 0009
9. Rename `igs` CLI to `joelclaw`
implemented - 0008
Add post-loop retrospective for skill evolution and memory ingestion
ADR-0005 established the durable PLANNER → IMPLEMENTOR → REVIEWER → JUDGE loop. ADR-0007 improved loop execution quality (Docker isolation, duration tracking, stricter controls). The system can now…
implemented - 0007
Upgrade durable coding loops to v2 with Docker-isolated execution and stronger loop controls
ADR-0005 established the durable PLANNER → IMPLEMENTOR → REVIEWER → JUDGE loop on Inngest and was implemented on 2026-02-14. Initial build + smoke test validated the architecture but exposed practi…
superseded - 0006
Adopt Prometheus + Grafana for system observability
The Mac Mini runs 3 Docker containers (Inngest, Qdrant, Redis), a Bun worker (system-bus), and Caddy — all managed via Docker Compose and launchd. AGENTS.md principle #2 states **"Observability ove…
superseded - 0005
Adopt Inngest multi-agent pipeline for durable autonomous coding loops
joelclaw needs the ability to execute long-running autonomous coding workloads — send an event, go AFK, wake up to stacked PRs with every iteration traceable. No durable autonomous coding loop exis…
implemented - 0004
0004 — AT Protocol as Bedrock
implemented - 0003
Build joelclaw instead of deploying OpenClaw
ADR-0002 assumed OpenClaw would be the orchestration layer for the personal assistant system. After 6 sessions of infrastructure work, the system has evolved beyond what OpenClaw provides in severa…
implemented - 0002
Adopt PARA vault + OpenClaw orchestration for always-on personal assistant
A Mac Mini is being set up as a prototype always-on AI personal assistant/copilot/life management system. The machine needs a unified architecture that connects:
superseded - 0001
Adopt architecture decision records
Architecture decisions in this project are made implicitly — through code, conversations, and tribal knowledge. When a new contributor (human or AI agent) joins the codebase, there is no record of …
implemented