Skip to main content

omena_query/
boundary.rs

1use super::*;
2
3pub fn summarize_omena_query_design_system_minimum_description(
4    source_uri: impl Into<String>,
5    source_hash: impl Into<String>,
6    rule_count: usize,
7    observation_count: usize,
8) -> DesignSystemMinimumDescriptionV0 {
9    let model_bits = rule_count as f64;
10    let residual_bits = observation_count as f64;
11    DesignSystemMinimumDescriptionV0 {
12        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
13        product: "omena-query.design-system-minimum-description",
14        layer_marker: "mdl-bits",
15        feature_gate: "mdl",
16        model_bits,
17        residual_bits,
18        total_bits: model_bits + residual_bits,
19        unit: "bit",
20        model_class: ModelClassV0::TwoPartUniform,
21        rule_count,
22        observation_count,
23        canonical_form_present: false,
24        cascade_proof_obligation_count: 0,
25        sass_namespace_partition: SassNamespaceBitsV0 {
26            namespace_count: 0,
27            partition_count: 0,
28            deterministic_partition: true,
29        },
30        generated_at_iso: "deterministic-v0",
31        source_pin: SourcePinV0 {
32            source_uri: source_uri.into(),
33            source_hash: source_hash.into(),
34        },
35        weights_calibration_pin: "uniform-v0",
36        weights_version: "0",
37        semiring_instance: "tropical",
38    }
39}
40
41pub struct OmenaQueryCanonicalFormInput {
42    pub pass_id: &'static str,
43    pub before: String,
44    pub canonical_after: String,
45    pub fallback_after: String,
46    pub mdl_bits: f64,
47    pub ast_size_bits: f64,
48    pub iteration_count: usize,
49    pub eclass_count: usize,
50    pub enode_count: usize,
51}
52
53pub fn summarize_omena_query_canonical_form(
54    input: OmenaQueryCanonicalFormInput,
55) -> CanonicalFormV0 {
56    let canonical_matches_fallback = input.canonical_after == input.fallback_after;
57    let bits_saved_vs_fallback = input.ast_size_bits - input.mdl_bits;
58    CanonicalFormV0 {
59        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
60        product: "omena-query.canonical-form",
61        layer_marker: "mdl-bits",
62        feature_gate: "mdl",
63        pass_id: input.pass_id,
64        before: input.before,
65        canonical_after: input.canonical_after,
66        fallback_after: input.fallback_after,
67        canonical_matches_fallback,
68        bits_saved_vs_fallback,
69        mdl_bits: input.mdl_bits,
70        ast_size_bits: input.ast_size_bits,
71        unit: "bit",
72        iteration_count: input.iteration_count,
73        eclass_count: input.eclass_count,
74        enode_count: input.enode_count,
75        cascade_safe_witness: "cascade proof obligation remains conservative",
76        egg_analysis_witness: "extracted canonical form is compared against fallback output",
77    }
78}
79
80pub fn summarize_omena_query_boundary(input: &EngineInputV2) -> OmenaQueryBoundarySummaryV0 {
81    let fragment_bundle = summarize_omena_query_fragment_bundle(input);
82    let expression_semantics_query_count = fragment_bundle.expression_semantics.fragments.len();
83    let source_resolution_query_count = fragment_bundle.source_resolution.fragments.len();
84    let selector_usage_query_count = fragment_bundle.selector_usage.fragments.len();
85
86    OmenaQueryBoundarySummaryV0 {
87        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
88        product: "omena-query.boundary",
89        query_engine_name: "omena-query",
90        schema_version_policy: summarize_omena_query_schema_version_policy(),
91        input_version: input.version.clone(),
92        abstract_value_domain: summarize_omena_abstract_value_domain(),
93        selected_query_adapter_capabilities:
94            summarize_omena_query_selected_query_adapter_capabilities(),
95        delegated_fragment_products: vec![
96            "engine-input-producers.expression-semantics-query-fragments",
97            "engine-input-producers.source-resolution-query-fragments",
98            "omena-resolver.boundary",
99            "omena-resolver.source-resolution-runtime-index",
100            "engine-input-producers.selector-usage-query-fragments",
101            "engine-input-producers.expression-domain-flow-analysis",
102            "engine-input-producers.expression-domain-control-flow-analysis",
103            "engine-input-producers.expression-domain-call-site-flow-analysis",
104            "engine-input-producers.expression-domain-provenance-explanations",
105            "engine-input-producers.expression-domain-reduced-product-iteration",
106            "omena-query.expression-domain-incremental-flow-analysis",
107            "omena-query.expression-domain-selector-projection",
108            "omena-parser.style-facts",
109            "omena-transform-bundle.source",
110            "omena-transform-target.plan",
111            "omena-transform-egg.plan",
112            "omena-transform-egg.execution",
113            "omena-transform-print.artifact",
114            "omena-transform-passes.plan",
115            "omena-transform-passes.execution",
116            "omena-cascade.custom-property-least-fixed-point",
117            "omena-semantic.style-context-index",
118            "omena-query.transform-execute",
119            "omena-query.transform-context-from-engine-input",
120            "omena-query.consumer-check-style-source",
121            "omena-query.consumer-build-style-source",
122            "omena-query.evaluation-runtime",
123            "omena-query.fast-facts",
124            "omena-query.analyzed-graph",
125            "omena-query.custom-property-annotations",
126            "omena-query.design-system-minimum-description",
127        ],
128        expression_semantics_query_count,
129        source_resolution_query_count,
130        selector_usage_query_count,
131        total_query_count: expression_semantics_query_count
132            + source_resolution_query_count
133            + selector_usage_query_count,
134        ready_surfaces: vec![
135            "queryFragmentBundle",
136            "abstractValueProjectionContract",
137            "abstractValueReducedProductAlgebra",
138            "sourceResolutionResolverBoundary",
139            "sourceResolutionRuntimeIndex",
140            "expressionDomainFlowAnalysisBoundary",
141            "expressionDomainControlFlowAnalysisBoundary",
142            "expressionDomainCallSiteFlowAnalysisBoundary",
143            "expressionDomainProvenanceExplanations",
144            "expressionDomainReducedProductIteration",
145            "expressionDomainSalsaRuntime",
146            "expressionDomainSelectorProjection",
147            "styleHoverRenderParts",
148            "styleMissingCustomPropertyDiagnostics",
149            "styleDiagnosticsForFile",
150            "sourceDiagnosticsForFile",
151            "crossLanguageDiagnostics",
152            "cascadeAwareDiagnostics",
153            "completionAt",
154            "refsForClass",
155            "renamePlan",
156            "readCascadeAtPosition",
157            "readStyleContextIndex",
158            "readCascadeCustomPropertyLeastFixedPoint",
159            "sourceMissingSelectorDiagnostics",
160            "sourceProviderCandidateResolution",
161            "selectorRenameEditPlanning",
162            "sassSymbolResolutionPrimitives",
163            "sassModuleSourceSelection",
164            "omenaParserStyleFactExtraction",
165            "transformPlanFacade",
166            "transformEggExecutionWitnesses",
167            "transformExecutionRuntime",
168            "transformExecutionRunner",
169            "semanticReachabilityTransformContext",
170            "consumerCheckFacade",
171            "consumerBuildFacade",
172            "consumerTransformPassListFacade",
173            "queryBoundarySummary",
174            "selectedQueryBackendAdapter",
175            "queryEvaluationRuntime",
176            "omenaParserStyleDocumentSummary",
177            "omenaParserPublicContractTypes",
178            "fastFactsV0",
179            "analyzedGraphV0",
180            "customPropertyAnnotations",
181            "designSystemMinimumDescription",
182        ],
183        cme_coupled_surfaces: vec!["EngineInputV2", "producerQueryFragments"],
184        next_decoupling_targets: Vec::new(),
185    }
186}
187
188pub fn summarize_omena_query_evaluation_runtime(
189    input: &EngineInputV2,
190    runtime: &mut OmenaQueryExpressionDomainFlowRuntimeV0,
191) -> OmenaQueryEvaluationRuntimeSummaryV0 {
192    let selected_query_adapter_capabilities =
193        summarize_omena_query_selected_query_adapter_capabilities();
194    let source_resolution_runtime = summarize_omena_query_source_resolution_runtime(input);
195    let expression_domain_runtime =
196        summarize_omena_query_expression_domain_incremental_flow_analysis(input, runtime);
197
198    OmenaQueryEvaluationRuntimeSummaryV0 {
199        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
200        product: "omena-query.evaluation-runtime",
201        input_version: input.version.clone(),
202        selected_query_adapter_capabilities,
203        runtime_products: vec![
204            source_resolution_runtime.product,
205            expression_domain_runtime.product,
206            "omena-query.style-document-summary",
207        ],
208        source_resolution_expression_count: source_resolution_runtime.expression_count,
209        source_resolution_unresolved_expression_count: source_resolution_runtime
210            .unresolved_expression_count,
211        expression_domain_revision: expression_domain_runtime.revision,
212        expression_domain_graph_count: expression_domain_runtime.graph_count,
213        expression_domain_dirty_graph_count: expression_domain_runtime.dirty_graph_count,
214        expression_domain_reused_graph_count: expression_domain_runtime.reused_graph_count,
215        style_document_summary_source: "omena-parser.style-facts",
216        ready_surfaces: vec![
217            "selectedQueryBackendAdapter",
218            "sourceResolutionRuntimeIndex",
219            "expressionDomainSalsaRuntime",
220            "expressionDomainSelectorProjection",
221            "omenaParserStyleDocumentSummary",
222            "omenaParserPublicContractTypes",
223        ],
224        retired_couplings: vec![
225            "engineStyleParserStyleDocumentSummary",
226            "engineStyleParserQueryPublicTypes",
227        ],
228    }
229}
230
231pub fn summarize_omena_query_selected_query_adapter_capabilities()
232-> SelectedQueryAdapterCapabilitiesV0 {
233    SelectedQueryAdapterCapabilitiesV0 {
234        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
235        product: "omena-query.selected-query-adapter-capabilities",
236        default_candidate_backend: "rust-selected-query",
237        schema_version_policy: summarize_omena_query_schema_version_policy(),
238        schema_version_checks: vec![
239            check_omena_query_schema_version(Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION)),
240            check_omena_query_schema_version(Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL)),
241            check_omena_query_schema_version(Some("1")),
242            check_omena_query_schema_version(None),
243        ],
244        backend_kinds: vec![
245            SelectedQueryBackendCapabilityV0 {
246                backend_kind: "typescript-current",
247                source_resolution: false,
248                expression_semantics: false,
249                selector_usage: false,
250                style_semantic_graph: false,
251            },
252            SelectedQueryBackendCapabilityV0 {
253                backend_kind: "rust-source-resolution",
254                source_resolution: true,
255                expression_semantics: false,
256                selector_usage: false,
257                style_semantic_graph: false,
258            },
259            SelectedQueryBackendCapabilityV0 {
260                backend_kind: "rust-expression-semantics",
261                source_resolution: false,
262                expression_semantics: true,
263                selector_usage: false,
264                style_semantic_graph: false,
265            },
266            SelectedQueryBackendCapabilityV0 {
267                backend_kind: "rust-selector-usage",
268                source_resolution: false,
269                expression_semantics: false,
270                selector_usage: true,
271                style_semantic_graph: false,
272            },
273            SelectedQueryBackendCapabilityV0 {
274                backend_kind: "rust-selected-query",
275                source_resolution: true,
276                expression_semantics: true,
277                selector_usage: true,
278                style_semantic_graph: true,
279            },
280        ],
281        runner_commands: vec![
282            SelectedQueryRunnerCommandV0 {
283                surface: "queryEvaluationRuntime",
284                command: "input-omena-query-evaluation-runtime",
285                input_contract: "EngineInputV2 + OmenaQueryExpressionDomainFlowRuntimeV0",
286                output_product: "omena-query.evaluation-runtime",
287            },
288            SelectedQueryRunnerCommandV0 {
289                surface: "sourceResolution",
290                command: "input-source-resolution-canonical-producer",
291                input_contract: "EngineInputV2",
292                output_product: "engine-input-producers.source-resolution-canonical-producer",
293            },
294            SelectedQueryRunnerCommandV0 {
295                surface: "sourceResolutionRuntime",
296                command: "input-omena-resolver-source-resolution-runtime",
297                input_contract: "EngineInputV2",
298                output_product: "omena-resolver.source-resolution-runtime-index",
299            },
300            SelectedQueryRunnerCommandV0 {
301                surface: "expressionSemantics",
302                command: "input-expression-semantics-canonical-producer",
303                input_contract: "EngineInputV2",
304                output_product: "engine-input-producers.expression-semantics-canonical-producer",
305            },
306            SelectedQueryRunnerCommandV0 {
307                surface: "expressionDomainFlowAnalysis",
308                command: "input-expression-domain-flow-analysis",
309                input_contract: "EngineInputV2",
310                output_product: "engine-input-producers.expression-domain-flow-analysis",
311            },
312            SelectedQueryRunnerCommandV0 {
313                surface: "expressionDomainControlFlowAnalysis",
314                command: "input-expression-domain-control-flow-analysis",
315                input_contract: "EngineInputV2",
316                output_product: "engine-input-producers.expression-domain-control-flow-analysis",
317            },
318            SelectedQueryRunnerCommandV0 {
319                surface: "expressionDomainCallSiteFlowAnalysis",
320                command: "input-expression-domain-call-site-flow-analysis",
321                input_contract: "EngineInputV2",
322                output_product: "engine-input-producers.expression-domain-call-site-flow-analysis",
323            },
324            SelectedQueryRunnerCommandV0 {
325                surface: "expressionDomainProvenanceExplanations",
326                command: "input-expression-domain-provenance-explanations",
327                input_contract: "EngineInputV2",
328                output_product: "engine-input-producers.expression-domain-provenance-explanations",
329            },
330            SelectedQueryRunnerCommandV0 {
331                surface: "expressionDomainReducedProductIteration",
332                command: "input-expression-domain-reduced-product-iteration",
333                input_contract: "EngineInputV2",
334                output_product: "engine-input-producers.expression-domain-reduced-product-iteration",
335            },
336            SelectedQueryRunnerCommandV0 {
337                surface: "expressionDomainIncrementalFlowAnalysis",
338                command: "input-expression-domain-incremental-flow-analysis",
339                input_contract: "EngineInputV2 + OmenaQueryExpressionDomainFlowRuntimeV0",
340                output_product: "omena-query.expression-domain-incremental-flow-analysis",
341            },
342            SelectedQueryRunnerCommandV0 {
343                surface: "expressionDomainSelectorProjection",
344                command: "input-expression-domain-selector-projection",
345                input_contract: "EngineInputV2",
346                output_product: "omena-query.expression-domain-selector-projection",
347            },
348            SelectedQueryRunnerCommandV0 {
349                surface: "selectorUsage",
350                command: "input-selector-usage-canonical-producer",
351                input_contract: "EngineInputV2",
352                output_product: "engine-input-producers.selector-usage-canonical-producer",
353            },
354            SelectedQueryRunnerCommandV0 {
355                surface: "omenaParserStyleFacts",
356                command: "omena-parser-style-facts",
357                input_contract: "OmenaParserStyleFactsInputV0",
358                output_product: "omena-parser.style-facts",
359            },
360            SelectedQueryRunnerCommandV0 {
361                surface: "styleSemanticGraph",
362                command: "style-semantic-graph",
363                input_contract: "StyleSemanticGraphInputV0",
364                output_product: "omena-semantic.style-semantic-graph",
365            },
366            SelectedQueryRunnerCommandV0 {
367                surface: "readCascadeAtPosition",
368                command: "read-cascade-at-position",
369                input_contract: "ReadCascadeAtPositionInputV0",
370                output_product: "omena-query.read-cascade-at-position",
371            },
372            SelectedQueryRunnerCommandV0 {
373                surface: "styleDiagnosticsForFile",
374                command: "style-diagnostics-for-file",
375                input_contract: "StyleDiagnosticsForFileInputV0",
376                output_product: "omena-query.diagnostics-for-file",
377            },
378            SelectedQueryRunnerCommandV0 {
379                surface: "sourceDiagnosticsForFile",
380                command: "source-diagnostics-for-file",
381                input_contract: "SourceDiagnosticsForFileInputV0",
382                output_product: "omena-query.diagnostics-for-file",
383            },
384            SelectedQueryRunnerCommandV0 {
385                surface: "completionAt",
386                command: "completion-at",
387                input_contract: "CompletionAtInputV0",
388                output_product: "omena-query.completion-at",
389            },
390            SelectedQueryRunnerCommandV0 {
391                surface: "styleCodeActions",
392                command: "style-code-actions",
393                input_contract: "StyleCodeActionsInputV0",
394                output_product: "omena-query.code-actions",
395            },
396            SelectedQueryRunnerCommandV0 {
397                surface: "refsForClass",
398                command: "refs-for-class",
399                input_contract: "RefsForClassInputV0",
400                output_product: "omena-query.refs-for-class",
401            },
402            SelectedQueryRunnerCommandV0 {
403                surface: "renamePlan",
404                command: "rename-plan",
405                input_contract: "RenamePlanInputV0",
406                output_product: "omena-query.rename-plan",
407            },
408            SelectedQueryRunnerCommandV0 {
409                surface: "readStyleContextIndex",
410                command: "read-style-context-index",
411                input_contract: "ReadStyleContextIndexInputV0",
412                output_product: "omena-query.style-context-index",
413            },
414            SelectedQueryRunnerCommandV0 {
415                surface: "styleSemanticGraphBatch",
416                command: "style-semantic-graph-batch",
417                input_contract: "StyleSemanticGraphBatchInputV0",
418                output_product: "omena-semantic.style-semantic-graph-batch",
419            },
420            SelectedQueryRunnerCommandV0 {
421                surface: "transformPlan",
422                command: "transform-plan",
423                input_contract: "TransformPlanInputV0",
424                output_product: "omena-query.transform-plan",
425            },
426            SelectedQueryRunnerCommandV0 {
427                surface: "transformContext",
428                command: "transform-context",
429                input_contract: "TransformContextInputV0",
430                output_product: "omena-query.transform-context",
431            },
432            SelectedQueryRunnerCommandV0 {
433                surface: "semanticReachabilityTransformContext",
434                command: "transform-context-from-engine-input",
435                input_contract: "EngineInputV2 + targetStylePath + closedStyleWorld",
436                output_product: "omena-query.transform-context-from-engine-input",
437            },
438            SelectedQueryRunnerCommandV0 {
439                surface: "transformExecute",
440                command: "transform-execute",
441                input_contract: "TransformExecuteInputV0",
442                output_product: "omena-query.transform-execute",
443            },
444            SelectedQueryRunnerCommandV0 {
445                surface: "consumerCheckStyleSource",
446                command: "consumer-check-style-source",
447                input_contract: "ConsumerStyleSourceInputV0",
448                output_product: "omena-query.consumer-check-style-source",
449            },
450            SelectedQueryRunnerCommandV0 {
451                surface: "consumerBuildStyleSource",
452                command: "consumer-build-style-source",
453                input_contract: "ConsumerStyleSourceBuildInputV0",
454                output_product: "omena-query.consumer-build-style-source",
455            },
456            SelectedQueryRunnerCommandV0 {
457                surface: "consumerBuildStyleSources",
458                command: "consumer-build-style-sources",
459                input_contract: "ConsumerStyleSourcesBuildInputV0",
460                output_product: "omena-query.consumer-build-style-source",
461            },
462            SelectedQueryRunnerCommandV0 {
463                surface: "consumerTransformPassList",
464                command: "consumer-transform-pass-list",
465                input_contract: "None",
466                output_product: "omena-query.transform-pass-list",
467            },
468        ],
469        expression_semantics_payload_contracts: vec![
470            "valueDomainKind",
471            "valueDomainDerivation",
472            "valueDomainProvenanceTree",
473        ],
474        required_input_contracts: vec![
475            "EngineInputV2",
476            "StyleSemanticGraphInputV0",
477            "ReadCascadeAtPositionInputV0",
478            "StyleDiagnosticsForFileInputV0",
479            "SourceDiagnosticsForFileInputV0",
480            "CompletionAtInputV0",
481            "StyleCodeActionsInputV0",
482            "RefsForClassInputV0",
483            "RenamePlanInputV0",
484            "ReadStyleContextIndexInputV0",
485            "StyleSemanticGraphBatchInputV0",
486            "OmenaParserStyleFactsInputV0",
487            "TransformPlanInputV0",
488            "TransformContextInputV0",
489            "TransformContextFromEngineInputV0",
490            "TransformExecuteInputV0",
491            "ConsumerStyleSourceInputV0",
492            "ConsumerStyleSourceBuildInputV0",
493            "ConsumerStyleSourcesBuildInputV0",
494        ],
495        adapter_readiness: vec![
496            "backendCapabilityMatrix",
497            "canonicalProducerWrapperBoundary",
498            "styleSemanticGraphBridgeBoundary",
499            "runnerCommandContract",
500            "fragmentBundleBoundary",
501            "sourceResolutionRuntimeIndex",
502            "expressionSemanticsDerivationPayload",
503            "expressionDomainFlowAnalysisRunner",
504            "expressionDomainControlFlowAnalysisRunner",
505            "expressionDomainCallSiteFlowAnalysisRunner",
506            "expressionDomainProvenanceExplanationRunner",
507            "expressionDomainSalsaRuntime",
508            "expressionDomainSelectorProjection",
509            "omenaParserStyleFactExtraction",
510            "readCascadeAtPosition",
511            "readCascadeCustomPropertyLeastFixedPoint",
512            "styleDiagnosticsForFileRunner",
513            "sourceDiagnosticsForFileRunner",
514            "completionAtRunner",
515            "styleCodeActionsRunner",
516            "refsForClassRunner",
517            "renamePlanRunner",
518            "readStyleContextIndexRunner",
519            "transformPlanRunner",
520            "transformEggExecutionWitnesses",
521            "transformContextProducer",
522            "semanticReachabilityTransformContext",
523            "transformExecutionRunner",
524            "consumerCheckFacade",
525            "consumerBuildFacade",
526            "consumerTransformPassListFacade",
527            "queryEvaluationRuntime",
528        ],
529        routing_status: "runtimeBacked",
530    }
531}
532
533pub fn summarize_omena_query_schema_version_policy() -> OmenaQuerySchemaVersionPolicyV0 {
534    OmenaQuerySchemaVersionPolicyV0 {
535        schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
536        product: "omena-query.schema-version-policy",
537        current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
538        current_version_label: OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL,
539        accepted_versions: vec![OMENA_QUERY_CURRENT_SCHEMA_VERSION],
540        deprecated_versions: Vec::new(),
541        rejected_version_policy: "rejectUnknownVersionsBeforeExecution",
542        missing_version_policy: "rejectMissingSchemaVersionOnExternalInputs",
543        migration_policy: vec![
544            "new versions require additive reader before writer",
545            "old and new versions must run through the same omena-query facade during migration",
546            "schema gate must include current accepted, missing, label-only, and future-version checks",
547            "breaking payload changes require a new numeric schemaVersion and explicit migration adapter",
548        ],
549        compatibility_gate: "rust/omena-query/adapter-capabilities",
550    }
551}
552
553pub fn check_omena_query_schema_version(
554    requested_version: Option<&str>,
555) -> OmenaQuerySchemaVersionCheckV0 {
556    match requested_version {
557        Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION) => OmenaQuerySchemaVersionCheckV0 {
558            schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
559            product: "omena-query.schema-version-check",
560            requested_version: Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION.to_string()),
561            current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
562            accepted: true,
563            status: "current",
564            migration_action: "executeCurrentFacade",
565            reason: "requested schemaVersion is the current numeric wire version",
566        },
567        Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL) => OmenaQuerySchemaVersionCheckV0 {
568            schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
569            product: "omena-query.schema-version-check",
570            requested_version: Some(OMENA_QUERY_CURRENT_SCHEMA_VERSION_LABEL.to_string()),
571            current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
572            accepted: false,
573            status: "labelOnlyVersionRejected",
574            migration_action: "sendNumericSchemaVersion",
575            reason: "V0 is a Rust type label; external payloads must use numeric schemaVersion 0",
576        },
577        Some(version) => OmenaQuerySchemaVersionCheckV0 {
578            schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
579            product: "omena-query.schema-version-check",
580            requested_version: Some(version.to_string()),
581            current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
582            accepted: false,
583            status: "unsupportedVersion",
584            migration_action: "rejectBeforeExecution",
585            reason: "no migration adapter is registered for this schemaVersion",
586        },
587        None => OmenaQuerySchemaVersionCheckV0 {
588            schema_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
589            product: "omena-query.schema-version-check",
590            requested_version: None,
591            current_version: OMENA_QUERY_CURRENT_SCHEMA_VERSION,
592            accepted: false,
593            status: "missingVersion",
594            migration_action: "rejectBeforeExecution",
595            reason: "external payloads must carry schemaVersion explicitly",
596        },
597    }
598}