diff --git a/.pql/pql-plan.json b/.pql/pql-plan.json index 45f7b862..c7a100ec 100644 --- a/.pql/pql-plan.json +++ b/.pql/pql-plan.json @@ -1,5 +1,5 @@ { - "exported_at": "2026-05-03T20:29:03Z", + "exported_at": "2026-05-05T06:49:53Z", "decisions": [ { "id": "D-1", @@ -9,7 +9,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-3", @@ -19,7 +19,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-4", @@ -29,7 +29,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-5", @@ -39,7 +39,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-6", @@ -49,7 +49,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-7", @@ -59,7 +59,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-8", @@ -69,7 +69,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-9", @@ -79,7 +79,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-10", @@ -89,7 +89,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-11", @@ -99,7 +99,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-12", @@ -109,7 +109,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-13", @@ -119,7 +119,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-14", @@ -129,7 +129,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-15", @@ -139,7 +139,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-16", @@ -149,7 +149,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-17", @@ -159,7 +159,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-18", @@ -169,7 +169,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-19", @@ -179,7 +179,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-20", @@ -189,7 +189,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/accessibility.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-21", @@ -199,7 +199,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/accessibility.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-22", @@ -209,7 +209,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/accessibility.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-23", @@ -219,7 +219,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-24", @@ -229,7 +229,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-25", @@ -239,7 +239,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-26", @@ -249,7 +249,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-27", @@ -259,7 +259,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-28", @@ -269,7 +269,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-29", @@ -279,7 +279,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-30", @@ -289,7 +289,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-31", @@ -299,7 +299,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-32", @@ -309,7 +309,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-33", @@ -319,7 +319,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-34", @@ -329,7 +329,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-35", @@ -339,7 +339,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-36", @@ -349,7 +349,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-37", @@ -359,7 +359,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-38", @@ -369,7 +369,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-39", @@ -379,7 +379,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-40", @@ -389,7 +389,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-41", @@ -399,7 +399,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-42", @@ -409,7 +409,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-43", @@ -419,7 +419,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-44", @@ -429,7 +429,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-45", @@ -439,7 +439,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-46", @@ -449,7 +449,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-47", @@ -459,7 +459,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-48", @@ -469,7 +469,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-49", @@ -479,7 +479,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-50", @@ -489,7 +489,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-51", @@ -499,7 +499,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-52", @@ -509,7 +509,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-53", @@ -519,7 +519,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-54", @@ -529,7 +529,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-55", @@ -539,7 +539,7 @@ "status": "active", "date": "2026-04-23", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-56", @@ -549,7 +549,7 @@ "status": "active", "date": "2026-04-23", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-57", @@ -559,7 +559,7 @@ "status": "active", "date": "2026-04-23", "file_path": "decisions/architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-58", @@ -569,7 +569,7 @@ "status": "active", "date": "2026-04-23", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "D-59", @@ -579,7 +579,67 @@ "status": "active", "date": "2026-04-25", "file_path": "decisions/tooling.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-60", + "type": "confirmed", + "domain": "tooling", + "title": "No network on default launch path", + "status": "active", + "date": "2026-04-26", + "file_path": "decisions/tooling.md", + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-61", + "type": "confirmed", + "domain": "tooling", + "title": "Dependency vetting checklist", + "status": "active", + "date": "2026-04-26", + "file_path": "decisions/tooling.md", + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-62", + "type": "confirmed", + "domain": "tooling", + "title": "Dependency removal process", + "status": "active", + "date": "2026-04-26", + "file_path": "decisions/tooling.md", + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-63", + "type": "confirmed", + "domain": "tooling", + "title": "Vendored binary rebuild process", + "status": "active", + "date": "2026-04-26", + "file_path": "decisions/tooling.md", + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-64", + "type": "confirmed", + "domain": "architecture", + "title": "No telemetry — architectural commitment", + "status": "active", + "date": "2026-05-03", + "file_path": "decisions/architecture.md", + "synced_at": "2026-05-03 20:40:19" + }, + { + "id": "D-65", + "type": "confirmed", + "domain": "tooling", + "title": "License compatibility matrix", + "status": "active", + "date": "2026-04-26", + "file_path": "decisions/tooling.md", + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-1", @@ -588,7 +648,7 @@ "title": "Authorisation granularity on the IPC socket", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-2", @@ -597,7 +657,7 @@ "title": "Back-pressure on event streams", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-3", @@ -606,7 +666,7 @@ "title": "Event persistence + audit/undo", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-4", @@ -615,7 +675,7 @@ "title": "`.canvas` schema compatibility with Obsidian", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-5", @@ -624,7 +684,7 @@ "title": "IPC wire-format stability + `schema_version:`", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-6", @@ -633,7 +693,7 @@ "title": "Window chrome — native frame vs frameless custom", "status": "resolved", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-7", @@ -642,7 +702,7 @@ "title": "macOS app bundle signing / notarisation", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-8", @@ -651,7 +711,7 @@ "title": "Extension API shape — widgets, subcommands, both?", "status": "open", "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-9", @@ -660,7 +720,7 @@ "title": "Lua runtime vendoring", "status": "open", "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-10", @@ -669,7 +729,7 @@ "title": "Extension manifest `schema_version:`", "status": "open", "file_path": "decisions/questions-extensions.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-11", @@ -678,7 +738,7 @@ "title": "Coverage gates — hard thresholds vs soft reporting", "status": "open", "file_path": "decisions/questions-testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-12", @@ -687,7 +747,7 @@ "title": "Screen-reader automation (axe-core via Playwright)", "status": "open", "file_path": "decisions/questions-testing.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-13", @@ -696,7 +756,7 @@ "title": "Web production-mode a11y", "status": "open", "file_path": "decisions/questions-accessibility.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-14", @@ -705,7 +765,7 @@ "title": "i18n plurals / gender / date-format tooling", "status": "open", "file_path": "decisions/questions-accessibility.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-15", @@ -714,7 +774,7 @@ "title": "Editor tab — full LSP vs tree-sitter-only highlight", "status": "open", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-16", @@ -723,7 +783,7 @@ "title": "`tree-sitter-dart` grammar maintenance", "status": "open", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-17", @@ -732,7 +792,7 @@ "title": "Icon set growth", "status": "open", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-18", @@ -741,7 +801,7 @@ "title": "Theme hot-reload in release builds", "status": "open", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-19", @@ -750,7 +810,7 @@ "title": "(withdrawn)", "status": "resolved", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-20", @@ -759,7 +819,7 @@ "title": "Kernel DB service — namespaced SQL access?", "status": "open", "file_path": "decisions/questions-process.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-21", @@ -768,7 +828,7 @@ "title": "Pql absorbs planning vs keeps separate", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-22", @@ -777,7 +837,7 @@ "title": "Ticket persistence strategy", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-23", @@ -786,7 +846,7 @@ "title": "SSH-remote development — run clide against a remote workspace", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-25", @@ -795,7 +855,7 @@ "title": "Body text face — mono everywhere vs Josefin Sans UI + mono code", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-26", @@ -804,7 +864,7 @@ "title": "Small screen layout (\u003c 1000px)", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-27", @@ -813,7 +873,7 @@ "title": "Two-editor split", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-28", @@ -822,7 +882,7 @@ "title": "Terminal strip scope — shell only or logs/errors/tests", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-29", @@ -831,7 +891,7 @@ "title": "Branch picker location", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-30", @@ -840,7 +900,7 @@ "title": "Focus behavior when editor is dirty and viewer is peeked", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "Q-31", @@ -849,7 +909,7 @@ "title": "XWayland fallback for frameless — proper Wayland protocol needed", "status": "open", "file_path": "decisions/questions-architecture.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-2", @@ -859,7 +919,7 @@ "status": "active", "date": "2026-04-20", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-3", @@ -869,7 +929,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-4", @@ -879,7 +939,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-5", @@ -889,7 +949,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-6", @@ -899,7 +959,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-7", @@ -909,7 +969,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-8", @@ -919,7 +979,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-9", @@ -929,7 +989,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-10", @@ -939,7 +999,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-11", @@ -949,7 +1009,7 @@ "status": "active", "date": "2026-04-21", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" }, { "id": "R-12", @@ -959,7 +1019,7 @@ "status": "active", "date": "2026-04-22", "file_path": "decisions/rejected.md", - "synced_at": "2026-05-03 20:28:13" + "synced_at": "2026-05-03 20:40:19" } ], "decision_refs": [ @@ -1407,6 +1467,84 @@ "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-60", + "target_id": "D-31", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-63](#d-63-vendored-binary-rebuild-process), `POLICY.md`." + }, + { + "source_id": "D-60", + "target_id": "D-63", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-63](#d-63-vendored-binary-rebuild-process), `POLICY.md`." + }, + { + "source_id": "D-61", + "target_id": "D-31", + "ref_type": "references", + "note": "**Decision:** Before adding any dependency (direct or transitive), verify: (1) **Network behavior** — no network I/O during import, init, or first call; no postinstall scripts that download binar..." + }, + { + "source_id": "D-61", + "target_id": "D-60", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-60](#d-60-no-network-on-default-launch-path), [D-65](#d-65-license-compatibility-matrix), `POLICY.md`." + }, + { + "source_id": "D-61", + "target_id": "D-65", + "ref_type": "references", + "note": "**Decision:** Before adding any dependency (direct or transitive), verify: (1) **Network behavior** — no network I/O during import, init, or first call; no postinstall scripts that download binar..." + }, + { + "source_id": "D-62", + "target_id": "D-31", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml), `POLICY.md`." + }, + { + "source_id": "D-62", + "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), `POLICY.md`." + }, + { + "source_id": "D-63", + "target_id": "D-42", + "ref_type": "references", + "note": "**Cross-reference:** [D-60](#d-60-no-network-on-default-launch-path), [D-42](#d-42-dependencies-documented-in-licensesyaml), T-25, `POLICY.md`." + }, + { + "source_id": "D-63", + "target_id": "D-60", + "ref_type": "references", + "note": "**Cross-reference:** [D-60](#d-60-no-network-on-default-launch-path), [D-42](#d-42-dependencies-documented-in-licensesyaml), T-25, `POLICY.md`." + }, + { + "source_id": "D-64", + "target_id": "D-60", + "ref_type": "references", + "note": "**Cross-reference:** [D-60](tooling.md#d-60-no-network-on-default-launch-path), `POLICY.md`." + }, + { + "source_id": "D-65", + "target_id": "D-31", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml), [D-61](#d-61-dependency-vetting-checklist), `POLICY.md`." + }, + { + "source_id": "D-65", + "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), [D-61](#d-61-dependency-vetting-checklist), `POLICY.md`." + }, + { + "source_id": "D-65", + "target_id": "D-61", + "ref_type": "references", + "note": "**Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml), [D-61](#d-61-dependency-vetting-checklist), `POLICY.md`." + }, { "source_id": "D-7", "target_id": "D-9", @@ -1859,21 +1997,21 @@ "type": "task", "parent_id": "T-8", "title": "add dart doc generation to CI", - "status": "backlog", + "status": "ready", "priority": "medium", "decision_ref": "D-32", "created_at": "2026-04-22 13:26:29", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:37:03" }, { "id": "T-18", "type": "task", "title": "audit error handling in PTY and IPC critical paths", - "status": "backlog", + "status": "ready", "priority": "medium", "decision_ref": "D-5", "created_at": "2026-04-22 13:26:29", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:37:30" }, { "id": "T-19", @@ -1902,11 +2040,11 @@ "type": "task", "parent_id": "T-4", "title": "implement welcome screen per hi-fi design", - "status": "backlog", + "status": "ready", "priority": "medium", "decision_ref": "D-43", "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:34:52" }, { "id": "T-22", @@ -1935,11 +2073,11 @@ "type": "task", "parent_id": "T-3", "title": "secondary Claude pane UI wiring", - "status": "backlog", + "status": "ready", "priority": "medium", "decision_ref": "D-41", "created_at": "2026-04-22 14:08:40", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:36:31" }, { "id": "T-25", @@ -1980,10 +2118,10 @@ "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", + "status": "done", "priority": "medium", "created_at": "2026-04-22 20:14:52", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:40:22" }, { "id": "T-29", @@ -2153,11 +2291,11 @@ "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", + "status": "in_progress", "priority": "high", "decision_ref": "D-41", "created_at": "2026-04-22 22:01:13", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:33:10" }, { "id": "T-44", @@ -2216,10 +2354,10 @@ "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", + "status": "done", "priority": "medium", "created_at": "2026-04-23 20:31:35", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:33:10" }, { "id": "T-50", @@ -2336,30 +2474,30 @@ "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", + "status": "done", "priority": "medium", "created_at": "2026-04-24 06:34:16", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:33:10" }, { "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", + "status": "done", "priority": "medium", "created_at": "2026-04-24 06:34:16", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:33:10" }, { "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", + "status": "done", "priority": "medium", "created_at": "2026-04-24 06:34:16", - "updated_at": "2026-05-03 19:26:04" + "updated_at": "2026-05-03 20:33:10" }, { "id": "T-64", @@ -3501,6 +3639,76 @@ "old_value": "backlog", "new_value": "ready", "changed_at": "2026-04-24 08:17:11" + }, + { + "ticket_id": "T-43", + "field": "status", + "old_value": "ready", + "new_value": "in_progress", + "changed_at": "2026-05-03 20:33:10" + }, + { + "ticket_id": "T-49", + "field": "status", + "old_value": "backlog", + "new_value": "done", + "changed_at": "2026-05-03 20:33:10" + }, + { + "ticket_id": "T-61", + "field": "status", + "old_value": "backlog", + "new_value": "done", + "changed_at": "2026-05-03 20:33:10" + }, + { + "ticket_id": "T-62", + "field": "status", + "old_value": "backlog", + "new_value": "done", + "changed_at": "2026-05-03 20:33:10" + }, + { + "ticket_id": "T-63", + "field": "status", + "old_value": "in_progress", + "new_value": "done", + "changed_at": "2026-05-03 20:33:10" + }, + { + "ticket_id": "T-21", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-05-03 20:34:52" + }, + { + "ticket_id": "T-24", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-05-03 20:36:31" + }, + { + "ticket_id": "T-17", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-05-03 20:37:03" + }, + { + "ticket_id": "T-18", + "field": "status", + "old_value": "backlog", + "new_value": "ready", + "changed_at": "2026-05-03 20:37:30" + }, + { + "ticket_id": "T-28", + "field": "status", + "old_value": "in_progress", + "new_value": "done", + "changed_at": "2026-05-03 20:40:22" } ] } diff --git a/decisions/architecture.md b/decisions/architecture.md index 99d75762..a20a11ed 100644 --- a/decisions/architecture.md +++ b/decisions/architecture.md @@ -235,4 +235,12 @@ Core, rendering, IPC, kernel, panel manager. - **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). - **Raised by:** 2026-04-23 interaction model refinement. +### D-64: No telemetry — architectural commitment +- **Date:** 2026-05-03 +- **Decision:** clide does not phone home. No analytics SDKs (Firebase, Sentry, Mixpanel, hand-rolled). No crash reporters that upload automatically — crashes produce local logs the user can read and optionally attach to a manual bug report. No auto-update checks without user action. No license validation calls. No feature flags fetched from a server. No A/B testing, experiments, remote config, or "anonymous usage statistics." This is not a "default off" setting; it is an architectural commitment. Proposals to add telemetry under any framing — opt-in, anonymized, debug-only, "just errors" — are out of scope for this project, full stop. +- **Rationale:** clide is a space to think, not a surface for data collection. Users installing clide are choosing a tool that does not watch them. That promise is worth more than any data we could collect. The architectural commitment is the feature. +- **Cost:** No usage data for product decisions; no automated crash triage. Accepted — user trust is the product decision. +- **Cross-reference:** [D-60](tooling.md#d-60-no-network-on-default-launch-path), `POLICY.md`. +- **Raised by:** 2026-05-03 policy-to-decision migration (T-28). + --- diff --git a/decisions/tooling.md b/decisions/tooling.md index ce4b7db7..3fcdae5d 100644 --- a/decisions/tooling.md +++ b/decisions/tooling.md @@ -51,4 +51,44 @@ Toolchain, supply chain, CI, ignore strategy. - **Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml). - **Raised by:** 2026-04-25 macOS sandbox investigation. +### D-60: No network on default launch path +- **Date:** 2026-04-26 +- **Decision:** clide does not perform network I/O during app startup, library initialization, or first use of any API unless the user has explicitly taken an action whose stated purpose is to cause a network fetch. Opening the app, opening a file, or typing in a buffer are not such actions. Libraries that download native binaries on first import (the `wasm_run` pattern), auto-installing language servers/grammars, CDN-fetched assets, startup telemetry, and unsolicited update checks are all prohibited. Signed, pinned fetches are permitted only when: the URL is hardcoded in the repo, the artifact is verified against a committed hash or signature, the fetch is cached, failure produces a clear error, and the primary function works without the fetch succeeding. If all five cannot be satisfied, vendor the artifact or require explicit user action. +- **Rationale:** clide's security model claims that app behavior on a user's machine is fully determined by the signed release artifact and the repository state at build time. The moment something is fetched from the network that wasn't audited at build time, the entire sandboxing and trust story collapses. See `POLICY.md` §"The core rule." +- **Cost:** Some features require vendoring artifacts that other apps would download at first launch. Accepted — the trust boundary is worth the extra build complexity. +- **Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-63](#d-63-vendored-binary-rebuild-process), `POLICY.md`. +- **Raised by:** 2026-04-26 policy-to-decision migration (T-28). + +### D-61: Dependency vetting checklist +- **Date:** 2026-04-26 +- **Decision:** Before adding any dependency (direct or transitive), verify: (1) **Network behavior** — no network I/O during import, init, or first call; no postinstall scripts that download binaries; check transitive deps with `flutter pub deps`. (2) **Binary provenance** — native binaries must be built from source in the same repo, not fetched from release artifacts. (3) **Maintainership** — single-maintainer packages need explicit sign-off and a documented fallback; packages with no activity in 12+ months require a controlled fork or inlining. (4) **Surface area** — prefer packages that do one thing; a dep adding 15 transitive deps for a 100-line problem should be inlined. (5) **Version pinning** — exact-pinned per D-31, lockfile committed, CVE-checked, source-reviewed, justified in place. (6) **License** — compatible per D-65. +- **Rationale:** D-31 states the budget; this record codifies the gate each dependency must pass. The checklist exists so agents and human contributors apply the same standard without re-deriving it each time. +- **Cost:** Longer evaluation cycle for new dependencies. Intentional — the cost of a bad dep is higher. +- **Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-60](#d-60-no-network-on-default-launch-path), [D-65](#d-65-license-compatibility-matrix), `POLICY.md`. +- **Raised by:** 2026-04-26 policy-to-decision migration (T-28). + +### D-62: Dependency removal process +- **Date:** 2026-04-26 +- **Decision:** A dependency is not removed until all five steps are completed in a single PR: (1) Grep the entire repository for references to the package, its exports, and contributed type names — zero hits outside git history. (2) Regenerate the lockfile. (3) Update `assets/licenses.yaml` to drop the package and any orphaned transitive deps. (4) Remove any vendored artifacts (binaries, prebuilt assets, generated bindings) and delete their `BUILD.md` records. (5) Check for architectural assumptions the dep was carrying — if it justified a data flow, build step, or platform strategy, the replacement must pick up those responsibilities or the relevant D-record must be updated. +- **Rationale:** "I deleted the line from pubspec.yaml" is the start of a removal, not the end. Partial removals leave orphaned lockfile entries (installed on fresh clones), stale license entries, or orphaned vendored binaries that look legitimate. +- **Cost:** Removal PRs are larger than the one-line diff suggests. Accepted. +- **Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml), `POLICY.md`. +- **Raised by:** 2026-04-26 policy-to-decision migration (T-28). + +### D-63: Vendored binary rebuild process +- **Date:** 2026-04-26 +- **Decision:** Every vendored native binary has a `BUILD.md` next to it recording: (1) exact upstream source (git URL + commit SHA, not a version tag), (2) full build command with all compile flags, (3) toolchain version (compiler, linker, target triple), (4) expected output size and SHA-256 hash, (5) any patches applied (stored as `.patch` files in the same directory). Rebuilds happen in CI, not on contributor machines. The rebuild PR updates `BUILD.md`, the binaries, and hashes atomically. No binary is committed without a reproducibility record. Security patches to vendored deps are tracked with the same urgency as source-level vulnerabilities. Dropping a platform requires a policy decision; adding one requires adding it to the CI matrix and rebuilding all vendored binaries first. +- **Rationale:** Vendored binaries are inside the trust boundary — the signed release contains exactly these bytes. Without reproducibility records, a committed binary is unverifiable and therefore untrustworthy. +- **Cost:** Rebuilds require CI infrastructure and cross-compilation. Currently partially manual (T-25 tracks full CI automation). +- **Cross-reference:** [D-60](#d-60-no-network-on-default-launch-path), [D-42](#d-42-dependencies-documented-in-licensesyaml), T-25, `POLICY.md`. +- **Raised by:** 2026-04-26 policy-to-decision migration (T-28). + +### D-65: License compatibility matrix +- **Date:** 2026-04-26 +- **Decision:** clide is MIT-licensed. Every dependency, vendored binary, bundled font, and asset must be compatible and attributed. **Compatible (permissive):** MIT, Apache-2.0, BSD-2/3, ISC, Zlib, Unlicense, CC0. **Compatible with care (copyleft):** MPL-2.0 for libraries; LGPL only for dynamically-linked vendored binaries where users can replace the library. **Not compatible:** GPL for linked code (GPL vendored binaries like git are fine — they ship as separate executables), AGPL, SSPL, "commercial use prohibited," unreviewed custom licenses. Apache-2.0 deps preserve their NOTICE file verbatim. Apache-2.0-with-LLVM-exception requires the exception text specifically. Fonts and icon sets are attributed even if the license doesn't strictly require it. An incompatible or unclear license is disqualifying regardless of technical merit. +- **Rationale:** The compatibility rules existed in POLICY.md but were not captured as a D-record, making them invisible to the decision-reference system. This record makes them queryable and cross-referenceable. +- **Cost:** License evaluation adds time to the vetting checklist. Intentional. +- **Cross-reference:** [D-31](#d-31-prefer-zero-deps-exact-pin), [D-42](#d-42-dependencies-documented-in-licensesyaml), [D-61](#d-61-dependency-vetting-checklist), `POLICY.md`. +- **Raised by:** 2026-04-26 policy-to-decision migration (T-28). + ---