db-tests-qa
The groupant beside tools/db/tests/qa.rs in the Mova repository: what the code computes, what it never does, how to go back from its outputs, its invariants, cost and checks.
Facts
Implementation material. A Mova code model describes this code at one source revision: partial models, finite checks and their stated scope. It is not a reviewed general exposition, and its labels are shown as written, never raised.
Components
| component | label | where |
|---|---|---|
| approximant | partial | approximant |
| ast | partial | syntax.json |
| cost | partial | invariant-and-cost |
| descriptant | present | descriptant |
| invariant | partial | invariant-and-cost |
| tests | bounded checks partial scope | tests |
Obernants
The typed relations around the forward model: the behaviour complement (what the code never does), the reverse reconstruction (every input compatible with an output) and specialised views.
| id | type | label | where |
|---|---|---|---|
behavior_complement | behavior_complement | partial source derived model | behavior_complement |
reverse_reconstruction | reverse_reconstruction | partial source derived model | reverse_reconstruction |
paragraph_coordinate_fixture | paragraph_coordinate_fixture | partial source derived model | paragraph_coordinate_fixture |
migration_version_test | migration_version_test | partial source derived model | migration_version_test |
replacement_observation | replacement_observation | partial source derived model | replacement_observation |
rejection_matrix | rejection_matrix | partial source derived model | rejection_matrix |
Model text
descriptant
QA migration and replacement fixture
sent/tales construct four CoNLL blocks across two tale IDs and three paragraph boundaries. Legacy integration initializes v2, observes missing qa failure, migrates twice to v4, loads three questions, checks anchor joins, rejects invalid coordinates/types/empty answers/duplicates, then replacement linkage and current view. Executed new check validates fixture shape only.
Prospective epoch โ 2026-10-31
Full source was reviewed before edits; external prospective.md records API states, failure order and predicted checks. Production prefix remains byte-identical; test additions are isolated cfg(test)/test items.
Observed epoch โ 2026-10-31
2026-10-31 wave31: 16 selected target/name cases passed twice debug and twice release with identical sorted outcomes; six compiled source-behavior mutants failed assertions, exact bytes restored and positive checks passed. Evidence scope is only the named helpers/fixtures. External receipt directory: $MOVA_DATA/runs/octopus-wave31-store-2026-10-31. No DuckDB integration, production loader/corpus, training or GPU run.
Retained limitations
No SQL evaluation was substituted with a mock process. Missing DuckDB is a dependency gap, not passing database evidence. Partial syntax has no macro expansion/name resolution/types; Rust helpers and fixtures do not prove all models.
approximant
QA migration and replacement fixture forward relation
sent/tales construct four CoNLL blocks across two tale IDs and three paragraph boundaries. Legacy integration initializes v2, observes missing qa failure, migrates twice to v4, loads three questions, checks anchor joins, rejects invalid coordinates/types/empty answers/duplicates, then replacement linkage and current view. Executed new check validates fixture shape only.
Domain
Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Approximation limits
Categorical parsing, exact identity, transactional effects and resource errors have no useful percentage approximation metric here. No executable surrogate is claimed. Future profiles, if justified, may use only 1%, 2%, 5%, 10% with a defined metric/reference/domain.
models
QA migration and replacement fixture typed model catalog
Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Observation is one call/trace in the declared scope. Operators below are partial source-derived relations; complement is a proposed inner exclusion relation, reverse an outer compatible-antecedent relation retaining ambiguity. No universal proof follows from finite checks. Each oracle is the relevant named helper check below when it reaches the behavior; remaining SQL/effect cases are source review or proposed real-CLI checks.
behavior_complement
Fixture check cannot pass if it observes other than four parsed sentences or three newpar comments. This does not exclude a wrong SQL anchor join or migration implementation.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
reverse_reconstruction
Given four fixture blocks and paragraph count, many possible row annotations are compatible; exact Doc::text comparison additionally binds fixture bytes. Legacy query output leaves timestamps and unused DB columns ambiguous.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
paragraph_coordinate_fixture
Tale-a IDs 1 and 2 share first paragraph, ID3 starts second; tale-b ID1 starts another. Helper text creates the boundary observations consumed by loader, not DB paragraph numbering itself.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
migration_version_test
Legacy test truncates SCHEMA before migrate:v3 to build v2, then requires two idempotent migrate outputs v4. Version-string assertions alone would not establish schema equivalence.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
replacement_observation
Legacy fixture asserts reciprocal old/new IDs, current view excludes old qid1, all-pairs keeps four. Count and link checks are distinct from parser representation tests.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
rejection_matrix
Legacy negative domains include unknown doc, missing/wrong/ambiguous coordinates, closed-set/answer constraints and repeated question keys; new check leaves all SQL branches explicit gaps.
Domain/assumptions: Finite valid-UTF8 inputs, representable counters/IDs, available memory; filesystem fixtures confined to owned temporary root. SQL semantics are conditional and unexecuted. Subject is the source and SHA256 bound in manifest; fragment applies only to declared byte range.
Evidence: see tests.md; unexecuted database branches remain conditional.
tests
Selected checks
2026-10-31 wave31: 16 selected target/name cases passed twice debug and twice release with identical sorted outcomes; six compiled source-behavior mutants failed assertions, exact bytes restored and positive checks passed. Evidence scope is only the named helpers/fixtures. External receipt directory: $MOVA_DATA/runs/octopus-wave31-store-2026-10-31. No DuckDB integration, production loader/corpus, training or GPU run.
Named target-scoped checks for parent source: ["qa::wave31_fixture_representation_without_database"]
Native commands and numeric status/log/outcomes live in external native-commands.json and receipts. Integration fixture checks use actual en::conllu parsing only. Legacy prag_layer_and_negative_controls, qa_table_loader_and_negative_controls and lossless_round_trip_and_negative_controls were inspected but not executed: real DuckDB unavailable. A fragment's listed parent tests may only cover part of its relation; SQL/query/transaction/IO-fault claims remain source-derived.
Negative controls
Six source-behavior mutations: quote doubling, TSV NULL rejection, QA positivity, prag bit truth, MWT counter, sentence boundary predicate. Each compiled, failed an assertion, restored exact original bytes and passed the selected positive. No assertion-only mutations and no surviving behavioral mutants.
invariant-and-cost
QA migration and replacement fixture invariants and costs
Invariant
Fixture sentence IDs and paragraph comments are explicit but not a proof of syntactic annotation gates. Replacing old qid1 with new qid4 is a legacy SQL expectation; no SQL was executed for this wave.
Cost
Synthetic fixture construction/parse O(text bytes); legacy sequence adds bounded CLI/SQL calls and temp files, dependency currently absent.
Symbolic bounds are source-derived, not measured wall-clock speed or universal complexity proof. Allocation failures, integer exhaustion and concurrency are outside finite evidence.
This page in Markdown โ https://md.groupants.elamur.ai/free/en/mova/tools/db/tests/qa.rs.groupant/