diff --git a/pql-plan.json b/pql-plan.json deleted file mode 100644 index f7801eb4..00000000 --- a/pql-plan.json +++ /dev/null @@ -1,2969 +0,0 @@ -{ - "exported_at": "2026-04-23T10:24:31Z", - "decisions": [ - { - "id": "D-1", - "type": "confirmed", - "domain": "architecture", - "title": "CLI-first, not MCP", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-1", - "type": "question", - "domain": "architecture", - "title": "Authorisation granularity on the IPC socket", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-2", - "type": "question", - "domain": "architecture", - "title": "Back-pressure on event streams", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-2", - "type": "rejected", - "domain": "rejected", - "title": "Go sidecar", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-3", - "type": "confirmed", - "domain": "architecture", - "title": "pql as supporter tool; clide wraps, never duplicates", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-3", - "type": "question", - "domain": "architecture", - "title": "Event persistence + audit/undo", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-3", - "type": "rejected", - "domain": "rejected", - "title": "`MaterialApp` root", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-4", - "type": "confirmed", - "domain": "architecture", - "title": "Ignore file strategy", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-4", - "type": "question", - "domain": "architecture", - "title": "`.canvas` schema compatibility with Obsidian", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-4", - "type": "rejected", - "domain": "rejected", - "title": "Flutter `intl` + ARB codegen for i18n", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-5", - "type": "confirmed", - "domain": "architecture", - "title": "Dart core; sidecar dissolved; `ptyc` as pql-peer", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-5", - "type": "question", - "domain": "architecture", - "title": "IPC wire-format stability + `schema_version:`", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-5", - "type": "rejected", - "domain": "rejected", - "title": "Patrol test runner", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-6", - "type": "confirmed", - "domain": "architecture", - "title": "CLI and event surface contract", - "status": "active", - "date": "2026-04-20", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-6", - "type": "question", - "domain": "architecture", - "title": "Window chrome — native frame vs frameless custom", - "status": "resolved", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-6", - "type": "rejected", - "domain": "rejected", - "title": "Nerd-font glyph icons", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-7", - "type": "confirmed", - "domain": "architecture", - "title": "App root is bare `WidgetsApp`", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-7", - "type": "question", - "domain": "architecture", - "title": "macOS app bundle signing / notarisation", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-7", - "type": "rejected", - "domain": "rejected", - "title": "`CupertinoApp` root", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-8", - "type": "confirmed", - "domain": "architecture", - "title": "Feature-first folder layout", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-8", - "type": "question", - "domain": "extensions", - "title": "Extension API shape — widgets, subcommands, both?", - "status": "open", - "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-8", - "type": "rejected", - "domain": "rejected", - "title": "Riverpod / Provider / BLoC for state", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-9", - "type": "confirmed", - "domain": "architecture", - "title": "Three-tier theme pipeline", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-9", - "type": "question", - "domain": "extensions", - "title": "Lua runtime vendoring", - "status": "open", - "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-9", - "type": "rejected", - "domain": "rejected", - "title": "Port planning tooling into clide", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-10", - "type": "confirmed", - "domain": "architecture", - "title": "State management — `ChangeNotifier` + `ListenableBuilder`", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-10", - "type": "question", - "domain": "extensions", - "title": "Extension manifest `schema_version:`", - "status": "open", - "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-10", - "type": "rejected", - "domain": "rejected", - "title": "Python-script stopgap under `tooling/db/`", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-11", - "type": "confirmed", - "domain": "architecture", - "title": "Panel manager is kernel; layout is data; three-column is a preset", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-11", - "type": "question", - "domain": "testing", - "title": "Coverage gates — hard thresholds vs soft reporting", - "status": "open", - "file_path": "decisions/questions-testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-11", - "type": "rejected", - "domain": "rejected", - "title": "Permanent stopgap", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-12", - "type": "confirmed", - "domain": "architecture", - "title": "Kernel admission rule — mandatory shared singletons only", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-12", - "type": "question", - "domain": "testing", - "title": "Screen-reader automation (axe-core via Playwright)", - "status": "open", - "file_path": "decisions/questions-testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "R-12", - "type": "rejected", - "domain": "rejected", - "title": "MaterialApp wrapper from design handoff", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/rejected.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-13", - "type": "confirmed", - "domain": "architecture", - "title": "Git hardcoded in kernel project-loader", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-13", - "type": "question", - "domain": "accessibility", - "title": "Web production-mode a11y", - "status": "open", - "file_path": "decisions/questions-accessibility.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-14", - "type": "confirmed", - "domain": "architecture", - "title": "Two-tier disable — kernel locked, everything else extension-shaped", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-14", - "type": "question", - "domain": "accessibility", - "title": "i18n plurals / gender / date-format tooling", - "status": "open", - "file_path": "decisions/questions-accessibility.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-15", - "type": "confirmed", - "domain": "extensions", - "title": "Extension grain — container-level, multi-contribution", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-15", - "type": "question", - "domain": "process", - "title": "Editor tab — full LSP vs tree-sitter-only highlight", - "status": "open", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-16", - "type": "confirmed", - "domain": "extensions", - "title": "Built-ins in Dart, third-party in sandboxed Lua", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-16", - "type": "question", - "domain": "process", - "title": "`tree-sitter-dart` grammar maintenance", - "status": "open", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-17", - "type": "confirmed", - "domain": "extensions", - "title": "Panels are extension-shaped from day one", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-17", - "type": "question", - "domain": "process", - "title": "Icon set growth", - "status": "open", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-18", - "type": "confirmed", - "domain": "extensions", - "title": "YAML for themes + manifests; JSON for i18n catalogs", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-18", - "type": "question", - "domain": "process", - "title": "Theme hot-reload in release builds", - "status": "open", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-19", - "type": "confirmed", - "domain": "extensions", - "title": "Lua runtime as `ptyc`-peer supporter tool", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-19", - "type": "question", - "domain": "process", - "title": "(withdrawn)", - "status": "resolved", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-20", - "type": "confirmed", - "domain": "accessibility", - "title": "A11y is a Tier-0 contract", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/accessibility.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-20", - "type": "question", - "domain": "process", - "title": "Kernel DB service — namespaced SQL access?", - "status": "open", - "file_path": "decisions/questions-process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-21", - "type": "confirmed", - "domain": "accessibility", - "title": "i18n is a Tier-0 contract (fframe pattern + locale-fallback chain)", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/accessibility.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-21", - "type": "question", - "domain": "architecture", - "title": "Pql absorbs planning vs keeps separate", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-22", - "type": "confirmed", - "domain": "accessibility", - "title": "WCAG-AA contrast gate on bundled themes", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/accessibility.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-22", - "type": "question", - "domain": "architecture", - "title": "Ticket persistence strategy", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-23", - "type": "confirmed", - "domain": "testing", - "title": "Test pyramid — seven layers", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-23", - "type": "question", - "domain": "architecture", - "title": "SSH-remote development — run clide against a remote workspace", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-24", - "type": "confirmed", - "domain": "testing", - "title": "Golden tests — primitives only, Alchemist + Ahem", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-25", - "type": "confirmed", - "domain": "testing", - "title": "Mocks — mocktail at IO, hand-rolled fakes for ChangeNotifiers", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-25", - "type": "question", - "domain": "architecture", - "title": "Body text face — mono everywhere vs Josefin Sans UI + mono code", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-26", - "type": "confirmed", - "domain": "testing", - "title": "Web driver — raw Playwright + Flutter semantics", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-26", - "type": "question", - "domain": "architecture", - "title": "Small screen layout (\u003c 1000px)", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-27", - "type": "confirmed", - "domain": "testing", - "title": "Startup regression gate", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-27", - "type": "question", - "domain": "architecture", - "title": "Two-editor split", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-28", - "type": "confirmed", - "domain": "testing", - "title": "Test organisation — mirror `lib/` in `test/`", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-28", - "type": "question", - "domain": "architecture", - "title": "Terminal strip scope — shell only or logs/errors/tests", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-29", - "type": "confirmed", - "domain": "testing", - "title": "Pre-push gate — fast layer only", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-29", - "type": "question", - "domain": "architecture", - "title": "Branch picker location", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-30", - "type": "confirmed", - "domain": "testing", - "title": "Tests are client-side only", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/testing.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-30", - "type": "question", - "domain": "architecture", - "title": "Focus behavior when editor is dirty and viewer is peeked", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-31", - "type": "confirmed", - "domain": "tooling", - "title": "Prefer-zero-deps, exact-pin", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/tooling.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "Q-31", - "type": "question", - "domain": "architecture", - "title": "XWayland fallback for frameless — proper Wayland protocol needed", - "status": "open", - "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-32", - "type": "confirmed", - "domain": "tooling", - "title": "CI — Gitea primary, Linux-only runners, not yet activated", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/tooling.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-33", - "type": "confirmed", - "domain": "tooling", - "title": "Golden-output ignore pattern — `coverage.*` excludes output, not scripts", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/tooling.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-34", - "type": "confirmed", - "domain": "process", - "title": "Q\u0026D record system", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-35", - "type": "confirmed", - "domain": "process", - "title": "Kanban / waterfall, not Scrum", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-36", - "type": "confirmed", - "domain": "process", - "title": "`.claude/` is committed project surface, managed through the IDE", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-37", - "type": "confirmed", - "domain": "process", - "title": "Commit conventions per git-commit skill", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-38", - "type": "confirmed", - "domain": "process", - "title": "Changelog discipline — Keep a Changelog 1.1.0", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-39", - "type": "confirmed", - "domain": "process", - "title": "Planning tooling lives in pql, not clide", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-40", - "type": "confirmed", - "domain": "process", - "title": "[SUPERSEDED] Python stopgap under `tools/scripts/plan`", - "status": "active", - "date": "2026-04-21", - "file_path": "decisions/process.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-41", - "type": "confirmed", - "domain": "architecture", - "title": "Claude panes — one primary per repo, tmux-backed", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-42", - "type": "confirmed", - "domain": "tooling", - "title": "Dependencies documented in `licenses.yaml`", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/tooling.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-43", - "type": "confirmed", - "domain": "architecture", - "title": "Design handoff — adopt token palettes, reject Material wrapper", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-44", - "type": "confirmed", - "domain": "architecture", - "title": "Four bundled themes — clide, midnight, paper, terminal", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-45", - "type": "confirmed", - "domain": "architecture", - "title": "Syntax highlighting tokens in the theme pipeline", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-46", - "type": "confirmed", - "domain": "extensions", - "title": "Core frame builtins vs shipped extensions boundary", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/extensions.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-47", - "type": "confirmed", - "domain": "architecture", - "title": "Interaction model — Claude-is-home layout", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-48", - "type": "confirmed", - "domain": "architecture", - "title": "Chrome budget — no tabs, no breadcrumbs, keyboard-first", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-49", - "type": "confirmed", - "domain": "architecture", - "title": "Editor mode — inline above Claude, viewer swap", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-50", - "type": "confirmed", - "domain": "architecture", - "title": "Context auto-behavior — right panel reacts to Claude", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-51", - "type": "confirmed", - "domain": "architecture", - "title": "Panel collapse — 12px spine with badge", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-52", - "type": "confirmed", - "domain": "architecture", - "title": "Focus mode — full-window takeover", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-53", - "type": "confirmed", - "domain": "architecture", - "title": "State persistence across sessions", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-54", - "type": "confirmed", - "domain": "architecture", - "title": "Keyboard map — canonical shortcuts", - "status": "active", - "date": "2026-04-22", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-55", - "type": "confirmed", - "domain": "architecture", - "title": "Claude pane internal tabs for multi-session", - "status": "active", - "date": "2026-04-23", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-56", - "type": "confirmed", - "domain": "architecture", - "title": "Dissolve daemon process; Flutter app hosts IPC server", - "status": "active", - "date": "2026-04-23", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-57", - "type": "confirmed", - "domain": "architecture", - "title": "Frameless custom chrome with per-column 24px hats", - "status": "active", - "date": "2026-04-23", - "file_path": "decisions/architecture.md", - "synced_at": "2026-04-23 10:16:30" - }, - { - "id": "D-58", - "type": "confirmed", - "domain": "tooling", - "title": "Format engines are adoptable dependencies", - "status": "active", - "date": "2026-04-23", - "file_path": "decisions/tooling.md", - "synced_at": "2026-04-23 10:16:30" - } - ], - "decision_refs": [ - { - "source_id": "D-1", - "target_id": "D-6", - "ref_type": "references", - "note": "**Rationale:** Same mental model as pql for the agent — one tool-use pattern covers both. No MCP runtime to host, authenticate, or keep in sync with client versions. User/Claude parity is easier ..." - }, - { - "source_id": "D-10", - "target_id": "D-25", - "ref_type": "references", - "note": "**Rationale:** SDK-shipped, zero deps, trivial to fake in tests (hand-rolled fakes in [D-25](testing.md#d-25-mocks-mocktail-at-io-plus-hand-rolled-fakes)). Violates [D-31 prefer-zero-deps](tooling...." - }, - { - "source_id": "D-10", - "target_id": "D-31", - "ref_type": "references", - "note": "**Rationale:** SDK-shipped, zero deps, trivial to fake in tests (hand-rolled fakes in [D-25](testing.md#d-25-mocks-mocktail-at-io-plus-hand-rolled-fakes)). Violates [D-31 prefer-zero-deps](tooling...." - }, - { - "source_id": "D-10", - "target_id": "R-8", - "ref_type": "references", - "note": "**Rationale:** SDK-shipped, zero deps, trivial to fake in tests (hand-rolled fakes in [D-25](testing.md#d-25-mocks-mocktail-at-io-plus-hand-rolled-fakes)). Violates [D-31 prefer-zero-deps](tooling...." - }, - { - "source_id": "D-16", - "target_id": "D-19", - "ref_type": "references", - "note": "**Decision:** Bundled extensions (every `app/lib/builtin/\u003cname\u003e`) are Dart — they link into the app binary. Third-party extensions (Tier 6) run in sandboxed Lua via the `ptyc`-peer Lua runtime (s..." - }, - { - "source_id": "D-18", - "target_id": "D-21", - "ref_type": "references", - "note": "**Decision:** Themes and extension manifests are YAML; i18n catalogues are JSON (fframe parity — see [D-21](accessibility.md#d-21-i18n-is-a-tier-0-contract))." - }, - { - "source_id": "D-21", - "target_id": "R-4", - "ref_type": "references", - "note": "**Rationale:** Flutter's `intl` + ARB codegen is inflexible for plugin-contributed catalogs (see [R-4](rejected.md#r-4-flutter-intl-and-arb-codegen)) — we need per-extension catalogs that merge w..." - }, - { - "source_id": "D-23", - "target_id": "D-29", - "ref_type": "references", - "note": "**Cost:** Seven CI jobs; total wall time budgeted at \u003c 15 min. Pre-push runs layers 1-4 (\u003c 90 s — see [D-29](#d-29-pre-push-gate-fast-layer-only))." - }, - { - "source_id": "D-26", - "target_id": "D-20", - "ref_type": "references", - "note": "**Rationale:** Patrol adds a dependency for a capability we get from semantics + Playwright directly. Labels are the a11y tree we already contract to maintain ([D-20](accessibility.md#d-20-a11y-is-..." - }, - { - "source_id": "D-3", - "target_id": "D-39", - "ref_type": "references", - "note": "**Raised by:** Ported from the claudian lineage. Load-bearing for [D-39](process.md#d-39-planning-tooling-lives-in-pql)." - }, - { - "source_id": "D-3", - "target_id": "D-4", - "ref_type": "references", - "note": "**Decision:** Two complementary rules. **(1) Wrap, don't duplicate.** Clide never re-implements backlinks, ranking, frontmatter parsing, or wikilink resolution for query purposes. If a capability i..." - }, - { - "source_id": "D-35", - "target_id": "Q-22", - "ref_type": "references", - "note": "**Cost:** No natural \"sprint close\" event to sync shared state. See [Q-22](questions-process.md#q-22-ticket-persistence-strategy)." - }, - { - "source_id": "D-39", - "target_id": "D-3", - "ref_type": "references", - "note": "**Decision:** Planning subcommands (`decisions`, `ticket`, `plan`) land in pql's repo long-term. Clide consumes them via shell-out, matching [D-3](architecture.md)'s wrap-don't-duplicate rule for p..." - }, - { - "source_id": "D-39", - "target_id": "D-40", - "ref_type": "references", - "note": "**Cost:** Planning features don't ship until pql catches up. Mitigated by [D-40](#d-40-python-stopgap-under-toolsscriptsplan). Gated by [Q-21](questions-process.md#q-21-pql-absorbs-planning-vs-keep..." - }, - { - "source_id": "D-39", - "target_id": "Q-21", - "ref_type": "references", - "note": "**Cost:** Planning features don't ship until pql catches up. Mitigated by [D-40](#d-40-python-stopgap-under-toolsscriptsplan). Gated by [Q-21](questions-process.md#q-21-pql-absorbs-planning-vs-keep..." - }, - { - "source_id": "D-39", - "target_id": "R-9", - "ref_type": "references", - "note": "**Rationale:** A terminal user or a user in VS Code / JetBrains still needs Q\u0026D access. Binding planning tooling to clide-the-Flutter-app would cut them off from their own work — see [R-9](reject..." - }, - { - "source_id": "D-4", - "target_id": "D-3", - "ref_type": "references", - "note": "**Decision:** One mechanism everywhere: the `ignore_files:` list in `.pql/config.yaml`. Ordered list of gitignore-shaped files; later entries win on per-pattern conflicts. pql defaults to `ignore_f..." - }, - { - "source_id": "D-40", - "target_id": "R-10", - "ref_type": "references", - "note": "**Cost:** Python dep on contributors' machines (already present on most Linux dists). One time-limited tool to maintain. See [R-10](rejected.md#r-10-python-script-stopgap-at-toolingdb) for why `too..." - }, - { - "source_id": "D-40", - "target_id": "R-11", - "ref_type": "references", - "note": "**Sunset:** Delete the stopgap when pql ships `pql decisions sync | validate | list | show | claim | coverage` + `pql ticket new | list | show | status | assign | block | board` with feature parity..." - }, - { - "source_id": "D-41", - "target_id": "D-5", - "ref_type": "references", - "note": "**Cross-reference:** [`D-5`](#d-5-dart-core-sidecar-dissolved-ptyc-as-pql-peer) (ptyc as the spawn primitive tmux runs under), [`D-6`](#d-6-cli-and-event-surface-contract) (pane.\\* IPC surface), [`..." - }, - { - "source_id": "D-41", - "target_id": "D-6", - "ref_type": "references", - "note": "**Cross-reference:** [`D-5`](#d-5-dart-core-sidecar-dissolved-ptyc-as-pql-peer) (ptyc as the spawn primitive tmux runs under), [`D-6`](#d-6-cli-and-event-surface-contract) (pane.\\* IPC surface), [`..." - }, - { - "source_id": "D-41", - "target_id": "R-9", - "ref_type": "references", - "note": "**Cross-reference:** [`D-5`](#d-5-dart-core-sidecar-dissolved-ptyc-as-pql-peer) (ptyc as the spawn primitive tmux runs under), [`D-6`](#d-6-cli-and-event-surface-contract) (pane.\\* IPC surface), [`..." - }, - { - "source_id": "D-42", - "target_id": "D-31", - "ref_type": "references", - "note": "**Rationale:** Complements [D-31](#d-31-prefer-zero-deps-exact-pin). Prefer-zero-deps is a *budget*; `licenses.yaml` is the *visible consequence*. An extra row in the About screen is a review-time ..." - }, - { - "source_id": "D-43", - "target_id": "D-7", - "ref_type": "references", - "note": "**Decision:** The claude.ai/design handoff (`docs/claude-design/`) delivers hi-fi mockups, interaction flows, a design system, and four theme palettes (clide, midnight, paper, terminal) as Dart fil..." - }, - { - "source_id": "D-43", - "target_id": "D-9", - "ref_type": "references", - "note": "**Cross-reference:** [D-7](#d-7-app-root-is-bare-widgetsapp), [D-9](#d-9-three-tier-theme-pipeline), [R-12](rejected.md#r-12-materialapp-wrapper-from-design-handoff)." - }, - { - "source_id": "D-43", - "target_id": "R-12", - "ref_type": "references", - "note": "**Cross-reference:** [D-7](#d-7-app-root-is-bare-widgetsapp), [D-9](#d-9-three-tier-theme-pipeline), [R-12](rejected.md#r-12-materialapp-wrapper-from-design-handoff)." - }, - { - "source_id": "D-44", - "target_id": "D-22", - "ref_type": "references", - "note": "**Cross-reference:** [D-43](#d-43-design-handoff-adopt-token-palettes-reject-material-wrapper), [D-22](accessibility.md#d-22-wcag-aa-contrast-gate-on-bundled-themes)." - }, - { - "source_id": "D-44", - "target_id": "D-43", - "ref_type": "references", - "note": "**Cross-reference:** [D-43](#d-43-design-handoff-adopt-token-palettes-reject-material-wrapper), [D-22](accessibility.md#d-22-wcag-aa-contrast-gate-on-bundled-themes)." - }, - { - "source_id": "D-45", - "target_id": "Q-15", - "ref_type": "references", - "note": "**Decision:** Add syntax-role colour tokens to `SurfaceTokens`: keyword, type, string, number, comment, method, punctuation. Each bundled theme defines these. The editor and diff views consume them..." - }, - { - "source_id": "D-47", - "target_id": "D-11", - "ref_type": "references", - "note": "**Decision:** The prompt bar is pinned to a fixed Y-position in the middle column; every other surface makes room *around* Claude — never on top, never pushing the prompt off-Y. Three hard rules:..." - }, - { - "source_id": "D-47", - "target_id": "D-48", - "ref_type": "references", - "note": "**Cross-reference:** [D-11](#d-11-panel-manager-is-kernel-layout-is-data-three-column-is-a-preset), [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first), [D-49](#d-49-editor-mode-inlin..." - }, - { - "source_id": "D-47", - "target_id": "D-49", - "ref_type": "references", - "note": "**Cost:** The prompt bar invariant constrains future layout presets — any preset that repositions Claude must explicitly break this rule. Editor mode (see [D-49](#d-49-editor-mode-inline-above-cl..." - }, - { - "source_id": "D-48", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-49](#d-49-editor-mode-inline-above-claude-viewer-swap)." - }, - { - "source_id": "D-48", - "target_id": "D-49", - "ref_type": "references", - "note": "**Rationale:** Every pixel of chrome that isn't Claude is a tax on the \"Claude is home\" principle. Tabs and breadcrumbs are navigation affordances for a multi-buffer editor; clide's editor is a sec..." - }, - { - "source_id": "D-48", - "target_id": "Q-27", - "ref_type": "references", - "note": "**Decision:** Clide deletes classic IDE chrome: no buffer tabs, no breadcrumbs, no VS Code-style activity bar, no separate status bar row (merged into app strip). Total persistent chrome: 2 edge ar..." - }, - { - "source_id": "D-49", - "target_id": "D-47", - "ref_type": "references", - "note": "**Rationale:** The editor is not a primary surface — it's a temporary intervention. Claude's prompt bar must never move ([D-47](#d-47-interaction-model-claude-is-home-layout)), so the editor open..." - }, - { - "source_id": "D-49", - "target_id": "D-48", - "ref_type": "references", - "note": "**Cost:** Only one file in the editor at a time (no tabs per [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first)). Power users wanting two files side-by-side must wait for split (see ..." - }, - { - "source_id": "D-49", - "target_id": "Q-27", - "ref_type": "references", - "note": "**Cost:** Only one file in the editor at a time (no tabs per [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first)). Power users wanting two files side-by-side must wait for split (see ..." - }, - { - "source_id": "D-5", - "target_id": "D-56", - "ref_type": "references", - "note": "**Amendment (2026-04-23):** The separate daemon process and two-package layout are dissolved per [D-56](#d-56-dissolve-daemon-process-flutter-app-hosts-ipc-server). Dart-core and ptyc-as-peer princ..." - }, - { - "source_id": "D-5", - "target_id": "R-2", - "ref_type": "references", - "note": "**Date:** 2026-04-20 (was ADR 0005; supersedes [R-2](rejected.md#r-2-go-sidecar))" - }, - { - "source_id": "D-50", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-51](#d-51-panel-collapse-12px-spine-with-badge)." - }, - { - "source_id": "D-50", - "target_id": "D-51", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-51](#d-51-panel-collapse-12px-spine-with-badge)." - }, - { - "source_id": "D-51", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-50](#d-50-context-auto-behavior-right-panel-reacts-to-claude)." - }, - { - "source_id": "D-51", - "target_id": "D-50", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-50](#d-50-context-auto-behavior-right-panel-reacts-to-claude)." - }, - { - "source_id": "D-51", - "target_id": "D-53", - "ref_type": "references", - "note": "**Cost:** The spine replaces the current simple `setVisible(false)` toggle with a real collapsed-state widget. Collapse state must be persisted across sessions (see [D-53](#d-53-state-persistence-a..." - }, - { - "source_id": "D-52", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-53](#d-53-state-persistence-across-sessions)." - }, - { - "source_id": "D-52", - "target_id": "D-53", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-53](#d-53-state-persistence-across-sessions)." - }, - { - "source_id": "D-53", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-51](#d-51-panel-collapse-12px-spine-with-badge), [D-52](#d-52-focus-mode-full-window-takeover)." - }, - { - "source_id": "D-53", - "target_id": "D-51", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-51](#d-51-panel-collapse-12px-spine-with-badge), [D-52](#d-52-focus-mode-full-window-takeover)." - }, - { - "source_id": "D-53", - "target_id": "D-52", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-51](#d-51-panel-collapse-12px-spine-with-badge), [D-52](#d-52-focus-mode-full-window-takeover)." - }, - { - "source_id": "D-54", - "target_id": "D-17", - "ref_type": "references", - "note": "**Cost:** Some shortcuts may conflict with OS-level bindings on specific Linux desktops; the keybinding resolver ([D-17](extensions.md#d-17-panels-are-extension-shaped-from-day-one)) allows user ov..." - }, - { - "source_id": "D-54", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first), [D-52](#d-52-focus-mode-full-window-takeover)." - }, - { - "source_id": "D-54", - "target_id": "D-48", - "ref_type": "references", - "note": "**Rationale:** These shortcuts follow the \"keyboard is the primary surface\" principle from [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first). The set is minimal and covers all layou..." - }, - { - "source_id": "D-54", - "target_id": "D-52", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout), [D-48](#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first), [D-52](#d-52-focus-mode-full-window-takeover)." - }, - { - "source_id": "D-54", - "target_id": "Q-26", - "ref_type": "references", - "note": "**Decision:** Canonical keyboard shortcuts (cross-platform, `⌘` = `Ctrl` on Linux): `⌘P` fuzzy find overlay; `⌘⇧1` / `⌘⇧3` collapse/expand left / right panel; `⌘1` / `⌘2` / `⌘3` f..." - }, - { - "source_id": "D-55", - "target_id": "D-41", - "ref_type": "references", - "note": "**Decision:** Multiple Claude sessions share the workspace as internal tabs inside the Claude pane header — not as workspace-level tabs (which would violate [D-48](#d-48-chrome-budget-no-tabs-no-..." - }, - { - "source_id": "D-55", - "target_id": "D-47", - "ref_type": "references", - "note": "**Rationale:** The workspace is Claude's space ([D-47](#d-47-interaction-model-claude-is-home-layout)). Multiple Claude sessions are a Claude concern, not a workspace concern. Internal tabs keep th..." - }, - { - "source_id": "D-55", - "target_id": "D-48", - "ref_type": "references", - "note": "**Decision:** Multiple Claude sessions share the workspace as internal tabs inside the Claude pane header — not as workspace-level tabs (which would violate [D-48](#d-48-chrome-budget-no-tabs-no-..." - }, - { - "source_id": "D-56", - "target_id": "D-1", - "ref_type": "references", - "note": "**Cross-reference:** [D-5](#d-5-dart-core-sidecar-dissolved-ptyc-as-pql-peer) (amended), [D-41](#d-41-claude-panes-one-primary-per-repo-tmux-backed) (tmux persistence), [D-1](#d-1-cli-first-not-mcp..." - }, - { - "source_id": "D-56", - "target_id": "D-41", - "ref_type": "references", - "note": "**Decision:** The separate Dart daemon process (`clide --daemon`) and the two-package repo layout (`lib/` core + `app/` Flutter) are dissolved. The Flutter app moves to the repo root (one `pubspec...." - }, - { - "source_id": "D-56", - "target_id": "D-5", - "ref_type": "references", - "note": "**Amendment to [D-5](#d-5-dart-core-sidecar-dissolved-ptyc-as-pql-peer):** D-5's \"two execution modes of one Dart AOT binary\" premise assumed the daemon needed to outlive the app to preserve PTY se..." - }, - { - "source_id": "D-57", - "target_id": "D-31", - "ref_type": "references", - "note": "**Rationale:** The GTK headerbar wastes 30+ vertical pixels and clashes with the custom theme. Per-column hats add zero net rows — they reuse the space each column header already occupied. Custom..." - }, - { - "source_id": "D-57", - "target_id": "D-47", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout) (center hat always visible), [D-51](#d-51-panel-collapse-12px-spine-with-badge) (spine-cap behavior)." - }, - { - "source_id": "D-57", - "target_id": "D-51", - "ref_type": "references", - "note": "**Cross-reference:** [D-47](#d-47-interaction-model-claude-is-home-layout) (center hat always visible), [D-51](#d-51-panel-collapse-12px-spine-with-badge) (spine-cap behavior)." - }, - { - "source_id": "D-57", - "target_id": "Q-6", - "ref_type": "resolves", - "note": "**Resolves:** [Q-6](questions-architecture.md#q-6-window-chrome-native-frame-vs-frameless-custom)." - }, - { - "source_id": "D-58", - "target_id": "D-31", - "ref_type": "references", - "note": "**Amendment to D-31 (prefer-zero-deps):** D-31's \"prefer-zero-deps\" still applies — every new dependency needs justification. This record clarifies that format engines clear the justification bar..." - }, - { - "source_id": "D-58", - "target_id": "D-42", - "ref_type": "references", - "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml)." - }, - { - "source_id": "D-6", - "target_id": "D-1", - "ref_type": "references", - "note": "**Context:** [D-1](#d-1-cli-first-not-mcp) established that Claude drives clide via a Bash CLI. That decided the *channel* — it did not define the *surface*. CLAUDE.md stated the rule colloquiall..." - }, - { - "source_id": "D-6", - "target_id": "Q-1", - "ref_type": "references", - "note": "**Cost:** Replay-buffer memory per subsystem (cheap — most emit seldom). Back-pressure on firehose streams ([Q-2](questions-architecture.md#q-2-back-pressure-on-event-streams)), authorisation gra..." - }, - { - "source_id": "D-6", - "target_id": "Q-2", - "ref_type": "references", - "note": "**Cost:** Replay-buffer memory per subsystem (cheap — most emit seldom). Back-pressure on firehose streams ([Q-2](questions-architecture.md#q-2-back-pressure-on-event-streams)), authorisation gra..." - }, - { - "source_id": "D-6", - "target_id": "Q-3", - "ref_type": "references", - "note": "**Cost:** Replay-buffer memory per subsystem (cheap — most emit seldom). Back-pressure on firehose streams ([Q-2](questions-architecture.md#q-2-back-pressure-on-event-streams)), authorisation gra..." - }, - { - "source_id": "D-6", - "target_id": "Q-5", - "ref_type": "references", - "note": "**Rationale:** Surface is enumerable — adding a subsystem means adding a row and specifying verbs + events. Wire schema is versioned (`v: 1` starting point; compatibility breaks bump the major an..." - }, - { - "source_id": "D-7", - "target_id": "D-9", - "ref_type": "references", - "note": "**Rationale:** Clide is a Linux-primary desktop IDE with a custom theme pipeline and custom primitives (panels, tabs, panes, canvas). Material's implicit theming collides with [D-9](#d-9-three-tier..." - }, - { - "source_id": "D-7", - "target_id": "R-3", - "ref_type": "references", - "note": "**Cost:** We build and own every primitive; no `ElevatedButton` fallback. See [R-3](rejected.md#r-3-materialapp-root) and [R-7](rejected.md#r-7-cupertinoapp-root)." - }, - { - "source_id": "D-7", - "target_id": "R-7", - "ref_type": "references", - "note": "**Cost:** We build and own every primitive; no `ElevatedButton` fallback. See [R-3](rejected.md#r-3-materialapp-root) and [R-7](rejected.md#r-7-cupertinoapp-root)." - }, - { - "source_id": "D-9", - "target_id": "D-22", - "ref_type": "references", - "note": "**Cost:** Three layers to keep coherent per theme. Contrast gate ([D-22](accessibility.md#d-22-wcag-aa-contrast-gate-on-bundled-themes)) enforces the semantic layer on every bundled theme." - }, - { - "source_id": "Q-1", - "target_id": "D-6", - "ref_type": "references", - "note": "**Source:** ADR 0006 (migrated to [D-6](architecture.md))." - }, - { - "source_id": "Q-10", - "target_id": "Q-5", - "ref_type": "references", - "note": "**Question:** What's the manifest schema-version scheme and bump policy? Coupled with [Q-5](questions-architecture.md#q-5-ipc-wire-format-stability) (IPC wire format) — both want a versioning story." - }, - { - "source_id": "Q-12", - "target_id": "D-22", - "ref_type": "references", - "note": "**Question:** [D-22](accessibility.md#d-22-wcag-aa-contrast-gate-on-bundled-themes) gates contrast at build time. Do we also run axe-core against the WASM build in Playwright for runtime a11y issue..." - }, - { - "source_id": "Q-14", - "target_id": "D-31", - "ref_type": "references", - "note": "**Question:** fframe's pattern covers straight key→string lookup with variable interpolation. Plurals, gendered forms, and ICU-style date formatting aren't in scope there. Do we add them to the i..." - }, - { - "source_id": "Q-16", - "target_id": "Q-15", - "ref_type": "references", - "note": "**Context:** If tree-sitter is the Tier-2 answer ([Q-15](#q-15-editor-tab-full-lsp-vs-tree-sitter-only)), grammar sourcing matters." - }, - { - "source_id": "Q-17", - "target_id": "R-6", - "ref_type": "references", - "note": "**Context:** We rejected Nerd-font glyphs ([R-6](rejected.md#r-6-nerd-font-glyph-icons)); something has to fill the gap." - }, - { - "source_id": "Q-19", - "target_id": "D-40", - "ref_type": "references", - "note": "**Note:** Earlier floated as \"ticket markdown mirror vs SQLite\" — no longer a split question. Markdown mirror is tracked in [Q-22](questions-architecture.md#q-22-ticket-persistence-strategy); SQL..." - }, - { - "source_id": "Q-19", - "target_id": "Q-22", - "ref_type": "references", - "note": "**Note:** Earlier floated as \"ticket markdown mirror vs SQLite\" — no longer a split question. Markdown mirror is tracked in [Q-22](questions-architecture.md#q-22-ticket-persistence-strategy); SQL..." - }, - { - "source_id": "Q-2", - "target_id": "D-6", - "ref_type": "references", - "note": "**Source:** ADR 0006 (migrated to [D-6](architecture.md))." - }, - { - "source_id": "Q-20", - "target_id": "D-12", - "ref_type": "references", - "note": "**Question:** Do extensions get namespaced SQL access to `.clide/clide.db` (tables prefixed `ext_\u003cid\u003e_…`) or stay on the `kernel.settings` key/value facade? Admission-level question ([D-12](archi..." - }, - { - "source_id": "Q-21", - "target_id": "D-3", - "ref_type": "references", - "note": "**Question:** Three shapes for planning tooling's long-term home: (A) Pql absorbs planning — `pql decisions …` + `pql ticket …` subcommands; clide shells out. (B) Clide absorbs pql — revers..." - }, - { - "source_id": "Q-21", - "target_id": "D-39", - "ref_type": "references", - "note": "**Context:** User is leaning (A). This plan assumes (A) without committing. If (A) doesn't land, [D-40](process.md#d-40-python-stopgap-under-toolsscriptsplan)'s sunset condition changes. Gates all ..." - }, - { - "source_id": "Q-21", - "target_id": "D-40", - "ref_type": "references", - "note": "**Context:** User is leaning (A). This plan assumes (A) without committing. If (A) doesn't land, [D-40](process.md#d-40-python-stopgap-under-toolsscriptsplan)'s sunset condition changes. Gates all ..." - }, - { - "source_id": "Q-21", - "target_id": "R-9", - "ref_type": "references", - "note": "**Context:** User is leaning (A). This plan assumes (A) without committing. If (A) doesn't land, [D-40](process.md#d-40-python-stopgap-under-toolsscriptsplan)'s sunset condition changes. Gates all ..." - }, - { - "source_id": "Q-22", - "target_id": "Q-21", - "ref_type": "references", - "note": "**Question:** Once [Q-21](#q-21-pql-absorbs-planning-vs-keeps-separate) resolves in favour of (A), how do tickets handle shared team state? (1) Never commit (per-dev, ephemeral — works for solo)...." - }, - { - "source_id": "Q-23", - "target_id": "D-5", - "ref_type": "references", - "note": "**Context:** Surfaced 2026-04-22 during Tier-1 planning. Not a Tier 1 concern — terminal + Claude panes land local-first — but the daemon/IPC seam decisions (notably `D-5` and `D-6`) constrain ..." - }, - { - "source_id": "Q-23", - "target_id": "D-6", - "ref_type": "references", - "note": "**Context:** Surfaced 2026-04-22 during Tier-1 planning. Not a Tier 1 concern — terminal + Claude panes land local-first — but the daemon/IPC seam decisions (notably `D-5` and `D-6`) constrain ..." - }, - { - "source_id": "Q-27", - "target_id": "D-48", - "ref_type": "references", - "note": "**Context:** [D-48](architecture.md#d-48-chrome-budget-no-tabs-no-breadcrumbs-keyboard-first) deletes buffer tabs. A two-editor split would be the only way to compare files side-by-side without usi..." - }, - { - "source_id": "Q-3", - "target_id": "D-6", - "ref_type": "references", - "note": "**Source:** ADR 0006 (migrated to [D-6](architecture.md))." - }, - { - "source_id": "Q-30", - "target_id": "D-47", - "ref_type": "references", - "note": "**Context:** This intersects [D-47](architecture.md#d-47-interaction-model-claude-is-home-layout) (Claude is home) and [D-49](architecture.md#d-49-editor-mode-inline-above-claude-viewer-swap) (edit..." - }, - { - "source_id": "Q-30", - "target_id": "D-49", - "ref_type": "references", - "note": "**Context:** This intersects [D-47](architecture.md#d-47-interaction-model-claude-is-home-layout) (Claude is home) and [D-49](architecture.md#d-49-editor-mode-inline-above-claude-viewer-swap) (edit..." - }, - { - "source_id": "Q-31", - "target_id": "D-57", - "ref_type": "references", - "note": "**Question:** The frameless window (D-57) currently forces `GDK_BACKEND=x11` because GTK3 doesn't implement the `xdg-decoration` Wayland protocol and KWin ignores `gtk_window_set_decorated(FALSE)` ..." - }, - { - "source_id": "Q-5", - "target_id": "D-6", - "ref_type": "references", - "note": "**Context:** Covered partially by [D-6](architecture.md)'s `v: 1` starting point; CLAUDE.md flags this as \"decide when the first real subcommand lands.\"" - }, - { - "source_id": "Q-6", - "target_id": "D-57", - "ref_type": "references", - "note": "**Status:** Resolved → [D-57](architecture.md#d-57-frameless-custom-chrome-with-per-column-24px-hats)" - }, - { - "source_id": "Q-8", - "target_id": "D-6", - "ref_type": "references", - "note": "**Question:** Should extensions contribute widgets (panels, tabs, status-bar items), subcommands (CLI verbs), or both? Both is the obvious answer but has a cost in API surface that must be designed..." - }, - { - "source_id": "Q-9", - "target_id": "D-19", - "ref_type": "references", - "note": "**Question:** Does the Lua supporter tool ([D-19](extensions.md#d-19-lua-runtime-as-ptyc-peer-supporter-tool)) bundle liblua source (build with the binary) or link system liblua (smaller binary, fr..." - }, - { - "source_id": "R-10", - "target_id": "D-40", - "ref_type": "references", - "note": "**Reason:** Location, not language. Settled-reach puts scripts at `tooling/db/` — copying that path here creates a script-pollution problem: every project using the pattern commits its own copy. ..." - }, - { - "source_id": "R-11", - "target_id": "D-40", - "ref_type": "references", - "note": "**Cross-reference:** [D-40](process.md#d-40-python-stopgap-under-toolsscriptsplan)" - }, - { - "source_id": "R-12", - "target_id": "D-43", - "ref_type": "references", - "note": "**Cross-reference:** [D-43](architecture.md#d-43-design-handoff-adopt-token-palettes-reject-material-wrapper)" - }, - { - "source_id": "R-12", - "target_id": "D-7", - "ref_type": "references", - "note": "**Reason:** The design handoff delivers theme files as `MaterialApp`/`ThemeData` Dart classes. This is the delivery format of claude.ai/design, not a design intent. Adopting Material's widget syste..." - }, - { - "source_id": "R-2", - "target_id": "D-5", - "ref_type": "references", - "note": "**Rejected:** 2026-04-20 (was ADR 0002; superseded by [D-5](architecture.md#d-5-dart-core-ptyc-peer))" - }, - { - "source_id": "R-3", - "target_id": "D-7", - "ref_type": "references", - "note": "**Cross-reference:** [D-7](architecture.md#d-7-app-root-is-bare-widgetsapp)" - }, - { - "source_id": "R-3", - "target_id": "D-9", - "ref_type": "references", - "note": "**Reason:** Dragged in Material theming, default icons, and platform chrome that fought the custom three-tier theme pipeline ([D-9](architecture.md#d-9-three-tier-theme-pipeline)). Every bundled th..." - }, - { - "source_id": "R-4", - "target_id": "D-21", - "ref_type": "references", - "note": "**Cross-reference:** [D-21](accessibility.md#d-21-i18n-is-a-tier-0-contract)" - }, - { - "source_id": "R-5", - "target_id": "D-26", - "ref_type": "references", - "note": "**Cross-reference:** [D-26](testing.md#d-26-web-driver-raw-playwright-plus-flutter-semantics)" - }, - { - "source_id": "R-5", - "target_id": "D-31", - "ref_type": "references", - "note": "**Reason:** Adds a dependency (violates [D-31](tooling.md#d-31-prefer-zero-deps-exact-pin)) for a capability we get from Playwright + Flutter's own semantics tree. Patrol's value proposition (nativ..." - }, - { - "source_id": "R-6", - "target_id": "Q-17", - "ref_type": "references", - "note": "**Cross-reference:** [Q-17](questions-process.md#q-17-icon-set-growth)" - }, - { - "source_id": "R-7", - "target_id": "D-7", - "ref_type": "references", - "note": "**Cross-reference:** [D-7](architecture.md#d-7-app-root-is-bare-widgetsapp)" - }, - { - "source_id": "R-7", - "target_id": "R-3", - "ref_type": "references", - "note": "**Reason:** iOS-opinionated; wrong shell for a Linux-primary desktop IDE. Same theming-collision problem as [R-3](#r-3-materialapp-root)." - }, - { - "source_id": "R-8", - "target_id": "D-10", - "ref_type": "references", - "note": "**Cross-reference:** [D-10](architecture.md#d-10-state-management-changenotifier)" - }, - { - "source_id": "R-8", - "target_id": "D-31", - "ref_type": "references", - "note": "**Reason:** Violates [D-31](tooling.md#d-31-prefer-zero-deps-exact-pin). `ChangeNotifier` + `ListenableBuilder` ship in the SDK, fake trivially, and cover the state model we need. The ergonomic win..." - }, - { - "source_id": "R-9", - "target_id": "D-39", - "ref_type": "references", - "note": "**Reason:** Earlier in the planning session the assumption was \"clide owns Dart subcommands for decisions + tickets.\" That breaks the day a contributor works in a terminal or in VS Code / JetBrains..." - } - ], - "tickets": [ - { - "id": "T-1", - "type": "task", - "parent_id": "T-6", - "title": "validate pql init installation cycle", - "status": "done", - "priority": "medium", - "decision_ref": "D-39", - "created_at": "2026-04-22 09:41:51", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-2", - "type": "epic", - "title": "Tier 0 — app + daemon handshake, empty IDE shell", - "status": "done", - "priority": "medium", - "decision_ref": "D-7", - "created_at": "2026-04-22 11:45:26", - "updated_at": "2026-04-22 11:46:33" - }, - { - "id": "T-3", - "type": "epic", - "title": "Tier 1 — Claude in xterm pane, PTY, session persistence", - "status": "done", - "priority": "medium", - "decision_ref": "D-41", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 11:46:37" - }, - { - "id": "T-4", - "type": "epic", - "title": "Tier 2 — pane model, editor, active-file awareness, CLI", - "status": "done", - "priority": "medium", - "decision_ref": "D-6", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 11:46:44" - }, - { - "id": "T-5", - "type": "epic", - "title": "Tier 3 — git panel, diff tab, clide git CLI", - "status": "done", - "priority": "medium", - "decision_ref": "D-13", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 11:46:48" - }, - { - "id": "T-6", - "type": "epic", - "title": "Tier 4 — pql integration: query panel, file tree, backlinks, problems", - "status": "done", - "priority": "medium", - "decision_ref": "D-3", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 12:03:54" - }, - { - "id": "T-7", - "type": "epic", - "title": "Tier 5 — canvas and graph view", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-17", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 11:45:41" - }, - { - "id": "T-8", - "type": "epic", - "title": "Tier 6 — extension API, settings, theming, distributable builds", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-15", - "created_at": "2026-04-22 11:45:41", - "updated_at": "2026-04-22 11:45:41" - }, - { - "id": "T-9", - "type": "task", - "parent_id": "T-2", - "title": "Q\u0026D record system + ADR migration", - "status": "done", - "priority": "medium", - "decision_ref": "D-34", - "created_at": "2026-04-22 11:47:02", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-10", - "type": "task", - "parent_id": "T-2", - "title": "Python stopgap tooling", - "status": "done", - "priority": "medium", - "decision_ref": "D-40", - "created_at": "2026-04-22 11:47:02", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-11", - "type": "task", - "parent_id": "T-6", - "title": "pql skill install + stopgap removal", - "status": "done", - "priority": "medium", - "decision_ref": "D-39", - "created_at": "2026-04-22 11:47:02", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-12", - "type": "task", - "parent_id": "T-2", - "title": "bundled dependency licensing", - "status": "done", - "priority": "medium", - "decision_ref": "D-42", - "created_at": "2026-04-22 11:47:03", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-13", - "type": "task", - "parent_id": "T-6", - "title": "pql query panel — sidebar tab for vault queries", - "status": "done", - "priority": "medium", - "decision_ref": "D-3", - "created_at": "2026-04-22 11:47:18", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-14", - "type": "task", - "parent_id": "T-6", - "title": "pql-backed file tree — replace or augment files.ls with pql files", - "status": "done", - "priority": "medium", - "decision_ref": "D-3", - "created_at": "2026-04-22 11:47:18", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-15", - "type": "task", - "parent_id": "T-6", - "title": "backlinks panel — show inbound links to active file", - "status": "done", - "priority": "medium", - "decision_ref": "D-3", - "created_at": "2026-04-22 11:47:18", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-16", - "type": "task", - "parent_id": "T-6", - "title": "problems panel — surface pql doctor + validate warnings", - "status": "done", - "priority": "medium", - "decision_ref": "D-3", - "created_at": "2026-04-22 11:47:18", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-17", - "type": "task", - "parent_id": "T-8", - "title": "add dart doc generation to CI", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-32", - "created_at": "2026-04-22 13:26:29", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-18", - "type": "task", - "title": "audit error handling in PTY and IPC critical paths", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-5", - "created_at": "2026-04-22 13:26:29", - "updated_at": "2026-04-22 13:26:29" - }, - { - "id": "T-19", - "type": "task", - "parent_id": "T-2", - "title": "translate four design themes into YAML theme files", - "status": "done", - "priority": "medium", - "decision_ref": "D-44", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-20", - "type": "task", - "parent_id": "T-2", - "title": "expand SurfaceTokens with syntax highlighting roles", - "status": "done", - "priority": "medium", - "decision_ref": "D-45", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-21", - "type": "task", - "parent_id": "T-4", - "title": "implement welcome screen per hi-fi design", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-43", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-22", - "type": "task", - "parent_id": "T-4", - "title": "multi-buffer editor tabs", - "status": "cancelled", - "priority": "medium", - "decision_ref": "D-6", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-23", - "type": "task", - "parent_id": "T-4", - "title": "wire command palette keybinding", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-6", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-24", - "type": "task", - "parent_id": "T-3", - "title": "secondary Claude pane UI wiring", - "status": "backlog", - "priority": "medium", - "decision_ref": "D-41", - "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-25", - "type": "task", - "parent_id": "T-8", - "title": "CI reproducible build for libtree-sitter.so", - "description": "BUILD.md at app/native/linux-x64/ has TODO checklist: build from pinned source SHA in CI, record SHA-256, cross-compile for macOS (aarch64, x86_64) and Windows (x86_64). Currently built on contributor machine.", - "status": "backlog", - "priority": "medium", - "created_at": "2026-04-22 20:14:24", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-26", - "type": "task", - "parent_id": "T-8", - "title": "web-tree-sitter via JS interop for browser builds", - "description": "Conditional import behind TreeSitterService: native impl uses dart:ffi to libtree-sitter.so, web impl uses dart:js_interop to web-tree-sitter (official emscripten build from tree-sitter org). Same grammar .wasm files on both platforms. Vendor web-tree-sitter .wasm + JS glue as Flutter web assets, pinned version, added to licenses.yaml.", - "status": "backlog", - "priority": "medium", - "created_at": "2026-04-22 20:14:33", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-27", - "type": "task", - "parent_id": "T-8", - "title": "migrate shipped extensions from builtin/ to extensions/ per D-46", - "description": "D-46 defines the boundary: content extensions (editor, claude, claude-control, markdown, diff, git-ui, pql, canvas, graph, decisions, tickets, todos, problems) move from app/lib/builtin/ to app/lib/extensions/. Incremental — one at a time, each behind a working build. Extension contract must support bundled Dart extension as a first-class category.", - "status": "backlog", - "priority": "medium", - "created_at": "2026-04-22 20:14:45", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-28", - "type": "task", - "parent_id": "T-8", - "title": "feed POLICY.md rules into D-records", - "description": "POLICY.md (added 2026-04-22) defines rules for: no-network-on-default-launch-path, dependency vetting checklist, vendored binary rebuild process, telemetry prohibition, license compatibility matrix. These need corresponding D-records in decisions/ so the architectural decision trail is complete. Some may overlap with or supersede existing D-records.", - "status": "backlog", - "priority": "medium", - "created_at": "2026-04-22 20:14:52", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-29", - "type": "story", - "parent_id": "T-4", - "title": "editor respects .editorconfig settings", - "description": "When a file is opened in the editor, read .editorconfig from the workspace root and apply: indent_style, indent_size, max_line_length (ruler/wrap guide), end_of_line, trim_trailing_whitespace, insert_final_newline. Parse the INI format ourselves (small, no dep). Glob matching per the EditorConfig spec.", - "status": "backlog", - "priority": "medium", - "created_at": "2026-04-22 20:17:26", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-30", - "type": "story", - "title": "Implement 12px collapse spine for side panels", - "description": "Replace current visibility toggle with a 12px spine widget: rotated label, paper-2 bg, inner-edge border, click-to-expand, badge dot with count for pending context.", - "status": "done", - "priority": "high", - "decision_ref": "D-51", - "created_at": "2026-04-22 20:33:53", - "updated_at": "2026-04-22 20:38:51" - }, - { - "id": "T-31", - "type": "story", - "title": "Implement focus mode (full-window takeover)", - "description": "Focus mode via double-click header, hover ⛶ glyph, or ⌘. shortcut. Snapshot LayoutArrangement on enter, restore on Esc. Show Esc hint in header.", - "status": "done", - "priority": "medium", - "decision_ref": "D-52", - "created_at": "2026-04-22 20:33:56", - "updated_at": "2026-04-22 20:38:51" - }, - { - "id": "T-32", - "type": "story", - "title": "Persist layout state across sessions", - "description": "Save collapse state, active sections, pql pane state, editor split ratio, and fuzzy find recent picks to .clide/settings.yaml via SettingsStore. Restore on boot.", - "status": "done", - "priority": "medium", - "decision_ref": "D-53", - "created_at": "2026-04-22 20:33:58", - "updated_at": "2026-04-22 21:02:29" - }, - { - "id": "T-33", - "type": "story", - "title": "Wire canonical keyboard shortcuts from interaction model", - "description": "Add commands and keybindings: ⌘⇧1/⌘⇧3 collapse, ⌘1/⌘2/⌘3 focus panel, ⌘. focus mode, ⌥1-5 left section switch, ⌘E editor, ⌘W close editor, Esc dismiss.", - "status": "done", - "priority": "high", - "decision_ref": "D-54", - "created_at": "2026-04-22 20:34:01", - "updated_at": "2026-04-22 20:38:51" - }, - { - "id": "T-34", - "type": "story", - "title": "Add icon rail to right panel (context section switcher)", - "description": "Right panel currently has no bottom icon rail. Add one matching the left sidebar rail pattern: viewer, pql graph, links, images as section tabs.", - "status": "done", - "priority": "medium", - "decision_ref": "D-47", - "created_at": "2026-04-22 20:34:03", - "updated_at": "2026-04-22 20:38:51" - }, - { - "id": "T-35", - "type": "story", - "parent_id": "T-4", - "title": "Implement editor-above-Claude mode in middle column", - "description": "⌘E opens editor above Claude with draggable divider, 30-40% height. ⌘W closes. Viewer ↔ editor swap: ✎ promotes to editor, 👁 demotes to viewer. Prompt bar Y stays fixed.", - "status": "done", - "priority": "medium", - "decision_ref": "D-49", - "created_at": "2026-04-22 20:34:06", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-36", - "type": "story", - "parent_id": "T-7", - "title": "Context auto-behavior: right panel reacts to Claude references", - "description": "Parse file references from Claude output. Swap viewer content when right panel is open. Badge on spine when collapsed. Live-sync viewer when editing .md.", - "status": "backlog", - "priority": "low", - "decision_ref": "D-50", - "created_at": "2026-04-22 20:34:09", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-37", - "type": "task", - "parent_id": "T-6", - "title": "Contribute tickets \u0026 decisions tabs to sidebar", - "description": "The decisions and tickets shipped extensions exist as stubs but don't contribute TabContributions to Slots.sidebar yet. Spec lists them as the default left-panel section.", - "status": "done", - "priority": "medium", - "decision_ref": "D-47", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-38", - "type": "task", - "parent_id": "T-6", - "title": "Contribute markdown viewer tab to context panel", - "description": "The markdown shipped extension exists as a stub but doesn't contribute a TabContribution to Slots.contextPanel. Spec lists viewer as the primary right-panel section.", - "status": "done", - "priority": "medium", - "decision_ref": "D-47", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-39", - "type": "task", - "parent_id": "T-6", - "title": "Contribute graph view tab to context panel", - "description": "The graph shipped extension exists as a stub but doesn't contribute a TabContribution to Slots.contextPanel. Spec lists pql graph as a right-panel section.", - "status": "done", - "priority": "medium", - "decision_ref": "D-47", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-40", - "type": "task", - "parent_id": "T-8", - "title": "Add PRs tab to sidebar", - "description": "Spec lists PRs as a left-panel section (icon rail position 5). No extension exists yet.", - "status": "backlog", - "priority": "low", - "decision_ref": "D-47", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-41", - "type": "task", - "parent_id": "T-7", - "title": "Add images tab to context panel", - "description": "Spec lists images as a right-panel section. No extension exists yet.", - "status": "backlog", - "priority": "low", - "decision_ref": "D-47", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-42", - "type": "task", - "parent_id": "T-5", - "title": "Decide diff view placement", - "description": "Diff view currently contributes to workspace. Spec doesn't place it. Likely belongs in context panel (viewer) or as an editor overlay. Depends on Q-27.", - "status": "backlog", - "priority": "low", - "decision_ref": "D-48", - "created_at": "2026-04-22 21:03:40", - "updated_at": "2026-04-23 10:23:49" - }, - { - "id": "T-43", - "type": "story", - "parent_id": "T-3", - "title": "Ship clide tmux.conf for Claude pane sessions", - "description": "Bundle a clide-specific tmux.conf (no status bar, large scrollback, zero escape delay, 256color passthrough). Claude pane spawn passes -f to use it. Includes bottom-anchoring via initial escape sequence or shell profile trick after attach.", - "status": "backlog", - "priority": "high", - "decision_ref": "D-41", - "created_at": "2026-04-22 22:01:13", - "updated_at": "2026-04-23 10:23:49" - } - ], - "ticket_deps": null, - "ticket_labels": null, - "history": [ - { - "ticket_id": "T-1", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 09:42:11" - }, - { - "ticket_id": "T-1", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 09:42:11" - }, - { - "ticket_id": "T-1", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:45:21" - }, - { - "ticket_id": "T-1", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:45:21" - }, - { - "ticket_id": "T-2", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:46:12" - }, - { - "ticket_id": "T-2", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:46:16" - }, - { - "ticket_id": "T-2", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:46:26" - }, - { - "ticket_id": "T-2", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:46:33" - }, - { - "ticket_id": "T-3", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:46:37" - }, - { - "ticket_id": "T-3", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:46:37" - }, - { - "ticket_id": "T-3", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:46:37" - }, - { - "ticket_id": "T-3", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:46:37" - }, - { - "ticket_id": "T-4", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:46:44" - }, - { - "ticket_id": "T-4", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:46:44" - }, - { - "ticket_id": "T-4", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:46:44" - }, - { - "ticket_id": "T-4", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:46:44" - }, - { - "ticket_id": "T-5", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:46:48" - }, - { - "ticket_id": "T-5", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:46:48" - }, - { - "ticket_id": "T-5", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:46:48" - }, - { - "ticket_id": "T-5", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:46:48" - }, - { - "ticket_id": "T-6", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:46:52" - }, - { - "ticket_id": "T-10", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-10", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-10", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-10", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-11", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-11", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-11", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-11", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-12", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-12", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-12", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-12", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-9", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-9", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-9", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-9", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 11:47:11" - }, - { - "ticket_id": "T-13", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:52:59" - }, - { - "ticket_id": "T-14", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:52:59" - }, - { - "ticket_id": "T-15", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:52:59" - }, - { - "ticket_id": "T-16", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 11:52:59" - }, - { - "ticket_id": "T-6", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 11:52:59" - }, - { - "ticket_id": "T-13", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-13", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-13", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-14", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-14", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-14", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-15", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-15", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-15", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-16", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-16", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-16", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 12:03:48" - }, - { - "ticket_id": "T-6", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 12:03:54" - }, - { - "ticket_id": "T-6", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 12:03:54" - }, - { - "ticket_id": "T-19", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 14:16:39" - }, - { - "ticket_id": "T-19", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 14:16:39" - }, - { - "ticket_id": "T-20", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 14:16:39" - }, - { - "ticket_id": "T-20", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 14:16:39" - }, - { - "ticket_id": "T-19", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 14:30:05" - }, - { - "ticket_id": "T-19", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 14:30:05" - }, - { - "ticket_id": "T-20", - "field": "status", - "old_value": "in_progress", - "new_value": "review", - "changed_at": "2026-04-22 14:30:05" - }, - { - "ticket_id": "T-20", - "field": "status", - "old_value": "review", - "new_value": "done", - "changed_at": "2026-04-22 14:30:05" - }, - { - "ticket_id": "T-22", - "field": "status", - "old_value": "backlog", - "new_value": "cancelled", - "changed_at": "2026-04-22 20:34:17" - }, - { - "ticket_id": "T-30", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 20:38:42" - }, - { - "ticket_id": "T-31", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 20:38:42" - }, - { - "ticket_id": "T-33", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 20:38:42" - }, - { - "ticket_id": "T-34", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 20:38:42" - }, - { - "ticket_id": "T-30", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 20:38:49" - }, - { - "ticket_id": "T-31", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 20:38:49" - }, - { - "ticket_id": "T-33", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 20:38:49" - }, - { - "ticket_id": "T-34", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 20:38:49" - }, - { - "ticket_id": "T-30", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 20:38:51" - }, - { - "ticket_id": "T-31", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 20:38:51" - }, - { - "ticket_id": "T-33", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 20:38:51" - }, - { - "ticket_id": "T-34", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 20:38:51" - }, - { - "ticket_id": "T-35", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 20:56:58" - }, - { - "ticket_id": "T-35", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 20:56:58" - }, - { - "ticket_id": "T-35", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 20:56:58" - }, - { - "ticket_id": "T-32", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 21:02:29" - }, - { - "ticket_id": "T-32", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 21:02:29" - }, - { - "ticket_id": "T-32", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 21:02:29" - }, - { - "ticket_id": "T-37", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-37", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-37", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-38", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-38", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-38", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-39", - "field": "status", - "old_value": "backlog", - "new_value": "ready", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-39", - "field": "status", - "old_value": "ready", - "new_value": "in_progress", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-39", - "field": "status", - "old_value": "in_progress", - "new_value": "done", - "changed_at": "2026-04-22 21:16:41" - }, - { - "ticket_id": "T-1", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-10", - "field": "parent_id", - "new_value": "T-2", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-11", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-12", - "field": "parent_id", - "new_value": "T-2", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-13", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-14", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-15", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-16", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-17", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-19", - "field": "parent_id", - "new_value": "T-2", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-20", - "field": "parent_id", - "new_value": "T-2", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-21", - "field": "parent_id", - "new_value": "T-4", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-22", - "field": "parent_id", - "new_value": "T-4", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-23", - "field": "parent_id", - "new_value": "T-4", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-24", - "field": "parent_id", - "new_value": "T-3", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-25", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-26", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-27", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-28", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-29", - "field": "parent_id", - "new_value": "T-4", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-35", - "field": "parent_id", - "new_value": "T-4", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-36", - "field": "parent_id", - "new_value": "T-7", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-37", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-38", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-39", - "field": "parent_id", - "new_value": "T-6", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-40", - "field": "parent_id", - "new_value": "T-8", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-41", - "field": "parent_id", - "new_value": "T-7", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-42", - "field": "parent_id", - "new_value": "T-5", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-43", - "field": "parent_id", - "new_value": "T-3", - "changed_at": "2026-04-23 10:23:49" - }, - { - "ticket_id": "T-9", - "field": "parent_id", - "new_value": "T-2", - "changed_at": "2026-04-23 10:23:49" - } - ] -}