Known limitations
Things that will bite you, listed before they do.
Everything on this page is true as of the current release. Struck-through items do not exist. They are listed rather than omitted, because finding out in week one is worse than reading it here.
Notification and alerting
| Capability | Status | What it means in practice |
|---|---|---|
| Does not exist | Nothing in Beetl can send you a message. | |
| Does not exist | Same. | |
| Does not exist | There is no notification domain or provider anywhere in the server. |
An Automation that finds a problem sets needs_attention and stops there. Someone has to open Beetl and look. The same applies to pipeline failures, ingestion errors and data-quality problems. In-app toasts are the only signal, and they only exist while you are looking at the page.
Query results and evidence
| Capability | Status | What it means in practice |
|---|---|---|
| 7-day result retention | Enforced | Ad-hoc query results expire silently after 7 days. |
| Does not exist | You cannot keep one past the clock. | |
| Does not exist | Re-run the query, or export it, before it goes. | |
| Does not exist | A chart you configured on an ad-hoc result is not saved with it. |
The consequence people hit first: an Automation report outlives its own evidence. The report persists, its linked query results expire on the normal 7-day clock, and the links go dead.
Navigation
Three fully built page families are unreachable from any navigation surface. The routes resolve, but nothing links to them.
/web/connections
/web/data-sets
/web/pipelinesYou have to type the URL. This matters more than it sounds, because two things live only on the connection detail page: Reassign Connector, and the uploaded-file card with its Replace control. Day-to-day connection work is expected to happen through the Data Landscape graph on the home page instead.
The status page at /web/status is also linked from nowhere.
Export and BI
| Capability | Status | What it means in practice |
|---|---|---|
| CSV export of a query result | Works | This is the only export format in the product. |
| Does not exist | Take CSV, or read the data over Flight SQL. | |
| Does not exist | Export is per query result only. | |
| Does not exist | Automation reports are Markdown in the UI. | |
| Does not exist | Dashboards are authored in Superset, not in Beetl. |
Embedded Superset gives you saved, shareable dashboards, but authoring happens over there and an operator has to publish a dashboard and enable embedding before it appears in Beetl. There is no path from a query result or an Automation's evidence into a dashboard.
Datasets and lineage
| Capability | Status | What it means in practice |
|---|---|---|
| Bronze / Silver / Gold tiers | Convention only | A tier is a label. Nothing enforces a Bronze to Silver to Gold DAG. |
| Data Landscape graph | Works | An entity graph over connections, datasets and pipelines. Not a tier lineage graph. |
| Per-cell lineage | Partial | Drill-down to contributing records where a deterministic path can be constructed. |
| Does not exist | The catalog is read-only. | |
| Does not exist in any API response | You cannot see how big or how stale a dataset is from the product. |
Pipelines and scheduling
| Capability | Status | What it means in practice |
|---|---|---|
| Time travel by version or timestamp | Backend only | It exists in storage. There is no UI and no version-history or rollback surface. |
| Automation schedule editor | Works | Plain-English builder, 6-field cron escape hatch, IANA timezone, 15-minute minimum. |
| Does not exist | The command exists in the domain but no endpoint calls it. The schedule is displayed read-only. | |
| Does not exist | Only table selections and connector reassignment can be changed. | |
| Does not exist | The builder shows the schedule read-only. | |
| Does not exist | No jobs page and no per-connection run list. Failures are not visible to you. |
Collaboration
| Capability | Status | What it means in practice |
|---|---|---|
| Workspace-owned Automations | Works | The one shared object. It survives its creator leaving. |
| Does not exist | Chat sessions, query results and API keys stay creator-scoped. | |
| Does not exist | No annotation anywhere. | |
| Does not exist | No groups, no assignment, no ownership transfer. |
Roles and access
| Capability | Status | What it means in practice |
|---|---|---|
| Roles | TenantAdmin and TenantUser | Two roles, no custom roles, no groups. |
| Role gating | One gate | Object-store mutation in Settings is the only role-gated action in the server. |
| Does not exist | Any authenticated user in the tenant can create and delete them. | |
| Does not exist | The event store has the answer, but the product cannot tell you who deleted a dataset. |
API keys and programmatic access
| Capability | Status | What it means in practice |
|---|---|---|
| Scopes | read and write | Checked at tool dispatch. |
| Does not exist | A key is valid until revoked. | |
| Does not exist | Create a new key, delete the old one. | |
| Does not exist | Scope is the only restriction. | |
| Does not exist | No throttle on /mcp. | |
| Does not exist | A last_used_at timestamp is the entire record. | |
| Does not exist | API keys authenticate /mcp and nothing else. | |
| Deliberately withheld | The run-history tools are not exposed over MCP. | |
| Does not exist | POST only. GET and DELETE return 405. |
Onboarding and guidance
There is no guided setup, no sample data, no tooltips and no walkthrough. Empty states point at the next action and stop there.
The sharpest version of this is the first-run trap: a new tenant has no object store, everything returns OBJECT_STORE_NOT_CONFIGURED until an admin registers one, and a non-admin first user cannot fix it themselves.