Architecture Decision Records¶
kenny's architecture decisions in MADR format, and the only
kind of record kenny keeps. What qualifies: When (not) to write an ADR in the repository
CLAUDE.md, applied by /new-adr before it scaffolds anything.
- Numbered
NNNN-kebab-title.mdas a gap-free0001..Nsequence; the index is the record set, and a number always names the record at that position. 0000-template.mdis the MADR template — copy it for a new record (/new-adr).- A record is immutable once accepted; later decisions amend or supersede it via a
new record. The one exception: an accepted record may gain a dated
## Update (YYYY-MM-DD)section refining how it is implemented. Anything that changes what was decided needs a new record. - A number is an address, not content — repairing a link or renumbering is not an edit to a decision.
Index¶
| # | Title | Status |
|---|---|---|
| 0001 | Record architecture decisions using MADR | accepted |
| 0002 | Python server, Rust agent | accepted |
| 0003 | Self-built WebSocket/HTTPS tunnel | accepted |
| 0004 | Agent initiates the outbound connection | accepted |
| 0005 | Contract-first development with golden fixtures | accepted |
| 0006 | MCP over Streamable HTTP between Claude and the server | accepted |
| 0007 | Telemetry push model and SQLite storage | accepted |
| 0008 | Operator authentication | superseded by 0033 |
| 0009 | Server-hosted Claude chat with a confirm-gate | accepted |
| 0010 | Containerization (Docker/Compose) and GHCR | accepted |
| 0011 | Local remote-control kill switch (tray on/off) | accepted |
| 0012 | Agent distribution: prebuilt binary + config injection | accepted |
| 0013 | Agent as a Windows service + server-triggered self-update | accepted |
| 0014 | Auth hardening: token store, rotation, multi-operator, TLS cookie | accepted |
| 0015 | Server auto-fetch of the prebuilt agent binary from GitHub Releases | accepted |
| 0016 | Anthropic-native (underscore) capability tool names | accepted |
| 0017 | Observability: structured logging and a persistent event store | accepted |
| 0018 | Screenshots captured in the user session via the tray helper | accepted |
| 0019 | Agent-side deterministic safety guard for dangerous tool calls | accepted |
| 0020 | Shared policy catalog, operator deny rules, and a server-side mirror | accepted |
| 0021 | Orchestrate Windows Quick Assist as a concierge via user-session launch | accepted |
| 0022 | Mutual agent⇄server authentication via per-agent Ed25519 signatures | accepted |
| 0023 | Treat agent-supplied data as untrusted in the chat tool-use loop | accepted |
| 0024 | Parental controls: web-activity observability and on-demand web filtering | accepted |
| 0025 | Persistent, resumable copilot chat history | accepted |
| 0026 | LLM categorization of reliability events | accepted |
| 0027 | Push alerting via ntfy/webhook and a weekly digest | accepted |
| 0028 | Security-inventory and resilience telemetry sections | accepted |
| 0029 | Screen time as aggregated whole-machine session minutes | accepted |
| 0030 | Agent self-elevating bootstrap installer + fixed install location | accepted |
| 0031 | First-class Linux agent support | accepted |
| 0032 | Runtime settings resolved DB-over-env, editable in the dashboard | accepted |
| 0033 | Multi-user authentication: accounts, roles, sessions, and per-user access tokens | accepted |
| 0034 | Linux agent distribution: convenience install script + server-triggered self-update | accepted |
| 0035 | Anti-cheat coexistence and publisher legitimacy | accepted |
| 0036 | Report CPU arch via telemetry; pin arch for fresh Linux installs | accepted |
| 0037 | OAuth 2.1 authorization server for the MCP connector | accepted |
| 0038 | Explicit per-call agent targeting for forwarded MCP capability tools | accepted |
| 0039 | Server database backup/restore with pluggable local + remote destinations | accepted |
| 0040 | Scheduled update detection with a pinned, operator-approved rollout | accepted |
| 0041 | Operator-managed reliability alarm suppression | accepted |
| 0042 | Account governance across local and Microsoft accounts | accepted |
| 0043 | Account governance on Linux | accepted |
| 0044 | Delegated identity from a chat platform, with no parallel authorization | accepted |
| 0045 | Tiered tool classification: the tier belongs to the tool, the gate to the surface | accepted |
| 0046 | The ticket is the entity; the chat thread is a binding | accepted |
| 0047 | Capability profiles: named per-user tool allowlists that only narrow | accepted |
| 0048 | Second release channel: dev prereleases via the GitHub prerelease flag |
accepted |
| 0049 | The ticket lifecycle splits into two axes: state and blocked-on | accepted |
| 0050 | The ticket is its own chat surface | accepted |
| 0051 | Serialize this process's SQLite writers behind an in-process lock | accepted |
| 0052 | Build the dashboard as a compiled frontend shipped in the wheel | accepted |
| 0053 | Guarded minting, open redemption for agent distribution | accepted |
| 0054 | Alert delivery channels are live settings, resolved per dispatch | accepted |
| 0055 | Scheduled web-filter enforcement: a standing rule the server enacts on a clock | accepted |
| 0056 | Unprompted ticket triage, and what may let it act | accepted |
| 0057 | Read GitHub releases anonymously for agent distribution | accepted |
| 0058 | Time-aware findings with an incident/posture split | accepted |
| 0059 | The inbox is the ticket queue | proposed |
| 0060 | The ticket shows findings; the trail stays the audit | accepted |
| 0061 | The ticket keeps a record, not a transcript | proposed |
| 0062 | A block is machine-written, and a ticket nobody works dies of neglect | accepted |
| 0063 | The copilot proposes a ticket; it does not open one | proposed |
| 0064 | The fleet declares what a shell may run | accepted |
| 0065 | Reliability is scored on user-visible impact | accepted |
| 0066 | The Anthropic key is a dashboard setting, kept out of backups | accepted |
| 0067 | Alert delivery is routed by actionability | proposed |
| 0068 | LLM egress through an operator-configured gateway | accepted |
| 0069 | Web filtering is set per host on two axes: enforcement and history | accepted |
| 0070 | Long-lived per-device hardware history | proposed |