diff --git a/.gitignore b/.gitignore index 912c14d5..47d0e90c 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,8 @@ coverage.* test/goldens/failures/ # -- pql per-repo state (index + planning DB, rebuilt from markdown) ---- -/.pql/ +/.pql/* +!/.pql/pql-plan.json # -- SQLite index files (defensive; should never land at repo root) ---- *.sqlite diff --git a/.pql/pql-plan.json b/.pql/pql-plan.json new file mode 100644 index 00000000..1ace2415 --- /dev/null +++ b/.pql/pql-plan.json @@ -0,0 +1,3484 @@ +{ + "exported_at": "2026-04-25T11:12:25Z", + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-3", + "type": "question", + "domain": "architecture", + "title": "Event persistence + audit/undo", + "status": "open", + "file_path": "decisions/questions-architecture.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-9", + "type": "question", + "domain": "extensions", + "title": "Lua runtime vendoring", + "status": "open", + "file_path": "decisions/questions-extensions.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "id": "Q-10", + "type": "question", + "domain": "extensions", + "title": "Extension manifest `schema_version:`", + "status": "open", + "file_path": "decisions/questions-extensions.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-13", + "type": "question", + "domain": "accessibility", + "title": "Web production-mode a11y", + "status": "open", + "file_path": "decisions/questions-accessibility.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-17", + "type": "question", + "domain": "process", + "title": "Icon set growth", + "status": "open", + "file_path": "decisions/questions-process.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-19", + "type": "question", + "domain": "process", + "title": "(withdrawn)", + "status": "resolved", + "file_path": "decisions/questions-process.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-22", + "type": "question", + "domain": "architecture", + "title": "Ticket persistence strategy", + "status": "open", + "file_path": "decisions/questions-architecture.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-27", + "type": "question", + "domain": "architecture", + "title": "Two-editor split", + "status": "open", + "file_path": "decisions/questions-architecture.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "id": "Q-29", + "type": "question", + "domain": "architecture", + "title": "Branch picker location", + "status": "open", + "file_path": "decisions/questions-architecture.md", + "synced_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + } + ], + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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": "in_progress", + "priority": "medium", + "created_at": "2026-04-22 20:14:52", + "updated_at": "2026-04-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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-25 11:11:15" + }, + { + "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": "ready", + "priority": "high", + "decision_ref": "D-41", + "created_at": "2026-04-22 22:01:13", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-44", + "type": "story", + "title": "image paste in Claude panel prompt bar", + "description": "Support pasting images (Ctrl+V / right-click paste) into the Claude panel text input bar. The image should be sent as part of the message context to Claude, matching Claude Code CLI multimodal input.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:25:26", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-45", + "type": "task", + "parent_id": "T-3", + "title": "detect and install tmux on first launch", + "description": "On first launch, check if tmux is on PATH. If missing, prompt the user with platform-appropriate install instructions (apt, dnf, brew) or offer to install automatically. Claude pane requires tmux per D-41; without it the primary session cannot persist.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:27:28", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-46", + "type": "epic", + "title": "cross-platform clide installer", + "description": "Build a distribution-aware installer for clide. Detects platform (Linux distro, macOS, WSL) and package manager (apt, dnf, pacman, brew, winget). Handles: Flutter runtime or bundled AOT binary, ptyc compilation or prebuilt binary, tmux and other runtime dependencies, font installation (Josefin Sans, JetBrains Mono, Phosphor Icons), desktop entry / .app bundle / Start Menu shortcut, and PATH registration. Should support both interactive install and headless CI mode (--unattended). Consider AppImage/Flatpak for Linux, .dmg for macOS.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:27:58", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-47", + "type": "story", + "parent_id": "T-46", + "title": "clide self-update mechanism", + "description": "Check for new versions on startup (or on demand via command palette). Show a non-intrusive notification when an update is available. Support in-place update without losing running Claude sessions (tmux sessions survive). Respect POLICY.md: no silent network calls on default launch path — the check should be opt-in or gated behind a setting. Consider delta updates for bandwidth efficiency.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:28:43", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-48", + "type": "story", + "title": "application menu bar (Zed-style)", + "description": "Add a Zed-style application menu integrated into the hat bar: File, Edit, Selection, View, Help/About. Rendered as custom Flutter widgets (no native menu bar — we own the chrome per D-7). Menus expose the same commands registered in the command palette with their keybindings shown inline. Submenus for View should include panel toggles, zoom, focus mode. About opens a modal with version, license, and links.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:30:09", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-49", + "type": "story", + "title": "native folder picker for Open Workspace", + "description": "Replace the text input in the welcome screen Open Workspace flow with a native folder picker dialog (gtk_file_chooser on Linux, NSOpenPanel on macOS). Fall back to the text input if the native dialog is unavailable. The selected path should validate as a git repo before opening.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:31:35", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-50", + "type": "story", + "title": "toast notification system", + "description": "Non-modal toast notifications for operation feedback (git push succeeded, extension activated, update available, errors). Slide in from bottom-right or top-right, auto-dismiss after timeout, manually dismissable. Queue multiple toasts. Severity levels map to status tokens (success/warning/error/info).", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:31:48", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-51", + "type": "story", + "title": "quick file open (Ctrl+P)", + "description": "Fuzzy file finder overlay, separate from the command palette. Wired to pql files with debounced input. Shows file path with match highlighting. Enter opens in editor or markdown viewer depending on file type. Recent files shown when input is empty.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-52", + "type": "story", + "title": "find in files (Ctrl+Shift+F)", + "description": "Workspace-wide text search via ripgrep or grep fallback. Sidebar panel with search input, match-in-context results, clickable to open file at line. Supports regex toggle, case sensitivity toggle, include/exclude glob filters.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-53", + "type": "story", + "title": "search and replace across files", + "description": "Companion to find-in-files. Preview all replacements before applying. Support regex capture groups in replacement. Respects ignore patterns from pql config.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-54", + "type": "story", + "title": "output and log panel", + "description": "Bottom panel or context tab showing daemon logs, build output, extension logs, and pql sync output. Filterable by source. Auto-scrolls to latest. Useful for debugging extension and IPC issues.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-55", + "type": "story", + "title": "system tray and dock persistence", + "description": "Minimize to system tray on Linux (AppIndicator) or Dock on macOS. Reopening from tray restores the window without cold boot. tmux sessions stay alive in background regardless.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-56", + "type": "story", + "title": "deep link protocol handler", + "description": "Register clide:// protocol handler. Support clide://open?path=/repo/file.md\u0026line=42 for external tools to open files at specific locations. Useful for CI links, error reports, and cross-tool integration.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-57", + "type": "task", + "title": "drag tab reordering in sidebar and context panel", + "description": "Reorder tabs in the sidebar and context panel icon rails by dragging. Persist order to project settings.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-58", + "type": "task", + "title": "activity badges on sidebar icons", + "description": "Show unread count dots on sidebar icons: git changes count, new problems, pending notifications. Badges clear when the tab is viewed.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-59", + "type": "task", + "title": "progress indicators in status bar", + "description": "Loading bar or spinner in the status bar for long-running operations: git pull/push, pql sync, extension install. Operations register with the kernel; status bar renders the active set.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-60", + "type": "story", + "title": "workspace trust prompt", + "description": "Prompt before running extensions or loading project settings in untrusted repositories. Trust decision persisted per repo path. Untrusted mode disables third-party extensions and restricts IPC commands.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-23 20:32:06", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-61", + "type": "task", + "title": "kernel scheduler service with tiered timer events", + "description": "Add SchedulerService to the kernel with Timer.periodic instances at five tiers (1min, 10min, 15min, 60min, midnight). Emits SchedulerTick events on the DaemonBus. Extensions subscribe and filter by tier.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-62", + "type": "story", + "title": "auto-refresh decisions and tickets on file change and scheduler tick", + "description": "Decisions panel subscribes to files.changed for decisions/*.md and to the 10-minute scheduler tick. Tickets panel subscribes to files.changed for tickets/ paths and to the 10-minute tick. Both use debounce to coalesce burst events. Keep existing data visible during refresh.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-63", + "type": "task", + "title": "manual refresh button in sidebar panels", + "description": "Add a small arrowClockwise icon button next to the filter box in decisions, tickets, and pql markdown panels. Triggers immediate data reload. Disabled while refresh is in-flight.", + "status": "in_progress", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-64", + "type": "story", + "title": "VS Code keybinding preset", + "description": "Ship a VS Code-compatible keybinding preset that maps standard VS Code shortcuts to clide commands. Users select it in settings. Covers file navigation, editor actions, panel toggles, search, and terminal.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-65", + "type": "story", + "title": "Vim keybinding preset", + "description": "Ship a Vim-compatible keybinding preset with modal editing support (normal/insert/visual modes). Maps Vim motions and commands to clide editor and navigation actions. Users select it in settings.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-66", + "type": "story", + "title": "JetBrains keybinding preset", + "description": "Ship a JetBrains/IntelliJ-compatible keybinding preset mapping standard JetBrains shortcuts to clide commands. Covers navigation, refactoring, search, run/debug, and tool windows.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + }, + { + "id": "T-67", + "type": "story", + "title": "review Semantics widget coverage and UI testability", + "description": "Audit all interactive widgets for Semantics coverage (labels, roles, states). Verify flutter test can locate and interact with every panel, button, and input via find.bySemanticsLabel. Run the existing a11y test suite and document gaps. Target: every user-facing action is testable without widget keys.", + "status": "backlog", + "priority": "medium", + "created_at": "2026-04-24 06:34:16", + "updated_at": "2026-04-25 11:11:15" + } + ], + "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" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:01:08" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:01:08" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:01:48" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:01:48" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:05:40" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:05:50" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:05:51" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:06:30" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:06:32" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:07:55" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-04-24 07:07:55" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "in_progress", + "new_value": "review", + "changed_at": "2026-04-24 07:07:55" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "review", + "new_value": "done", + "changed_at": "2026-04-24 07:07:55" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "done", + "new_value": "in_progress", + "changed_at": "2026-04-24 07:08:00" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "in_progress", + "new_value": "done", + "changed_at": "2026-04-24 07:08:29" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "done", + "new_value": "in_progress", + "changed_at": "2026-04-24 07:08:29" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "in_progress", + "new_value": "ready", + "changed_at": "2026-04-24 07:08:35" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:08:35" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "in_progress", + "new_value": "ready", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "backlog", + "new_value": "cancelled", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "cancelled", + "new_value": "backlog", + "changed_at": "2026-04-24 07:08:59" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "backlog", + "new_value": "done", + "changed_at": "2026-04-24 07:30:15" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "done", + "new_value": "backlog", + "changed_at": "2026-04-24 07:30:22" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 08:08:16" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 08:08:16" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-04-24 08:08:23" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "in_progress", + "new_value": "ready", + "changed_at": "2026-04-24 08:08:38" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-04-24 08:08:40" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "in_progress", + "new_value": "review", + "changed_at": "2026-04-24 08:08:44" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "review", + "new_value": "in_progress", + "changed_at": "2026-04-24 08:08:48" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "in_progress", + "new_value": "ready", + "changed_at": "2026-04-24 08:16:15" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "backlog", + "changed_at": "2026-04-24 08:16:19" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 08:16:21" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-04-24 08:16:47" + }, + { + "ticket_id": "T-28", + "field": "status", + "old_value": "backlog", + "new_value": "in_progress", + "changed_at": "2026-04-24 08:16:56" + }, + { + "ticket_id": "T-43", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-04-24 08:17:11" + } + ] +}