Skip to main content

Reports

Sources

Docs: Plots, Policies, Powers Web App: Open a Parable in Ponder. The Refresh menu at the top right of the Parable editor leads with the Refresh on screen, unless it is Latest, then Refresh, which runs the Report now, Refresh everything, which runs it now and recomputes every Pipeline, Preview, which runs it on a sample of the data, and Plan Refreshes, which schedules it; below them it selects Latest or a stored run, which the UI calls a Refresh. Refresh in an empty run History of a Plot runs it too. A Report is one execution of a Parable’s Pipelines, the Plots whose Pipeline switch is on. Each run produces durable outputs that readers can select later, even after the Parable’s code changes. A Parable’s definition version identifies code and schema; a Report identifies produced data. A Refresh needs a Release. Any Parable with a Release and a Pipeline can run a Report, in every Collaboration Mode. A run needs no setup. Each run runs the Pipelines whose run key changed and reuses the output of the others (Reuse unchanged Pipelines). Plan Refreshes adds a schedule. A Personal Parable follows the same rule. Before its first Release, the Refresh menu shows Refresh refused, with the reason. After it, the menu offers Refresh, and Cancel Refresh while one runs. Each Refresh runs the Newest Release, and the schedules of that Release run. The person with Primary reads which Release a Refresh runs on the Personal sign: Personal. Changes save at once and go into no Release. A Refresh runs the Newest Release, v1.4. A schedule changed with Plan Refreshes in Personal is a saved change like any other. It goes into the next Release, and until that Publish the schedules of the Newest Release keep running. Parables are product experiences, and a Page that makes its reader wait has failed. Make any expensive query a Pipeline, judged by what it scans, joins, aggregates or calls and by measured read times, so Pages read stored rows instead of computing them on every read. A reader sees when the data was produced and can refresh it. A Pipeline is as fresh as its last run, so schedule runs as often as the Pages need. A Parable delivered to a Workspace carries its Reports and their schedules. The Workspace can run the Reports, and publishing its own changes keeps them. A schedule is the Parable’s default: every Workspace that publishes the Parable runs it, each on its own, and a Workspace can change it for itself. See Who runs a schedule.

Run a Report now

  1. Open the Parable and choose Refresh at the top of the Refresh menu, or Refresh in a Plot’s empty run History. Both send the Plot Report action. The menu offers it to a seat that may work in Publishing and moves you to Publishing first when you are Peeking or Pinging. A Personal Parable gets the same menu. On a Version with no Refresh yet, Power on Parable where the Pages go sends the same action (Read a Report).
  2. Parable captures the exact definition, the SQL implementation of each Plot it runs, and your identity as the requester.
  3. The run is queued and produces real outputs before it is shown as complete. A run is pending until a Plot starts, running while its Plots execute, and complete only when every Plot in it has succeeded. The first Plot that fails makes the run failed, and a cancelled Plot makes it cancelled; neither publishes any output. Each Plot has its own status: Pending, Running, paused at its budget while it waits for a higher budget, Complete, Failed or Cancelled. The run picker lists every run with its status, and only a complete run has rows to read. Selecting any other run shows its status, and its message when it failed, never rows. Pending, failed, empty, stale, unavailable, and incompatible results are shown as such; Parable does not switch readings to hide a failure. Each Plot’s History tab shows the same runs; see Plots.
Refresh runs each Pipeline of the run whose run key changed. Every other Pipeline reuses the output of its last run with the same run key. See Reuse unchanged Pipelines. Refresh everything, right after Refresh in the same menu, runs the Report now and recomputes every Pipeline, also one whose run key did not change. It is offered and refused exactly as Refresh is. A Refresh always runs the Newest Release. While an older Release or a Pending or Proposed Patch is on screen, the menu says so: Refresh Newest (v1.4) and Refresh everything in Newest (v1.4). A Preview also runs the Newest Release, unless a Patch is on screen. So while an older Release is on screen, the menu says Preview Newest (v1.4). While a Patch is on screen, it says Preview, because the Preview reads that Patch. Two Refreshes of one Report take turns. This is the first of the one-at-a-time limits. People and schedules run one Refresh at a time for each Report of a Parable. While a Refresh of the same Report is pending or running, Plot Report is refused with a message that names that run, and a scheduled occurrence due in that time is skipped without counting as a failure. The second limit is for Refresh by Parable: one Workspace runs one Refresh by Parable at a time. A Refresh does not wait for a Preview. A run that names no Report, as Refresh and Power on Parable send it, belongs to the Parable’s first enabled Report by order, or to the Parable itself when it has no Report. Retrying with the same request key returns the same run. It does not start another.

Preview a Report

Preview runs the whole Report end to end on a sample of the real data, so a Parable that takes a long time to refresh can be checked in a fraction of that time. A Preview needs the Parable manage permission and Publishing or Primary, on a published Version or on a set of Changes. A Preview needs a Release. On a Parable with no Release, the Refresh menu turns Preview and Refresh off. This includes a Workspace copy that has not taken its first Release. A Preview of a Patch there is refused before anything is stored. A Patch that does not exist, or a Pending Patch that another person started, gets its own refusal first.
  • The same run. A Preview captures the definition, each Pipeline’s SQL and inputs, and the shared settings when it starts. It captures the AS OF time as a Refresh does. A Piece edit or a settings save after that does not show in it. Preview again to see the change. The run executes every Pipeline in the same order, with the same SQL and the same Jev calls. Its outputs are stored like a Refresh’s.
  • On a sample. Every Provider table the run reads that has more than 10,000 rows is read as TABLESAMPLE BERNOULLI (10 PERCENT) REPEATABLE (0); smaller tables are read whole. The Pipelines that read other Pipelines read the sampled outputs and are not sampled again. Joins from a large table to a small one, such as events to people or channels, keep every match; a join between two sampled tables keeps about one match in a hundred. The same seed reads the same rows of the same data, so two Previews compare.
  • On a set of Changes. The Preview reads that set before it is published: a Pending set as it stands, and a Proposed set as it was proposed. Because a Preview records a Pending set as it stands, only the set’s author may Preview a Pending set; anyone who may open a Proposed set may Preview it. A Preview of a Published set is refused and says that the set is already published. A Preview of a Pocketed set is refused and says to Restore it first. Only the set’s author reads that answer: for everyone else, a Pocketed set is not found. The set itself does not change: its edits go on, and it is proposed and published as before. A Refresh of a set is refused, because only a published Version is refreshed. The Refresh menu lists a set’s Previews on that set and a Version’s on the Versions. A Pending set that changes nothing yet seals as the Version it was made from, so its Preview is that Version’s, and the menu lists the Version’s runs on the set. For a pulled Patch, Preview includes the incoming fix and the conflict choices you selected. Resolve any remaining conflicts before Preview. Later edits or publications do not change the SQL captured by an existing Preview. Parable staff turn on Previews of a pulled Patch for each environment. While they are off, a Preview of a pulled Patch is refused with PA-AU-122, and nothing runs. Every other Preview still runs.
  • Under the published Policies. A Preview of a set of Changes is computed and stored under the line’s published Policies, not under the set’s draft Policies. The view.preferences and view.data grants decide which saved rows, Pane values and Pane data the run reads, for the person who runs the Preview. A Pane that the current Release holds uses the current Release’s grants. A Pane that a later Release removed, and that the set adds back, needs both the set’s grant and the grant of the newest Version that held it. On a Workspace copy, that history stops at the upstream Release the copy accepted. A newer upstream Release cannot change the floor before the copy accepts it. Only a Pane that no Version of the line ever held uses the set’s grants. As in every run, filter Policies do not shape what a Preview stores: each read applies the current filters of the Parable (Policies). So a set that widens a Policy never shows a reader more than the published Policies allow, and that holds for anyone with Peeking, Pinging, Publishing or Primary who reads the set. A Preview does not show what the draft Policies change.
  • Says what it read. A Preview you choose says so on the Refresh control, with the sample it read: 2m ago · Preview: a 10 percent sample. Hover the control for the whole sample. The words come from the sample that the run recorded.
  • Never Latest. A Preview is listed with the Refreshes and marked preview. A reader reads it only by choosing it: Latest, the API’s Current, SQL that names parables.{parable}.{plot} and the Version a reader is held on all skip it.
  • One at a time. A Preview waits while any run of its Report moves. A Refresh does not wait for a Preview, because a Preview never becomes Latest. So a Preview never holds back Power on Parable, a Refresh or a scheduled run. Cancel Refresh stops either.
Judge shapes, joins, empty states and errors on a Preview, never totals: its numbers cover a tenth of each large table. Run a Refresh once the Pages read right on a Preview and the Changes are published.

Cancel a run or raise a paused Plot’s budget

A Refresh or a Preview that is still moving can be cancelled, from Cancel Refresh at the top of the Refresh menu, from Cancel beside its progress bar, or from its row in a Plot’s History tab. Every Plot still queued, running or paused at its budget stops. Model calls already paid for stay cached, so running the Report again does not pay for them twice. The run becomes cancelled within a few seconds and never becomes readable; the newest complete run stays the one Latest reads. Cancelling a cancelled run changes nothing. A run that already completed cannot be cancelled. A run that a failed Plot is failing becomes failed, and the cancel says so. Cancel also settles a run whose last Plot status never reached the Report, so the run looks unfinished although nothing of it is still running. The Plots that finished but never reported close as cancelled, and the run becomes cancelled, or failed when one of its Plots failed. The Report can then run again. On a run that already failed, Cancel closes any Plot it left showing running. A cancelled scheduled run does not count as a failure of its Report plan. A Pocket cancels every run that is still moving. When a Workspace Pockets its Deployment, the runs of that Deployment stop. When Parable staff Pocket the Parable in Admin, the runs of the Parable and of every copy stop. Each run and each of its open Plots becomes cancelled at once and reads “Cancelled because the Parable was Pocketed.” in the Plot’s History tab. Then Parable asks query-runner to stop the query runs of each run. The Pocket waits at most five seconds for these answers. If query-runner does not answer, a query run can continue to its end, but its output does not become readable. A later Plot status never opens a closed Plot again, and a late cancel keeps the Pocket’s sentence. If a query run fails or finishes late, its Plot shows how it ended, and the run stays cancelled. A Restore does not start the runs again. A run that already ended stays as it ended. The audit log records each cancelled run with the person who Pocketed the Parable. When Parable staff delete a Parable or a copy in Admin, its runs end in the same way, with “Cancelled because the Parable was deleted.” A Plot that reaches its cost, call or runtime cap pauses at its budget while the run stays running. Raise budget on that Plot’s History row, or on the run’s paused state where the Page goes, shows what it has spent against its caps and takes new caps for this run only. Each new cap must be above the current cap and above what the Plot has used; the runtime cap counts from when the Plot started, including the time it was paused. The Plot resumes from what it had spent, without a publish, and its published caps do not change. The dialog closes when the server accepts the raise, or when the Plot no longer waits at its budget. Opening Raise budget again starts a new dialog, which an earlier raise does not close. A paused Plot waits four hours for a raise. When no one raises it in that time, the Plot fails and says that no one raised its budget, and the run becomes failed. The run’s other Plots are cancelled, so the Report’s next scheduled run is not held back by a run that cannot finish. Model calls already paid for stay cached. Raise the Plot’s caps, or make its query cheaper, before the next run. Cancelling uses the same check as Plot Report: Parable manage permission and Publishing or Primary. Raising a budget allows spend beyond the published caps, so it needs the budget override permission, which Workspace Administrators hold, and Primary. Both are recorded in the audit trail with the person, the run and, for a raise, the previous and new caps. Each Plot of a run executes its captured SQL at the captured publication, so a later publish does not change it. If the run cannot start, the request returns an error and the run stays pending. A retry with the same request key starts it again. If the run’s captured inputs no longer match its published Version, the run fails. When a run never starts and nobody retries it, the scheduler starts it within a few minutes. A run executes under its captured principal: the person who chose Plot Report, or the Workspace for a scheduled run. Planning applies that principal’s Policies (each Plot’s Pane Policies and each Provider table’s Provider Policy) and records the sources it read. A person whose Provider Policies narrow a Provider table the run reads is refused before the run starts, because the run would store only their rows for everyone; no Provider Policy narrows the Workspace. A Plot in a Report run reads four kinds of input:
  • Provider and Plot tables (providers.*, parables.*). Planning applies the principal’s Policies to each (each Plot’s Pane Policies and each Provider table’s data policy) and records the sources it read.
  • Artifact tables (artifacts.*). They have no Policies. A run reads each at its pinned version, as below.
  • Workspace tables (workspace.*, such as workspace.users). They have no Policies and hold only the run’s Workspace’s rows, as any query of the Workspace sees them. A run reads each table once when it plans the Plot.
  • Saved rows (parables.<parable>.<pane>, _by_actor and _data). A run has no reader, so a Plot reads each Pane’s rows layered with no reader, This Parable’s over the Parable’s Default, and every team’s through _by_actor, never a person’s own, as below.
Artifact and Workspace tables and saved rows add no source authority, so a reader of the run’s output is checked against its Provider and Plot tables. Prepare and Publish refuse a Pipeline whose SQL reads a table a Report run cannot read, such as providers_quality.summary.*, and name it. A run of a Pipeline published earlier refuses the table when it plans that Plot: the Plot fails with QL-PL-016, and its message says it reads a table a Report run cannot read. Read such a table in a Plot that is not a Pipeline. Every Plot of a Report run reads its inputs as of one time, the run’s AS OF time. Every run records an AS OF time. For Plot Report it is the moment you chose it; for a scheduled run it is the occurrence, even when the scheduler reaches it late. Each Plot reads every versioned input at the last version committed before that time: every Provider and artifact table, and every Plot table except a Pipeline’s. A Pipeline of the same Report is read from the table this run wrote. Times are compared to the whole second, so a commit made in the same second as the AS OF time is not read. A commit that lands while the run is queued, or between two Plots, is not read either, and a restart pins the same versions. Each pin also records when its version was committed, to the second, so the run shows how old the data it read from that table was. Workspace tables have no versions. A Plot reads them when its query run is planned, at or after the AS OF time, and the run records when it read each one. Every stage of that Plot reads the same rows. The Plots of one run are planned separately, so two of them can read a Workspace table a few seconds apart, and a restart from planning reads it again. Saved rows are the exception: the run keeps the moment it started, and every Plot reads each Pane’s rows as they were then, keeping only the rows whose Pane’s view.preferences Policy allows the run’s principal. A Pane showing that run reads the rows as of that moment too, filtered by the reader’s current Policies, and the history an old run needs is kept as long as the run is (Preferences). When a row that a Pipeline read changes after the run started, the Pipeline’s result says These settings changed since the last run. To a person who may start a Refresh, it also offers Preview, a run on a sample, and Run, with its estimate. This includes a Lab Parable and a Personal Parable with a Release. Before the first Release, the notice offers neither, as the Refresh menu refuses Refresh. While the page still loads, the notice waits until it knows, then offers them. An input whose table has never been written, whose Provider is not connected in the Workspace, or whose stream the Workspace has not enabled on a Provider it has connected, reads as an empty table, and the run records it as empty with the reason never_written, not_connected or not_enabled, so a Report can say there is no data yet rather than show zero and the run still completes. A not_enabled input also names its stream, the Provider stream that feeds it (replies for providers.slack.replies), so a Report can say which stream to turn on; the providers.identity family, which any directory stream feeds, names none. An input with no readable version at that time, because its table was created later or retention removed that version, fails the Plot with QL-PL-005 instead of reading newer data. A run can read a Pipeline of a Platform Parable, directly or through a view (Parable Pool). It reads the Release of that Parable that the run’s Version pinned when it was published. When the run is captured, each such Pipeline is pinned to the newest complete Refresh of that Parable that completed at or before the run’s AS OF time and whose output fits the Pipeline’s definition in the pinned Release. A Refresh that failed, was cancelled or has expired is never pinned. Every plan and restart of the run reads that Refresh as it completed, so a newer Refresh of that Parable does not change what the run reads, and the run’s output names the Refresh it read. A Refresh is seen a few seconds after it completes. Two runs with the same AS OF time can therefore pin different Refreshes: a Plot Report pressed in those seconds pins the Refresh before it, and a scheduled run for the same time captured afterwards pins the new one. The earlier capture reads older data; neither fails. When that Parable completed no Refresh by the AS OF time, the run reads the Pipeline as an empty table. When every fitting Refresh it completed by then has left retention, the run is refused rather than read the Pipeline as empty: Plot Report answers with a 409 that says so. A scheduled occurrence that is refused this way counts as a failure on the schedule and names its reason, but the schedule is not paused, and its next occurrence reads the Refreshes completed by it. When retention deletes the pinned Refresh after the run was captured, the Plot and its run fail. The run answers to the sources that Refresh captured, as a run that reads any stored Refresh does: a person those sources refuse, or whose Provider Policies narrow them, cannot run it. A Plot that reads a Pipeline of any other Parable gets PV_REF_002, and Prepare and Publish refuse it.

Incremental Pipelines

An incremental Pipeline keeps one table that its interval runs update as data lands. A Refresh does not run it. The Refresh plans the Pipeline, then pins the table of its current epoch at the version of its newest interval commit. While a publish’s new epoch builds, a Refresh waits for it, and pins the epoch before it when the new one is not done at the end of the wait (Epochs). Every Plot of the run that reads the Pipeline reads that version. A later interval commit does not change what the run reads. The Pipeline’s result shows the run that wrote the pinned version as the run it reused. A Pipeline that has committed no interval yet runs, as any member does. A Preview runs every member, incremental ones too, because its Plots can differ from the Version whose intervals the ledger holds. A Refresh waits for its incremental members to catch up before it pins them (PARABLE-8079):
  1. The Refresh holds each incremental member back while an interval of an incremental member waits for a run, or runs. An interval also waits while its completion has not yet marked the intervals of the Pipelines that read it. The Refresh also waits for a sync of a tap that a member reads, which landed before the Refresh but which Parable has not marked yet (PARABLE-8246). A sync that lands after the Refresh does not hold it, and neither does an interval that only such a sync changed. A Pipeline that reads another incremental Pipeline waits for each of its intervals, because they change only when the upstream intervals complete. An interval whose next try comes after the limit, such as one that keeps failing, does not hold the Refresh. While a publish’s new epoch of a member builds, the Refresh waits for it too. The member pins the new epoch when it is done within the wait, else the epoch before it.
  2. When no interval that it waits for remains, the Refresh releases its incremental members together, within a minute. Each one pins its table, and the members that read them run after them, as for any member.
  3. The wait has a limit, 30 minutes by default (QUERY_RUNNER_INCREMENTAL_REFRESH_WAIT_MINUTES). At the limit the members pin the state their tables have then. Parable logs a warning (query_run.incremental_pin_incomplete) and counts the pin (query_runner.incremental.refresh_pins_incomplete). Each Pipeline of a chain adds a few minutes once its data stops changing, and up to its maxDelayMinutes while it keeps changing. So a chain of two or more incremental Pipelines can reach the limit; raise it for a deeper chain.
So in a Report whose hourly Pipeline A feeds a daily Pipeline B, which feeds a Pipeline C that is not incremental, a Refresh pins A and B once both took in the newest data, and runs C once, against B’s pin. The pin keeps the Plots of one run on one state of the table. It does not keep the run reproducible. The table’s normal retention removes the files of an old version, and a read of a Pipeline whose pinned version is gone fails. An author who needs a point in time stores it: a Pipeline that is not incremental and reads the incremental one writes its own table for each run, as every other Pipeline does. The read of a pin checks the version’s commit digest and row count. It reads the rows without a row check only while the interval ledger still describes the pinned version and every interval was checked against the Pipeline’s contract (Incremental Plot tables). A run plans the Plots of a Platform Parable against its newest Release, and reads the Refreshes the capture pinned. So capture refuses a run that reads a Plot that a newer Release of that Parable changed since the pinned Release: its output contract, its planned columns, whether a run stores it, or a view’s SQL. The refusal names the Parable and the Plot, and publishing the reading Parable again pins the newest Release. A run of a Parable that is no longer a Platform Parable is refused, by its name. While the Platform Parable is not Visible in the Workspace, each of its Pipelines is pinned with no Refresh, so the run reads it as an empty table. A Refresh stores one table for each Plot. It applies no reader filter while it writes that table. Each read applies the current view filters of both the reading Parable and every Platform Parable whose rows contributed to the output. Two people can therefore read different rows from the same stored table. View as applies both people’s filters. The Refresh records how each upstream filter column reaches its output. A renamed column keeps that binding. An aggregate can keep it when the original column is a direct grouping key. A sum per team that drops the person column cannot keep a reporting-chain filter. Such a Plot refuses storage with QL-PL-022, which names the filter and the lost column. Unsupported operators, including windows, limits and outer joins, also refuse storage when a filter needs to cross them. A Current-data read retries that storage refusal once by running the saved Plot SQL as the reader. An explicitly selected Refresh or a request that requires stored data returns the refusal. A Page on Latest reads each Pipeline Plot from the Refresh it holds. When that read gets this refusal, the Page reads that one Plot once more as Current, so the retry still runs. That Plot can then show live data or the newest Refresh, while the other Plots stay on the held Refresh. An older output without a complete source-ancestry record is refused when its Plot read a Plot of a Platform Parable, even when no current filter appears to narrow it. Parable refreshes the Parable itself to create that record (Refresh by Parable). While it runs, a Pane that reads Latest shows the Refresh in progress, not the refusal. A read applies upstream filters only to Plots of other Parables, so an older output whose Plot read only Provider tables and Plots of its own Parable needs no such record. It reads when its own record also lists every source behind the stored outputs it read, because the reader is checked against each source the record lists. Each of those stored outputs must still be the current output of its Plot. When one of them is not, when the record leaves out a source behind one, or when the record lists a Plot that its run kept no stored output of and that no stored output it read lists (a view, for example), Parable cannot tell what stood behind the output. It refuses the output until its Plot is refreshed, and the Refresh by Parable refreshes it. The live retry still reads the stored Refresh of each Plot that the saved SQL reads, in this Parable or in a Platform Parable. When one of those Refreshes is refused for the same reason, the retry gets QL-PL-022 too. When the saved SQL names that Plot itself, the refusal names it, and its details carry the Plot’s Parable id and key (Flight SQL errors). The Pane’s read error then offers Open Plot, which opens that Plot in Ponder in a new tab. Refresh it there, then read the Pane again. A Plot that the saved SQL reads only through a view is never named, because the view’s source can be closed to the reader. A reader who may not inspect the source of the Plot read gets no name and no Open Plot on any read. Open Plot opens only a Parable that the Workspace’s members can open. A Platform Parable that is not Visible in the Workspace reads as an empty table, so no read is refused for it. Refreshing the Plot still needs a seat that may work in Publishing, such as the Workspace administrators’ Primary. A member who holds only Pinging sees the Plot and its run History, and asks one of them. Changes to audiences, switches and in_plot sets apply on the next read. A newly required column that the saved output lacks causes the same refusal and Current-data retry. Each Plot that completes also records the Providers it read, for the Refresh menu: one row per Workspace connection of each Provider, named for the product (its catalog grouping’s name, else its connector’s, such as BambooHR). When the Workspace has more than one connection of a Provider, each of its rows is named for its connection instead, such as Acme BambooHR, so the rows can be told apart. Each row also records how the Provider delivers its data, as the Provider catalog classifies it: streaming, batch, or unknown when the catalog has not classified the connector. A row keeps the name and delivery it recorded; a later catalog change does not rewrite an older Refresh. Each row has the newest commit time among the Provider’s tables the Plot pinned (how old its data was), the connection’s status and detail as the Providers directory settles them at that moment (while a sync runs, the status before it), and the Provider’s logo as the catalog had it (its grouping’s, else its vendor’s). A Provider the Plot read as empty because the Workspace has not connected it gets a row with no connection; a Provider whose stream is off gets its connection’s row. A Provider the Plot read only as empty keeps why: never_written when it is connected but none of its tables the Plot read had data yet, not_connected when the Workspace had not connected it, and not_enabled when a stream it read was off. When its tables read as empty for different reasons, not_connected outranks not_enabled, which outranks never_written: a stream that is off sends no data however long the reader waits. The row also keeps every stream the Plot read while it was off, whether or not the Provider’s other streams had data. The Plots of one run add to the same rows, each moving the data’s age forward to the newest commit any of them read and adding the streams it read off; a Provider any of them pinned data from has no reason, but keeps its streams off. Time functions such as now() return the AS OF time too, in the Plot’s SQL and in Policy conditions. The run records whether the Plot read the clock that way. It also records whether the Plot calls another function whose result can change from one call to the next. AI functions do not count: each answer is kept and reused. A Report run cannot plan a Plot that calls random(). Such a Plot fails when the run tries to plan it. Each Plot also runs with the SQL parameters its captured SQL holds. A Page’s live Plots can read directories beside a Report’s stored outputs: Team Time Spend’s teams reads the identity directory, and a providerConnections Plot reads workspace.providers. So a run also captures the Workspace directory projections its Version’s Plots read, such as workspace.users and workspace.providers, when it is requested. A reader who picks an older Refresh reads each directory as that Refresh saw it: the projections from the rows the run captured (a captured empty directory reads as empty), and the derived identity directory (providers.identity.*) at its version as of the run’s AS OF time, under the reader’s current Provider Policies. A directory the run did not capture, and an identity version that retention removed, read current rows instead, and the Pane says Directory data is current, not as of this Refresh. Other Provider data a live Plot reads still needs a snapshot the run bound; current facts are never silently substituted. Each query run writes its Plot’s output to a table of its own, once, and a later run never overwrites it. The table lives in the Workspace’s own storage, beside its Provider tables. The run stores the vectors of an embed() column with its output. A Workspace without data storage has nowhere to put it: Parable refuses to plan its Plots, and the run fails. When the query run succeeds, Parable records that table, the version the run committed and a digest of that commit on the Plot result. A Plot whose output cannot be recorded fails, and so does its run. The Report run records each status change of its Plots, usually within five seconds. Each Plot result records its status, when it started and finished, its row count, and what it has spent: the cost of its AI calls in US dollars, and its paid calls. Every reader sees the same values, except the row count: a reader sees it only when they could read every row it counts. A filter Policy on a Plot the result read, a Provider Policy on a Provider table it read, or, while the Workspace enforces source permissions, source permissions on such a table hide it from the readers they narrow. A failed or cancelled Plot carries a short message chosen by its error code, never the query’s own error text. When one Plot fails, the run cancels its other Plots, and their results say they were cancelled because another Plot failed. Such a cancel makes the run failed, even when it arrives before the failure: the run then says only that a Plot failed, and the failure, when it arrives, names its Plot. A complete, failed or cancelled run keeps its status: a later change, such as a cancelled Plot that finished anyway, updates only that Plot’s result. A later change never opens a closed Plot of such a run again: a status that says the query run is queued, running or paused at its budget leaves the Plot as it ended. A late cancel of a cancelled Plot keeps the reason it was cancelled for. A Plot pays for each AI answer once. All runs of a Plot read and append to one inference log. Parable keeps that log in the Workspace’s storage, beside the Plot’s outputs. When a ponder() or embed() call has the same model, instruction, output type and input values as an answer an earlier run of that Plot received, the run takes the answer from the log. It makes no Provider call and costs the run nothing. A rerun over unchanged input therefore records zero paid calls, and a run after an input changed pays only for the rows whose input changed. A call that failed in an earlier run is not reused; the next run tries it again. Plots do not share logs, so two Plots that make the same call each pay for it once. Parable never removes an answer that a later run could reuse. Because a Pipeline pays only for answers its log lacks, the cost of its next run can be counted before it runs. An estimate of a Pipeline plans it as its next run would, builds the rows each AI call will be asked about, and counts those the log already answers. It makes no AI call, writes no output, adds nothing to the log and leaves the Pipeline’s History unchanged. For each call it reports the model, the rows, the rows the log answers, and the paid calls for the rest, priced at what the log’s answers of that call cost, else of that function, else left unpriced. It also says whether the run would pause at its call or cost cap.

Reuse unchanged Pipelines

A Refresh or a Preview runs only the Pipelines whose run key changed. Each other Pipeline reuses the output of its newest successful run with the same run key, from a complete run in the same Workspace. A reused Pipeline writes no table, makes no AI call and spends nothing. Its History row says Reused from the Refresh of that run’s time, or the Preview of for a Preview. A Pipeline that reads a reused output keeps its own run key when nothing else changed, so it reuses too. The run key holds everything that decides a Pipeline’s rows:
  • The plan. The Pipeline’s SQL, its parameters and the Plot views it reads.
  • The build of query-runner that runs the Pipeline.
  • The data version of each input. For a Provider table, the version of its data. For another Pipeline’s output, its rows.
  • The captured inputs. The saved settings and the directory rows that the run captured.
  • The sample. A Preview’s sample, or none for a Refresh.
  • The authority of the run. The rules on each source for the person whose access runs it, and the filter Policies on each Plot that it reads.
So reuse saves the most when a Refresh follows a change with no deploy and no new data between them. A Release that changes one Pipeline then runs that Pipeline and the Pipelines that read it, and every other Pipeline reuses its output. A Refresh after a Release that changes no Pipeline reuses every output. These make Pipelines run again:
  • A query-runner deploy. The build is in every run key, so every Pipeline runs again at the next Refresh after a deploy. The inference log still answers each AI call, so this costs compute and no paid calls.
  • New Provider data. Each Pipeline that reads the new data runs again. A Pipeline that reads one of those runs again too, unless the rows it reads did not change.
  • Other rules on the sources. A run whose person has other rules on its sources reuses nothing from a run under the first rules.
  • A changed Pipeline. A change to a Pipeline’s SQL or its parameters, or to a shared setting that it captures, runs it again.
  • A changed filter Policy. A Pipeline that reads a Plot the filter Policy covers runs again. The covered Pipeline itself does not: a Report run writes its rows with no reader filter, and each read applies the current filter (Policies).
  • The clock. A Pipeline that reads the clock runs again at each new AS OF time. A Pipeline whose functions can give other rows on each call, or that reads live rows that the run did not capture, never reuses and is never reused.
A Preview reuses only an earlier Preview with the same sample, from the same set of Changes or from another one. So two Patches whose Previews leave a Pipeline unchanged run it once. A Refresh reuses only full results. A Preview and a Refresh never reuse each other. A Pipeline whose last run left an AI call unanswered is not reused, so the next run tries that call again. A Pipeline whose earlier output retention already deleted runs again. Refresh everything runs every Pipeline again, even one whose run key did not change, and the next Refresh can reuse what it wrote.

See what a change runs again

Before you publish a set of Changes, or change a shared row, the rerun list names the Pipelines that the change affects. It is not a Preview, which runs the Report on a sample: it runs nothing but a count of paid AI calls. The Publish panel shows it under the Prepare findings once the Changes are Proposed, as What the next Refresh runs again; Publish stays available beside it. The Preferences tab of a Page or Pane shows What changing a shared setting runs again above its rows. A Pane’s own controls save rows without stopping to show it, so read it there before you change a shared row. The rerun list is an info callout. It shows only when the change runs a Pipeline again. A change that affects no Pipeline shows no callout.
  • Changed Pipelines, each with why. For a publish: its SQL or parameters change, or it is new; or the Policies of the Pane that owns it change; or a Plot view it reads changes, since a view’s SQL is planned inside each Pipeline that reads it. Each Pipeline whose SQL changes lists the columns the publish adds, removes or retypes, the same diff a Refresh records when it publishes the output. For a shared row: each Pipeline whose SQL reads the row’s Pane by name, directly or through a view of this Parable.
  • Downstream Pipelines. Every Pipeline of this Parable that reads a changed Pipeline’s output, directly or through other Plots. A Pipeline the publish deletes runs nothing, but each Pipeline that reads it is listed here, since it loses its input.
  • The Refresh cost threshold of the Workspace, $1.00 unless a Workspace administrator sets another.
The list names more than the next Refresh can run. A downstream Pipeline whose input rows do not change reuses its output, and a Pipeline whose Pane only changes a filter Policy reuses its output too (Reuse unchanged Pipelines). The list reads the published Versions and their Plot dependencies, so it answers at once. For a publish, the rerun list also counts the paid AI calls. It captures what a Refresh after the publish would capture, as you. Then it estimates each changed Pipeline of this Parable under that capture, with the SQL, parameters, Plot views and settings that the Changes leave. The panel says Counting the paid AI calls these runs make until the runs finish. If they take more than about a minute, it says Still counting and offers Check again. A Pipeline whose estimate failed says why, and Try again starts its estimate again when that can help. Then it shows the calls and their cost for each Pipeline and in total, says when a Pipeline’s Refresh would pause at its budget, and calls out a total above the Workspace’s Refresh cost threshold. Publish stays available either way. Two notes qualify a Pipeline’s estimate:
  • Estimated under the published Policies. The Pipeline’s Policies change, and the estimate plans it under the Policies already published; or the Pipeline is new, and the estimate applies none of its own Policies, which only the Changes hold. The Policies of what it reads apply either way. A Pipeline that a later Release removed and the Changes add back is not new: the estimate plans it under the Policies of the newest Version that held it, as a Preview does, and adds this note only when the Changes change those Policies.
  • It reads a Pipeline this change also runs again. The estimate reads that Pipeline’s last Refresh, not the rows the change will produce.
When every estimated Pipeline of this Parable has the same note, the panel says the note once, above the list, and not on each Pipeline. A Pipeline that has no estimate shows no notes. A Pipeline that has no estimate says why, in plain words. The panel never shows the server’s own error text. Parable keeps that text in its logs for its engineers.
  • It reads something these Changes add. The estimate plans against the Plots of the published Version, with their published columns. A Pipeline whose plan reads, directly or through Plot views, a Plot that only these Changes add starts no estimate. So does a Pipeline whose SQL names a column that these Changes add to a Plot it reads. The panel names what it reads and says that the cost is known after the next Refresh. When every Pipeline without an estimate waits like this, the total says that some runs have no estimate until the next Refresh.
  • It reads a Pipeline with no complete Refresh. The panel names that Pipeline and says that the cost is known after the next Refresh.
  • These Changes leave it out of the Refresh.
  • Its SQL or settings in these Changes could not be read. A Preview shows whether its Refresh works.
  • The estimate could not start. The panel says to try again in a minute.
  • The estimate stopped before it counted the calls. A Preview shows whether its Refresh works.
Try again shows for the last two, and for a failure the panel has no words for. It does not show for a Pipeline that waits for the next Refresh. The Preferences tab’s list says that it is not estimated before the row changes, and an estimate of Changes that could not start says that. The Pipelines that read the changed ones are listed in the order a Refresh runs them: each after every Plot it reads. When the change affects no Pipeline, no estimate is needed. When the estimate cannot start, it is unavailable. The Preferences tab’s list is not estimated: the row has not changed yet. After a save of a shared row, the Parable estimates the next Refresh with the saved value and says the result in a notice, as a warning above the threshold. A save of many rows at once starts one estimate. Counting the paid AI calls needs the Parable manage permission and the Refresh action on the Parable.

Schedule Reports

Choose Plan Refreshes in the Refresh menu. A Report with no schedule yet starts on every Friday at 12:00 AM in your timezone, with its upcoming runs: save it as it is, or change it. Enter a schedule in your own words, for example Every weekday at 9am, starting next Monday, or use Build a schedule. Review the interpreted schedule and upcoming runs, then choose Save schedule. A new schedule: every Friday at 12:00 AM, in the reader's timezone shown by name beneath the free-text entry, with the builder collapsed. New schedules use your browser’s timezone, shown by name beneath the input, such as Eastern Time. Change it there if the Report should follow another timezone; Your timezone heads the list. Existing Plans keep their saved timezone and start. Upcoming runs are displayed in the selected timezone, which each run names with its weekday and date, for example Tuesday, October 13, 2026 at 9:00am ET. Build a schedule opens the repeat, day, time, start, and end controls. The time follows your locale’s clock: 06:00 AM in the United States, 06:00 where clocks run to 24 hours. Start and end dates read in your locale’s order with dashes, such as 10-13-2026 in the United States or 13-10-2026 in the United Kingdom, and are picked from a calendar. Text entry and the controls edit the same Plan. Opening the controls does not change a saved schedule. Changing the time preserves its calendar dates, weekday exclusions, and seconds. If the controls cannot preserve a schedule’s details, saving those edits is disabled; enter a new schedule above to replace it. The schedule builder: every Friday at 12:00 AM, the time in the reader's clock and the start day in the locale's order with dashes, 10-16-2026. Clearing the text leaves an example result in its place. It is not saved until you try it and choose Save schedule. If a phrase cannot become a supported Plan, the input stays in place and shows We can’t Ponder that… Try something else! with a thinking icon. Edit the phrase or use the schedule builder. If only the time is missing, the message is Provide a time!. Add a time to the same phrase to continue. A malformed time still shows the general error. A schedule with a weekday but no clock time, showing Provide a time! Monthly ordinals work in words or digits: every 2nd Friday of month at 6pm means the second Friday of each month at 6:00 PM. For phrases such as every month at 9am, review the day shown in the interpretation and upcoming runs. That day is retained when you change the time in the builder. A monthly ordinal schedule interpreted as the second Friday at 6:00 PM. Plans support timed, daily-or-longer recurrences and a single timed occurrence. Time windows, multiple separate schedules, and sub-daily recurrences cannot be saved through this input. A recurring schedule combined with a separate one-time run, such as every Monday at 9am; tomorrow at noon, is rejected as a whole. Remove the additional schedule and try again. Seconds are supported. The upcoming-run preview shows them when a run has them, as in 9:00:30am, and leaves them out of a schedule on the minute. Parable computes the upcoming runs the same way the scheduler computes the runs it starts. The selected timezone and start keep relative dates and daylight-saving changes anchored to the intended local time. On the day clocks move forward, a run time inside the skipped hour runs that much later: 2:30 AM runs at 3:30 AM. On the day clocks move back, a run time in the repeated hour runs the first time it occurs. A schedule the calendar standard (RFC 5545) does not allow, such as a day of the month on a weekly schedule, cannot be saved. A one-time request runs once. Plans that repeat every few weeks or stop after a number of runs preserve their original start when reopened. The start can be in the past. The preview and the scheduler count runs forward from it and give up after 200,000. A schedule with more runs than that between its start and now, such as a daily schedule that starts before about 1480, cannot be saved: the preview says the rule starts too far back or runs too often, and Save schedule answers that the schedule starts too far in the past. Choose a later start. Editing a schedule does not publish the Parable, and publishing does not run a Report or reset its schedule. Scheduled runs execute as the Workspace, not with the credentials of whoever created the schedule. The Workspace usually holds no seat of its own on the line: a scheduled run starts on the authority of whoever holds Primary on the Parable, read when each occurrence is captured. That is the person who holds Primary, or, when a role holds it, any active member of that role. They need an active membership in the Workspace and permission to edit Parables, and the run computes with their Primary. When the Workspace itself holds Primary, the run acts as that Workspace and starts on Primary. When no person holds Primary, or none of them can run the Report, the occurrence is refused and the schedule names the reason. A run already under way finishes if the person who holds Primary later loses permission to edit Parables, and the next occurrence is refused. Losing Primary, the membership or the account ends the run’s reads at its next check. Each occurrence runs the Report once. Saving a schedule never runs an occurrence that has already passed: a daily 9:00 AM schedule saved at 2:00 PM first runs the next morning. If the scheduler was stopped through several occurrences, they merge into one run at the latest of them. A scheduled run reads its inputs as of its occurrence, not the moment the scheduler reached it. Disabling or pausing a schedule stops later occurrences only; runs already started finish. An occurrence that falls while an earlier Refresh of the same Report is still pending or running is skipped and is not counted as a failure. A Preview that is pending or running does not skip it: the scheduled Refresh starts beside the Preview, because a Preview writes its own outputs. When the Workspace cannot run the Report at an occurrence, for example because the line’s published version no longer has the Report, its member Plots read each other in a cycle, or the Parable’s Pipelines are off, the schedule records the failure and its reason, and that occurrence is not tried again. Plan Refreshes shows the newest refusal above the schedule. It says when the scheduler recorded it, what stopped the Refresh, and what lets the next one start. For example: “No person held Primary on this Parable.” or “This Parable’s Pipelines were off. The schedule stays on.” The sentence goes away when a scheduled Refresh of the plan starts, or when a publish turns the schedule off or turns Refresh after its sources refresh on or off. A publish that only changes when the schedule runs keeps the sentence. A refusal sends no Ping. A refused Refresh for a proposed Patch does not show there. The Refresh control marks a schedule that fails, for a person with Primary or Publishing. A warning icon shows on the control when the newest Refresh that a plan started failed, or when the plan’s newest occurrence could not start. A Refresh that a plan started after its sources refreshed counts too. A Refresh by hand, a Preview and a Refresh by Parable do not. Each plan counts only its own Refreshes. When two plans fail, the mark names the newer failure. The control’s hint says why. For an occurrence that could not start, it is the same sentence as Plan Refreshes. The menu says it again above its actions. The mark goes away when a later Refresh of the plan starts, or when a publish turns the plan off. It also goes away when the failed Refresh expires, even while the schedule still fails. That needs 90 days with no newer Refresh of the plan, and a newer failed run of the Report, because the Report’s newest failed run does not expire. A cancelled Refresh that expires does not bring an older failure back, because the mark reads only the plan’s newest Refresh. A person who reads in Pinging or Peeking sees no mark, and View as shows none. Each saved schedule is a Report plan, saved with the Workspace’s Changes and published with them. Capture reads the plan from the line’s current published version, so a schedule first runs once the line publishes it, and a published version without the plan stops it. The publish activates each plan that the Version enables. It deactivates each plan that the Version disables or removes. The publish that first enables a plan fixes the instant its recurrence counts from: the plan’s own start, else the start of the minute the Version was published in. A rule that names no second takes the second of that instant, so a daily 6:00 AM plan with no start runs at 6:00:00. The upcoming-run preview of a plan with no start counts from the start of the current minute for the same reason. Later publishes keep that start, any pause and the run history. An older plan can keep the second of its first publish time. Every Workspace keeps its own state for each plan. An installed line’s version carries the plans of the upstream version it reads, with the Workspace’s own changes over them. Its publish writes the Workspace’s state for each plan. Saving a schedule needs the schedule permission. Publishing needs none, including the publish of a Delivery that carries schedules. A schedule can name any Report the Workspace reads on its line, including a delivered Report the Workspace never changed. Until the Workspace first pulls a delivered Parable, that is the delivered definition; after that, it is the version it pulled. Capture checks the Report against the line’s published version: an occurrence whose Report the line no longer contains is refused and counts as a failure on its plan. The scheduler checks every enabled plan every minute. It starts each due occurrence once in each Workspace that runs the plan. The scheduler never runs a plan whose occurrences it cannot compute, such as a plan whose start has fallen more than 200,000 runs behind since it was saved. A disabled or deleted plan stops running.

Who runs a schedule

A schedule is part of the Parable’s Version, so it travels with every Delivery. Each Workspace that publishes the Parable runs the schedule its own published Version carries:
  1. The Workspace’s own schedule, when someone changed it in the Workspace’s Changes and published them. It stays when new Versions of the Parable arrive. When a Delivery changes the same schedule, Prepare shows the conflict and the Workspace chooses which to keep.
  2. Otherwise, the Parable’s default, from the Version the Workspace published. A new default reaches the Workspace when it publishes the Delivery that carries it.
A schedule runs in every Collaboration Mode. A Parable that goes back to Personal after a Release keeps running the schedules of its Newest Release. Each Workspace runs its schedule on its own. One Workspace’s pause or failure never stops another’s, and each keeps its own run history. A Workspace starts at the first occurrence after it publishes the schedule, never one before. A schedule without its own start counts from that publish, so the phase of a schedule such as every two weeks can differ between Workspaces; give it a start under Starts to run it in step everywhere. Changing a schedule, the Parable’s default or a Workspace’s own, takes the schedule permission and Publishing or Primary on the Parable. Only Parable staff hold the permission. Anyone else who chooses Plan Refreshes reads the schedule there, read-only and without leaving the mode they are in: the controls are off, and hovering them or Save schedule says why. A Report with no schedule says so. A save from Ponder or an archive upload that changes a schedule is refused the same way. The permission gates the schedule, not the Report. A person who holds Publishing or Primary without it can still delete or disable the Report, or switch its Pipelines off, as any Report change. The schedule then has nothing to run: capture refuses each occurrence and records the reason on the schedule, as described in Schedule Reports.

Refresh after sources

A Report plan can also refresh after its sources refresh. Its sources are the Providers its Pipelines read and the Platform Parables whose Pipelines they read. A plan may have a schedule, afterSources, or both. A plan with neither is never scheduled. afterSources is part of the plan, saved with the Workspace’s Changes and published with them like the schedule. It has four settings: A save that sets a value out of range, or a quiet window longer than the maximum delay, is refused with PA-AU-040, and the message names the setting. An archive carries the settings, and an import saves them through the same check. Parables that refresh after their sources must not read each other in a loop. Two Platform Parables can read each other through different Plots: a Plot of A reads B while another Plot of B reads A. With afterSources on both, every Refresh of one would set off the other forever. So a save that switches afterSources on, and a publish whose Version has it on, are refused when they would close such a loop. The refusal names the Parables in read order, such as “Shared Kinds reads Team Time reads Shared Kinds”. A loop through a Parable whose plans all have afterSources off is allowed, because that Parable’s Refreshes do not follow its sources. A Pocketed Parable still counts: a Restore brings back its plan and its reads. A Refresh fired by its sources records the source changes that made the plan due: for each source, the first and last change that counted. History uses this record to name what fired the Refresh. Such a Refresh runs as a scheduled one does: as the Workspace, on the authority of the person who holds Primary on the Parable, at scheduled priority, reading its inputs as of the fire. A fire does not run when its plan no longer refreshes after its sources, or when the plan changed after the scheduler computed the fire.

Plan Refreshes

Plan Refreshes edits afterSources below the schedule. Refresh after its sources refresh switches it on. On, it shows the three settings, prefilled for a plan that has none with the defaults: Quiet for 30 min, Wait at most 240 min (4 h) and At most 6 a day. The dialog refuses what the save refuses, and names the setting. It also refuses a quiet window longer than the longest wait. Switching it off keeps the settings. A plan keeps the timezone it saved, with or without a schedule: that timezone sets the day At most counts in, so reopening Plan Refreshes in another timezone does not move it. Only a plan that has never been saved starts in the browser’s timezone. The switch can be on with or without a schedule. A new plan starts on the every-Friday default; switching the switch on before changing that default drops it, and switching it off again before entering a schedule brings it back. With the switch on and no schedule, the result reads No schedule, and Save schedule saves a plan that refreshes only after its sources. A plan with both shows Remove the schedule under its schedule. A plan with neither cannot be saved. Under the settings, Sources lists what the plan would watch: each Provider connection, with its logo, and each Platform Parable it reads with the age of its newest complete Refresh. A Parable the reader may not see is listed as Another Parable, with no age. Parable reads the published Version and computes the list the same way the scheduler does, so the dialog and the scheduler agree. A line with no published Version lists nothing yet, and one whose Refreshes have read no Provider lists only its Parables (see Limits). A Refresh fired by its sources names them in the Refresh menu, after its age (2 hrs ago · After Okta synced), and on Latest when Latest stands for it (Latest (1 min ago) · After Okta synced). A label longer than the menu ends in an ellipsis. Each Plot’s History names them too, where its owner is Sources and it reads After Okta synced in place of Scheduled. A Provider is named by its connection, as the Providers directory shows it. Two sources are both named, and more read as the first and a count (After Okta synced and 2 more). Parable names the sources when it reads the Refreshes, so a renamed connection shows its current name. A Provider is always named: it is a Workspace connection the reader already sees in the editor.

When a plan fires after its sources

Every minute, the scheduler decides which plans fire. Each Workspace line of a plan keeps its own floor, changes and fires: one line’s fire is never another line’s floor, and never supersedes another line’s fire.
  1. The floor. A change counts only after the plan’s floor: the newest of its latest save, its pause, the last run the scheduler recorded and its newest fire, of either trigger, that read its sources. A fire skipped because another Refresh of the Report was in flight, or superseded before it was captured, read nothing and is not a floor.
  2. The changes. Each completed sync of new data from a source Provider, in the plan’s Workspace, after the floor. The scheduler reads syncs from at most seven days back.
  3. Due. With changes, the plan is due when the newest change is quietMinutes old or the oldest is maxDelayMinutes old. It fires at the instant that first held, and its Refresh reads its inputs as of that instant. A change after that instant waits for the next fire.
  4. The daily cap. It fires at most maxPerDay times after its sources on one day in the plan’s timezone; skipped and superseded fires do not count. A capped plan fires at the start of its next day.
  5. A skipped fire. When the capture skips a fire because the Report is running, its changes still count, and the plan tries again a quiet window after the skip.
A line with incremental Pipelines counts their interval runs as changes of the taps they read (PARABLE-8079). A sync of a tap that only incremental Pipelines read reaches the Report only through those intervals, so the sync itself is not a change. Each interval run that completes is a change of those taps, and the quiet window and the maximum delay start from the interval completions. The plan fires once the incremental Pipelines caught up, and the Refresh pins them without a wait. An upstream incremental Pipeline counts as a source, as an upstream Parable’s Refresh does. A tap that a Pipeline that is not incremental reads still counts by its syncs, also when an incremental Pipeline reads it too (PARABLE-8246). The Refresh then waits for the incremental Pipelines’ intervals before it pins them. A plan whose schedule and sources are both due at the same scheduler check fires once, at the later of the two: a schedule occurrence after the sources settled covers their changes, and a sources fire after a missed occurrence covers the occurrence, as missed occurrences merge into one. Either fire moves both floors, and a newer fire of either trigger supersedes an older one on the same line if the older one has not started.

Refresh for each Proposed Patch

Parable staff configure this setting in the source plan of a Report in a composed Platform Parable. A Release carries it to each Workspace copy. Plan Refreshes shows the setting read-only. The setting has three limits:
  • Quiet time is 1 to 600 seconds. The default is 5 seconds.
  • Longest wait cannot be shorter than quiet time. The default is 600 seconds.
  • Daily limit is 1 to 500 automatic runs in the plan’s timezone. The default is 288.
Propose does not wait for checks or model calls. The ordinary plan check, which runs every 60 seconds, finds each Proposed Patch whose current tree has no complete Refresh that answered every call. It waits for quiet time or the longest wait of the oldest uncovered tree. Quiet time starts when that check first observes the changed input, not when a person presses Propose. A later change restarts quiet time but keeps the oldest uncovered wait. If complete Refresh history is unavailable, the plan waits rather than assuming that no Refresh exists. Each Patch gets its own Refresh. Only one run of a plan runs in a Workspace at a time. A Refresh paused at its limits holds only its Patch, not the plan. At the daily limit, uncovered Patches wait for the next day in the plan’s timezone. A paused plan keeps those Patches waiting and can resume the same requests. Failed work waits one minute, then two, four, and later waits of at most an hour before another attempt, within the daily limit. A complete Refresh covers only the tree it read. A new Release can move a clean Proposed Patch onto a new tree without changing its Changes. Ponder reads that new tree again. A person’s signed review of unchanged Changes stays. A changed Release of the reacting composed Platform Parable also needs answers from that Release, rather than answers from its earlier rules. Tabs read completed answers for the Patch’s current tree and the selected Release of the reacting composed Platform Parable. A selected older Release keeps its own answers. An earlier Refresh selected beside a Patch must be about that same Patch. Its retained answer stays readable after that Patch changes again. Selecting a different Patch’s Refresh is refused, even when the person can read both Patches. Checks wait while a Refresh is due or running. A Refresh paused at its limits shows Paused at its limits for that Patch. A failed or unanswered Refresh shows No answer from Proofs during its retry wait. If failed work uses the day’s last automatic run, that Patch keeps this state until the next plan-local day. An untouched Patch at the same daily limit stays pending. Expired answered output becomes due again without counting expiry as a failed call. After every call answers, the same check Plot reads the stored Refresh for that exact tree. A newer Refresh with unanswered calls does not replace that stored answer. Enabled automatic work that cannot run does not treat an empty Pipeline as an answer. Preference reads stay current. If a Refresh plan’s history is unavailable, only that plan in that Workspace waits. Automatic Refreshes in other Workspaces and ordinary schedules continue. Reactions also run on a hidden composed Platform copy. This does not let a person open that hidden copy. The Workspace pays. The run does not borrow the person who pressed Propose, and a refused model never selects another model. Unedited Pulls that only carry a Delivery, the reacting composed Platform Parable’s own Patches, and Refreshes made by reactions are not subjects. Other subject kinds and Run Proofs Again are not included.

Refresh by Parable

A platform update can make stored outputs older than the rules that now read them. Parable then refreshes the Parable itself. The first rule of this kind is the record of the data sources that each Plot read. An output stored without this record that read a Plot uses older rules. The next rule a platform update adds works the same way. When a reader opens a Page on Latest and the Refresh that Latest reads holds such an output, Parable starts a Refresh at once. A read of that output through Ponder or the API starts it too. The Page shows the Refresh in progress, as for any Refresh. A Page that holds its Refresh reads a refused output once more as Current, so its Pane also shows the Refresh in progress. When the Refresh completes, that Pane reads it. The other Panes stay on the held Refresh, and the Page offers Newer data is ready.
  • Readers keep the last good data. Latest stays on the newest completed Refresh until the new one completes. A Refresh that fails never replaces it.
  • An output that still reads shows its data while the Refresh runs. An output that cannot read shows the Pane’s Refresh state while the Refresh runs, not the technical error. When no Refresh by Parable can run, the read keeps its error.
  • No reader needs Publishing or Primary. The platform caused the problem, so the Refresh runs as a scheduled Refresh does. It runs as the Workspace, with the authority of the Parable’s Primary seat, at scheduled priority. It runs the newest published Release and its default Report. It reads its inputs as of its start. It stores outputs under the Parable’s own Policies. Every reader still reads them through their own filters. When no person with Primary can run the Refresh, or the Parable’s Pipelines permission is off, it does not start.
  • History and the Refresh menu name it Refresh by Parable. History records that Parable started it, and its row says Started by Parable to repair data after a platform update. A Plot’s own message replaces that line: why the Plot failed or was cancelled, that it paused at its budget, or that its rows wait for the rest of the Refresh.
  • A Page on a pinned Refresh, a Patch, or an earlier Release does not start one. The Refresh runs the newest published Release.
Parable starts at most one at a time:
  • None starts while any Refresh of the Parable is pending or running.
  • One Workspace runs one Refresh by Parable at a time. This second limit keeps spend down. Another Parable of the Workspace does not queue. A visit to it while the Refresh by Parable runs starts nothing. A visit after that Refresh ends can start its own. The server keeps its answer for up to one minute, so the first visits after the end can still start nothing. A Refresh by Parable that makes no progress for 2 hours is stuck: no Plot of it moves and the Refresh does not change. It then holds no other Parable of the Workspace back, and the next visit to another Parable starts that Parable’s Refresh by Parable. 2 hours is a heuristic. It matches the runtime alert line of query-runner. One query of a Plot may run for up to 24 hours, and it shows no progress until its status changes. So a slow Refresh with no status change for 2 hours is also treated as stuck, and a second Refresh by Parable can start in the Workspace. That costs spend. Each Parable still runs one Refresh at a time.
  • After one fails, the next waits 15 minutes, then 1 hour.
  • A Parable gets at most 3 for one Latest Refresh. After that, it waits until a manual or scheduled Refresh completes.
  • None starts after a Refresh by Parable whose outputs still predate a rule. Another would store them the same way. A manual or scheduled Refresh moves Latest on.
  • None starts when the Latest Refresh is a person’s Refresh that holds a row filter their Provider Policies or source permissions put on a Provider table. The Refresh by Parable captures no such filter, so readers with that filter could not open it. They keep the Refresh they can open.
  • A visit never waits for another capture. When another one holds the Workspace or the Parable, the next visit tries again.
A scheduled Refresh also writes outputs under the current rules, so the next occurrence of a schedule heals a Parable that nobody opens.

Runs about a Patch

A Platform Parable can keep its Pipelines true for each proposed Patch of its Workspace. Its Home Page declares a react contribution that names one of its Reports (Perceptions). Each run of that Report is then about one subject: one Patch at the revision that Propose sealed. A failed call for one Patch holds only that Patch.
  • What a run reads. The Pipelines read the Patch through the subject.* relations, as a Platform Parable’s tab does (Plots). The run builds those rows when it starts and keeps them with its other inputs. They name the Pieces and the Changes of the Patch. They never hold source.
  • Two Primary seats. Primary on the Platform Parable’s copy runs the Report. The run acts as the Workspace, never as a person. Primary on the Deployment of the Patch binds the Patch and nothing else. When no one who holds Primary there can read the Patch, the run fails and says why.
  • The tree. A run records its subject and the tree it read: the sealed head of the Patch and the upstream Release under it. A Publish of another Patch moves this Patch onto the new Release and gives it a new tree. A new upstream Release does the same.
  • One at a time. One run of the Report runs at a time for each Patch. A newer start replaces an older run of the same plan and Patch that has not begun.
  • Reuse. No run reuses the output of a run about another Patch. Model calls stay memoized by their content, so the same content costs nothing again.
A read that names its subject reads these Pipelines about that Patch. A Platform Parable’s tab beside a Parable makes such reads. The server picks the newest complete run about the Patch at its revision whose tree is the tree of the Patch now. The reader never picks it. A Plot that reads a Pipeline directly reads that run’s output. A Plot that joins a Pipeline with other data reads the Pipeline at that run, and reads everything else as it is now. The joined Plot stays live. Its output records which Refresh supplied the Pipeline without treating the other inputs as historical. When no such run has completed, each Pipeline reads as an empty table, so the tab shows that the run is pending, not No data yet. A read that names no subject reads them as empty tables too. A person reads the outputs of a run about a Patch only when they can read that Patch and hold Pinging, Publishing or Primary on its Parable, so their participation lists every Piece kind that the run’s subject.* rows list. A Peeking reader’s subject.* rows list Pages only, so the run’s outputs are hidden from them and the Pipelines read as empty tables. When a run about a Patch ends, each open tab of the Platform Parable reads its Pipelines again with no reload. Runs about a Patch stay apart from the Refreshes of the Platform Parable:
  • They never become its Latest, never show in its History or in the Refresh menu, and never reach the SQL of other Parables.
  • Its Pages never show No data yet or Power on Parable for these Pipelines, and no reader is held on an earlier Release for them.
  • No person can Refresh or Preview such a Report by hand. The Refresh menu answers “This Report runs for each proposed Patch.”
  • A Pipeline with an incremental declaration cannot run about a Patch. Saving or importing a new combination refuses it. An older declaration can stay unchanged while other edits repair it, but capture still refuses it before any Refresh starts. Remove that declaration to run a separate, complete output for each Patch. These Pipelines never enter interval scheduling, even when incremental runs are enabled.
  • A pending Refresh captured before this refusal keeps its captured Release. Retrying it, replaying its original trigger, or recovering it after an interruption refuses that same incompatible combination. The Refresh and its pending Plot results become failed. The refusal submits no new work. It does not cancel work accepted before an interruption. Repairing the current Release does not change the old capture. Use the repaired Release for a new Refresh about the Patch.

Incremental Plots

An incremental Plot declares a time grain (Incremental Plots). Its output is a set of intervals of that length, aligned to UTC. When a source lands new data, Parable marks as changed only the intervals that the data touched. A changed interval is the only part of the output that needs to run again. An incremental Plot of the same Parable is a source too (PARABLE-8079). When an interval of it completes, the interval’s range is the change, and the table above applies to each incremental Plot that reads it. Name it in sources as parables.{parable}.{plot} to read it by time. So one sync that touches one hour of an hourly Plot A runs that hour of A, then the day of a daily Plot B that reads A, and nothing else. A Plot’s grain must be the same as the grain of each incremental Plot it reads, directly or through a view, or coarser: publish refuses a finer one. A Plot of another Parable is not a source yet (PARABLE-6383). A rebuild of a Provider’s data marks every interval of each incremental Plot that reads it, because the rebuild does not say which event times changed. A change to a setting shared for This Parable, or to a Pane row, that a RESTATE Plot reads runs every interval again too. A person’s own setting does not. Every interval of a Plot that runs again for a RESTATE change can cost a lot, and nobody previews it. So Parable first estimates the paid AI calls of that run. At or below the Workspace’s Refresh cost threshold, the intervals run. Above it, or when the estimate fails, they wait until a person with the budget override permission and the Primary seat approves the run, as for Raise budget (PARABLE-8249). While they wait, each interval keeps the rows of its last run. The Pipeline’s History shows the waiting run and its Approve button (Run history and status). A changed interval waits the way a Report plan waits in Refresh after sources: until its sources stay unchanged for quietMinutes (default 2), or until its oldest change is maxDelayMinutes old (default 15). A burst of syncs gives one wait, and a steady stream of syncs never waits longer than maxDelayMinutes. Only the incremental Plots that a Report runs are marked. One Workspace’s data never marks another Workspace’s intervals. When a changed interval is due, Parable runs that interval alone. The run reads each source in sources only from the interval’s start, widened back by the source’s lookback, to its end. On a Provider table that is laid out by event day, it reads only the days of that window. It keeps only the output rows whose by column falls in the interval, and replaces the interval’s rows in the Plot’s table. Other intervals keep their rows.
  • An interval whose sources did not change since its last run does not run again. Its rows stay.
  • An interval whose run fails runs again on its own, after a wait that grows to at most an hour. Other intervals go on.
  • The intervals of one Plot run one at a time in a Workspace.
  • A Plot that declares split runs each part of an interval as its own run. Each part retries on its own and replaces only its own rows (Split an interval).
  • A run of a Plot that reads an incremental Plot of its Parable reads that Plot’s current table at its newest interval commit. It waits while that Plot has committed no interval to its current table, and until the run that made the newest commit has succeeded. When that run fails after its commit, the interval of that commit runs again, and the Plot that reads it runs after it.
  • A run is refused when the Plot reads a Pipeline of another Parable or a Pipeline that is not incremental, reads the clock or calls a function whose result can differ between runs, also through a Plot it reads as a view. A run is also refused when the planned type of by or of a source’s timeColumn is not a timestamp, or when the split key does not partition the Plot’s rows.

How long Report runs are kept

Each Report keeps its newest 30 completed runs, plus every run started with Plot Report that completed in the last 90 days. The newest completed run is always kept, so Latest (the API’s Current) never loses it. When a run completes and its Report holds more than that, the older runs leave the Refresh menu at once. A reading pinned to one of them answers unavailable, and Latest and SQL that names parables.{parable}.{plot} never use it. A read that was already scanning it fails rather than returning part of it. Parable then deletes their output tables, usually within an hour. A run started with Plot Report outside the newest 30 stays until 90 days after it completed. It leaves at the Report’s next completed run after that, or at the hourly check, whichever comes first. Previews keep their own, shorter rule and never count toward the 30: each Report keeps its newest 3 completed Previews, and none longer than 7 days after it completed. A Preview checks a set while it changes, so the newest few matter, and three leave Latest and the recent Refreshes on the menu’s first screen. Previews outside the rule leave at the Report’s next completed run, Refresh or Preview, or at the hourly check, whichever comes first. A failed or cancelled run was never readable. The output tables its finished Plots wrote are deleted a day after they finish. Failed and cancelled runs never count toward the 30 or the 3. Each one leaves the Refresh menu and History 90 days after it ended, the same window as a run started with Plot Report. The newest failed run of each Report stays however old it is, so the Report can still say why its last run failed. The newest failed Preview stays too. A cancelled run has no such exception. These runs leave at the hourly check, or at the Report’s next completed run, whichever comes first. Their output tables are then deleted the same way as those of an expired complete run. A run about a Patch (Runs about a Patch) keeps its own rule and never counts toward the 30. The newest completed run about each revision of each Patch stays with no time limit. Other completed runs about the same revision leave 30 days after they completed, at the next completed run about that revision. Parable deletes an output table only when no result that a reader can still reach reads it.

Read a Report

The Refresh menu selects Latest or one stored run, a Refresh:
  • Latest is one Refresh: the newest completed Refresh whose Release is in the same major line as the Release on screen. For a Parable with a Pipeline, every stored Plot on the Pages reads its output from that one Refresh, through the API’s Current.
    • A Release that keeps its major number reads the Refreshes of earlier Releases in its major line at once. Publishing does not start a Refresh, so after a minor publish the stored Plots keep the last completed Refresh, and live Plots continue to read live tables.
    • A major Release needs a Refresh of its own major line. A person with Publishing or Primary chooses Publish as Major Version for a change that the earlier Refreshes cannot serve. Only the source Deployment offers it, after its first Publish. A copy takes its major number from its source and refuses it. The source’s first Release is always v1.0, so Major changes nothing on a first Publish through Ponder or the API, and the answer says so.
    • A stored Plot that the Refresh did not store, such as a Plot that is new in a minor Release, or whose output shape the Release changed, has no data until the next Refresh. The Pages do not look for it in older Refreshes.
    • SQL that names parables.{parable}.{plot} chooses for each Plot: the newest completed Report whose output fits the published definition. That is the same run except after a change to the Plot’s output shape. A run that completes reaches it within moments (Plots).
    The menu shows the age of the Refresh that Latest reads and does not list that run again. The tooltip on Latest names that Refresh and its time. While the Refreshes are read, it says Reading Refreshes. When Current cannot be read, it says why. When Latest names a Refresh whose time the Page does not know, such as a held Refresh that no read listed, Latest shows no age, and its tooltip says Latest Refresh. Its time is not known. Only a Parable with no Refresh to read says Latest data, read from the Providers now. In Ponder, a Page on Latest sends the Refresh it holds for each Pipeline Plot, and Current for every other Plot and for a SQL preview. A held read that a filter refuses on stored data is sent once more as Current. Admin Ponder holds no Refresh, so its Latest always sends Current. The page finds that Refresh with one lookup and does not read the run history (PARABLE-7144). When a new run is moving and stored data is not ready for the selected definition, the menu says Refreshing…. Latest remains selectable for live Plots. Stored Plots without an output in Latest’s Refresh wait and read again when a Refresh completes. Their response is PD-RESULT-002, not a raw Plot failure. They wait only while a Refresh is queued or running; with none, the Pane says No data yet with the server’s reason (Plots). On the published line and on a set of Changes the Pages do not get that far: No data yet takes their place, below. The Latest row says No data yet. too. The Latest row shows the server’s sentence. On an older Release whose major number is not the newest Release’s, no Refresh will ever fill Latest, because a Refresh runs only the newest Release. The row then says “This Release has no data, and no Refresh will add it. A Refresh runs only the newest Release. Choose the newest Release to read data.” Existing contract and access checks still apply.
  • A reader on the newest Release is served the newest Version whose stored Plots can be served. A Version can be served when it stores nothing, when its major line has a completed Refresh (its own, or one of an earlier Release in the same major line), or when its Refreshes cannot be read. Ponder and Admin Ponder serve the same Version, and the rule is one: a visit lands on the newest Release that has a complete Refresh, with that Refresh, and a Parable never shows Power on Parable while a Release has data to show. The rule holds for anyone with Peeking, Pinging, Publishing or Primary, in Peeking mode and in Publishing mode. In Publishing mode with no Changes open, the Pages read the line’s own tree, which is the newest Release’s. Empty Changes read the same tree, such as a person’s own Patch that they opened and did not edit, because they are that Release. A visit that would land on the person’s own Patch (PARABLE-8316) lands instead on the newest earlier Release that can be served while an empty Patch’s Release cannot, as in Peeking mode, and the empty Patch waits in the Release menu. Changes that change something, a Release or Changes that a person picks, and a link that names a Release are read as named. A set of Changes that changes something reads its own Preview, and says These Changes have no Preview yet until it has one.
    • After a major publish, readers stay on the newest earlier Version that can be served, with its data on screen. That is usually the Version they were already reading; a reader is never moved back past a Version that reads the last completed Refresh. Meanwhile Latest · Refreshing… and the progress bar show the new Version’s first Report. The Release menu marks the new Release in progress with the same spinner as the Refresh control, and the Release control names the Release on screen. The Refresh menu lists the running Refresh with its status.
    • Choosing the newer Release, or its running Refresh, in a menu opens that Release. The state says Refreshing Data, with the bar of Pipelines done and a button, Go to Latest Refresh, that returns to the newest complete combination of a Release and a Refresh: the address with no Release and no Refresh. The button shows only when such a combination exists. With none, the state says Powering on… as below.
    • When that Report completes, the reader stays on the previous Version: nothing moves without a click (Tyler, 2026-10-25). Within a few seconds the page names that Version in the address, so a reload or a later read keeps it, and a notice says v1.40 is ready with Open v1.40. The notice waits while the new Version still refreshes, so it comes once.
    • Open v1.40 and a choice in the Release menu swap as soon as the chosen Page has drawn, so they show that Version’s own loading state at once.
    • A pick of Newest never opens from the tab’s memory. It reads the newest Release, as any other choice in the Release menu does.
    • A Plot the newer Version deleted does not refuse the Version and the runs that read it. Admitting a reader to a stored output that read a Plot a later publish deleted judges that Plot as if it were still there, with its owning Pane’s Policies as of the newest Version that had it, at the reader’s current rank. A read of the deleted Plot itself, as the older Version’s deleted Pane makes, is judged the same way, and its rows are narrowed by every view filter Policy on the line that binds the reader and by the own view filters on the deleted Pane and tree view filters on Pages or Panes above it in the read window before the deletion. A reader who could read it before the deletion still can, narrowed by those filters, and one with no seat on the line now cannot. This holds for a Plot deleted on the line itself. A Plot deleted only in an installed line’s upstream version is still refused there.
    • While a reader is held, a publish does not make their Pages read again: a Version’s content never changes, so only a setting, a seat or a newly served Version makes a Page read again. A Pane that does read again keeps its rows on screen until the new ones arrive.
    • A Release that keeps its major number moves no one either. It has data at once, so its notice comes at once: v1.41 is ready, with Open v1.41.
    • The publisher’s notice says Published v1.40, that readers stay on the previous Version until its first Refresh finishes, and offers Open v1.40 to look early.
    • While the Parable’s Pipelines are off, no Refresh can run, so the new major Release gets no data. For example, after v2.0 the held reader reads v2.0 has no data, and this Parable’s Pipelines are off. and You are reading v1.39. Open v2.0 to read it without data., with Open v2.0. Nothing moves without that click. The notice stays while it is true. It closes when the reader closes it, opens another Release or a set of Changes, or opens another Parable, or when the Pipelines are on again. The publisher’s notice says that readers stay on v1.39 because v2.0 has no data and the Pipelines are off.
    • Choosing a Version in the Release menu reads that Version, skeletons and all.
  • For a Parable with no Pipeline, Latest is live Provider data with no age, and its stored runs are listed below it by age.
  • A Page on Latest keeps the Refresh it opened with. When a newer Refresh completes, the Page stays as it is and offers Newer data is ready with Read it. The Page reads the newer Refresh only after that click, or when the reader picks Latest again. Only a Plot whose held read a filter refuses reads it sooner. Admin Ponder still reads it at once.
  • A visible Page on Latest hears a Refresh that another person or the schedule starts, with no reload. It reads its Refreshes every 30 s while no Refresh moves, more often while one moves, and at once when the reader comes back to the tab. A hidden tab sends no reads. So the start of such a Refresh shows within 30 s, and Newer data is ready shows within 30 s after it completes. While no Refresh moves and its reads fail with a server error or a lost connection, for example during a deploy, the Page reads its Refreshes every 5 minutes. It does the same when the server asks it to wait. After a read succeeds, it reads them every 30 s again. Any other failed read stops the reads.
  • The menu reads past Refreshes when it opens, 50 at a time until none are left. A second open within 30 s shows them again without a read. A Plot’s History reads that Plot’s runs the same way when it opens. When the Pages show No data yet, they read at most three pages of 50 runs to find a usable completed Preview of the reading. They stop earlier when a Preview is found or no runs remain. A Preview beyond those 150 runs is not offered in the empty state. The Refresh menu still reads the full history when opened. Ordinary Page reads keep their bounded run context.
  • This month’s Refreshes follow, one line each with their age and, for a run with no rows to read, a status badge such as Failed. Two runs that would read alike add the clock, or the date, that tells them apart. Each row carries its exact time on hover and in its spoken name. Earlier months sit under Older Refreshes in month folders.
  • The Refresh on screen leads the menu, ruled off above Refresh and Plan Refreshes, and reads as its row in the list does; its chevron opens the Providers it read, and pressing it keeps it and closes the menu. The Refresh on screen is checked, at the end of its label and before its chevron. Latest is not repeated there: it is always the list’s first row, so while Latest is on screen the actions lead the menu.
  • Latest and each Refresh open on the Providers they read. A Provider’s row shows its logo, the product’s name, one colored icon for its connection (a green plug when it is connected; the blue read-live mark instead only when the catalog marks its connector streaming; waiting for first data, amber when it needs attention, red when it failed, or unplugged when it is not connected), what that means in the Providers directory’s words, and how old its data was, in one line: Updated 16 mins before Refresh, with the whole moment on hover. A healthy connection with no data reads Waiting for first data: on a Refresh, when the Refresh read every one of the Provider’s tables as never written; on Latest, when its connection’s first data has not arrived, as the Providers directory’s card says it: a push connection until a sender’s data lands, a pull connection until its first sync ends completed or partly successful (the connection’s has_ever_synced flag, which stays set). A commit in table_commits also counts as data. The connection answers, not the commits alone, because a reader’s Provider Policy can hide every table of a Provider that has data. That Provider reads as connected with no age, not as waiting. A Provider that read a stream while it was off needs attention, never waits: its row reads Stream off and names the stream, “The replies stream was off: read as empty.”, whatever data its other streams had. A connection that needs action or is turned off says so first. Those rows end in Fix, and pressing the row opens that connection in the app with a way back to the Parable, as the Pages’ Fix does; under View as the rows offer no Fix. A Provider whose connector the catalog marks streaming reads Updated Live while its connection is fine and its data is missing or no more than five minutes older than the moment it was read (the Refresh, or now for Latest). Older data shows its real age, so a stalled stream never reads Live. Every other connector, batch or unclassified, shows its age. When the Workspace has two connections of one Provider, each row shows its connection’s own name. A Refresh’s own row carries the worst of its Providers’ icons. Its Providers list the connected ones first, the worst of them first, then a rule and the ones it read with no connection, each by name. These rows name external Providers only. Parable’s derived identity pool is not a connection and does not appear as Not connected.
  • Latest’s Providers are read when the menu opens, as they stand now: each connection’s status and the newest commit among the Provider’s tables (Updated 19 mins ago), through providers_quality.summary.table_commits, as the reader. Until that read lands, a Latest that stands for a Refresh shows what that Refresh read. Latest names the streams the newest Refresh read while they were off that no connection of the Provider has turned on since, from the Workspace’s streams. It learns which streams a Parable reads from that Refresh, so a stream turned off after it shows from the next Refresh on.
  • A Refresh belongs to the Version that saved it. One the selected Version cannot read is filed below, in a folder for the Version that saved it, newest Version first: v1.97 · 6 Refreshes. Choosing it switches to that Version and that Refresh together, and RELEASE then names the Version. A link to such a Refresh, or a run chosen in a Plot’s History, opens it on its Version the same way. A Refresh no Version can read (its saved outputs expired) is not listed. Version folders past what the menu shows without scrolling fold under one Older Versions (N) folder that opens in place; the newest Release’s folder and the folder of the Refresh on screen always stay in view. A Refresh stays readable on every Release of its major line, also after a minor publish changes a Plot’s SQL. A Plot whose output shape changed has no rows in it.
  • A chosen Refresh that failed or was cancelled has no rows to read. Where the Page was, the editor and Ponder show This Refresh failed (or was cancelled), when it started and how long it ran, why, the Plots that failed and any Provider with an error, then Read Latest, Choose another Refresh and, for a seat that may, Refresh now.
  • A chosen Refresh that is still queued or running has no rows to read yet. Where the Page was, the editor and Ponder show This Refresh is queued, is still running or is paused at a budget (This Preview for a Preview), when it was queued or started, and its progress bar. A running Refresh also says how many Pipelines are done. A queued Refresh has not started, so its bar moves without a value, and its tooltip says Queued. It has not started yet. Then come Read Latest and Choose another Refresh. It offers no Refresh now. Cancel sits beside the bar for a person with Publishing or Primary, as on the header’s bar, and the bar says Cancelling… until the Refresh stops. A Refresh paused at a budget also offers Raise budget to a person with Primary who may override budgets. When several Pipelines wait at their budgets, the state names the Pipeline that makes the run fail first, and Raise budget opens for that Pipeline. Both controls show in every mode except Lab mode, as the header’s Cancel does. When the chosen Refresh is the newest one, the header’s bar gives way to this one, so one run shows one bar. When the editor shows any Piece other than a Page or a Pane, or another tab of the Page, this state is not drawn, and the header keeps its bar. When the Refresh completes, the Page shows its data with no click. When it fails or is cancelled, the state above shows.
  • A reading whose Pages read a stored Plot, with no compatible completed Refresh, shows one state where the Pages go on Latest, in the editor and in Ponder, instead of Panes that each wait or say No data yet (PARABLE-6285). Publishing never starts a Refresh, so a first publish, or a major publish, leaves its Version here until someone refreshes it, and a set of Changes stays here until someone Previews it. No setting turns this on: the report context’s currentDisabledReason, the server’s answer for the reading on screen, decides it.
    • The state says No data yet. On a set of Changes that changes something and has no Preview, it says These Changes have no Preview yet instead, because a set reads its own Preview and never the data of a Release. A seat the Refresh menu offers a run to gets that run as a button in the state: Power on Parable, which is Refresh, on the published line, and Preview on the published line or on a set of Changes. Only the author of a Pending set may Preview it. Power on Parable needs no Report Piece or schedule. Each button starts its run where the reader is, without the menu’s switch to Publishing, which would open their Changes.
    • Anyone with no button reads who can: “Only a person with Publishing or Primary can Preview or Power on this Parable.” On a set of Changes it reads “Only a person with Publishing or Primary can Preview these Changes.” View as shows the sentence, as it shows no Refresh actions.
    • A reader whom the Refresh menu offers Preview, on a Pending set that another person started, reads who started it in place of that sentence: “Only Ana, who started these Changes, can Preview them while they are Pending. You can Preview them after they are Proposed.” When the server turns Preview off, the state shows the server’s reason for Preview instead (PARABLE-8559).
    • A seat that the server refuses sees Power on Parable turned off, with the server’s sentence under it, such as “This Parable cannot refresh because its Pipelines permission is off.” The who-can sentence does not show then. It shows only when the server sends no sentence (PARABLE-8559).
    • A Preview is never Latest, so a completed Preview of the reading is offered to every reader as Read Preview, which opens it as choosing it in the Refresh menu does. While one can be read, the state offers no Preview button; the Refresh menu still does.
    • From a Power on press, and while a Refresh that fills the reading moves, everyone reading it sees a spinner, Powering on…, This will take some time. and a bar of the Pipelines done, with 3 of 12 Pipelines done in its tooltip. A first Refresh has no typical duration, so the bar moves without a value until the first Pipeline ends. Cancel sits beside the bar for a seat that may cancel, and the header’s bar gives way to this one. When the editor shows any Piece other than a Page or a Pane, this state is not drawn, and the header keeps its bar. A Refresh that someone else starts shows within 10 s. A moving Preview says Powering on Preview… with the same spinner, progress, and controls.
    • When a Pipeline reaches its budget, the run waits up to four hours for a person with Primary to raise it. The state then says This Refresh is paused at a budget for a Refresh or This Preview is paused at a budget for a Preview, the same words as a picked Refresh. Under it, Hours by person reached its budget. names the Pipeline, then says when the run fails unless a person with Primary raises the budget. It shows no spinner, and the bar holds. Raise budget opens the same dialog as History, for a person with Primary and the budget override permission. When several Pipelines wait at their budgets, the state names the Pipeline that makes the run fail first, and Raise budget opens for that Pipeline. After a cancel from this bar, the state says Cancelling… for a Refresh or Cancelling Preview… for a Preview at once, until the Pipelines stop.
    • When the Refresh completes, the Pages draw in place, with no reload. A Preview completes with Read Preview, which opens its rows only when the reader chooses it. Two presses at once make one Refresh. The server refuses the second press, and the second reader’s page reads the run again before it shows anything, so it goes from Powering on… to the first reader’s run.
    • When the Refresh fails, or someone cancels it, the state says Powering on failed or Powering on stopped, then the reason, then the button again. A Preview says Powering on Preview failed or Preview stopped instead. Only a Preview of the reading or a Refresh of the Version on screen counts: when a newer Version fixes the cause, it starts at No data yet. A press that the server refuses before a run starts says Powering on failed and why. Power on Parable never shows a toast.
    • When the place for the Pages is short, as on a phone with Ponder above the Page, the scene gets smaller and then leaves, so the words and the bar always show. The state scrolls when even the words do not fit.
    • It covers the published line, its newest published Version or the line’s own tree in Publishing with no Changes open, and a Pending or Proposed set of Changes on a line with a published Version. The server decides it from the line’s Latest, so a set of Changes shows it only while the line has no compatible Refresh. When the line has one, a set that edits a stored Plot keeps each Pane’s No data yet with the server’s sentence about these Changes (Plots). A Pending set that changes nothing yet, such as the Patch a person with Publishing opens, is the Version it was made from: its Preview runs that Version and names no set, so the line’s runs fill it and the Refresh menu lists them on it. Made from the newest Version, it offers Power on Parable too. An older Version keeps each Pane’s No data yet, because no Refresh or Preview runs it. So do the Changes of a Parable with no published Version. A Personal Parable’s Page shows its saved Pieces, not a Release. Its Refresh menu runs the Newest Release, and its Panes read the Latest Refresh of that Release. The server refuses a Preview of a set made from no published Version. Readers who follow the newest Release stay on the previous Version until they open the new one, as above, so they never see it after an ordinary publish. In Publishing mode, a visit with no Changes open, or with empty Changes, stays there too. Power on Parable shows on the published line only when no Release of the Parable has a Refresh to read. On a Release that a person picks or a link names, it shows when that Release has no Refresh and none runs, and Refreshing Data shows while its Refresh runs and another Release has a complete one.
    • Above the words, an animated three.js scene: a sphere of points with three orbits, which stream into it while a run moves. It loads only with this state, and a reader who prefers reduced motion gets a still frame.
  • While a Refresh is queued or running, the closed Refresh control turns a small spinner beside its label, such as Latest (4m ago), until the run finishes or fails; a failed run then shows its status there instead. The spinner stands still under reduced motion.
  • While a Refresh runs, a slim animated bar sits right after RELEASE and REFRESH, with Cancel beside it. Its fill and its tooltip, such as Est. Time Remaining: 4 min and 12 of 31 Pipelines done, are estimated from the median duration of this Report’s last ten completed Refreshes and the Pipelines the run has finished. The bar never goes backwards and slows near the end rather than sitting at 99%. With no history, it follows the Pipelines done, and it moves without a value until the first Pipeline ends. While the newest Refresh is queued, it has not started, so the bar gives no estimate: it moves without a value, and its tooltip says Queued. It has not started yet., as the chosen Refresh’s state does. The bar on Powering on… gives a queued Refresh no estimate either. Cancel asks first. Once confirmed, the bar holds where it was and says Cancelling… in Cancel’s place until the run’s Plots have stopped, then Refresh cancelled for a few seconds, and is gone.
  • The Refresh trigger marks only the Refresh being read. A chosen Refresh names its own state after its age (2h ago · Failed); Latest is marked when the Refresh it stands for did not succeed. A newer run that failed or was cancelled never marks another Refresh the reader chose.
  • An output is compatible when the rows the new Version declares match the rows it was saved under. Naming a plain field as its scalar-lib type, a text field as Generic.Text, a number as Generic.Float64 or a yes or no as Generic.Boolean, keeps it compatible: those types accept exactly the values the plain ones do, so no Refresh is needed and older Refreshes stay readable. Any other scalar (Identity.Name, Generic.Int64), a native Date becoming a Temporal.DateTime, or another type is a new contract, and the stored Plot waits for a Refresh.
  • Every time in the menu, History and Results is in the reader’s time zone and clock, read from their browser: 12:31pm ET in New York, 17:31 BST in London. A locale that uses a 24-hour clock gets one; others get am and pm.
  • An explicit Refresh stays pinned, in the address as refresh=<run id>. A Failed or Cancelled one stays pinned and its Pages say it has no rows to read. A run id the Parable does not have, such as one that left retention, another Parable’s, or a typed word, is dropped once the runs are read, and the page reads Latest.
Ordinary SQL Plots and previews may query completed pipeline outputs with their own parameters. Direct reads of a materialization keep their captured inputs and refuse different overrides. Reading a Report checks its captured inputs against current Policies, so a deleted or newly hidden input can make an old result unavailable rather than substituting today’s values. A reader whose Provider Policies narrow a Provider table the run read is refused for the same reason: the result holds rows they can’t read. It also checks the stored bytes against the run’s record and refuses a result whose table, commit or row count no longer matches. A run’s rows come back in the order the run wrote them. See Plots for plotApi.readReport.

Limits

  • A Plot can read the Plots of a Platform Parable only. A reference to any other Parable’s Plot gets PV_REF_002, and Prepare and Publish refuse it.
  • A Refresh plans a Platform Parable’s Plots against its newest Release. A Refresh of a Version whose pinned Release a newer Release changed, in a Plot the Refresh reads, is refused until the reading Parable is published again.
  • A Refresh over a filtered Platform Parable must retain the columns needed to apply its filters to the stored output. If it cannot prove this, the Plot refuses storage with QL-PL-022. A Current-data read runs its saved SQL live under the reader’s filters.
  • A Pipeline can read another Pipeline of the same Report: it runs after the members it reads and reads what they wrote in that run. Members that read each other in a cycle are refused. Capture finds which members read which (Dependency graph). See Plots. A Plot the run reads but nothing stores is read as a view of its SQL (Plots read as views).
  • Capture finds what each Plot reads from the dependencies the Workspace recorded when it published each Parable. A Parable delivered to the Workspace and not published there since has none recorded there. A Report run of such a Parable does not order its members.
  • A Report run reads each view of its own Parable from the Version it captured. A run captured before that view was published again is refused when it is planned; run the Report again.
  • Refresh after sources learns a plan’s Providers from what the Report’s Refreshes read, not from its Pipelines’ SQL. A plan watches no Provider until the Report’s first Refresh that reads a Provider completes. Then it watches each connection that Refresh read, whichever of the connection’s tables the Pipelines use. The Platform Parables a plan reads count from its first publish.
The built-in Reports Power carries these rules for Ponder when it designs a Report pipeline.