Skip to main content

omena_query/
boundary.rs

1use super::*;
2
3mod evaluator;
4
5pub use evaluator::*;
6
7/// Shannon entropy (in bits) of an empirical value-frequency histogram.
8///
9/// `H(p) = -Σ p_i · log2(p_i)` over the normalised non-zero bins. A uniform
10/// histogram maximises entropy (`log2(k)` for `k` distinct symbols); a peaked /
11/// more-compressible histogram lowers it. Empty / single-symbol histograms have
12/// zero entropy. Deterministic and dependency-light (std `f64::log2` only).
13fn 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
30/// Compute a genuine two-part minimum-description-length code for a design system.
31///
32/// claim_level: algorithm (real entropy/log code length, not theorem). This is an
33/// honest information-theoretic two-part code, NOT a normalized-maximum-likelihood
34/// optimality proof.
35///
36/// - `model_bits` is the structural code length: each of `rule_count` rules costs
37///   `log2(alphabet_size)` bits to point into the distinct value-symbol alphabet
38///   (`alphabet_size` = number of non-empty histogram bins). This is a real `log2`,
39///   not a count.
40/// - `residual_bits` is the multinomial description length of the observations
41///   given the model: `observation_count · H(p)` where `H(p)` is the Shannon
42///   entropy of `value_frequencies`. Lower-entropy (more compressible) value
43///   distributions cost fewer residual bits.
44///
45/// `total_bits` is therefore a non-linear function of the model structure (`log2`
46/// and entropy terms), so it is NOT reproducible by `rule_count + observation_count`.
47pub 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    // Structural code: bits to address each rule's value symbol in the alphabet.
56    let model_bits = if alphabet_size > 1 {
57        rule_count as f64 * (alphabet_size as f64).log2()
58    } else {
59        0.0
60    };
61    // Residual code: multinomial description length of the observations given the
62    // empirical value distribution. Uniform distributions cost more than peaked ones.
63    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}