You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 25d54e9
Browse filesBrowse the repository at this point in the historyBrowse files
docs: match the DAG API docs to the implemented collection boundaries
Describe the two plain candidate collections, the view-based compile, the
caller-typed physical candidate errors, lifecycle_guarantee, and
PhysicalExecution as an execution handle. Remove APIs the docs said were
removed but never existed (compile_timed_candidates, PhysicalDAGCandidate),
the agent instructions in the alignment proposal's baseline, and the
ingestion-time Binary exception from design docs, where it is an
implementation detail (the developer migration guide keeps it).
Restore #485's statement that candidates do not choose placement and #508's
CandidatePostASAPDAGs<Id> names in input-output-workflow.md, rejoin the
split test table in physical-planning-and-deployment.md, and take
planner-backend-layering.md verbatim from #509.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/design_docs/architecture/input-output-workflow.md
+7-5Lines changed: 7 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,7 +30,7 @@ fields and [frontend dependencies](#frontend-specific-dependencies).
30
30
31
31
| Output | Fields or contents | Meaning |
32
32
|---|---|---|
33
-
|`CandidatePostASAPDAGs`| All legal logical candidates for the workload, represented compactly as canonical roots, one candidate set per target sub-DAG, and cross-target composition information | The candidate space: nothing is selected yet |
33
+
|`CandidatePostASAPDAGs<Id>`| All legal logical candidates for the workload, represented compactly as canonical roots, one candidate set per target sub-DAG, and cross-target composition information | The candidate space: nothing is selected yet |
34
34
|`PlanOutput`| One selected PostASAPDAG root (`Rc<PostASAPNode>`) per workload entry, optionally with summary-maintenance lifecycle decisions | One optimization pass's selection, returned by `e2e_plan` and `optimize`|
35
35
36
36
`PlanOutput` is selected from the candidate space, not a second output beside
@@ -41,7 +41,9 @@ it. [Output layers](#output-layers) places both in the `PreASAPDAG` →
41
41
DAG assembly](#selection-and-dag-assembly), and
42
42
[summary-maintenance lifecycle](#summary-maintenance-lifecycle-aware-helper) APIs operate on this candidate collection.
43
43
These are different uses of the candidate space, not mandatory sequential
44
-
stages. The logical candidates have no selected summary-maintenance lifecycle.
44
+
stages. `CandidatePostASAPDAGs` itself has no selected summary-maintenance lifecycle, and
45
+
its candidates do not choose precompute versus query-time placement: a chosen
46
+
lifecycle assignment sets each node's execution timing.
45
47
46
48
These candidates are logical `PostASAPDAG`s. Planner also compiles
47
49
physical candidates. Downstream systems price lifecycle assignments, bind
@@ -325,7 +327,7 @@ Additional inputs for a Planner-owned maintenance decision are listed with the
325
327
326
328
## Output
327
329
328
-
### CandidatePostASAPDAGs
330
+
### `CandidatePostASAPDAGs<Id>`
329
331
330
332
The logical layer outputs `CandidatePostASAPDAGs`. The current
331
333
Rust API represents this collection compactly as `CandidatePostASAPDAGs<Id>`; this is an
@@ -390,8 +392,8 @@ timing assignments, physical candidate generation and explicit transport exports
390
392
|---|---|---|
391
393
| 0. Frontends |`CandidatePreASAPDAGs`| Parse and lower PromQL, SQL, or MetricsQL; reject unsupported semantics such as PromQL `fill`. |
392
394
| 1. Logical Post-ASAP |`CandidatePostASAPDAGs`| What to compute: summary families, rewrites, and exact candidates. No placement. `PlanOutput` is an optional library-selected logical result; deployments can enumerate candidates themselves. |
393
-
| 2. Summary maintenance lifecycle | Lifecycle choices per unique summary state and maintained population → `CandidatePostASAPDAGs` with timing |`Ephemeral`, `Prepared`, `Shared`, or `ContinuouslyMaintained`. Each admissible assignment produces a candidate with node timing, window framework, and retention; this layer is the only source of timing. |
394
-
| 3. Physical compilation |`CandidatePhysicalDAGs`| Compile operators and kernels once, then cut by timing into precompute and query DAGs with typed `InputContracts`. Ingestion-time Binary lowering requires matching compile-time timing. |
395
+
| 2. Summary maintenance lifecycle | Lifecycle choices per unique summary state and maintained population → `CandidatePostASAPDAGs` with timing (`CandidatePostASAPDAGsWithTiming`) |`Ephemeral`, `Prepared`, `Shared`, or `ContinuouslyMaintained`. Each admissible assignment produces a candidate with node timing, window framework, and retention; this layer is the only source of timing. |
396
+
| 3. Physical compilation |`CandidatePhysicalDAGs`| Compile operators and kernels once, then cut by timing into precompute and query DAGs with typed `InputContracts`. |
395
397
| 4–5. Deployment | Deployment-owned | Prices lifecycle assignments with its own costs, including summary store cost; selects, binds, and executes. |
396
398
397
399
Each layer preserves all legal candidates under the supplied constraints;
Copy file name to clipboardExpand all lines: docs/design_docs/physical-planning-and-deployment.md
+3-5Lines changed: 3 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -434,15 +434,14 @@ The lifecycle layer decides timing; physical compilation reads it. Lowering a
434
434
node does not depend on the frontier, so each query DAG is lowered once and
435
435
different lifecycle assignments are different cuts of that lowering.
436
436
`compile(dag, inputs, roots)` yields the complete `PhysicalDAG`.
437
-
`frontier_from_timing(&timed_dag)` reads an assignment's timed DAG (from
438
-
`export_timed_dag`) and returns its frontier: ingestion-time nodes read by
437
+
`frontier_from_timing` reads an assignment's timing (a lifecycle assignment's
438
+
view, or a DAG from `export_timed_dag`) and returns its frontier: ingestion-time nodes read by
439
439
query-time nodes, or an ingestion-time root; a query-time node feeding an
440
440
ingestion-time node is rejected. `cut_candidate(&compiled, &frontier)` then
441
441
partitions the lowered operators: the frontier's ancestors form the precompute
442
442
DAG and the rest form the query DAG. Helper operators are numbered by their
443
443
Planner node (`u64::MAX - (node_id << 16) - index`), so a cut is byte-identical to
444
-
`compile_candidate` for that frontier. One exception: an ingestion-time
445
-
`Binary` lowers differently, so its timing must match at compile time.
444
+
`compile_candidate` for that frontier.
446
445
`compile_candidate(s)` and `enumerate_frontiers` wrap the same path. Temporal
447
446
pane candidates remain a separate lowering.
448
447
@@ -572,7 +571,6 @@ operator/runtime fixtures:
572
571
|`summary_maintenance_lifecycle_e2e::continuous_lifecycle_compiles_and_executes_spatial_kll`| PromQL workload → selected continuous lifecycle → logical DAG → compiled precompute/query candidate → results in independent revisions; an unbounded candidate fails before pricing, and a bounded request candidate summarizes the same input samples |
573
572
|`summary_maintenance_lifecycle_e2e::chosen_lifecycle_timing_decides_precompute_contents`| PromQL workload → enumerated lifecycles → explicit choice → timed DAG → compiled candidate; ContinuouslyMaintained stores the state in precompute, Ephemeral leaves precompute empty and reads the raw source at query time; both return the same p99 |
574
573
|`summary_maintenance_lifecycle_e2e::lifecycle_timing_cuts_one_compilation`| KLL quantile and grouped Rate→Sum: one compilation cut by the ContinuouslyMaintained and Ephemeral timed DAGs equals `compile_candidate` for each; the frontier is the retained state or empty |
575
-
576
574
|`summary_maintenance_lifecycle_e2e::chosen_population_lifecycle_decides_precompute_contents`| PromQL `topk by(job)` over a maintained population → explicit choice → timed DAG → compiled candidate; ContinuouslyMaintained stores the population in precompute, Ephemeral rebuilds it from raw samples at query time; both rank alike |
577
575
|`summary_maintenance_lifecycle_e2e::planner_lifecycle_selection_reproduces_strategy_timing`| For PromQL summary fixtures, the timed DAG from Planner's retained selection equals the DAG realization strategies produce |
578
576
|`kll_pane_execution::five_panes_roundtrip_and_shared_merge_runs_once`| Explicit one-minute precompute DAGs → real MessagePack state bytes → five required query inputs → shared native merge → p50/p99; counts every sample once, checks adjacent aligned windows and instruments one merge start per run |
0 commit comments