1use super::*;
2
3mod evaluator;
4
5pub use evaluator::*;
6
7fn value_distribution_entropy_bits(value_frequencies: &[usize]) -> f64 {
14 let total: usize = value_frequencies.iter().copied().sum();
15 if total == 0 {
16 return 0.0;
17 }
18 let total = total as f64;
19 value_frequencies
20 .iter()
21 .copied()
22 .filter(|&count| count > 0)
23 .map(|count| {
24 let p = count as f64 / total;
25 -p * p.log2()
26 })
27 .sum()
28}
29
30pub fn summarize_omena_query_design_system_minimum_description(
48 source_uri: impl Into<String>,
49 source_hash: impl Into<String>,
50 rule_count: usize,
51 observation_count: usize,
52 value_frequencies: &[usize],
53) -> DesignSystemMinimumDescriptionV0 {
54 let alphabet_size = value_frequencies.iter().filter(|&&count| count > 0).count();
55 let model_bits = if alphabet_size > 1 {
57 rule_count as f64 * (alphabet_size as f64).log2()
58 } else {
59 0.0
60 };
61 let entropy_bits = value_distribution_entropy_bits(value_frequencies);
64 let residual_bits = observation_count as f64 * entropy_bits;
65 let model_class = if alphabet_size > 1 {
66 ModelClassV0::TwoPartMultinomial
67 } else {
68 ModelClassV0::TwoPartUniform
69 };
70 DesignSystemMinimumDescriptionV0 {
71 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
72 product: "omena-query.design-system-minimum-description",
73 layer_marker: "mdl-bits",
74 feature_gate: "mdl",
75 model_bits,
76 residual_bits,
77 total_bits: model_bits + residual_bits,
78 unit: "bit",
79 model_class,
80 rule_count,
81 observation_count,
82 canonical_form_present: false,
83 cascade_proof_obligation_count: 0,
84 sass_namespace_partition: SassNamespaceBitsV0 {
85 namespace_count: 0,
86 partition_count: 0,
87 deterministic_partition: true,
88 },
89 generated_at_iso: "deterministic-v0",
90 source_pin: SourcePinV0 {
91 source_uri: source_uri.into(),
92 source_hash: source_hash.into(),
93 },
94 weights_calibration_pin: "uniform-v0",
95 weights_version: "0",
96 semiring_instance: "tropical",
97 }
98}
99
100pub struct OmenaQueryCanonicalFormInput {
101 pub pass_id: &'static str,
102 pub before: String,
103 pub canonical_after: String,
104 pub fallback_after: String,
105 pub mdl_bits: f64,
106 pub ast_size_bits: f64,
107 pub iteration_count: usize,
108 pub eclass_count: usize,
109 pub enode_count: usize,
110}
111
112pub fn summarize_omena_query_canonical_form(
113 input: OmenaQueryCanonicalFormInput,
114) -> CanonicalFormV0 {
115 let canonical_matches_fallback = input.canonical_after == input.fallback_after;
116 let bits_saved_vs_fallback = input.ast_size_bits - input.mdl_bits;
117 CanonicalFormV0 {
118 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
119 product: "omena-query.canonical-form",
120 layer_marker: "mdl-bits",
121 feature_gate: "mdl",
122 pass_id: input.pass_id,
123 before: input.before,
124 canonical_after: input.canonical_after,
125 fallback_after: input.fallback_after,
126 canonical_matches_fallback,
127 bits_saved_vs_fallback,
128 mdl_bits: input.mdl_bits,
129 ast_size_bits: input.ast_size_bits,
130 unit: "bit",
131 iteration_count: input.iteration_count,
132 eclass_count: input.eclass_count,
133 enode_count: input.enode_count,
134 cascade_safe_witness: "cascade proof obligation remains conservative",
135 egg_analysis_witness: "extracted canonical form is compared against fallback output",
136 }
137}
138
139pub fn summarize_omena_query_boundary(input: &EngineInputV2) -> OmenaQueryBoundarySummaryV0 {
140 let fragment_bundle = summarize_omena_query_fragment_bundle(input);
141 let expression_semantics_query_count = fragment_bundle.expression_semantics.fragments.len();
142 let source_resolution_query_count = fragment_bundle.source_resolution.fragments.len();
143 let selector_usage_query_count = fragment_bundle.selector_usage.fragments.len();
144
145 OmenaQueryBoundarySummaryV0 {
146 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
147 product: "omena-query.boundary",
148 query_engine_name: "omena-query",
149 schema_version_policy: summarize_omena_query_schema_version_policy(),
150 input_version: input.version.clone(),
151 abstract_value_domain: summarize_omena_query_core_abstract_value_domain(),
152 selected_query_adapter_capabilities:
153 summarize_omena_query_selected_query_adapter_capabilities(),
154 delegated_fragment_products: vec![
155 "engine-input-producers.expression-semantics-query-fragments",
156 "engine-input-producers.source-resolution-query-fragments",
157 "omena-resolver.boundary",
158 "omena-resolver.source-resolution-runtime-index",
159 "engine-input-producers.selector-usage-query-fragments",
160 "engine-input-producers.expression-domain-flow-analysis",
161 "engine-input-producers.expression-domain-control-flow-analysis",
162 "engine-input-producers.expression-domain-call-site-flow-analysis",
163 "engine-input-producers.expression-domain-provenance-explanations",
164 "engine-input-producers.expression-domain-reduced-product-iteration",
165 "omena-query.expression-domain-incremental-flow-analysis",
166 "omena-query.expression-domain-selector-projection",
167 "omena-parser.style-facts",
168 "omena-query-checker-orchestrator.cascade-gate",
169 "omena-query-transform-runner.boundary",
170 "omena-transform-bundle.source",
171 "omena-transform-target.plan",
172 "omena-transform-egg.plan",
173 "omena-transform-egg.execution",
174 "omena-transform-print.artifact",
175 "omena-transform-passes.plan",
176 "omena-transform-passes.execution",
177 "omena-cascade.custom-property-least-fixed-point",
178 "omena-semantic.style-context-index",
179 "omena-query.transform-execute",
180 "omena-query.transform-context-from-engine-input",
181 "omena-query.consumer-check-style-source",
182 "omena-query.consumer-build-style-source",
183 "omena-query.static-stylesheet-evaluator",
184 "omena-scss-eval.oracle",
185 "omena-scss-eval.static-value-resolution",
186 "omena-query.scss-evaluator-control-flow",
187 "omena-query.native-css-evaluator",
188 "omena-scss-eval.native-css-function-surface",
189 "omena-scss-eval.native-css-if-function-decisions",
190 "omena-scss-eval.control-flow-ir",
191 "omena-scss-eval.control-flow-value-analysis",
192 "omena-scss-eval.call-return-ir",
193 "omena-query.static-lif-exports",
194 "omena-query.scss-evaluator-control-flow-oracle-corpus",
195 "omena-scss-eval.control-flow-oracle-corpus",
196 "omena-query.evaluation-runtime",
197 "omena-query.fast-facts",
198 "omena-query.analyzed-graph",
199 "omena-query.custom-property-annotations",
200 "omena-query.design-system-minimum-description",
201 "omena-abstract-value.polynomial-provenance",
202 ],
203 expression_semantics_query_count,
204 source_resolution_query_count,
205 selector_usage_query_count,
206 total_query_count: expression_semantics_query_count
207 + source_resolution_query_count
208 + selector_usage_query_count,
209 ready_surfaces: vec![
210 "queryFragmentBundle",
211 "abstractValueProjectionContract",
212 "abstractValueReducedProductAlgebra",
213 "sourceResolutionResolverBoundary",
214 "sourceResolutionRuntimeIndex",
215 "expressionDomainFlowAnalysisBoundary",
216 "expressionDomainControlFlowAnalysisBoundary",
217 "expressionDomainCallSiteFlowAnalysisBoundary",
218 "expressionDomainProvenanceExplanations",
219 "expressionDomainReducedProductIteration",
220 "expressionDomainSalsaRuntime",
221 "expressionDomainSelectorProjection",
222 "styleHoverRenderParts",
223 "styleMissingCustomPropertyDiagnostics",
224 "styleDiagnosticsForFile",
225 "sourceDiagnosticsForFile",
226 "crossLanguageDiagnostics",
227 "cascadeAwareDiagnostics",
228 "completionAt",
229 "refsForClass",
230 "renamePlan",
231 "readCascadeAtPosition",
232 "readStyleContextIndex",
233 "readCascadeCustomPropertyLeastFixedPoint",
234 "sourceMissingSelectorDiagnostics",
235 "sourceProviderCandidateResolution",
236 "selectorRenameEditPlanning",
237 "sassSymbolResolutionPrimitives",
238 "staticStylesheetEvaluatorOracle",
239 "staticStylesheetEvaluatorOracleCorpus",
240 "scssEvaluatorControlFlowOracle",
241 "nativeCssEvaluatorOracle",
242 "staticLifExportsBoundary",
243 "scssEvaluatorControlFlowOracleCorpus",
244 "sassModuleSourceSelection",
245 "omenaParserStyleFactExtraction",
246 "queryCheckerOrchestratorBoundary",
247 "queryTransformRunnerBoundary",
248 "transformPlanFacade",
249 "transformEggExecutionWitnesses",
250 "transformExecutionRuntime",
251 "transformExecutionRunner",
252 "semanticReachabilityTransformContext",
253 "consumerCheckFacade",
254 "consumerBuildFacade",
255 "consumerTransformPassListFacade",
256 "queryBoundarySummary",
257 "selectedQueryBackendAdapter",
258 "queryEvaluationRuntime",
259 "omenaParserStyleDocumentSummary",
260 "omenaParserPublicContractTypes",
261 "fastFactsV0",
262 "analyzedGraphV0",
263 "customPropertyAnnotations",
264 "designSystemMinimumDescription",
265 "polynomialProvenanceDiagnostics",
266 ],
267 style_completion_consumer_decisions: style_completion_consumer_decisions(),
268 cme_coupled_surfaces: vec!["EngineInputV2", "producerQueryFragments"],
269 next_decoupling_targets: Vec::new(),
270 }
271}
272
273pub fn summarize_omena_query_sass_module_conformance_v0() -> OmenaQuerySassModuleConformanceReportV0
274{
275 let rows = sass_module_conformance_rows();
276 let modeled_count = rows.iter().filter(|row| row.status == "modeled").count();
277 let gap_count = rows.iter().filter(|row| row.status == "gap").count();
278 let decided_out_count = rows.iter().filter(|row| row.status == "decidedOut").count();
279 let policy_count = rows.iter().filter(|row| row.status == "policy").count();
280 OmenaQuerySassModuleConformanceReportV0 {
281 schema_version: "0",
282 product: "omena-query.sass-module-conformance",
283 claim_level: "boundedStaticAnalysisCoverageLedger",
284 theorem_claimed: false,
285 normative_source: "https://github.com/sass/sass/blob/main/accepted/module-system.md",
286 modeled_count,
287 gap_count,
288 decided_out_count,
289 policy_count,
290 rows,
291 ready_surfaces: vec![
292 "sassModuleConformanceLedger",
293 "mandatoryPolicyRows",
294 "gapRowsExplicit",
295 "noSassRuntimeEquivalenceClaim",
296 ],
297 }
298}
299
300fn sass_module_conformance_rows() -> Vec<OmenaQuerySassModuleConformanceRowV0> {
301 vec![
302 OmenaQuerySassModuleConformanceRowV0 {
303 key: "useNamespaceVisibility",
304 category: "visibility",
305 status: "modeled",
306 normative_anchor: "module-system.md: @use makes members available through a namespace or as *; private members are not visible through @use",
307 implementation: "collect_visible_sass_symbol_keys + collect_exported_sass_symbol_keys",
308 witness: "style diagnostics and LSP completion witnesses for namespaced, wildcard, builtin, and hidden Sass symbols",
309 decision: "Static member-name visibility is modeled; value execution is not claimed.",
310 },
311 OmenaQuerySassModuleConformanceRowV0 {
312 key: "forwardPrefixShowHide",
313 category: "forwarding",
314 status: "modeled",
315 normative_anchor: "module-system.md: @forward exposes another module API; show/hide filters and as-prefix alter forwarded member names",
316 implementation: "apply_sass_forward_prefix + sass_forward_filter_allows_symbol",
317 witness: "style_diagnostics_respect_prefixed_forward_show_filters and cross-file Sass completion visible-set equality",
318 decision: "Forwarded public API names are modeled for static symbol consumers.",
319 },
320 OmenaQuerySassModuleConformanceRowV0 {
321 key: "configurationWithDefaultVariables",
322 category: "configuration",
323 status: "modeled",
324 normative_anchor: "module-system.md: with may configure variables defined by or forwarded by a module only when those variables are !default",
325 implementation: "derive_sass_module_rule_variable_overrides_at_ordinal + sass_module_configuration_variables_are_valid",
326 witness: "style_diagnostics_query_identity_reports_non_default_sass_module_configuration and build scss-module-mode fixtures",
327 decision: "Static configuration validity is modeled for known workspace module facts.",
328 },
329 OmenaQuerySassModuleConformanceRowV0 {
330 key: "forwardedConfigurationPropagation",
331 category: "configuration",
332 status: "modeled",
333 normative_anchor: "module-system.md: @forward can expose configurable variables and downstream configuration may flow through forwarded APIs",
334 implementation: "derive_sass_module_forward_effective_variable_overrides_at_ordinal",
335 witness: "style_diagnostics_query_identity_uses_downstream_forward_default_configuration and path-mapped forwarded configuration tests",
336 decision: "Forwarded !default configuration is modeled for static graph closure.",
337 },
338 OmenaQuerySassModuleConformanceRowV0 {
339 key: "canonicalModuleInstanceIdentity",
340 category: "identity",
341 status: "modeled",
342 normative_anchor: "module-system.md: a module is produced by executing the source file identified by canonical URL with a configuration",
343 implementation: "summarize_sass_module_instance_identity_key",
344 witness: "sassModuleInstanceIdentity and sassModuleSymlinkResolution diagnostics via omena style-diagnostics",
345 decision: "Canonical path plus static configuration signature is the product identity key.",
346 },
347 OmenaQuerySassModuleConformanceRowV0 {
348 key: "reconfigurationConflict",
349 category: "configuration",
350 status: "modeled",
351 normative_anchor: "module-system.md: loading an already-executed file with non-empty configuration is an error",
352 implementation: "resolve_sass_module_effective_variable_overrides + emitted_module_identity_keys conflict checks",
353 witness: "style_diagnostics_query_identity_reports_conflicting_sass_module_configurations and repeated-forward conflict tests",
354 decision: "Conflicting static configurations surface through existing Sass module identity diagnostics.",
355 },
356 OmenaQuerySassModuleConformanceRowV0 {
357 key: "importContextInterop",
358 category: "import",
359 status: "modeled",
360 normative_anchor: "module-system.md: @import uses a mutable import context and can add imported public API members to the importing stylesheet",
361 implementation: "resolve_import_inline_replacement_for_transform_context applies use-aware static module source before importer evaluation",
362 witness: "imports_scss_module_public_variables_from_used_imported_file plus omena build product witness",
363 decision: "Imported files that use configured modules contribute static public variables and CSS to the importing stylesheet.",
364 },
365 OmenaQuerySassModuleConformanceRowV0 {
366 key: "loadPathRelativeIdentityCoherence",
367 category: "identity",
368 status: "modeled",
369 normative_anchor: "module-system.md: module identity is based on canonical URL, not the syntactic route that reached it",
370 implementation: "resolve_sass_module_effective_variable_overrides + summarize_sass_module_instance_identity_key",
371 witness: "shares_scss_module_identity_across_relative_and_load_path_routes plus omena build product witness",
372 decision: "Relative and load-path routes share the canonical configured module instance and emit side-effect CSS once.",
373 },
374 OmenaQuerySassModuleConformanceRowV0 {
375 key: "metaLoadCssRuntimeConfiguration",
376 category: "runtime",
377 status: "decidedOut",
378 normative_anchor: "module-system.md: meta.load-css dynamically loads CSS and accepts a $with configuration map without exposing members",
379 implementation: "not evaluated by omena-query static Sass module semantics",
380 witness: "ledger row only",
381 decision: "Runtime CSS inclusion is outside the static member-visibility and identity diagnostic contract.",
382 },
383 OmenaQuerySassModuleConformanceRowV0 {
384 key: "importContextMixinFunctionExecution",
385 category: "runtime",
386 status: "decidedOut",
387 normative_anchor: "module-system.md: an imported stylesheet can expose mixins and functions through the import context",
388 implementation: "not evaluated by omena-query static stylesheet evaluation",
389 witness: "ledger row only",
390 decision: "Sass mixin/function execution remains outside the static variable/CSS evaluation contract.",
391 },
392 OmenaQuerySassModuleConformanceRowV0 {
393 key: "yarnPnpImporterRuntime",
394 category: "resolver",
395 status: "decidedOut",
396 normative_anchor: "module-system.md: implementations load URLs through importer semantics; package manager runtime hooks are implementation-specific",
397 implementation: "resolver policy models package manifests, path mappings, local filesystem candidates, and explicit SIF boundaries",
398 witness: "resolution-policy report",
399 decision: "Yarn PnP runtime importer emulation is out of scope for this static analyzer.",
400 },
401 OmenaQuerySassModuleConformanceRowV0 {
402 key: "deprecatedSassImportPolicy",
403 category: "policy",
404 status: "policy",
405 normative_anchor: "module-system.md: @use/@forward are intended to replace @import; import compatibility remains transitional",
406 implementation: "deprecatedSassImport diagnostic",
407 witness: "style_diagnostics_for_file_suppresses_sass_builtins_and_hints_imports",
408 decision: "Keep the hint on by default at information severity; users can suppress diagnostics without opting into a new setting.",
409 },
410 OmenaQuerySassModuleConformanceRowV0 {
411 key: "aliasExtractionFallbackPolicy",
412 category: "policy",
413 status: "policy",
414 normative_anchor: "module-system.md: loading is importer-defined; omena's resolver policy fixes local precedence without network fetches",
415 implementation: "resolution-policy report plus source/style diagnostics for unresolved imports",
416 witness: "check-rust-omena-cli-resolution-policy",
417 decision: "Use explicit path-mapping/package-manifest settings as the primary fallback; surface graceful unresolved-import diagnostics rather than guessing.",
418 },
419 ]
420}
421
422fn style_completion_consumer_decisions() -> Vec<OmenaQueryStyleCompletionConsumerDecisionV0> {
423 vec![
424 OmenaQueryStyleCompletionConsumerDecisionV0 {
425 consumer: "omena-lsp-server",
426 surface: "textDocument/completion",
427 decision: "adoptWorkspaceVisibleSassSymbols",
428 rationale: "The Rust LSP owns workspace state and can route style completion through the memoized workspace substrate.",
429 },
430 OmenaQueryStyleCompletionConsumerDecisionV0 {
431 consumer: "engine-shadow-runner",
432 surface: "completion-at",
433 decision: "adoptWorkspaceVisibleSassSymbolsWhenStylesProvided",
434 rationale: "The selected-query runner already accepts a styles corpus for completion-at and now forwards it to the workspace entry.",
435 },
436 OmenaQueryStyleCompletionConsumerDecisionV0 {
437 consumer: "server/lsp-server",
438 surface: "style-completion-query",
439 decision: "staySingleFilePayload",
440 rationale: "The TypeScript host currently sends only the active style document to the runner; cross-file adoption belongs at the Rust LSP workspace owner.",
441 },
442 OmenaQueryStyleCompletionConsumerDecisionV0 {
443 consumer: "omena-napi",
444 surface: "read_style_completion_at_position_summary",
445 decision: "staySingleFileApi",
446 rationale: "The published NAPI facade exposes a stateless single-source API with no workspace resolution input contract.",
447 },
448 OmenaQueryStyleCompletionConsumerDecisionV0 {
449 consumer: "omena-wasm",
450 surface: "read_style_completion_at_position_summary",
451 decision: "staySingleFileApi",
452 rationale: "The published WASM facade exposes a stateless single-source API with no workspace resolution input contract.",
453 },
454 OmenaQueryStyleCompletionConsumerDecisionV0 {
455 consumer: "omena-cli",
456 surface: "omena style-completion",
457 decision: "staySingleFileCommand",
458 rationale: "The CLI command is a single-file inspection surface; workspace completion should use the selected-query runner or LSP.",
459 },
460 ]
461}
462
463pub fn summarize_omena_query_evaluation_runtime(
464 input: &EngineInputV2,
465 runtime: &mut OmenaQueryExpressionDomainFlowRuntimeV0,
466) -> OmenaQueryEvaluationRuntimeSummaryV0 {
467 let selected_query_adapter_capabilities =
468 summarize_omena_query_selected_query_adapter_capabilities();
469 let source_resolution_runtime = summarize_omena_query_source_resolution_runtime(input);
470 let expression_domain_runtime =
471 summarize_omena_query_expression_domain_incremental_flow_analysis(input, runtime);
472
473 OmenaQueryEvaluationRuntimeSummaryV0 {
474 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
475 product: "omena-query.evaluation-runtime",
476 input_version: input.version.clone(),
477 selected_query_adapter_capabilities,
478 runtime_products: vec![
479 source_resolution_runtime.product,
480 expression_domain_runtime.product,
481 "omena-query.style-document-summary",
482 ],
483 source_resolution_expression_count: source_resolution_runtime.expression_count,
484 source_resolution_unresolved_expression_count: source_resolution_runtime
485 .unresolved_expression_count,
486 expression_domain_revision: expression_domain_runtime.revision,
487 expression_domain_graph_count: expression_domain_runtime.graph_count,
488 expression_domain_dirty_graph_count: expression_domain_runtime.dirty_graph_count,
489 expression_domain_reused_graph_count: expression_domain_runtime.reused_graph_count,
490 style_document_summary_source: "omena-parser.style-facts",
491 ready_surfaces: vec![
492 "selectedQueryBackendAdapter",
493 "sourceResolutionRuntimeIndex",
494 "expressionDomainSalsaRuntime",
495 "expressionDomainSelectorProjection",
496 "omenaParserStyleDocumentSummary",
497 "omenaParserPublicContractTypes",
498 ],
499 retired_couplings: vec![
500 "engineStyleParserStyleDocumentSummary",
501 "engineStyleParserQueryPublicTypes",
502 ],
503 }
504}
505
506pub fn summarize_omena_query_selected_query_adapter_capabilities()
507-> SelectedQueryAdapterCapabilitiesV0 {
508 SelectedQueryAdapterCapabilitiesV0 {
509 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
510 product: "omena-query.selected-query-adapter-capabilities",
511 default_candidate_backend: "rust-selected-query",
512 schema_version_policy: summarize_omena_query_schema_version_policy(),
513 schema_version_checks: vec![
514 check_omena_query_schema_version(Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION)),
515 check_omena_query_schema_version(Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL)),
516 check_omena_query_schema_version(Some("1")),
517 check_omena_query_schema_version(None),
518 ],
519 backend_kinds: vec![
520 SelectedQueryBackendCapabilityV0 {
521 backend_kind: "typescript-current",
522 source_resolution: false,
523 expression_semantics: false,
524 selector_usage: false,
525 style_semantic_graph: false,
526 },
527 SelectedQueryBackendCapabilityV0 {
528 backend_kind: "rust-source-resolution",
529 source_resolution: true,
530 expression_semantics: false,
531 selector_usage: false,
532 style_semantic_graph: false,
533 },
534 SelectedQueryBackendCapabilityV0 {
535 backend_kind: "rust-expression-semantics",
536 source_resolution: false,
537 expression_semantics: true,
538 selector_usage: false,
539 style_semantic_graph: false,
540 },
541 SelectedQueryBackendCapabilityV0 {
542 backend_kind: "rust-selector-usage",
543 source_resolution: false,
544 expression_semantics: false,
545 selector_usage: true,
546 style_semantic_graph: false,
547 },
548 SelectedQueryBackendCapabilityV0 {
549 backend_kind: "rust-selected-query",
550 source_resolution: true,
551 expression_semantics: true,
552 selector_usage: true,
553 style_semantic_graph: true,
554 },
555 ],
556 runner_commands: vec![
557 SelectedQueryRunnerCommandV0 {
558 surface: "queryEvaluationRuntime",
559 command: "input-omena-query-evaluation-runtime",
560 input_contract: "EngineInputV2 + OmenaQueryExpressionDomainFlowRuntimeV0",
561 output_product: "omena-query.evaluation-runtime",
562 },
563 SelectedQueryRunnerCommandV0 {
564 surface: "sourceResolution",
565 command: "input-source-resolution-canonical-producer",
566 input_contract: "EngineInputV2",
567 output_product: "engine-input-producers.source-resolution-canonical-producer",
568 },
569 SelectedQueryRunnerCommandV0 {
570 surface: "sourceResolutionRuntime",
571 command: "input-omena-resolver-source-resolution-runtime",
572 input_contract: "EngineInputV2",
573 output_product: "omena-resolver.source-resolution-runtime-index",
574 },
575 SelectedQueryRunnerCommandV0 {
576 surface: "expressionSemantics",
577 command: "input-expression-semantics-canonical-producer",
578 input_contract: "EngineInputV2",
579 output_product: "engine-input-producers.expression-semantics-canonical-producer",
580 },
581 SelectedQueryRunnerCommandV0 {
582 surface: "expressionDomainFlowAnalysis",
583 command: "input-expression-domain-flow-analysis",
584 input_contract: "EngineInputV2",
585 output_product: "engine-input-producers.expression-domain-flow-analysis",
586 },
587 SelectedQueryRunnerCommandV0 {
588 surface: "expressionDomainControlFlowAnalysis",
589 command: "input-expression-domain-control-flow-analysis",
590 input_contract: "EngineInputV2",
591 output_product: "engine-input-producers.expression-domain-control-flow-analysis",
592 },
593 SelectedQueryRunnerCommandV0 {
594 surface: "expressionDomainCallSiteFlowAnalysis",
595 command: "input-expression-domain-call-site-flow-analysis",
596 input_contract: "EngineInputV2",
597 output_product: "engine-input-producers.expression-domain-call-site-flow-analysis",
598 },
599 SelectedQueryRunnerCommandV0 {
600 surface: "expressionDomainProvenanceExplanations",
601 command: "input-expression-domain-provenance-explanations",
602 input_contract: "EngineInputV2",
603 output_product: "engine-input-producers.expression-domain-provenance-explanations",
604 },
605 SelectedQueryRunnerCommandV0 {
606 surface: "expressionDomainReducedProductIteration",
607 command: "input-expression-domain-reduced-product-iteration",
608 input_contract: "EngineInputV2",
609 output_product: "engine-input-producers.expression-domain-reduced-product-iteration",
610 },
611 SelectedQueryRunnerCommandV0 {
612 surface: "expressionDomainIncrementalFlowAnalysis",
613 command: "input-expression-domain-incremental-flow-analysis",
614 input_contract: "EngineInputV2 + OmenaQueryExpressionDomainFlowRuntimeV0",
615 output_product: "omena-query.expression-domain-incremental-flow-analysis",
616 },
617 SelectedQueryRunnerCommandV0 {
618 surface: "expressionDomainSelectorProjection",
619 command: "input-expression-domain-selector-projection",
620 input_contract: "EngineInputV2",
621 output_product: "omena-query.expression-domain-selector-projection",
622 },
623 SelectedQueryRunnerCommandV0 {
624 surface: "scssEvaluatorControlFlow",
625 command: "input-scss-evaluator-control-flow",
626 input_contract: "EngineInputV2 + targetStylePath",
627 output_product: "omena-query.scss-evaluator-control-flow",
628 },
629 SelectedQueryRunnerCommandV0 {
630 surface: "scssEvaluatorControlFlowOracleCorpus",
631 command: "input-scss-evaluator-control-flow-oracle-corpus",
632 input_contract: "none",
633 output_product: "omena-query.scss-evaluator-control-flow-oracle-corpus",
634 },
635 SelectedQueryRunnerCommandV0 {
636 surface: "nativeCssEvaluator",
637 command: "input-native-css-evaluator",
638 input_contract: "EngineInputV2 + targetStylePath",
639 output_product: "omena-query.native-css-evaluator",
640 },
641 SelectedQueryRunnerCommandV0 {
642 surface: "staticStylesheetEvaluator",
643 command: "input-static-stylesheet-evaluator",
644 input_contract: "EngineInputV2 + targetStylePath",
645 output_product: "omena-query.static-stylesheet-evaluator",
646 },
647 SelectedQueryRunnerCommandV0 {
648 surface: "staticStylesheetEvaluatorOracleCorpus",
649 command: "input-static-stylesheet-evaluator-oracle-corpus",
650 input_contract: "none",
651 output_product: "omena-query.static-stylesheet-evaluator-oracle-corpus",
652 },
653 SelectedQueryRunnerCommandV0 {
654 surface: "staticLifExports",
655 command: "input-static-lif-exports",
656 input_contract: "EngineInputV2 + targetStylePath",
657 output_product: "omena-query.static-lif-exports",
658 },
659 SelectedQueryRunnerCommandV0 {
660 surface: "selectorUsage",
661 command: "input-selector-usage-canonical-producer",
662 input_contract: "EngineInputV2",
663 output_product: "engine-input-producers.selector-usage-canonical-producer",
664 },
665 SelectedQueryRunnerCommandV0 {
666 surface: "omenaParserStyleFacts",
667 command: "omena-parser-style-facts",
668 input_contract: "OmenaParserStyleFactsInputV0",
669 output_product: "omena-parser.style-facts",
670 },
671 SelectedQueryRunnerCommandV0 {
672 surface: "styleSemanticGraph",
673 command: "style-semantic-graph",
674 input_contract: "StyleSemanticGraphInputV0",
675 output_product: "omena-semantic.style-semantic-graph",
676 },
677 SelectedQueryRunnerCommandV0 {
678 surface: "readCascadeAtPosition",
679 command: "read-cascade-at-position",
680 input_contract: "ReadCascadeAtPositionInputV0",
681 output_product: "omena-query.read-cascade-at-position",
682 },
683 SelectedQueryRunnerCommandV0 {
684 surface: "styleDiagnosticsForFile",
685 command: "style-diagnostics-for-file",
686 input_contract: "StyleDiagnosticsForFileInputV0",
687 output_product: "omena-query.diagnostics-for-file",
688 },
689 SelectedQueryRunnerCommandV0 {
690 surface: "sourceDiagnosticsForFile",
691 command: "source-diagnostics-for-file",
692 input_contract: "SourceDiagnosticsForFileInputV0",
693 output_product: "omena-query.diagnostics-for-file",
694 },
695 SelectedQueryRunnerCommandV0 {
696 surface: "completionAt",
697 command: "completion-at",
698 input_contract: "CompletionAtInputV0",
699 output_product: "omena-query.completion-at",
700 },
701 SelectedQueryRunnerCommandV0 {
702 surface: "styleCodeActions",
703 command: "style-code-actions",
704 input_contract: "StyleCodeActionsInputV0",
705 output_product: "omena-query.code-actions",
706 },
707 SelectedQueryRunnerCommandV0 {
708 surface: "refsForClass",
709 command: "refs-for-class",
710 input_contract: "RefsForClassInputV0",
711 output_product: "omena-query.refs-for-class",
712 },
713 SelectedQueryRunnerCommandV0 {
714 surface: "renamePlan",
715 command: "rename-plan",
716 input_contract: "RenamePlanInputV0",
717 output_product: "omena-query.rename-plan",
718 },
719 SelectedQueryRunnerCommandV0 {
720 surface: "readStyleContextIndex",
721 command: "read-style-context-index",
722 input_contract: "ReadStyleContextIndexInputV0",
723 output_product: "omena-query.style-context-index",
724 },
725 SelectedQueryRunnerCommandV0 {
726 surface: "styleSemanticGraphBatch",
727 command: "style-semantic-graph-batch",
728 input_contract: "StyleSemanticGraphBatchInputV0",
729 output_product: "omena-semantic.style-semantic-graph-batch",
730 },
731 SelectedQueryRunnerCommandV0 {
732 surface: "transformPlan",
733 command: "transform-plan",
734 input_contract: "TransformPlanInputV0",
735 output_product: "omena-query.transform-plan",
736 },
737 SelectedQueryRunnerCommandV0 {
738 surface: "transformContext",
739 command: "transform-context",
740 input_contract: "TransformContextInputV0",
741 output_product: "omena-query.transform-context",
742 },
743 SelectedQueryRunnerCommandV0 {
744 surface: "semanticReachabilityTransformContext",
745 command: "transform-context-from-engine-input",
746 input_contract: "EngineInputV2 + targetStylePath + closedStyleWorld",
747 output_product: "omena-query.transform-context-from-engine-input",
748 },
749 SelectedQueryRunnerCommandV0 {
750 surface: "transformExecute",
751 command: "transform-execute",
752 input_contract: "TransformExecuteInputV0",
753 output_product: "omena-query.transform-execute",
754 },
755 SelectedQueryRunnerCommandV0 {
756 surface: "consumerCheckStyleSource",
757 command: "consumer-check-style-source",
758 input_contract: "ConsumerStyleSourceInputV0",
759 output_product: "omena-query.consumer-check-style-source",
760 },
761 SelectedQueryRunnerCommandV0 {
762 surface: "consumerBuildStyleSource",
763 command: "consumer-build-style-source",
764 input_contract: "ConsumerStyleSourceBuildInputV0",
765 output_product: "omena-query.consumer-build-style-source",
766 },
767 SelectedQueryRunnerCommandV0 {
768 surface: "consumerBuildStyleSources",
769 command: "consumer-build-style-sources",
770 input_contract: "ConsumerStyleSourcesBuildInputV0",
771 output_product: "omena-query.consumer-build-style-source",
772 },
773 SelectedQueryRunnerCommandV0 {
774 surface: "consumerTransformPassList",
775 command: "consumer-transform-pass-list",
776 input_contract: "None",
777 output_product: "omena-query.transform-pass-list",
778 },
779 ],
780 expression_semantics_payload_contracts: vec![
781 "valueDomainKind",
782 "valueDomainDerivation",
783 "valueDomainProvenanceTree",
784 ],
785 required_input_contracts: vec![
786 "EngineInputV2",
787 "StyleSemanticGraphInputV0",
788 "ReadCascadeAtPositionInputV0",
789 "StyleDiagnosticsForFileInputV0",
790 "SourceDiagnosticsForFileInputV0",
791 "CompletionAtInputV0",
792 "StyleCodeActionsInputV0",
793 "RefsForClassInputV0",
794 "RenamePlanInputV0",
795 "ReadStyleContextIndexInputV0",
796 "StyleSemanticGraphBatchInputV0",
797 "OmenaParserStyleFactsInputV0",
798 "TransformPlanInputV0",
799 "TransformContextInputV0",
800 "TransformContextFromEngineInputV0",
801 "TransformExecuteInputV0",
802 "ConsumerStyleSourceInputV0",
803 "ConsumerStyleSourceBuildInputV0",
804 "ConsumerStyleSourcesBuildInputV0",
805 ],
806 adapter_readiness: vec![
807 "backendCapabilityMatrix",
808 "canonicalProducerWrapperBoundary",
809 "styleSemanticGraphBridgeBoundary",
810 "runnerCommandContract",
811 "fragmentBundleBoundary",
812 "sourceResolutionRuntimeIndex",
813 "expressionSemanticsDerivationPayload",
814 "expressionDomainFlowAnalysisRunner",
815 "expressionDomainControlFlowAnalysisRunner",
816 "expressionDomainCallSiteFlowAnalysisRunner",
817 "expressionDomainProvenanceExplanationRunner",
818 "expressionDomainSalsaRuntime",
819 "expressionDomainSelectorProjection",
820 "omenaParserStyleFactExtraction",
821 "readCascadeAtPosition",
822 "readCascadeCustomPropertyLeastFixedPoint",
823 "styleDiagnosticsForFileRunner",
824 "sourceDiagnosticsForFileRunner",
825 "completionAtRunner",
826 "styleCodeActionsRunner",
827 "refsForClassRunner",
828 "renamePlanRunner",
829 "readStyleContextIndexRunner",
830 "transformPlanRunner",
831 "transformEggExecutionWitnesses",
832 "transformContextProducer",
833 "semanticReachabilityTransformContext",
834 "transformExecutionRunner",
835 "consumerCheckFacade",
836 "consumerBuildFacade",
837 "consumerTransformPassListFacade",
838 "staticStylesheetEvaluatorFacade",
839 "staticStylesheetEvaluatorOracleCorpusFacade",
840 "scssEvaluatorControlFlowFacade",
841 "nativeCssEvaluatorFacade",
842 "scssEvaluatorControlFlowOracleCorpusFacade",
843 "queryEvaluationRuntime",
844 ],
845 routing_status: "runtimeBacked",
846 }
847}
848
849pub fn summarize_omena_query_schema_version_policy() -> OmenaQuerySchemaVersionPolicyV0 {
850 OmenaQuerySchemaVersionPolicyV0 {
851 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
852 product: "omena-query.schema-version-policy",
853 current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
854 current_version_label: OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL,
855 accepted_versions: vec![OMENA_QUERY_CURRENT_SCHEMA_VERSION],
856 deprecated_versions: Vec::new(),
857 rejected_version_policy: "rejectUnknownVersionsBeforeExecution",
858 missing_version_policy: "rejectMissingSchemaVersionOnExternalInputs",
859 migration_policy: vec![
860 "new versions require additive reader before writer",
861 "old and new versions must run through the same omena-query facade during migration",
862 "schema gate must include current accepted, missing, label-only, and future-version checks",
863 "breaking payload changes require a new numeric schemaVersion and explicit migration adapter",
864 ],
865 compatibility_gate: "rust/omena-query/adapter-capabilities",
866 }
867}
868
869pub fn check_omena_query_schema_version(
870 requested_version: Option<&str>,
871) -> OmenaQuerySchemaVersionCheckV0 {
872 match requested_version {
873 Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION) => OmenaQuerySchemaVersionCheckV0 {
874 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
875 product: "omena-query.schema-version-check",
876 requested_version: Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION.to_string()),
877 current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
878 accepted: true,
879 status: "current",
880 migration_action: "executeCurrentFacade",
881 reason: "requested schemaVersion is the current numeric wire version",
882 },
883 Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL) => OmenaQuerySchemaVersionCheckV0 {
884 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
885 product: "omena-query.schema-version-check",
886 requested_version: Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL.to_string()),
887 current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
888 accepted: false,
889 status: "labelOnlyVersionRejected",
890 migration_action: "sendNumericSchemaVersion",
891 reason: "V0 is a Rust type label; external payloads must use numeric schemaVersion 0",
892 },
893 Some(version) => OmenaQuerySchemaVersionCheckV0 {
894 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
895 product: "omena-query.schema-version-check",
896 requested_version: Some(version.to_string()),
897 current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
898 accepted: false,
899 status: "unsupportedVersion",
900 migration_action: "rejectBeforeExecution",
901 reason: "no migration adapter is registered for this schemaVersion",
902 },
903 None => OmenaQuerySchemaVersionCheckV0 {
904 schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
905 product: "omena-query.schema-version-check",
906 requested_version: None,
907 current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
908 accepted: false,
909 status: "missingVersion",
910 migration_action: "rejectBeforeExecution",
911 reason: "external payloads must carry schemaVersion explicitly",
912 },
913 }
914}