Changelog¶
0.9.1 — 2026-07-03¶
Documentation adoption and Python CLI parity patch.
Added:
- User guides: Local registry, Compatibility analysis
- Tutorials: registry monorepo, contract upgrade with
odcs diff pyodcsCLI parity:diff,registry index|lookup|list,validate --dep|--include|--registry- Doc version lint (
scripts/check-doc-versions.sh) in CI checks
Changed:
- Unified 1.0 stabilization messaging across README, FAQ, and release status
- Updated user doc dependency pins from
0.7to0.9 - Registry-aware CI examples in CLI and getting started guides
Unreleased — 1.0.0 prep¶
Breaking (1.0.0):
- Removed deprecated
--strictCLI flag (Rust and Python) - Removed
ValidationOptions,validate_with_options(), andvalidate_strict()from Rust API - Removed Python
strict=parameters from validate helpers - Internal modules (
parser,validation,model,registry,schema,diagnostics) marked#[doc(hidden)]— use root re-exports only
Added:
- API stability policy
- Registry path confinement: reject indexed paths whose canonical form escapes the registry root
- Documented YAML alias/depth limits in SECURITY.md
- Production hardening: capped
parse_filereads, registry scan limits (10k files, 16 MiB index), symlink cycle detection, atomic index writes,ODCS_VERBOSEindex progress
Changed:
- Documentation sync for 0.9/1.0 reality (architecture, crate layout, enterprise evaluation, migration guide)
- CLI
diff/registryno longer panic on broken pipe (exit 2 instead) - Cross-file
--dep/ registry paths fail loudly whencanonicalize()fails (no silent skip)
0.9.0 — 2026-07-02¶
Local contract registry release — index, lookup, and --registry cross-file validation.
Added:
- Local registry: recursive directory index to
<dir>/.odcs/registry.jsonwith SHA-256 content hashes Registry,RegistryEntry,index_registry,index_and_save_registry,load_registryContractSet::from_paths_with_registryandparse_and_validate_set_with_registry- CLI:
odcs registry index|lookup|listsubcommands - CLI:
odcs validate --registry <dir>for registry-backed FQN resolution - Python:
registry_index,registry_index_and_save,registry_load,registry_lookup,registry_list - Python:
parse_and_validate_paths(..., registry=...)parameter - ADR: docs/implementation/registry.md
- Fixtures and tests under
tests/fixtures/registry/andtests/registry.rs
Changed:
- Cross-file load order extended: primary →
--dep→--registry→--include SPEC.mddocuments local registry policy (0.9.0)
0.8.0 — 2026-07-02¶
Section semantics, cross-file references, and compatibility analysis release.
Added:
- Section semantics validation: unique
roles[].id, support URL requirements, SLA scheduler/schedule pairing, pricing currency and amount rules - Cross-file FQN resolution via
ContractSet, indexed by contractid - CLI:
odcs validate --depand--includefor multi-document validation - CLI:
odcs diff <old> <new>with breaking-change classification - Library:
parse_and_validate_set,validate_set,load_set,ContractSet - Library:
compatibility::diffwithCompatibilityReport - Python:
parse_and_validate_paths()anddiff() - Diagnostic codes:
odcs:compatibility-breaking,odcs:compatibility-additive,odcs:compatibility-deprecated,odcs:compatibility-unchanged - ADR: docs/implementation/cross-file-references.md
- Fixtures and tests for section semantics, cross-file, and compatibility workflows
Changed:
- Pinned JSON Schema
FullyQualifiedReferencepattern accepts canonical 3-segment FQN form with hyphens in contract ids SPEC.mddocuments section semantics, cross-file references, and compatibility analysis (0.8.0)
0.7.0 — 2026-07-02¶
Structural validation release — cross-field rules for schema, server, and SLA references.
Added:
- Structural validation phase: unique
schema[].nameandservers[].servervalues slaProperties[].elementandslaDefaultElementmust reference existing schema object names (comma-separated tokens supported)- Negative fixtures and tests for each structural rule
- SPEC.md structural validation (0.7.0) policy section
Fixed:
slaDefaultElementnow uses the same comma-split and trim semantics asslaProperties[].element- Empty contract
idno longer emits a duplicateodcs:invalid-extensiondiagnostic from the IDs phase - Quality rules without an inferrable type now emit
odcs:invalid-qualityfrom Rust validation - Python CLI text output includes
phase:whenvalidationPhaseis set (Rust parity)
Changed:
with-sla-default-element.yamlfixture usesslaDefaultElement: "customers"to match schema object name semantics- ROADMAP rebaselined: Phases 12–14 target
0.8.0; Phase 15 targets0.9.0
0.6.0 — 2026-07-02¶
Diagnostics metadata release — validation pipeline phase on every validation diagnostic.
Added:
- Optional
validationPhasefield on validation-stage diagnostics (JSON camelCase; omitted for parse-stage diagnostics) ValidationPhaseenum with variants matching the validation pipeline (document,schema,quality,jsonSchema, …)- CLI text output includes
phase:line whenvalidationPhaseis set - Python
VALIDATION_PHASESconstants andvalidation_phases()native helper - Fixture-wide tests asserting
validationPhasecoverage on validation diagnostics
Changed:
validation_errorbuilder now requires aValidationPhaseargument (compile-time enforcement)ValidationPhasemoved tosrc/diagnostics/validation_phase.rs(re-exported fromvalidation::phases)
0.5.0 — 2026-07-02¶
Parser hardening release — nested duplicate-key detection for YAML and JSON.
Added:
- Nested YAML duplicate-key detection via
unsafe-libyamlevent walk beforeserde_yamldeserialization DuplicateKeyFindingwith path-awareobject_ref(e.g.schema[0].name) for JSON and YAML parse errors- Explicit
unsafe-libyaml = "0.2.11"dependency - Fixtures and tests:
invalid-nested-duplicate-key.yaml/.json; CLI exit code2for duplicate-key parse failures
Changed:
odcs:duplicate-keydiagnostics now use dotted paths for nested duplicates (root keys unchanged, e.g.id)- JSON duplicate-key detection reports path-aware
object_ref(aligned with YAML) - YAML duplicate-key scanner fails closed on libyaml scan errors
- Unknown nested fields report full dotted
object_refpaths - Server property typos in flattened details emit
odcs:unknown-field - JSON Schema diagnostics deduplicated when Rust validators report the same field
- Python
is_valid()accepts parse result dicts (readsreport.diagnostics) - CLI
--stricthelp text corrected (deprecated no-op)
Documentation:
- Adoption-focused docs: What is ODCS primer, API decision guide, troubleshooting, fix-invalid-contract tutorial, glossary, enterprise evaluation brief
- Release status page; MkDocs nav restructure (removed misleading
upstream/paths) - README sharpened; CI examples pin published version; diagnostic examples corrected for
apiVersionand dottedobject_refpaths - Expanded architecture guide for contributors
0.4.0 — 2026-07-02¶
Spec parity and validation maturity release — default validation is schema-complete for ODCS v3.1.0.
Breaking changes:
validate()always runs JSON Schema validation (not opt-in)versionis now the contract revision (e.g.1.0.0); onlyapiVersiongates spec support (v3.1.0)- Stricter default validation: quality dimensions, logical types, server types, library comparison operators
- Removed
primaryKeyPosition >= 0rule that rejected schema-valid upstream examples
Added:
--strictflag andvalidate(strict=True)retained as deprecated no-op aliases (JSON Schema always runs)ValidationOptions,validate_with_options(), andvalidate_strict()library APIsodcs schemaexports the pinned JSON Schema (default stdout;--jsonmetadata;--url-onlyURL)odcs:json-schema-violationdiagnostic code for JSON Schema errors- Pinned schema asset at
schema/odcs-v3.1.0.json - Upstream example corpus under
tests/fixtures/upstream/withscripts/sync-upstream-examples.sh - SLA fields
descriptionandscheduleronServiceLevelAgreementProperty - Rust validators for
logicalType,quality.dimension, servertypeenum, and type-specific required fields (Snowflake, Kafka, Postgres) - Library quality rules require a comparison operator (
mustBe,mustBeBetween, etc.) - Relationship
typeenum validation (foreignKey) AuthoritativeDefinition.typenon-empty validation- Broader JSON Schema negative parity tests and reference validation fixtures
- Section fixtures: tenant, tags, domain, description, dataProduct, contractCreatedTs, authoritativeDefinitions, property relationships, Kafka/Postgres servers
tests/spec_parity.rsharness; upstream examples preserved without version rewriting- Python
validate(strict=True),parse_and_validate(strict=True),pinned_schema(), and CLI parity - Python
CODESdiagnostic constants export - Read the Docs site via MkDocs (
mkdocs.yml,.readthedocs.yaml) - User guides: Rust API, contract authoring, migration, CI/CD integration
SECURITY.mdvulnerability reporting policy
Changed:
validate_strict()is an alias forvalidate()- Upstream sync script no longer rewrites
version: 1.0.0to3.1.0 odcs schemadefault output is full JSON Schema JSON (use--url-onlyfor URL-only output)- Minimal examples use
version: 1.0.0withapiVersion: v3.1.0(contract revision vs spec version) - PyPI
pyodcsdevelopment status classifier: Pre-Alpha → Alpha - Quick start and README examples work without a repository clone
0.3.0¶
ODCS v3.1.0 canonical object model and parsing release.
Breaking changes:
- Full ODCS v3.1.0 canonical object model replaces minimal skeleton types
- Unknown fields rejected at root and nested objects (
deny_unknown_fields,odcs:unknown-field) - Quality rules must be nested under
schema[](root-levelqualityno longer supported) - Library quality metrics use v3.1.0 names (
nullValues, notnot_null)
Added:
- YAML and JSON parsing with structured parse diagnostics
- Section modules: SLA, servers, team, roles, pricing, support, relationships
- Parse helpers:
ParseResult,into_contract(),parse_strict() - Expanded examples and integration test fixtures
- Pinned upstream JSON Schema reference fixture under
tests/fixtures/
Changed:
versionfield semantics aligned with upstream (contract revision, not spec version)
0.2.0¶
Early validation and Python bindings release.
Added:
- CI and release workflows (crates.io, PyPI)
- PyO3 bindings and
pyodcspackage - CLI commands:
validate,inspect,diagnostics,schema,version - Standardized exit codes (0 valid, 1 validation, 2 parse/IO)
- Basic YAML and JSON parsing for minimal contracts
0.1.0¶
Initial skeleton release.
Added:
- Rust crate layout and module skeleton
- CLI entry point
- Examples and test fixture directories
- Apache 2.0 license