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}