BundleFacts (and its G40 archive container) has no published JSON Schema, in either abicheck/schemas/ or docs/reference/schemas/¶
Index: Known gaps — closed; see the archive.
Status (2026-11-01): CLOSED. abicheck/schemas/bundle_facts.schema.json and abicheck/schemas/bundle_facts_archive_manifest.schema.json are published under docs/reference/schemas/v1/; tests/test_bundle_facts_schema.py validates real writer output against them and checks they refuse what the reader refuses. The text below is the history.
Earlier status (re-verified 2026-10-09 at 456989f): OPEN. abicheck/model/bundle_facts.py:53 BUNDLE_FACTS_SCHEMA_VERSION = 4, but abicheck/schemas/ and docs/reference/schemas/v1/ hold no bundle_facts schema (only aggregate/audit/audit_set/build_evidence/build_source_pack/compare). The module path in the entry is stale (bundle_facts.py is now model/bundle_facts.py).
—
investigated, not fixed (Codex review, CLI cleanup phase two's PR I
"artifact_type discriminator" prerequisite). That PR's own plan text
states the ordinary "Merge criteria" machine-contract obligations
(packaged and documented schema copies, JSON Schema validation) apply
when a manifest changes, and the bump BUNDLE_FACTS_SCHEMA_VERSION (in
abicheck/bundle_facts.py) got for the new artifact_type/
BUNDLE_ARCHIVE_ARTIFACT_TYPE markers is exactly that kind of change —
but a repo-wide search confirms neither
container has ever had a schema file: abicheck/schemas/ covers
compare_report, aggregate_report, build_evidence, and
build_source_pack only, and docs/reference/schemas/v1/ mirrors that
same set. This is a pre-existing gap predating this PR (the container
has existed since G38 Phase 2 with no schema at any version), not one
this PR's own diff introduced or made worse. Not fixed here because
authoring a first JSON Schema for a format with no existing schema
infrastructure (scripts/publish_schemas.py's packaged/documented-copy
machinery, plus real validation tests) is a substantial, separate
deliverable — not a narrow addition to a field-and-classifier PR — and
because BundleFacts' own shape is still scheduled to change again
shortly: PR I's own BundleCompareRequest unification may still touch
this container's fields before the format truly stabilizes, and
authoring a schema now only to revise it again for that landing would
be wasted work on the exact same axis. Correction (2026-09-04,
Codex review, PR #1050): GateOptions itself is no longer a blocker
here — ADR-064's own dedicated slice landed it 2026-09-02
(abicheck/policy/release_gate_options.py); PR I's own
BundleCompareRequest unification simply hasn't landed yet, for
reasons unrelated to GateOptions. Tracked here rather than deferred silently;
the schema-authoring work belongs with (or immediately after) whichever
PR actually stabilizes BundleFacts' shape at its current
BUNDLE_FACTS_SCHEMA_VERSION (abicheck/bundle_facts.py) -- the
BundleCompareRequest PR itself, or a dedicated follow-up if that PR's
own scope doesn't naturally include it.