Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
304 commits
Select commit Hold shift + click to select a range
2e41f80
Merge branch 'stack/planner-api-737' into stack/planner-api-749
zzylol Sep 23, 2026
0eefb49
docs: remove redundant Planner selection contract
zzylol Sep 23, 2026
48e9950
Merge branch 'stack/planner-api-737' into stack/planner-api-749
zzylol Sep 23, 2026
5ed60fc
Merge branch 'refactor/planner-selection-api' into stack/planner-api-737
zzylol Sep 23, 2026
d389e3b
deps: pin Planner bounded HLL confidence model
zzylol Sep 23, 2026
7c3d80a
test: size transmitted KLL state from a certified accuracy contract
zzylol Sep 23, 2026
5dc0113
Merge branch 'stack/planner-api-737' into stack/planner-api-749
zzylol Sep 23, 2026
61e0c14
Merge branch 'refactor/planner-selection-api' into stack/planner-api-737
zzylol Sep 23, 2026
67e8f13
test: retain KLL collector capability when using theoretical confidence
zzylol Sep 23, 2026
af35131
refactor: implement typed summary semantics and physical plan lowering
zzylol Sep 24, 2026
67e9cb9
docs: separate Planner physical computation from backend deployment
zzylol Sep 25, 2026
09e1bad
Merge branch 'integration/physical-stack-737' into integration/physic…
zzylol Sep 25, 2026
985b3cc
refactor: name the backend orchestration entry DeploymentPlanCompiler
zzylol Sep 25, 2026
ae604d0
Merge branch 'integration/physical-stack-749' into integration/physic…
zzylol Sep 25, 2026
29e1aba
Restack PR #770 with implementation before standalone acceptance
zzylol Sep 26, 2026
34658fc
Restack PR #763 with implementation before standalone acceptance
zzylol Sep 26, 2026
12c192e
chore: consume Planner physical precompute candidate interfaces
zzylol Sep 26, 2026
1be253e
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
f762aff
chore: consume Planner materialization frontier enumeration
zzylol Sep 26, 2026
ac85870
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
b3578f8
chore: consume exact temporal ranking physical candidates
zzylol Sep 26, 2026
297ac1f
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
1e38966
chore: use shared Planner candidate winner selection
zzylol Sep 26, 2026
f1ae0b0
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
887636c
chore: consume sparse counter shared readout contracts
zzylol Sep 26, 2026
802f189
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
8c4b080
test: declare collector ranking fixture capabilities explicitly
zzylol Sep 26, 2026
7b3df68
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
b8ef5d4
Use Planner counter-window candidate execution
zzylol Sep 26, 2026
e9dc0af
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
4442f70
Use shared keyed-counter omission contract
zzylol Sep 26, 2026
826d4d8
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
623acc2
Use Planner exact-counter population omission
zzylol Sep 26, 2026
8f5e265
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
0717ca0
Construct fixture evidence for the standalone operator foundation
zzylol Sep 26, 2026
17fa482
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
bf86025
build: pin Planner exact-state scratch merge implementation
zzylol Sep 26, 2026
7c5370b
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
4455fda
build: pin shared finalized-pane reconstruction fix
zzylol Sep 26, 2026
6255d76
Merge branch 'standalone/stack-770' into standalone/stack-763
zzylol Sep 26, 2026
858c9ba
docs: bind Planner physical DAGs without backend re-lowering
zzylol Sep 26, 2026
5bb4d70
docs: describe summary inputs with groups and pane duration
zzylol Sep 26, 2026
20b2d39
docs: define summary semantic completeness beyond input scope
zzylol Sep 26, 2026
b49e47a
docs: define SDS identity through canonical Planner computation
zzylol Sep 26, 2026
fb07b89
docs: decouple SDS semantic identity from executable Planner IR
zzylol Sep 26, 2026
134db0c
docs: define Planner-owned SDS discovery for future ad hoc queries
zzylol Sep 26, 2026
7367cc4
docs: streamline SDS design around definitions and stored results
zzylol Sep 26, 2026
b3163ef
docs: track bound-query SDS migration across implementation PRs
zzylol Sep 26, 2026
b38ae64
Merge remote-tracking branch 'sds-review/737' into impl/sds-semantic-…
zzylol Sep 26, 2026
199cc76
Merge branch 'impl/sds-semantic-identity' into impl/sds-stack-771
zzylol Sep 26, 2026
35c83bd
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 26, 2026
53bfb2f
docs: identify active shared-library PR in bound-query migration
zzylol Sep 26, 2026
57705f6
Merge branch 'docs/pr737-design-boundaries' into impl/sds-semantic-id…
zzylol Sep 26, 2026
41eb1e2
Merge branch 'impl/sds-semantic-identity' into impl/sds-stack-771
zzylol Sep 26, 2026
36d6c8f
build: align shared Planner dependencies with remote PR 462
zzylol Sep 26, 2026
d1420cc
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 26, 2026
692aa9d
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
39cf8d8
docs: separate bound SDS range lookup from state validation
zzylol Sep 26, 2026
534546c
Merge branch 'docs/pr737-design-boundaries' into impl/sds-semantic-id…
zzylol Sep 26, 2026
861bd11
Merge branch 'impl/sds-semantic-identity' into impl/sds-stack-771
zzylol Sep 26, 2026
50d4e92
feat(sds): separate bound output routing from persisted semantic iden…
zzylol Sep 26, 2026
3bbd198
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 26, 2026
c9bc216
merge: integrate semantic SDS identities with output-scoped storage
zzylol Sep 26, 2026
b0d77ce
docs: state SDS migration responsibilities without stale implementati…
zzylol Sep 26, 2026
e2bc561
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 26, 2026
40fbbac
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
fd3a02a
Merge branch 'docs/pr737-design-boundaries' into impl/sds-semantic-id…
zzylol Sep 26, 2026
cb1e237
Merge branch 'impl/sds-semantic-identity' into impl/sds-stack-771
zzylol Sep 26, 2026
14ef72d
refactor(sds): keep semantic variants compact without changing wire f…
zzylol Sep 26, 2026
83f21e9
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
4ba0a43
test: align evidence fixtures with selected exact count state
zzylol Sep 26, 2026
a56739d
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
599ea4b
docs: align precompute SDS description with semantic catalog
zzylol Sep 26, 2026
2cabd24
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
af9fec0
test: bind imported-state fixtures to their actual semantic definition
zzylol Sep 26, 2026
3d49ed7
test: bind imported-state fixtures to their actual semantic definition
zzylol Sep 26, 2026
ac08158
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
17671d6
test: distinguish imported CMS transport from total-count planning
zzylol Sep 26, 2026
ae462e0
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 26, 2026
749252d
docs: clarify Planner physical plan and SDS architecture
zzylol Sep 17, 2026
74255ec
docs: specify executable subplan materialization boundaries
zzylol Sep 18, 2026
d048262
docs: scope migration to backend precompute and query plans
zzylol Sep 18, 2026
ae92339
docs: clarify window terminology migration
zzylol Sep 18, 2026
d25d6c9
Revert "docs: clarify window terminology migration"
zzylol Sep 18, 2026
011a6cd
docs: focus physical plan and SDS designs
zzylol Sep 18, 2026
1ca64ed
docs: add physical compiler input example
zzylol Sep 18, 2026
06b26eb
docs: add physical compiler output example
zzylol Sep 18, 2026
9a1c41b
docs: include query expression in compiler example
zzylol Sep 18, 2026
19bc7da
docs: reorganize physical plan integration design
zzylol Sep 18, 2026
8fbe0f3
docs: reorganize SDS and migration designs
zzylol Sep 18, 2026
eb3c3c4
docs: define maintenance inputs before plan split example
zzylol Sep 18, 2026
c9b6ea7
docs: use plan version consistently in backend design
zzylol Sep 18, 2026
4de2df4
docs: remove standalone catalog materialization abstraction
zzylol Sep 18, 2026
9892bed
docs: add concise planner backend glossary
zzylol Sep 18, 2026
1232ce9
docs: clarify selected deployment guarantee terminology
zzylol Sep 21, 2026
158c22a
docs: explain missing planner maintenance guarantee
zzylol Sep 21, 2026
6322175
docs: motivate selected producer maintenance decision
zzylol Sep 21, 2026
8bdb7a7
docs: label catalog reads and SDS metadata ownership
zzylol Sep 21, 2026
813e3e3
docs: align SDS ownership and lifecycle terminology
zzylol Sep 21, 2026
f3bd9d8
docs: use current planner and plan-version names consistently
zzylol Sep 21, 2026
11e21d2
docs: align integration diagram with SDS ownership
zzylol Sep 21, 2026
b4dec9b
docs: clarify instance identity and shared producer wording
zzylol Sep 21, 2026
f300704
docs: distinguish summary definitions from runtime stores
zzylol Sep 22, 2026
520ace6
docs: model one runtime summary store for DAG bindings
zzylol Sep 22, 2026
864c2a2
docs: scope SDS lifecycle to read eligibility
zzylol Sep 22, 2026
e0ab398
docs: tie stored summary examples directly to DAG outputs
zzylol Sep 22, 2026
5f383d1
docs: name summary tables, stored records, and output references by role
zzylol Sep 22, 2026
a2ab168
docs: illustrate summary definitions, stored records, and output refe…
zzylol Sep 22, 2026
d5f5203
docs: limit v1 summary storage to definitions and stored summaries
zzylol Sep 22, 2026
ebf4569
docs: separate Planner physical computation from backend deployment
zzylol Sep 25, 2026
eb60220
docs: bind Planner physical DAGs without backend re-lowering
zzylol Sep 26, 2026
1b36bb7
docs: describe summary inputs with groups and pane duration
zzylol Sep 26, 2026
b12512f
docs: define summary semantic completeness beyond input scope
zzylol Sep 26, 2026
51185de
docs: define SDS identity through canonical Planner computation
zzylol Sep 26, 2026
69b28c2
docs: decouple SDS semantic identity from executable Planner IR
zzylol Sep 26, 2026
5ffc426
docs: define Planner-owned SDS discovery for future ad hoc queries
zzylol Sep 26, 2026
5bcd54c
docs: streamline SDS design around definitions and stored results
zzylol Sep 26, 2026
5b402b8
docs: track bound-query SDS migration across implementation PRs
zzylol Sep 26, 2026
0d9ab8e
docs: identify active shared-library PR in bound-query migration
zzylol Sep 26, 2026
ef6c127
docs: separate bound SDS range lookup from state validation
zzylol Sep 26, 2026
eb94d73
docs: state SDS migration responsibilities without stale implementati…
zzylol Sep 26, 2026
5f1eebf
docs: preserve design index after rebasing onto main
zzylol Sep 28, 2026
8857f25
docs: clarify SDS source identity and version-scoped recovery
zzylol Sep 28, 2026
bccb189
docs: illustrate SDS identity and recovery decisions
zzylol Sep 28, 2026
12896bd
Merge branch 'restack/pr737-main' into impl/sds-semantic-identity
zzylol Sep 28, 2026
bc417b0
Merge branch 'impl/sds-semantic-identity' into impl/sds-stack-771
zzylol Sep 28, 2026
f4d7869
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 28, 2026
6239249
feat: bind Planner dataset semantics to deployment input identity
zzylol Sep 28, 2026
ceffa2e
fix: reject cross-version stored-state adoption
zzylol Sep 28, 2026
3f28f6b
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
2767dbb
fix: recognize shared native batch encoding at dependency boundary
zzylol Sep 28, 2026
802f1af
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
c27dc95
test: reject pre-dataset planning snapshot versions
zzylol Sep 28, 2026
05e1479
refactor: version dataset-bound catalog and update empty-plan fixtures
zzylol Sep 28, 2026
a8cb523
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
e637cb8
docs: describe dataset-bound planning and installation inputs
zzylol Sep 28, 2026
c4da46d
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
a81f1ba
docs: clarify candidate selection and deployment ownership
zzylol Sep 28, 2026
8f36745
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
79eb631
refactor: split backend deployment plans and bind stored outputs
zzylol Sep 28, 2026
070fad6
fix: restrict foundation SDS recovery to the installed generation
zzylol Sep 28, 2026
6e3a50b
merge: base typed plan support on rebased foundation
zzylol Sep 28, 2026
d513aa5
merge: carry version-scoped foundation recovery into semantic integra…
zzylol Sep 28, 2026
63e498e
merge: preserve storage contracts after foundation rebase
zzylol Sep 28, 2026
3c840ff
fix: allocate fresh physical series when a plan version changes
zzylol Sep 28, 2026
5d6cdbc
Merge branch 'restack/pr749-main' into impl/sds-stack-771
zzylol Sep 28, 2026
3627535
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
f2fc57c
merge: allocate fresh output storage during version warm-up
zzylol Sep 28, 2026
3845a19
fix: reserve the persisted storage handle during recovery
zzylol Sep 28, 2026
70a8d88
test: record foundation rebase and recovery regression evidence
zzylol Sep 28, 2026
1953a40
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 28, 2026
7b35480
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
2dbe763
Merge branch 'restack/pr749-main' into impl/sds-stack-771
zzylol Sep 28, 2026
d71032d
fix: complete shared state encoding adoption at the dependency boundary
zzylol Sep 28, 2026
97ed2b6
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
b013c91
style: satisfy workspace formatting after the compiler rename
zzylol Sep 28, 2026
38fb552
Merge branch 'restack/pr749-main' into impl/sds-stack-771
zzylol Sep 28, 2026
e48181c
Merge branch 'impl/sds-stack-771' into impl/sds-stack-774
zzylol Sep 28, 2026
7f470d4
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
d8bf03e
feat(sds): separate bound output routing from persisted semantic iden…
zzylol Sep 26, 2026
42602b9
feat(sds): require dataset-bound Planner definitions and versioned ca…
zzylol Sep 28, 2026
9e0a892
refactor: implement typed summary semantics and physical plan lowering
zzylol Sep 24, 2026
0f05899
fix: validate final SDS semantics across Planner adapters and recovery
zzylol Sep 28, 2026
c556130
test: verify final SDS identity installation, serving and restart
zzylol Sep 28, 2026
d608213
merge: base shared execution on final SDS identity contract in #749
zzylol Sep 28, 2026
07f8ef6
test: align shared execution fixtures with final #749 SDS foundation
zzylol Sep 28, 2026
7f342ae
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
3f1db0f
docs: record shared execution directly after the SDS foundation
zzylol Sep 28, 2026
7b28606
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
9ca9ed3
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
e627dbb
fix(control-plane): supply dataset_identity in the API test fixtures
zzylol Sep 28, 2026
890b69c
Remove obsolete SDS wire aliases and persisted metadata migration
zzylol Sep 28, 2026
b1e2c00
Merge commit 'e627dbb329dabcff5a8d18e8796da2b0111efc01' into impl/pr7…
zzylol Sep 28, 2026
ab0a4d7
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
0cef456
fix(data-plane): initialize dataset_identity in the bootstrap ingest …
zzylol Sep 28, 2026
9cea766
Merge SDS format cleanup while retaining stored-output metadata schema 5
zzylol Sep 28, 2026
53d560e
Reject obsolete state-column syntax in compiler roundtrip coverage
zzylol Sep 28, 2026
a8cfcdd
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
7342aea
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
d6f688f
Remove unused materialization wire adapter and propagate recovery errors
zzylol Sep 28, 2026
b234911
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
9f5467d
Propagate stored-output metadata recovery failures through runtime stack
zzylol Sep 28, 2026
b9f6e66
Keep projection fixtures on the canonical typed encoding
zzylol Sep 28, 2026
855cfdb
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
f125008
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
621cc6e
Remove superseded deployment API field aliases
zzylol Sep 28, 2026
e21c8cd
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
1dbaaa6
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
edc6de4
fix(control-plane): supply dataset_identity in the API test fixtures
zzylol Sep 28, 2026
334b186
fix(control-plane): supply dataset_identity in the API test fixtures
zzylol Sep 28, 2026
07525f2
Merge remote-tracking branch 'refs/remotes/sds-cleanup/precompute' in…
zzylol Sep 28, 2026
67b5366
Merge remote-tracking branch 'refs/remotes/sds-cleanup/shared' into i…
zzylol Sep 28, 2026
de04ab7
Preserve current startup plan while merging upstream fixture fixes
zzylol Sep 28, 2026
51a686e
Document obsolete-format removals and cleanup validation
zzylol Sep 28, 2026
507cc8f
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
656df5b
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
f1256f0
Record passing restacked plan, storage and serving checks
zzylol Sep 28, 2026
2c726ce
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
eb120a1
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
269c774
Remove generated evaluation archives and keep validation summaries
zzylol Sep 28, 2026
97e1285
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
55f94da
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
be2b593
Normalize validation summary formatting
zzylol Sep 28, 2026
448c28c
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
aed0ec7
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
09cf67d
Remove PR process reports and defer execution design to shared-runtim…
zzylol Sep 28, 2026
04d5d2d
Own the precompute execution design in the shared-runtime foundation
zzylol Sep 28, 2026
9144358
Keep the expanded precompute design while removing PR evidence bundles
zzylol Sep 28, 2026
2a0f8ed
Keep discovery and calibration on dataset-bound snapshot version 3
zzylol Sep 28, 2026
f4a7653
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
226dc80
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
84e9468
Use typed deployment configuration in process E2E fixtures
zzylol Sep 28, 2026
ec36ae9
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
3eaae03
Integrate foundation CI fixes while preserving physical-plan-only sta…
zzylol Sep 28, 2026
8f4a171
Remove unused streaming-config fixture after physical-only startup
zzylol Sep 28, 2026
c11a540
Align process assertions with dataset-bound SDS and cold successor ac…
zzylol Sep 28, 2026
302ab25
Merge branch 'impl/pr749-final-sds' into impl/sds-stack-774
zzylol Sep 28, 2026
99ce6c1
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
c32094c
Align stack ancestry with the verified SDS foundation squash on main
zzylol Sep 28, 2026
97929bd
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
0d7ac30
fix: execute typed Planner fragments and preserve terminal resource e…
zzylol Sep 28, 2026
f5090c3
Merge remote-tracking branch 'origin/main' into impl/sds-stack-774
zzylol Sep 28, 2026
268039b
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
77679a4
fix: bind exact integer samples without losing input types
zzylol Sep 28, 2026
17da11e
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
1f0ad1d
test: verify exact integer protocol input binding
zzylol Sep 28, 2026
626faad
refactor: name per-boundary physical fragments explicitly
zzylol Sep 28, 2026
61d5019
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
d48ddce
fix: consume finalized Planner query candidate outputs
zzylol Sep 28, 2026
ad711aa
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
e42b0c1
test: require Planner filters for bound protocol vectors
zzylol Sep 28, 2026
87f6d4f
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
96e31e3
test: use Planner schema lifting module
zzylol Sep 28, 2026
bb97871
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
dbf18b0
fix: bind Planner filters and finalized query results
zzylol Sep 28, 2026
6292765
docs: describe bound Planner filter execution
zzylol Sep 28, 2026
e260694
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
23e08ac
fix: retain state binding and sharing beneath explicit query readouts
zzylol Sep 28, 2026
46c7070
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
22c7d4f
fix: pin Planner query finalization for every candidate entry point
zzylol Sep 28, 2026
a93328c
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
e26c787
docs: distinguish query values from stored accumulator boundaries
zzylol Sep 28, 2026
41093e6
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
a061df2
test: assert exact Count state beneath its query readout
zzylol Sep 28, 2026
f88d987
Merge branch 'impl/sds-stack-774' into impl/sds-stack-763
zzylol Sep 28, 2026
1c7833c
Merge main after shared physical operator foundation was squash-merged
zzylol Sep 28, 2026
2b2b2b4
fix: preserve maintenance failures and stop failed worker admission
zzylol Sep 28, 2026
4aac569
docs: specify bounded revisions and consistent query snapshots
zzylol Sep 28, 2026
8563c71
feat: execute bounded precompute revisions with consistent SDS reads
zzylol Sep 28, 2026
b3069e6
Merge main counter-delta cleanup into precompute revisions
zzylol Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion control_plane/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ name = "control_plane"
path = "src/main.rs"

[dependencies]
asap-physical-operators.workspace = true
tokio = { version = "1", features = ["full"] }
axum = { version = "0.7", features = ["ws"] }
futures-util = "0.3"
Expand All @@ -33,6 +32,7 @@ parking_lot = "0.12"
prometheus = { version = "0.13", default-features = false, features = ["process"] }
tonic = { version = "0.12", features = ["gzip"] }
asap_types.workspace = true
asap-physical-operators.workspace = true

# Planner's IR, replacement search, and frontends share the workspace pin.
planner-types.workspace = true
Expand Down
62 changes: 23 additions & 39 deletions control_plane/src/backend_client.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
//! HTTP client that pushes a freshly-generated `StreamingConfig` YAML
//! to the ASAPQuery-backend's `POST /api/v1/streaming-config` endpoint.
//!
//! This is the control-plane-side **producer** of the PR E phase 1 / phase 2
//! hot-reload contract that landed in ASAPQuery-backend PRs #10 and #12.
//! The replanner calls into this module immediately after generating a
//! new plan so the backend's active `StreamingConfig` is updated without
//! a restart and subsequent queries observe the new aggregation layout.
//!
//! The client is **fire-and-forget at the call site** — the replanner
//! awaits the POST but doesn't block its own return on the outcome.
//! Errors are logged at WARN; the control plane is expected to be tolerant
//! of transient backend unavailability because the next replan cycle
//! will try again with the latest plan.
//! Publish and activate complete physical-plan generations on the backend.

use std::time::Duration;

#[cfg(test)]
use anyhow::{Context, Result};
use reqwest::Client;
#[cfg(test)]
use tracing::debug;
#[cfg(test)]
use tracing::warn;
Expand Down Expand Up @@ -92,7 +81,7 @@ fn classify_http_status(status: reqwest::StatusCode, body: String, what: &str) -
}
}

/// Minimal HTTP client for ASAPQuery-backend's streaming-config endpoint.
/// Minimal HTTP client for ASAPQuery-backend's physical-plan endpoint.
/// Built once at control-plane startup from the
/// `CONTROL_PLANE_BACKEND_ENDPOINT` environment variable and shared
/// via `Arc` with the replanner.
Expand All @@ -105,7 +94,7 @@ pub struct BackendClient {
impl BackendClient {
/// Construct a client pointing at the backend's plan-push endpoint.
/// `endpoint` should be the full URL, e.g.
/// `http://backend.svc:8088/api/v1/streaming-config`.
/// `http://backend.svc:8088/api/v1/physical-plan`.
///
/// A 5-second timeout bounds the duration a slow or unreachable
/// backend can stall the replanner — consistent with the symmetric
Expand Down Expand Up @@ -136,11 +125,12 @@ impl BackendClient {
&self.endpoint
}

/// POST the given `StreamingConfig` YAML to the backend. Returns
/// Test-only transport helper: POST the given YAML to the backend. Returns
/// `Ok(())` on any 2xx status, otherwise an error carrying the
/// status code and response body. The caller (typically
/// [`Replanner::replan_metric`]) logs the error and moves on — the
/// next replan cycle will retry with the latest plan.
#[cfg(test)]
pub async fn push_streaming_config(&self, yaml: String) -> Result<()> {
debug!(
endpoint = %self.endpoint,
Expand Down Expand Up @@ -212,6 +202,7 @@ impl BackendClient {
/// that don't need retry semantics keep their `anyhow::Result`
/// shape. The retry layer in `emit::backend_push` uses this typed
/// variant.
#[cfg(test)]
pub async fn post_streaming_config_json_typed(
&self,
json: String,
Expand Down Expand Up @@ -245,7 +236,7 @@ impl BackendClient {

#[cfg(test)]
/// Post backend storage-routing JSON. Derive the URL by replacing the
/// `/api/v1/streaming-config` suffix with `/api/v1/storage_routing`; URLs
/// `/api/v1/physical-plan` suffix with `/api/v1/storage_routing`; URLs
/// without that suffix are used verbatim.
pub async fn post_storage_routing_json(&self, json: String) -> Result<()> {
let url = derive_storage_routing_url(&self.endpoint);
Expand Down Expand Up @@ -364,25 +355,18 @@ impl BackendClient {
}

fn derive_physical_plan_url(endpoint: &str) -> String {
const DASH: &str = "/api/v1/streaming-config";
const UNDERSCORE: &str = "/api/v1/streaming_config";
const PHYSICAL: &str = "/api/v1/physical-plan";
endpoint
.strip_suffix(DASH)
.or_else(|| endpoint.strip_suffix(UNDERSCORE))
.map(|base| format!("{base}{PHYSICAL}"))
.unwrap_or_else(|| endpoint.to_string())
endpoint.to_string()
}

/// Map a streaming-config endpoint URL to the sibling storage-routing
/// Map a physical-plan endpoint URL to the sibling storage-routing
/// endpoint by rewriting the trailing path component. URLs that don't
/// end with `/api/v1/streaming-config` (or `/api/v1/streaming_config` —
/// end with `/api/v1/physical-plan` (or `/api/v1/physical_plan` —
/// either spelling is supported) pass through unchanged so tests can
/// inject a mock-server URL directly.
#[cfg(test)]
fn derive_storage_routing_url(endpoint: &str) -> String {
const STREAMING_PATH_DASH: &str = "/api/v1/streaming-config";
const STREAMING_PATH_UNDERSCORE: &str = "/api/v1/streaming_config";
const STREAMING_PATH_DASH: &str = "/api/v1/physical-plan";
const STREAMING_PATH_UNDERSCORE: &str = "/api/v1/physical_plan";
const ROUTING_PATH: &str = "/api/v1/storage_routing";
if let Some(stripped) = endpoint.strip_suffix(STREAMING_PATH_DASH) {
return format!("{stripped}{ROUTING_PATH}");
Expand Down Expand Up @@ -429,7 +413,7 @@ mod tests {
async fn start_mock_backend(sink: SharedSink, status: axum::http::StatusCode) -> String {
let app = Router::new()
.route(
"/api/v1/streaming-config",
"/api/v1/physical-plan",
post(
move |State(sink): State<SharedSink>, body: axum::body::Bytes| async move {
let yaml = String::from_utf8_lossy(&body).to_string();
Expand All @@ -445,7 +429,7 @@ mod tests {
axum::serve(listener, app).await.unwrap();
});
tokio::time::sleep(Duration::from_millis(50)).await;
format!("http://{addr}/api/v1/streaming-config")
format!("http://{addr}/api/v1/physical-plan")
}

#[tokio::test]
Expand Down Expand Up @@ -481,7 +465,7 @@ mod tests {
#[tokio::test]
async fn push_or_log_swallows_errors() {
// Point at an unreachable port so the request fails fast.
let client = BackendClient::new("http://127.0.0.1:1/api/v1/streaming-config");
let client = BackendClient::new("http://127.0.0.1:1/api/v1/physical-plan");
// Must not panic or propagate — fire-and-forget semantics.
push_or_log(&client, "cpu_usage", "content".to_string()).await;
}
Expand Down Expand Up @@ -522,15 +506,15 @@ mod tests {

/// storage-routing-URL derivation rewrites the path
/// component when the configured endpoint ends in
/// `/api/v1/streaming-config`, leaving everything else untouched.
/// `/api/v1/physical-plan`, leaving everything else untouched.
#[test]
fn storage_routing_url_rewrites_streaming_path() {
assert_eq!(
derive_storage_routing_url("http://backend:8088/api/v1/streaming-config"),
derive_storage_routing_url("http://backend:8088/api/v1/physical-plan"),
"http://backend:8088/api/v1/storage_routing"
);
assert_eq!(
derive_storage_routing_url("http://backend:8088/api/v1/streaming_config"),
derive_storage_routing_url("http://backend:8088/api/v1/physical_plan"),
"http://backend:8088/api/v1/storage_routing"
);
}
Expand Down Expand Up @@ -578,7 +562,7 @@ mod tests {
let server = tokio::spawn(async move {
axum::serve(listener, app).await.unwrap();
});
let client = BackendClient::new(format!("http://{addr}/api/v1/streaming-config"));
let client = BackendClient::new(format!("http://{addr}/api/v1/physical-plan"));
client
.post_catalog_plan_typed(&publication, None, &[])
.await
Expand Down Expand Up @@ -630,7 +614,7 @@ mod tests {
tokio::time::sleep(Duration::from_millis(50)).await;
// Return the streaming-config URL — the client will rewrite
// the path before issuing the POST.
format!("http://{addr}/api/v1/streaming-config")
format!("http://{addr}/api/v1/physical-plan")
}

#[tokio::test]
Expand Down Expand Up @@ -702,7 +686,7 @@ mod tests {
#[tokio::test]
async fn typed_connection_refused_is_transient() {
// Port 1 on loopback is reserved and refuses connections.
let client = BackendClient::new("http://127.0.0.1:1/api/v1/streaming-config");
let client = BackendClient::new("http://127.0.0.1:1/api/v1/physical-plan");
let err = client
.post_streaming_config_json_typed("{}".to_string())
.await
Expand Down
4 changes: 2 additions & 2 deletions control_plane/src/emit/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
//! by `asapedgeprocessor.ThresholdConfig`). The edge derives the agg_id
//! from the metric name itself, so this block carries no agg_id.
//! 2. [`streaming_config_monitor_entry`] — the `monitors[]` JSON object for the
//! backend `StreamingConfig` (consumed by `asap_types::MonitorSpec`), where
//! backend `InstalledPrecomputePlan` (consumed by `asap_types::MonitorSpec`), where
//! `agg_id` IS carried and MUST equal [`agg_id_for_metric`].
//!
//! The functions are pure so they can be unit-tested and called from whichever
Expand Down Expand Up @@ -88,7 +88,7 @@ pub fn edge_threshold_block(intent: &MonitorIntent) -> Value {
Value::Mapping(m)
}

/// Render the backend `StreamingConfig.monitors[]` JSON entry for this intent,
/// Render the backend `InstalledPrecomputePlan.monitors[]` JSON entry for this intent,
/// stamping the cross-language `agg_id`.
pub fn streaming_config_monitor_entry(intent: &MonitorIntent) -> serde_json::Value {
serde_json::json!({
Expand Down
10 changes: 5 additions & 5 deletions control_plane/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct AppState {
/// input identity; incoming telemetry cannot supply its own descriptors.
active_summary_catalog:
Arc<tokio::sync::Mutex<Option<Arc<asap_types::summary_catalog::SummaryCatalog>>>>,
/// Shared client for posting streaming configs from HTTP planning and replanning.
/// Shared client for publishing physical plans from HTTP planning and replanning.
/// `None` when `CONTROLLER_BACKEND_ENDPOINT` is unset; pushes are then skipped.
backend_client: Option<Arc<backend_client::BackendClient>>,
}
Expand Down Expand Up @@ -69,13 +69,13 @@ async fn main() {
backend_endpoint.as_ref().map(|endpoint| {
info!(
endpoint = %endpoint,
"ASAPQuery-backend StreamingConfig push enabled"
"ASAPQuery-backend InstalledPrecomputePlan push enabled"
);
Arc::new(backend_client::BackendClient::new(endpoint.clone()))
});
if backend_client_shared.is_none() {
info!(
"ASAPQuery-backend StreamingConfig push disabled \
"ASAPQuery-backend physical-plan publication disabled \
(set CONTROLLER_BACKEND_ENDPOINT=<url> to enable)"
);
}
Expand Down Expand Up @@ -1000,9 +1000,9 @@ mod api_tests {
#[test]
fn app_state_backend_client_some_when_constructed_with_url() {
let (state, _router) =
test_app_with_backend(Some("http://127.0.0.1:1/api/v1/streaming-config".into()));
test_app_with_backend(Some("http://127.0.0.1:1/api/v1/physical-plan".into()));
let bc = state.backend_client.expect("backend_client must be Some");
assert_eq!(bc.endpoint(), "http://127.0.0.1:1/api/v1/streaming-config");
assert_eq!(bc.endpoint(), "http://127.0.0.1:1/api/v1/physical-plan");
}

// ── POST /api/v1/plan ─────────────────────────────────────────────────────
Expand Down
11 changes: 9 additions & 2 deletions control_plane/src/physical/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6993,15 +6993,22 @@ pub(crate) mod tests {
&query_plan,
)
.unwrap();
// V1 has one stored output per definition; arbitrary output IDs are
// rejected before writer/reader agreement is considered.
// Output identity is independent of definition identity, but changing
// only the writer must still invalidate every unchanged reader binding.
let mut rebound_writer = bundle.precompute_plan.clone();
rebound_writer.schemas[0]
.stored_output_reference
.stored_output_id = asap_types::sds::StoredOutputId(123);
assert!(rebound_writer
.validate_against_catalog(&bundle.summary_catalog)
.is_err());
assert!(
asap_types::plan_publication::validate_stored_output_references(
&rebound_writer,
&query_plan,
)
.is_err()
);
}

#[test]
Expand Down
30 changes: 27 additions & 3 deletions control_plane/src/physical/executable_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

pub use asap_types::executable_plan::*;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum OperatorExecution {
Ingestion,
Query,
}

/// Every physical operator uses its node's placement; payload kind does not
/// restrict execution phase. Runtime capability is checked separately.
fn operator_execution(node: &planner_types::post_asap::ExecutableDagNode) -> OperatorExecution {
match node.output_state.timing {
planner_types::post_asap::ExecutionTiming::IngestionTime => OperatorExecution::Ingestion,
planner_types::post_asap::ExecutionTiming::QueryTime => OperatorExecution::Query,
}
}

/// Assign backend phases to a selected semantic DAG without changing its nodes.
pub fn install_selected_dag(
query_id: String,
Expand All @@ -15,12 +30,21 @@ pub fn install_selected_dag(
let mut nodes = std::collections::BTreeMap::new();
let mut precompute_sinks = Vec::new();
for node in &dag.nodes {
if let planner_types::post_asap::ExecutableOperatorPayload::SummaryAgg {
family,
input,
grouping,
..
} = &node.payload
{
asap_physical_operators::capability::validate_summary_kernel(family, input, grouping)
.map_err(|reason| format!("post-ASAP node {:?}: {reason}", node.id))?;
}
let execution = operator_execution(node);
let binding = if let Some(stored_output) = materialization(node.id) {
precompute_sinks.push(node.id);
BackendNodeBinding::Materialization { stored_output }
} else if node.output_state.timing
== planner_types::post_asap::ExecutionTiming::IngestionTime
{
} else if execution == OperatorExecution::Ingestion {
BackendNodeBinding::MaintenanceInput
} else {
query_node(node.id).map_or(BackendNodeBinding::QueryInput, |query_node| {
Expand Down
2 changes: 1 addition & 1 deletion control_plane/src/physical/post_asap/deployment_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ pub enum PhysicalExpr {
/// Phase ε.1 Mode 2: no sketch processor at the edge — raw OTLP
/// forwards to the backend, which builds the sketch at ingest. The
/// `family` and `params` are the sketch the backend will build, so
/// the backend's `StreamingConfig` `aggregation_input` is `raw` for
/// the backend's `InstalledPrecomputePlan` `aggregation_input` is `raw` for
/// this metric.
RawAtEdgeSketchAtBackend {
/// Sketch family the backend will build at ingest.
Expand Down
2 changes: 1 addition & 1 deletion control_plane/src/physical/post_asap/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ fn pipeline_l1_to_l4(query: &str, accuracy: AccuracyTarget) -> PhysicalExpr {
}

/// `quantile_over_time.yaml` — the asap-planner-rs `quantile_over_time`
/// fixture maps to a KLL or DDSketch StreamingConfig row. The control plane
/// fixture maps to a KLL or DDSketch InstalledPrecomputePlan row. The control plane
/// path: L1 PromQL parse → L3 `Aggregate{Quantile{0.99}}` over `Window` →
/// L4 bind picks Kll (default) or DDSketch. Either is functionally
/// equivalent — both are quantile sketches.
Expand Down
2 changes: 1 addition & 1 deletion control_plane/src/workload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ impl WorkloadRegistry {
/// Inject (or replace, keyed by `metric_name`) a runtime workload entry.
/// Used by the autonomous-allocation apply path to register a synthesized
/// monitor so the next replan/repost emits it into the backend
/// `StreamingConfig` (the coordinator then derives the ε-floor `p`). Shared
/// `InstalledPrecomputePlan` (the coordinator then derives the ε-floor `p`). Shared
/// across registry clones via the `Arc<RwLock<…>>` overlay.
pub fn insert_runtime(&self, entry: WorkloadEntry) {
let mut rt = self
Expand Down
2 changes: 1 addition & 1 deletion crates/asap_types/src/aggregation_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ impl PrecomputeMaterialization {
}

/// `PolicyFingerprint::as_u64()` — the u64-form handle used by the
/// policy-fingerprint-keyed call sites (e.g. `StreamingConfig`'s
/// policy-fingerprint-keyed call sites (e.g. `InstalledPrecomputePlan`'s
/// `HashMap<u64, PrecomputeMaterialization>` keys). **Always** equal to
/// `self.policy_fingerprint().as_u64()`. The value is content-
/// addressed identity, NOT a controller-allocated counter id.
Expand Down
2 changes: 1 addition & 1 deletion crates/asap_types/src/executable_plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ mod tests {
fn send_sync<T: Send + Sync>() {}
send_sync::<InstalledPostAsapDag>();
let wire = serde_json::json!({
"schema_version": 1, "query_id": "q", "nodes": [], "edges": [], "root": 0
"schema_version": 2, "query_id": "q", "nodes": [], "edges": [], "root": 0
});
let document: OwnedPostAsapDag = serde_json::from_value(wire.clone()).unwrap();
assert_eq!(serde_json::to_value(document).unwrap(), wire);
Expand Down
4 changes: 2 additions & 2 deletions crates/asap_types/src/monitor_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ impl MonitorFunctional {
/// (empty for Sum / whole-stream). See
/// `ASAPCollector/docs/continuous-monitoring-tumbling-cost-analysis.md`.
///
/// Stays here (unlike `data_plane::storage_engines::types::StreamingConfig`,
/// Stays here (unlike `data_plane::storage_engines::types::InstalledPrecomputePlan`,
/// which holds a `Vec<MonitorSpec>` field) because `control_plane` genuinely
/// needs it: `emit/monitor.rs` builds the `StreamingConfig.monitors[]` JSON
/// needs it: `emit/monitor.rs` builds the `InstalledPrecomputePlan.monitors[]` JSON
/// entry by hand and has a regression test asserting that JSON deserializes
/// into this exact type. `control_plane` cannot depend on `data_plane` (the
/// dependency runs the other way), so this type has to live somewhere both
Expand Down
4 changes: 2 additions & 2 deletions crates/asap_types/src/policy_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
//! Derived view over a collection of `PrecomputeMaterialization`s that maps
//! [`PolicyFingerprint`] → [`PrecomputeMaterialization`]. This is the
//! merged-sid-identity-chain replacement for the controller-allocated
//! `aggregation_id`-keyed `HashMap` that `data_plane`'s `StreamingConfig`
//! carries (see `data_plane::storage_engines::types::streaming_config`'s
//! `aggregation_id`-keyed `HashMap` that `data_plane`'s `InstalledPrecomputePlan`
//! carries (see `data_plane::storage_engines::types::installed_precompute_plan`'s
//! module doc for why that type lives there, not here).
//!
//! ## Dual-keyed transition
Expand Down
Loading
Loading