Sources
Docs: Panes, Preferences, Policies, and Execution context. Web App: Select a Pane, open Plots, and choose a named side tab. Results and errors appear below its SQL. React source is in Pane. While you edit SQL, an advisory check runs after a short pause. Markers identify SQL problems; a marker with a suggested replacement offers a Monaco quick fix. The existing Plot panel also shows findings without a source location. Findings with a location can focus that position in the selected source. The panel distinguishes Advisory SQL from Server validation. A pending or unavailable check is not an all-clear. Missing catalog access or an unavailable browser validator leaves the source editable and keeps the existing save controls available. Server checks and Policies still apply when you save. Saving definition SQL records server validation diagnostics. An unavailable validator does not prevent saving: the draft, last successful schema, reference pins, and dependencies stay available. Each draft keeps its own dependencies. Completed, trustworthy reference checks replace that draft’s dependencies; references that would introduce a cycle retain the previous dependency set. A save shares one ten-second budget across all Plot validation calls, including any second pass needed for changed sibling columns. When time runs out, the remaining checks are skipped and those Plots recordPV_SYS_001 (unchecked).
Your SQL draft still saves, but unchecked Plots cannot be published. This bounds
validation waiting; database work can take additional time.
An explicit re-check on the Primary or Proposal retries unchecked or stale
verdicts with the same shared budget. It skips current completed verdicts,
including SQL errors that need an author edit. Re-checking does not change your
authored content. See the Primary re-check API
and Proposal re-check API.
Static validation derives schemas for SQL without parameter defaults. Sources
with explicit defaults, including [], retain their last successful bound
schema until native planning validates their actual inputs. Publishing checks
the candidate definition and its parameters, diagnostics, and scheduled plan
before sealing it. Saving a live SQL Preference still requires successful
planning as described below.
When publication is blocked, the current Prepare findings identify the Plot and
retain the server’s reason, including after reloading the Proposal.
Saved findings belong to the exact SQL and selected Workspace and definition.
They replace advisory feedback for that saved text and clear when a completed
server verdict clears them. Publication findings show the server’s reason for
the named Plot; changing its SQL starts a new check.
The catalog follows the selected Workspace and Changes. Historical versions
remain read-only and do not borrow
the current definition’s advisory catalog. Unsaved definition siblings can
contribute trustworthy schemas to the current check; saved SQL Preferences
keep their separate live source and planning lifecycle.
Typing a Plot back to its saved SQL withdraws its unsaved draft, including when
an earlier save is still pending. Other Plots then validate against the saved
schema again.
In the Admin editor, select the Workspace whose data the Plot uses before
checking it. This editor uses the Workspace adapter and its
tenant.data.catalog permission, alongside current RACI and Policies. Without
catalog permission, you can keep editing and saving. Unavailable checking is
shown as unavailable, never as a successful check against an empty catalog.
The native Admin catalog operation separately requires
admin.tenant.data.catalog. Native Admin Prepare and Publish use the selected
Workspace and authenticated staff account. Planning and execution still require
their current Workspace authority. A successful check in one Workspace does not
certify the data or Policies of other deployment targets.
The SQL validation specification describes
diagnostics, catalog snapshots, and publication checks.
For typed access from TypeScript Pieces, the
data SDK specification explains manifests,
reading selection, and pagination. It distinguishes the implemented runtime and
server foundations from execution-host integration.
Structure
A Plot is a typed computation owned by a Pane. Its Perception declaresPlotContract<Input, Output> under a local Plot name. SQL is the current
implementation language; React rendering belongs to the Pane.
The input describes positional parameters and the output describes rows.
A fixed tuple has exact arity. A dynamic query builder can declare an array
of supported scalar types. Both paths validate parameter values and the SQL’s
placeholder count. The contract exists even when no SQL has been saved.
React imports other application components through declared Pane references.
It accesses owned logic through its Pane SDK. For a Plot declared with no parameters:
plots.activityFacts()is a hook exposing status, rows, errors, and rerun.plotApi.run('activityFacts')runs from an action handler.result.metaidentifies the data that answered the request, including a resolved Report when relevant.
Services
Kysely is available by default. It compiles query structure into SQL and a separate parameters array. Preview the result through:{ sql, parameters? }. Create or update that value
through preferences, then execute it with
plotApi.runPreference('activityFacts', id).
create.plots and edit.plots govern those writes even though the API is the
shared Preference API. Saving SQL also requires successful planning.
Planning uses the same current definition and permissions as the save. A failed
plan preserves the previous saved revision and output schema.
SQL definition source can also retain parameter defaults alongside its code.
Those defaults belong to the definition, survive publication and archive
export/import, and must match the Perception’s declared Input. Older published
versions retain their own defaults after a later edit changes or clears them. React and CSS sources cannot carry
SQL parameters. An explicit empty array stays distinct from omitted defaults.
Use a declared tuple or scalar array for nonempty parameters. Native Dates
serialize as timestamps; strings, finite numbers, booleans, and null retain
their values. Parameters remain bound
values and are not interpolated into SQL. Omitting a live-query override uses
saved parameters; an explicit array replaces them, including an empty array.
Use explicit casts when needed to keep the planned output type stable.
Native numeric values must be finite. Integer-valued numbers must fit
JavaScript’s safe range, from -9007199254740991 through 9007199254740991.
This also applies inside nested values, parameters, saved defaults, and Report
results. Unsupported values refuse before a write or result completes; retained
values and Report bytes are never rounded or rewritten during a typed read.
Finite fractions remain supported. Use an explicitly declared string contract
when an application needs to retain larger integral identifiers as text.
A saved Plot edit uses the revision last read. A refused save preserves the
local draft; reload explicitly before replacing it. Previewing a generated query
does not save a Preference. An application may offer separate create, update,
and run actions for the selected saved query.
Each saved SQL Use names one owned Plot. Its members cannot run under another
Plot’s contract, even when both Plots belong to the same Pane.
plotApi.key('activityFacts') returns that declared Plot’s stable identity for
explicit Use setup; the identity grants no access by itself.
React source uses { source }. paneApi.renderPreference(sourcePreferenceId) loads a
renderer for its saved owner. The host determines its Pane, references, selected
value, and policy decisions; caller-supplied owner or policy objects cannot
replace those checks.
Storage
A definition version identifies code and schema. A Report identifies produced data. For a pipeline Plot, Current selects the newest completed Report whose output fits the selected definition. It can come from an earlier compatible definition. Publishing does not run a Report or change its schedule. Choosing a Report pins that run; an unavailable or incompatible result does not fall back to Current. Ordinary SQL Plots and previews can query completed pipeline outputs while using their own SQL and parameters. Direct reads of a materialization retain its captured inputs and refuse different overrides. UseplotApi.readReport('activityFacts') to read completed output with its
captured inputs. It returns the Perception’s typed rows without requiring
today’s input tuple. It uses the selected Report, or Current’s newest compatible
completed result, and refuses when no materialized result is available.
run and preview keep their declared input requirements.
Named reads let the server select the captured default source.
runPreference always checks the exact requested source ID and optional revision,
including when reading a Report. A materialized response retains its producer
contract and source metadata; consumerContractHash records admission for the
selected definition, and materialized distinguishes captured output from an
ordinary query running in Report context.
SQL catalog addresses use the stored Parable and Plot slugs. Both segments begin
with a lowercase letter and contain lowercase letters, digits, and underscores
between groups. Hyphens and case-only replacements are refused. Renaming a handle
does not move those addresses. Query builders take the stored slugs from the
selected definition’s metadata; they do not derive an address from a handle.
Publication plans Plot dependencies from the candidate definition’s schemas.
A missing dependency or a cycle refuses publication. Planning does not fabricate
rows or require an existing Report. Results retain the producing source and
Report separately from the consuming definition.
Security
Source inspection usesview.plots; source edits use edit.plots. SQL output
uses its Data Policies’ view.preferences and row filters. Permission to read
data need not disclose its query. The generic Preference API does not collapse
these targets into one grant.
Using a React renderer requires permitted Pane/value access. It can be delivered
without granting its source-editor view, but executable JavaScript necessarily
reaches the browser. CSS has the same limitation. These restrictions cannot
promise secrecy for delivered code or styles.
A constructed preview and a saved named output both apply their declared
Plot’s Data Policies and their actual inputs’ restrictions. Restrictions that
must apply to every query over a Provider belong on that Provider’s binding.
Invalid or unsupported filters refuse execution rather than returning
unfiltered rows.
Stability
A Report pipeline cannot yet consume another pipeline Plot’s newly produced output within the same run. The worker refuses that dependency until it can bind the intermediate output. Ordinary consumers of completed pipeline outputs support Current and explicit Report readings. A Report can consume a compatible output completed in an earlier run. Its captured definition supplies the planned input schemas, while current Policies authorize the recorded data. Contract validation and current-authority checks remain active through result streaming and completion, including empty results. Provider input replay is not yet available. A historical result whose Provider filter usesrequest_principal() requires the captured principal, including
email. Source filters using now(), current_timestamp, current_date, full
parable_context(), or another execution-dependent function refuse both Report
materialization and historical reads. Use Current data for those filters until
input replay is available. Typed Preference inputs support captured-value checks under
current Policies. These limits matter when assembling a real classification
pipeline; having SQL or a model UDF available does not itself connect that flow.
Historical source admission follows immutable Plot or SQL Preference identities,
including a retained SQL Preference’s declared Plot association. Retired,
replaced, or ambiguous identities refuse. Current access must cover every
captured contributor: unchanged filters or removed restrictions can qualify;
new restrictions require replay and refuse. An equivalent Policy conversion
can preserve access even when its internal lookup records change. Once a read
starts, any change to its admitted authority aborts that read before completion.