Skip to main content
Version: v0.0.67

v0.0.61 — Width buckets, chat polish, self-correcting AI-create

Released: 2026-05-08. Twenty commits.

Width-bucket abstraction

Card widths are now stored as one of three semantic buckets rather than raw pixel widths:

Bucketsize_xUse
small8KPIs, sparklines
medium12Paired charts, half-width tables
full24Tables, maps, choropleths

Buckets carry through:

  • Manual resize in the editor (width_bucket written alongside size_x)
  • The JSX / Figma-Make exporter (renders the right Tailwind col-span token)
  • The Metabase import (18-col → 24-col + bucket inference)
  • The LLM prompt (chat actions specify width_bucket, not raw pixels)

A small bucket-picker UI replaces the freeform resize handle on card edges — drag snaps to one of the three buckets. Existing dashboards backfill from size_x on first read.

The jsonb_set UPDATE for width_bucket initially tripped SQLAlchemy's bind-parser conflict with the ::jsonb cast ((?<![:\w\$\\]):(...) refuses to match :bind followed by ::). All cast operators on the path now use CAST(:bind AS jsonb) instead of :bind::jsonb. A new paas/tests/unit/test_sql_cast_after_bind.py greps every paas/backend/*.py for the :name::type pattern and fails CI if any reappears.

"Chat" mode renamed to "Build"

The three-mode picker is now View / Build / Full. "Chat" was misleading — the Edit-mode UI is a full authoring surface that just happens to be chat-driven. The localStorage key migrates automatically.

Self-correcting AI-create

When an AI-generated card's SQL fails schema pre-flight (sqlglot AST walk against the project's data_dictionary), the chat agent now sees the error inline and self-corrects rather than asking the user to debug. The pre-flight runs:

  1. sqlglot parses the SQL into an AST
  2. Every referenced schema.table.column is checked against data_dictionary
  3. Errors are persisted on the card (card_config.last_error) and surfaced to the LLM in the next turn's system context

After at most one self-correction round, if the SQL still doesn't pass pre-flight, the card lands as a mock card with a "🎨 MOCK — schema mismatch" tooltip rather than throwing.

sqlglot is now a release-time dep: excluded from Nuitka's follow set (single 1 MB / 10K-line module that scons couldn't compile) and pip-installed into dist/ after compilation. Same pattern as chromadb / faiss, except sqlglot is needed at module-load time by safe_sql.py.

Auto-tools heuristic

The Tier C agent loop is now auto-enabled for chat requests that have hallucination-prone shapes (e.g. asking about specific values, asking for cross-dataset joins, anything where a free-running LLM would invent table or column names). Users still see the explicit Agent mode toggle, but the default is now smarter — fewer "I don't know what orders_count is" failures.

MSTR-style inline chart for answer turns

When the LLM picks ANSWER with a SQL-backed answer (e.g. "what was last month's total?"), the chat panel renders a small inline chart inside the message — the MSTR / Tableau Pulse pattern. The chart carries a Refine button that pins its SQL as context for the next turn (see below) and an Add to dashboard action.

Refine-in-place

The Refine button on an inline chart pins its SQL as context for the next turn. The chat panel shows a "📌 Refining: <SQL>" chip above the composer with a clear . Send forwards the pinned SQL as refine_sql on AIChatRequest; the backend reframes the prompt with a [REFINE-IN-PLACE] tag and instructs the LLM to emit a delta rather than start fresh. Pin clears on send (one-shot).

Composable with inline-chart rendering: ask question → see chart → refine → modified chart replaces in the next turn → keep iterating, or Add to dashboard.

Follow-up chips

LLM-suggested next prompts as one-click chips below each assistant turn (the MSTR / Tableau Pulse pattern). The system prompt asks for an optional follow_ups list of 2–3 short prompts; the backend parser sanitizes (cap 3, length-bound 120 chars, drop empties) and persists alongside reasoning and title. Clicking a chip loads the prompt into the composer — no auto-send, the user can edit before committing.

v0.0.61 org-isolation cohort

entity_resolution and pipeline routers — ER configs / decision logs / review queues / pipeline runs / recipe lineage walks — now scope to the caller's org boundary.