This document defines the deterministic compatibility and migration contract for public parser APIs consumed by downstream integration surfaces.
Parser API compatibility artifacts are owned by:
docs/PARSER_API_COMPATIBILITY_CONTRACT.mdcrates/franken-engine/tests/fixtures/parser_api_compatibility_contract_v1.jsoncrates/franken-engine/tests/parser_api_compatibility_contract.rsscripts/run_parser_api_compatibility_gate.sh
This contract is binding for PSRP-10.3 parser API stabilization and for downstream PSRP-10.4/10.5 release readiness gates.
schema_version:franken-engine.parser-api-compatibility-contract.v1contract_version:1.0.0- parser API surface id:
franken-engine.parser-public-api.v1 - parser diagnostics dependency:
franken-engine.parser-diagnostics.schema.v1 - parser event-IR dependency:
franken-engine.parser-event-ir.schema.v2
PSRP-10.3 protects these entrypoints as compatibility-critical:
Es2020Parser::parseCanonicalEs2020Parser::parse_with_optionsCanonicalEs2020Parser::parse_with_event_irCanonicalEs2020Parser::parse_with_materialized_astCanonicalEs2020Parser::scalar_reference_grammar_matrix- input adapters:
&strString&Path/PathBufStreamInput<R: Read>
Any contract drift in these APIs requires explicit migration notes and fixture updates in the same change.
Compatibility tests must exercise stable behavior for:
scriptandmodulegoals- success/failure result envelopes
- deterministic canonical hashes for successful parses
- deterministic normalized diagnostics for failing parses
- deterministic event-IR envelopes (
trace_id,decision_id,policy_id,component,outcome,error_code)
The matrix is encoded in
tests/fixtures/parser_api_compatibility_contract_v1.json.
Public parser API changes must follow this fail-closed policy:
- Deprecate before removal for at least one contract version.
- Publish migration notes with old/new API mapping and replay verification commands.
- Keep deterministic behavior claims explicit (or document the intentional drift with a contract version bump).
- Reject silent compatibility breaks; CI gate must fail without updated migration notes and fixtures.
The compatibility gate tracks millionths-based SLOs:
integration_success_rateinput_adapter_coveragemigration_readability
The fixture sets baseline + allowed regression budget; gate fails if any score drops below baseline minus budget.
Compatibility vectors must expose stable parse event keys:
trace_iddecision_idpolicy_idcomponentkindoutcomeerror_code
All heavy Rust compatibility checks/tests must run through rch wrappers.
Canonical command:
./scripts/run_parser_api_compatibility_gate.sh ciModes:
check: compile focused parser API compatibility test targettest: execute focused parser API compatibility testsclippy: lint focused target with-D warningsci: check + test + clippy
Each run must publish:
artifacts/parser_api_compatibility/<timestamp>/run_manifest.jsonartifacts/parser_api_compatibility/<timestamp>/events.jsonlartifacts/parser_api_compatibility/<timestamp>/commands.txt
run_manifest.json must include:
- schema/version ids
- bead id and parser API surface id
- toolchain + mode + target-dir
- git commit + dirty-worktree state
- exact executed command list
- deterministic replay command
./scripts/run_parser_api_compatibility_gate.sh ci
cat artifacts/parser_api_compatibility/<timestamp>/run_manifest.json
cat artifacts/parser_api_compatibility/<timestamp>/events.jsonl
cat artifacts/parser_api_compatibility/<timestamp>/commands.txtThe run is invalid if required files are missing or event records do not contain the required structured keys.