Generalize the per-language *_backend_contract.py tests into a single parameterized cross-language, cross-backend contract suite that runs against the canonical model.
Goal: "new language = write an adapter, pass the suite." The suite defines what it means to be a CLDK language: which canonical queries must answer, with which invariants (URI round-trip, edge confidence present, provenance present, in-process ≡ Neo4j results).
This kills the parity treadmill permanently — parity gaps become failing tests instead of audit findings.
Part of #194. Branch: chore/issue-<n>.
Generalize the per-language
*_backend_contract.pytests into a single parameterized cross-language, cross-backend contract suite that runs against the canonical model.Goal: "new language = write an adapter, pass the suite." The suite defines what it means to be a CLDK language: which canonical queries must answer, with which invariants (URI round-trip, edge confidence present, provenance present, in-process ≡ Neo4j results).
This kills the parity treadmill permanently — parity gaps become failing tests instead of audit findings.
Part of #194. Branch:
chore/issue-<n>.