v0.0.58 — Three-mode dashboard picker
Released: 2026-05-07.
View / Edit / Full mode picker
The binary "Chat mode" toggle is replaced with a 3-way segmented picker in the dashboard header:
| Mode | Audience | UI |
|---|---|---|
| View | 95% of traffic (directors, ops managers, casual viewers) | Metabase-clean. No toolbar, no chat panel. Default. |
| Edit | Analysts who like AI-driven authoring | Figma-Make-style chat-primary. Chat panel as a flex rail on the left, canvas on the right. Toolbar hidden. |
| Full | Operators who want the v0.0.55 chrome | Legacy MSTR-style. Toolbar Row 2 + sticky bottom AI bar both visible; chat panel mounts as a collapsible overlay alongside. |
Selection persists per user via localStorage (honeyframe.dashboard.mode). The v0.0.56–v0.0.57 boolean key (chat_primary='1'/'0') is migrated automatically. Non-editors and kiosk users silently collapse to View regardless of preference.
Full mode is transitional — kept while we validate Edit covers every legacy capability. Planned to retire in v0.0.60+ once telemetry shows it rarely used. The toolbar code is NOT deleted; it's just gated behind Full mode.
View mode is genuinely read-only
showEditAffordances is threaded through the most visible canEdit-gated edit chrome: the inline title editor, + Add Card / + From Template buttons below the grid, the Add page tab button. View mode no longer shows these, even for users who can edit.
Chat covers every mutation type
The /ai-chat intent router grows from 4 actions (answer, create, modify, insights) to 9 — chat is now functionally equivalent to the toolbar for editing tasks. New chat actions:
set_period— set the dashboard time scope (column / start / end / preset)add_filter/remove_filter— manage dashboard-level filtersremove_card— delete a card by IDset_layout— bulk grid coordinates
Each branch goes through apply_mutations() so chat-driven edits hit the same dedup + snapshot infrastructure as the explicit /mutations endpoint. Bad LLM output (missing filter_id, invalid mutation type) degrades into a conversational "couldn't apply that" turn rather than 500-ing.
Period chip in the header (View + Edit modes)
A Figma-Make-style date-scope chip in the dashboard header. Clicks open a small popover with 8 presets (All time, Last 7d / 30d / 90d, This month, Last month, This quarter, YTD). State reuses the existing quickRange / filterStart / filterEnd source of truth, so a Full → View → Edit mode flip preserves the choice.
Opt-in per dashboard: the chip only renders when the creator has set a date column. Dashboards that never get a date column configured stay chrome-free.
DashboardsPage split — list vs detail
The 6,075-line DashboardsPage.tsx held two distinct routes (the list at /dashboards and the per-dashboard detail at /dashboards/:dashboardId) behind a single component. v0.0.58 Phase B splits the file along the route boundary so future detail-mode work has a bounded file to live in. The list page is now 2,810 lines; the detail page is 5,713 lines. No behavior change.
Release-bundle fix — daily extract pipelines restored
build_release.py never copied paas/api/, so the Postman environment JSON that a customer integration's source extractor reads to discover its per-source base URLs has been missing from every tarball since the /opt/honeyframe/ install-path migration. The daily pipeline crash-failed its extract step with FileNotFoundError, leaving the raw landing tables stale (10+ days behind on prod as of 2026-05-07) and the downstream dbt_run step skipped. paas/api/*.json is now bundled the same way paas/scripts/ is, with a contract test guarding against regression.