# ADR-0011: Console v2 Hybrid A canonical

**Status:** Accepted
**Date:** 2026-05-07
**Deciders:** JT, Claude (in dialogue, dual-consult round Console v2 + Engine Overhaul)
**Supersedes:** none directly; locks rejection of Spec A and Spec B as architectures.
**Superseded by:** none

## Decision

Console v2's canonical architecture is **Hybrid A**: React frontend + FastAPI backend + filesystem-as-DB + in-memory `eventbus.py`. Spec A (`recoil/pipeline/BUILD_SPEC_CONSOLE_V2.md`, 4755 lines, SQLite + SolidJS + a separate EventBus) and Spec B (`consultations/recoil/console-v2-architecture/BUILD_SPEC.md`, backend-deferral) are formally superseded.

Hybrid A is what was actually built and shipped. Spec A and Spec B are retained on disk as historical artifacts only. Future SQLite or SolidJS proposals must cite this ADR and argue for revision (Law 15) AND check `recoil/console-v2/.out-of-scope/sqlite-persistence-layer.md` + `recoil/console-v2/.out-of-scope/solidjs-frontend.md` (Law 14) before opening the question.

## Context

JT has paid the "is this Spec A canonical?" conversation tax at least twice. The Spec A document is 4755 lines of authoritative-looking architecture that future-Claude scans, reads as canonical, and pitches off of — even though Hybrid A is the system that actually exists in the codebase, runs the dev loop, and serves real shots. The dual-consult round on Console v2 + Engine Overhaul (`consultations/recoil/console-v2-overhaul/SYNTHESIS.md` §1 lock U-4) crystallized the rejection: the conversation tax is a real, recurring cost, and the only durable fix is an ADR plus rejection memos.

Spec B's "defer the backend" stance is also rejected here because the FastAPI backend is the substrate everything else (event bus, ttyd embed, queue endpoint, projects API) hangs off of. There is no useful frontend-only path forward.

## Consequences

- Future SQLite proposals are now anti-patterns by default (Law 14 — see `.out-of-scope/sqlite-persistence-layer.md`). Proposers must surface a measured filesystem-scan latency above 500ms per hierarchy walk before re-litigation is in scope.
- Future SolidJS proposals are now anti-patterns by default (Law 14 — see `.out-of-scope/solidjs-frontend.md`). Proposers must surface a measured React render bottleneck before re-litigation is in scope.
- Spec A and Spec B remain on disk as historical artifacts; both gain a banner pointing at this ADR in their respective scaffolding phases (CP-A and CP-D).
- ADR-0012, ADR-0013, ADR-0014 (the other three CP-A ADRs) extend this lock to the data layer, import idiom, and chat surface respectively.
- Cited Laws: Law 14 (anti-pattern memory), Law 15 (ADRs at decision-crystallization moment).
