Skip to content

Roadmap to 1.0.0 #68

Open
Open

Description

@BorisTyshkevich

Meta/tracking issue + living build plan. Architecture is settled (#88 / ADR-0001); the phases below are ordered so each refactor lands on a stable base and the most-wanted features ship early. Check items off as they land.

Architecture (settled — #88, ADR-0001)

  • State: @preact/signals-core, migrated slice-by-slice. No UI framework (React/Preact/Solid). A Preact spike on the schema panel (spike/preact-schema, ADR-0001 addendum) confirmed a component model removes the in-place-mutation pain but buys a second render paradigm the roadmap doesn't justify.
  • Shape: signals (state) · pure logic in src/core/ · imperative adapters behind injected seams for the hard / third-party / high-frequency-pointer surfaces (editor, EXPLAIN + schema graphs, Chart.js, result grid). Extract a shared primitive (EditorPort, GraphSurface, a result-view registry, Drawer) on the second consumer — not speculatively (CLAUDE.md rule 5).
  • Types: ADR-0002 (2026-07) — incremental strict TypeScript, dev-time only: tsc --noEmit joins the gate, files convert leaf-up one at a time (seams → state.js → core/ → net/ → editor/ → ui/), persisted-data types generated from the canonical JSON Schemas; esbuild and the artifact untouched, runtime deps stay four. Phases 0–5 landed via ADR-0002 phase 0: TypeScript gate — tsconfig, tsc --noEmit in the test gate, typed seam interfaces #262/PR ADR-0002: strict TypeScript migration — gate + phases 1–5 (generated schema types, state, contract spine, param pipeline, dashboard runtime, tests) #265 (gate, generated schema types, state, contract spine, param pipeline, dashboard runtime + tests); the remainder converts leaf-up with feature work. The no-framework line was re-evaluated at the dashboard milestone and stands (ADR-0001 2026-07 addendum, with a sharpened concrete re-evaluation trigger).

Build order

Phase 0 — baseline before refactors (cheap, do first)

Phase 1 — finish reactivity (#88)

Phase 2 — near-term wins

Phase 3 — Windows

Phase 4 — editor: CodeMirror 6 + the features it unlocks

Strict sequence — each issue is the foundation of the next: #143 → #21 → #84 → #60.

Phase 5 — schema / data-flow graph

Phase 6 — Dashboard (#149)

Epic: open favorited Library queries as an interactive dashboard in a new tab
(/sql/dashboard). Spec + pinned decisions + sub-phases D1–D8 live in #149. Same architecture
(signals + hyperscript, no framework — reaffirmed against the React mockup); one artifact,
client-side route; auth via one-time postMessage handoff + login fallback. Builds on #134
({name:Type} params / varValues) and the chart core.

Saved-query model: panel controls visualization; optional dashboard.role controls
dashboard participation (panel | filter | setup). Missing role defaults to panel.
Favorite state controls inclusion and is independent of role.

Design detail lives in #149 and the linked issues — this list tracks order + status only.
(History: this checklist once had D3/D4 swapped relative to #149; #149 is the source of truth
for phase order.)

Phase 7 — filters & variables

Reconciled by #447 (2026-07-26). This phase's framing predates the removal of
the curated-filter/provider model. The query-backed Filter source (#160) and
everything layered on it — #359's shared-source runtime, #360's parameterized
sources, #189's multiselect — are removed, not merely superseded. The surviving
concept is a Dashboard VARIABLE inferred from panel SQL; #165's optional blocks,
#170/#171's validation and recents, and the shared {name:Type} /
state.varValues machinery all remain and are what variables are built on. Read
the rows below as history for anything filter-source-shaped.

Amended by #468 (2026-07-26, shipped). One piece came back: #189's searchable
multiselect CONTROL, now driven by an Array(scalar T) variable's own
Dashboard-local option SQL rather than by a Filter-role source query. Nothing
else from the curated model returned — no provider, no shared source, no target
list, no persisted selection mode. #447's "Multiselect or Array-valued variable
controls" non-goal is annotated accordingly.
One track: every surface shares the {name:Type} / state.varValues machinery, and every
prerequisite is already merged
(#134, #152/D3, #84) — the whole phase is implementable now,
independent of the Panels track (the query-backed Filter source #160 is dashboard-only and moved
to Phase 6 with its #166 prerequisite; the workbench keeps free text inputs). Build order: #173
first (7.0 foundation — everything else is a pipeline stage or consumer, absorbs #155; its
typed serializer is what #189 will need for multiselect), then #165 → #170 → #169 → #171 /
#172-v1 → #172-v2; #174 (combobox a11y primitive) is normative from the first dropdown
consumer; its former dashboard clear/overflow/multiselect scope now lives in #286 (clear/count
baseline; #188 dissolved) and #189 (multiselect). Design
detail lives in the issues — this list tracks order + status only.

Deferred until demonstrated need: dependent/cascading query-backed option sources, option
dependency graph, and cache policy. File a focused issue only when a real dashboard requires it.
Also revisit on demand (each needs its own small design): filters: one-query-many-params
bundle (was a #149/#160 non-goal) — now the shared Filter-source track: #359 establishes the one-source-runtime boundary (source runs once per wave, provider keyed by source-query id, diagnostics published, options cleared-on-failure + active reconciled), and #360 adds parameterized sources + single-layer dependency scheduling on top (shipped — PR #362, merge gate); paired from/to time-range control shipped as #335 — PR #376 (merge gate): compound Time-section control with staged From/To popover on the shared popover primitive extracted from the #189 multiselect, atomic applyFilters batch commit (one wave), and one wallNow() snapshot per wave published as waveWallNowMs; #334 — PR #390 (merge gate) replaces #335's interim name-pair inference with authoritative saved-query timeRanges metadata, derives independent groups on Dashboard load, and adds synchronized exact-time crosshairs plus atomic mouse-brush range selection across temporal line/area/column charts; explicit SQL
NULL filter options (#165 "SQL NULL" notes).

Phase 8 — Dashboard as a first-class module (#280)

Epic: retire the favorites-derived dashboard in favor of an explicit persisted
DashboardDocumentV1 inside an atomic StoredWorkspaceV1 aggregate (one current workspace,
zero-or-one Dashboard), PortableBundleV1 interchange, presentation variants via JSON Merge
Patch, a normative flow@1 layout, and separate authoring/viewer sessions. Normative spec in
#280; six sequential sub-issues. Starts after #276 completes (phase 4's viewer session builds
on #276 3b DashboardSession); #283 is pure core/schema work and may start in parallel with the
#276 tail. Absorbs and closed: #235 (wave scheduling → #286), #153 (reorder/span → #286,
open-in-window → #288).

Phase 9 — multi-workspace and unified workspace routing

Strict sequence: #406 persistence foundation → #407 canonical unified route → #408 selector/management UI → #409 stale-write protection. The repository phase deliberately retains last-write-wins for simultaneous cross-tab commits; #409 owns conflict detection.

Phase 10 — multi-Dashboard workspace + Dashboard/Library UX (#430)

Epic: #430 turns the workspace's single Dashboard into a real multi-Dashboard
product surface — selection state, a Databases/Dashboards tree, Library queries
separated from Dashboard-owned copies, copy-on-drag assignment, and tree
editing. #430 specifies ONE continuous pass and ONE final PR closing #424–#429;
#424 was shipped separately by owner request (it is pure storage and has no UI
change, so it stands alone safely). The remaining phases still belong together.

Cross-cutting

Release-blockers (1.0 must not ship without)

\n\n## Dashboard layout sizing correction (#549)\n\nDraft PR #549 follows up on #538 with the corrected #535 behavior: grafana-grid@2 persists independent Grid, Full, and Report sizing; 2/3 Columns are session-only 300px previews; and Widen changes width only in Grid or a temporary preview. Full and Report have fixed authored widths and no Widen action.\n

Activity

  1. BorisTyshkevich commented on Jun 29, 2026

    @BorisTyshkevich
    CollaboratorAuthor

    Roadmap state audit (2026-06-29)

    Reconciled the checklist against main and the linked issues/PRs; ticked the items now actually complete.

    Newly checked off (all landed in code):

    Still open / unchecked (accurate):

    Net: the should-have/nice-to-have hygiene is essentially done; what remains for 1.0 is the four release-blockers (#69–#72) plus the per-track feature decisions.

  2. BorisTyshkevich commented on Jun 30, 2026

    @BorisTyshkevich
    CollaboratorAuthor

    Architecture + build order recorded (from #88 + the Preact spike; ADR-0001).

    Reactivity: @preact/signals-core, no UI framework (Preact evaluated on the schema panel and rejected — evidence: spike/preact-schema, ADR-0001 addendum). Architecture going forward: signals (state) + pure core/ + imperative adapters behind seams (editor/graph/Chart); complex UI gets a shared primitive once a second consumer appears (EditorPort, GraphSurface, a result-view registry, Drawer).

    Build order:
    0. #69 — add WebKit to Playwright + #70 WebKit-verify the html{zoom} dependency (cheap baseline before refactors).

    1. Finish signals-core (schema slice = replaced Set/Map signals, not in-place mutation).
    2. Ship the near-term wins that don't need CM6: Cap SELECT result rows (default 500) with a 100/500/1000/5000/10000 selector #86 (server-side row cap + selector) and Multiquery + run-selection: execute a ;-separated script (DDL / INSERT / single-row SELECT) with per-statement output #83 (multiquery/run-selection on the textarea + a pure statement-splitter).
    3. Adopt CodeMirror 6 behind the EditorPort seam (replace the hand-rolled textarea editor) #21 (reopened) — CM6 behind an EditorPort seam.
    4. Column-name autocompletion: FROM-driven column loading + alias/scope awareness #84 + Version-exact ClickHouse reference documentation in Workbench #60 (extract a shared Drawer here — its 3rd consumer is Version-exact ClickHouse reference documentation in Workbench #60's docs pane).
    5. Extract GraphSurface + core/graph-selection → Schema graph: multi-select + group-move of nodes (marquee, Shift-click, ⌘A) with single-step undo #66.
    6. Full html{zoom} removal, folded into the rewritten editor/graph coordinate paths.
  3. 2 remaining items

  4. added 5 commits that reference this issue on Jul 17, 2026
  5. BorisTyshkevich commented on Jul 18, 2026

    @BorisTyshkevich
    CollaboratorAuthor

    Dashboard track (#280) — Phase 6 shipped; #280 is now 6/6.

    #288 (direct + full-screen viewing with the one-time IndexedDB handoff) plus #302 (Dashboard nav/import/export moved out of the Workbench File menu) landed together on feat/dashboard-viewing-288. New: DashboardOpenSource route contract (?ws=&dash= edit / ?st=&dash= one-time view handoff), a one-time handoff store + a persistent detached-views store (ADR-0003), edit/view/not-found viewer branching, a Workbench-header Dashboard → control, and the Dashboard page's own File menu. Closes #153. This completes the #280 epic.

  6. added a commit that references this issue on Jul 18, 2026
  7. BorisTyshkevich commented on Jul 19, 2026

    @BorisTyshkevich
    CollaboratorAuthor

    Roadmap note: #316 (Grafana-grid KPI tile polish — edit/view-mode shell, state-card a11y roles, equal-width card grid, value+unit/description/delta card polish) shipped as a follow-on to #291's grafana-grid@1. It changes no schema/persistence/placement semantics, so no #68 track re-scoping is needed; recording it here since it isn't a tracked checklist item. Owner decisions pinned on #316 (card polish applies to workbench/flow cards too; flow stream layout unchanged).

  8. added 4 commits that reference this issue on Jul 20, 2026
  9. BorisTyshkevich commented on Jul 31, 2026

    @BorisTyshkevich
    CollaboratorAuthor

    V2 scoping (professional UI redesign) is now tracked separately in #582, decided 2026-07-31. This issue (#68) remains the V1 roadmap; V1 is nearly complete per that discussion. See #582 for what carries into V2, what's deferred, and what's out of scope.

  10. added 2 commits that reference this issue on Aug 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions