From 4f5d97ebc5289577206d08941aa3f58eea1a00f3 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Wed, 22 Apr 2026 22:07:04 +0200 Subject: [PATCH] define core frame vs shipped extension boundary (D-046) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Core frame builtins are infrastructure the shell can't function without. Content extensions (editor, claude, canvas, etc.) are bundled but architecturally removable — users swap the surface, not the data. Removes builtin.jira stub: Jira belongs as a third-party extension, not a frame builtin. Git is a split component — daemon-side process stays in frame, UI surfaces are extensions. Co-Authored-By: Claude --- app/lib/builtin/jira/jira.dart | 1 - app/lib/builtin/jira/src/extension.dart | 17 ----------------- app/lib/kernel/kernel.dart | 2 +- decisions/extensions.md | 18 ++++++++++++++++++ 4 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 app/lib/builtin/jira/jira.dart delete mode 100644 app/lib/builtin/jira/src/extension.dart diff --git a/app/lib/builtin/jira/jira.dart b/app/lib/builtin/jira/jira.dart deleted file mode 100644 index b968b883..00000000 --- a/app/lib/builtin/jira/jira.dart +++ /dev/null @@ -1 +0,0 @@ -export 'src/extension.dart'; diff --git a/app/lib/builtin/jira/src/extension.dart b/app/lib/builtin/jira/src/extension.dart deleted file mode 100644 index c924aaaf..00000000 --- a/app/lib/builtin/jira/src/extension.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:clide_app/extension/extension.dart'; - -/// Tier-0 stub. Real implementation lands in a later tier; the extension -/// is registered so the extensions-ui surface can list it as "installed, -/// not yet implemented" and its id is reserved. -class JiraExtension extends ClideExtension { - @override - String get id => 'builtin.jira'; - @override - String get title => 'Jira'; - @override - String get version => '0.0.0-stub'; - @override - List get dependsOn => const []; - @override - List get contributions => const []; -} diff --git a/app/lib/kernel/kernel.dart b/app/lib/kernel/kernel.dart index c57da238..2f1c7a33 100644 --- a/app/lib/kernel/kernel.dart +++ b/app/lib/kernel/kernel.dart @@ -3,7 +3,7 @@ /// /// Admission rule: the kernel owns anything whose second concurrent user /// would create incoherent state or divergent UX. External-interfacing -/// work generally belongs to extensions (git, pql, Linear, Jira); +/// work generally belongs to extensions (git, pql, Linear); /// external-interfacing *singletons* (OS clipboard, tray, keychain) /// belong here. /// diff --git a/decisions/extensions.md b/decisions/extensions.md index f3fdb07b..8cd8decf 100644 --- a/decisions/extensions.md +++ b/decisions/extensions.md @@ -39,6 +39,24 @@ Extension contract, Lua runtime, grain, contribution points. - **Cost:** Runtime is a separate supporter tool to build; ffi is tricky. Deferred to Tier 6; only the slot is reserved now. - **Raised by:** 2026-04-21 planning. +### D-046: Core frame builtins vs shipped extensions boundary +- **Date:** 2026-04-22 +- **Decision:** The `app/lib/builtin/` directory is reserved for core frame infrastructure — components the shell cannot function without. Everything that renders *content* (editor surfaces, tool panels, integrations) is a shipped extension: still Dart, still bundled in the binary, but architecturally an extension that registers through the contribution contract and could in principle be disabled by the user. + + **Core frame builtins** (cannot be disabled; the frame breaks without them): + `default-layout`, `welcome`, `ipc-status`, `theme-picker`, `terminal`, `files`, `grammars-core`, `settings-ui`, `extensions-ui`, `keybindings-ui`. + + **Split components** (core process in the frame, UI surfaces as shipped extensions): + `git` — the daemon-side git process (branch, status, stage, commit, diff computation) is frame infrastructure that the status bar, file tree dirty markers, and other extensions depend on. The git panel, conflict UI, and diff tab are shipped extensions that consume it. + + **Shipped extensions** (bundled but removable; contribute content, not infrastructure): + `editor`, `claude`, `claude-control`, `markdown`, `diff`, `git-ui`, `pql`, `canvas`, `graph`, `decisions`, `tickets`, `todos`, `problems`. + +- **Rationale:** The previous session bled several content extensions (jira, todos, decisions, tickets, canvas, graph) into `builtin/` as stubs, treating "shipped with the app" as "part of the frame." This conflates two concerns: the frame's structural integrity and the bundled feature set. A user who disables the canvas extension should get a working IDE with no canvas panel; a user who disables the layout extension gets a broken window. The boundary is: can the frame render and function without it? If yes, it's a shipped extension, not a frame builtin. +- **Cost:** Shipped extensions need a separate registration path (e.g. `app/lib/extensions/` or equivalent) distinct from `app/lib/builtin/`. The extension contract must support "bundled Dart extension" as a first-class category alongside "builtin" and "third-party Lua." Migration is incremental — move one at a time, each behind a working build. +- **Supersedes:** Removes `builtin.jira` (already deleted; should never have been a builtin — Jira integration is a third-party extension, not a shipped one). +- **Raised by:** 2026-04-22 session review. + --- *See also the existing `builtin.grammars_core` stub for tree-sitter