Skip to content
Open
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
f2e08c6
Restack PR #742 with implementation before standalone acceptance
zzylol Sep 26, 2026
e9bdc44
fix: declare actual replay cadence in differential planning
zzylol Sep 26, 2026
8bbe7a8
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
7adc977
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
09dac1b
test: constrain replay candidates to the deployed local execution cap…
zzylol Sep 26, 2026
111a2c1
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
080ce41
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
d74d939
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
881ac3b
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
4115700
test: require the full aggregation workload to bind locally
zzylol Sep 26, 2026
5014dff
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
091b2c8
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
27ff9bb
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
35596ea
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
597bbf4
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
6c27dd4
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
e3ffa2f
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
b098629
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
5d74fcc
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
85fa2c4
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
bb82277
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
92614f0
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
e93df71
Merge branch 'standalone/stack-728' into standalone/stack-742
zzylol Sep 26, 2026
30a434f
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
41c7aba
merge: run differential coverage on bound SDS identities
zzylol Sep 26, 2026
e49954f
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
e184754
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
e38cff1
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
39befb5
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
c6a2022
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
2bf54d8
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
057a695
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
1f370d8
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
1723076
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
842922e
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 26, 2026
34b6ad4
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
e78adf1
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
78c1c76
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
5270d53
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
3c2c3af
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
c914e79
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
b3b3a57
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
3e81743
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
07aa0f9
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 27, 2026
95e2028
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
334faa7
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
058bfc4
Validate native resource cost model v2 in differential acceptance
zzylol Sep 28, 2026
1dff365
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
e4174e1
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
4ee6ac1
Install the costed deployment plan in differential and benefit execution
zzylol Sep 28, 2026
df4fdc7
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
1f3213a
test: separate synthetic candidate ranking from execution E2E
zzylol Sep 28, 2026
8df7590
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
bdc583e
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
15683f1
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
2f146ed
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
3887dfa
test: rank every admitted query ensemble candidate with synthetic costs
zzylol Sep 28, 2026
49ea8cb
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
aeaf169
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
adeeb3b
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
ff65881
test: reject workload prices scoped to another dataset
zzylol Sep 28, 2026
6c17d18
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
397662a
style: format dataset quote rejection assertion
zzylol Sep 28, 2026
e780cbb
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
85fe203
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
337fcb7
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
6be83b3
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
47a5c11
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
a13a527
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
bc62dd0
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
90b9460
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
6309432
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
5920171
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
e6ebc0e
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
16bb84e
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
1c23852
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
9899410
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
a4ccacd
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
4c065ec
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
5a5a8d5
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
51cf9a6
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
ac5e88d
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
91b0415
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
d60a8b0
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
3f581ca
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
7cb7925
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
d3756f9
test: pin level2 ranking to typed dataset and status rejections
zzylol Sep 28, 2026
7c6f23f
Merge branch 'fix/cost-evidence-dataset' into grill-742-tests
zzylol Sep 28, 2026
354c489
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
6dbf2bb
Merge remote-tracking branch 'origin/732-test-add-prometheus-remote-w…
zzylol Sep 28, 2026
673529d
Merge branch 'fix/cost-evidence-dataset' into grill-742-tests
zzylol Sep 28, 2026
4ed518e
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
bcee5fc
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
9118966
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
cf80233
Merge remote-tracking branch 'origin/732-test-add-prometheus-remote-w…
zzylol Sep 28, 2026
9d0bbff
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
0fdb0f5
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
0aea4c0
Merge branch 'impl/sds-stack-728' into impl/sds-stack-742
zzylol Sep 28, 2026
30b4569
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
2407665
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
984edb9
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
0cc85da
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
ad577fa
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
ad1a894
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
f0286aa
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
f9cd94e
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
e72924d
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
b247736
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
81f4bcf
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
bf1935e
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
3a6d83c
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
406282f
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
6b2cb48
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
50e388f
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
574350b
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
a5e1c38
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 2026
ffdb312
Merge branch 'fix/cost-evidence-dataset' into impl/sds-stack-742
zzylol Sep 28, 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
159 changes: 159 additions & 0 deletions control_plane/tests/issue754_level2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
//! Synthetic prices test Backend ranking, not ERP calibration or runtime speed.
#[path = "support/issue754_workload.rs"]
mod workload;

use control_plane::physical::{
compiler::{CompileError, QueryFrontend, BACKEND_REVISION, PLANNER_REVISION},
workload_cost::{
compile_candidates_for_pricing, enumerate_exact_and_materialized_candidates,
select_lowest_cost_candidate, CandidateEvaluationStatus, WorkloadCostEvidence,
WorkloadQuote,
},
};

/// Every admissible workload candidate can win solely by changing complete quotes.
/// Missing/infeasible cheapest quotes must not become a zero-cost winner.
#[test]
fn workload_candidates_follow_prices_and_feasibility() {
let mut workloads: Vec<_> = workload::suite()
.queries
.into_iter()
.map(|case| (case.name.clone(), workload::input(&case)))
.collect();
workloads.extend(
workload::ensembles()
.into_iter()
.map(|(name, cases)| (name, workload::ensemble_input(&cases))),
);
for (name, input) in workloads {
let (request, env) = input.into_physical_compilation_request().unwrap();
let candidates = enumerate_exact_and_materialized_candidates(request).unwrap();
let (mut manifests, admission) =
compile_candidates_for_pricing(candidates.clone(), env.clone(), QueryFrontend::PromQl);
// The search is expected to reach one manifest through several candidates;
// equivalent manifests need exactly one quote.
let mut seen = std::collections::BTreeSet::new();
manifests.retain(|m| seen.insert(serde_json::to_string(m).unwrap()));
assert!(manifests.len() >= 2, "{} needs competing candidates", name);
assert!(admission.iter().all(|c| c.total_cost.is_none()));
let mut winners = std::collections::BTreeSet::new();
for preferred in 0..manifests.len() {
let evidence = WorkloadCostEvidence {
backend_revision: BACKEND_REVISION.into(),
planner_revision: PLANNER_REVISION.into(),
data_snapshot_id: format!("synthetic-ranking-{}", name),
model_version: "synthetic-complete-quotes-v1".into(),
observed_at_unix_ms: env.observed_at_unix_ms,
valid_for_ms: env.max_evidence_age_ms,
quotes: manifests
.iter()
.enumerate()
.map(|(index, manifest)| WorkloadQuote {
manifest: manifest.clone(),
executable: true,
unit_costs: manifest
.components
.keys()
.map(|key| (key.clone(), if index == preferred { 1.0 } else { 1e12 }))
.collect(),
})
.collect(),
};
// The preference must follow from construction, not fixture multiplicities.
let totals: Vec<f64> = evidence
.quotes
.iter()
.map(|quote| {
quote
.manifest
.components
.iter()
.map(|(key, demand)| quote.unit_costs[key] * demand.occurrences_per_horizon)
.sum()
})
.collect();
for (index, total) in totals.iter().enumerate() {
assert!(
index == preferred || *total > totals[preferred],
"{name}: candidate {index} is not costlier than preferred {preferred}"
);
}
if preferred == 0 {
// A single foreign quote, even a losing one, invalidates the generation.
let mut wrong_dataset = evidence.clone();
let foreign = &mut wrong_dataset.quotes.last_mut().unwrap().manifest;
foreign.dataset_identity.namespace = "another-tenant".into();
let error =
select_lowest_cost_candidate(candidates.clone(), env.clone(), &wrong_dataset)
.unwrap_err();
assert!(
matches!(error, CompileError::CostEvidenceDataset { .. }),
"{name}: quotes for another dataset must not price this workload: {error}"
);
}
let plan = select_lowest_cost_candidate(candidates.clone(), env.clone(), &evidence)
.unwrap_or_else(|e| panic!("{}: {e}", name));
let report = plan.cost_comparison.unwrap();
assert_eq!(report.selected_manifest, manifests[preferred], "{}", name);
assert_eq!(report.model_version, "synthetic-complete-quotes-v1");
let minimum = report
.candidate_evaluations
.iter()
.filter_map(|c| c.total_cost)
.fold(f64::INFINITY, f64::min);
assert_eq!(report.component_costs.values().sum::<f64>(), minimum);
assert_eq!(
report
.candidate_evaluations
.iter()
.filter(|c| c.status == CandidateEvaluationStatus::Selected)
.count(),
1
);
winners.insert(serde_json::to_string(&report.selected_manifest).unwrap());
// Inventory order cannot alter a unique cheapest choice.
let mut reversed = candidates.clone();
reversed.reverse();
assert_eq!(
select_lowest_cost_candidate(reversed, env.clone(), &evidence)
.unwrap()
.cost_comparison
.unwrap()
.selected_manifest,
manifests[preferred]
);
for missing in [false, true] {
let mut unavailable = evidence.clone();
let expected = if missing {
unavailable.quotes.remove(preferred);
CandidateEvaluationStatus::EvidenceMissing
} else {
unavailable.quotes[preferred].executable = false;
CandidateEvaluationStatus::ProviderRejected
};
let report =
select_lowest_cost_candidate(candidates.clone(), env.clone(), &unavailable)
.unwrap()
.cost_comparison
.unwrap();
assert_ne!(report.selected_manifest, manifests[preferred]);
let preferred_evaluations: Vec<_> = report
.candidate_evaluations
.iter()
.filter(|c| c.plan_id == Some(manifests[preferred].plan_id))
.collect();
assert!(!preferred_evaluations.is_empty(), "{name}");
for c in preferred_evaluations {
assert_eq!(c.status, expected, "{name}");
assert!(c.unavailable_reason.is_some() && c.total_cost.is_none());
}
}
}
assert_eq!(
winners.len(),
manifests.len(),
"{}: selection did not reverse",
name
);
}
}
Loading