Onboarding a new standard¶
Contributing
This page is for contributors expanding CORA's corpus with a new participating standard. Consumers reading the existing inventories and crosswalks should start with Quickstart or What CORA publishes.
A walkthrough for adding a fourth (fifth, …) standard to CORA's corpus. The mechanical steps; the editorial decisions are out of scope for this page (license review, governance signaling, etc. — see standards/_template/ and docs/onboarding-a-standard.md in the repo).
Each existing standard demonstrates one path:
| Standard | Primary format | Extractor |
|---|---|---|
| MITS | XML Schema (XSD) | xsd |
| IBPDI | Microsoft CDM JSON manifest | cdm-json |
| REDI | Excel workbook | excel |
A new standard slots into the same flow.
How proposals are evaluated¶
Before the mechanical steps below, a proposed standard has to clear an editorial bar. Anyone can propose one by opening a standard proposal issue; the proposal is evaluated against four criteria:
- Licensing. The standard is published under an open license CORA may redistribute, or the owning body grants written permission to mirror it. A standard CORA cannot legally republish cannot be hosted — only linked.
- Scope fit. The standard describes real-assets data across the investment, operational, or reporting lifecycle (real estate equity/debt, infrastructure). Adjacent domains (smart-building/IoT, general semantic interchange) are out of scope and belong to RealEstateCore, OSI, and similar — CORA crosswalks to them at the boundary rather than hosting them.
- Upstream relationship. Either an open-license mirror path exists (no permission needed) or there is a real conversation with the owning body. CORA does not host standards over a maintainer's objection.
- A reason to host it now. A named consumer who needs the crosswalks, or a participating sponsor, or clear overlap with concepts already in the corpus. Hosting a standard nobody is asking to unify adds maintenance cost without payoff.
Who decides. During bootstrap custodianship the decision rests with the bootstrap custodian (Cherre), made in the open on the proposal issue. When CORA transitions to neutral foundation governance, standard intake becomes a governance-body decision. Either way the criteria above are the bar, and the rationale for accepting or declining is recorded on the issue.
A proposal that clears the bar then follows the mechanical onboarding below.
Step 1: Mirror the native artifact¶
standards/<std>/
├── PROVENANCE.yaml
├── README.md
└── current/
├── CHANGELOG.md
├── native/ # bit-identical mirror of upstream artifacts
└── inventory/ # produced in step 3
Copy from standards/_template/. Fill in PROVENANCE.yaml (source URL, license, mirror date) and README.md (what this standard is, who maintains it upstream).
The native/ directory is the source of truth — never edited, only added to as new versions arrive. CORA mirrors it byte-identically and records the SHA in PROVENANCE.yaml.
Step 2: Pick (or build) an extractor¶
If your standard's primary format matches an existing adapter, you don't write new code — only a config file. The five existing adapters:
xsd— XML Schema; resolvesxs:includechains; redirect remote URLs viaXsdConfig.include_remap.cdm-json— Microsoft Common Data Model JSON manifests (one entity per*.cdm.jsonfile).json— Generic flat JSON catalog described by JSONPath.excel— Single-sheet Excel data dictionary.excel-multisheet— Multi-sheet MITS workbook (one sheet per type).
If your format is something else (PDF, SQL DDL, GraphQL SDL, JSON Schema, etc.), you write a new Extractor adapter. See Onboarding a new format.
Step 3: Author the per-module configs and extract¶
For each module of the standard, author one config file:
Then run the extractor against each module:
tools/extractors/.venv/bin/cora extract <format> \
standards/<std>/current/native/<module-source> \
--config tools/extractors/configs/<std>-<module>.yaml \
--standard <std> --module <module> --version <v> \
--repo-root . \
--output standards/<std>/current/inventory/<module>.yaml
Commit the resulting inventory YAMLs.
If the standard ships a secondary documentation source (Excel data dictionary, PDF, SQL DDL with comments), extract it separately and merge using Inventory.enrich — see the MITS pattern: XSD primary + Excel multi-sheet secondary, trust list {definition, enumeration}.
Step 4: Tune validators¶
Set the per-module field-count minimums so empty extractions are caught early:
Then run all three validators:
Exit 0 means schema-valid, field-count-compliant, and (once you add crosswalks) crosswalk-paths-clean.
Step 5: Add crosswalks¶
For every concept your standard also models, add a mappings.<std> block to the existing crosswalk YAML. For concepts unique to your standard, author new ones — see Authoring a crosswalk.
A first-time crosswalking pass often surfaces vocabulary clashes (IBPDI's "Building" vs MITS's "Property") that the canonical definitions need to disambiguate. Don't paper over the clash with a close mapping — use partial or divergent and write the narrative.
Step 6: Update generated docs¶
Your new inventory pages appear at docs/generated/inventories/<std>/<module>.md and the index page picks up the new standard automatically. Once the new standard has crosswalk mappings (step 5), docs build also emits the adoption briefings for every ordered pair it now participates in — no manual step. The CI drift gate (cora docs check) ensures regeneration happens. The worked example on the authored Adopting a standard page is hand-written, though — consider refreshing it if the new standard makes a better illustration.
Step 7: Update the CHANGELOG and the corpus-wide README¶
standards/<std>/current/CHANGELOG.md— record what changed (initial mirror, first inventories extracted, first enrichment, etc.).- The repo's top-level
README.md— mention the new standard in the hosted-standards table.
Step 8: PR + CI¶
Open the PR. CI runs:
- Ruff / mypy / pytest with 80% coverage
cora validate --repo-root .cora docs check --repo-root .check-jsonschemaover the new inventory YAMLs and any new crosswalks- markdownlint / yamllint
- The authored-docs-site build (broken-link check)
All five gates must pass before merge.
For deeper details on the format-extraction half — protocol shape, config class, fixtures, the "two-source genericity audit" — see Onboarding a new format.