corenetx.md
Corpus version
3.1
License
CC-BY-4.0

Cross-check: Corpus ⇄ CORENET X CoP v3.1

Review of Corenetx_corpus.zip against the BCA CORENET X Code of Practice v3.1 shared-parameter extraction (Corenetx_CoP_v3.1/), and the update applied.

What each artifact was

Artifact State on receipt
Corenetx_CoP_v3.1/ Source of truth — parameters extracted directly from corenet-x-cop_-_-3-1-edition-Shared_Param.pdf (194 pp). 74 components, 145 IFC bindings, 685 parameters, 10 structural enum groups, 84 glossary terms.
Corenetx_corpus.zip Empty scaffold. Folder-per-component with correct metadata in every README.md, but every parameters.json was [] and every notes.md was blank.

Cross-check findings

  1. Component set — 73 of 74 CoP components had a corpus folder. The generic Space (CoP #62, p110, 0 bindings) was missing. Everything else mapped 1:1.
  2. Metadata (bindings / parameters / IFC entity list) — the scaffold READMEs matched the CoP exactly for all 73 present components (0 mismatches). The scaffold was correctly generated; only the payload was absent.
  3. Parameter data — 100% missing (all parameters.json empty). This was the gap.
  4. Reference data — the 10 structural enum groups (p3) and 84 glossary terms present in the CoP were not represented in the corpus.

Update applied

Corrections against the source PDF

The automated CoP extraction dropped rows on tables with large multi-line value cells. Confirmed and fixed against corenet-x-cop---3-1-edition-2025-12.pdf:

Component Extraction Corrected Added (verified from PDF)
Site Boundary (p349) 1 param 3 params BroadLandUse (Text, 32-value URA land-use list), VacantLand (Boolean) — both apply only to IFC SubType SITEBOUNDARY

This shifts the corpus total from the extraction's 685 to 687 parameters. The same root cause (multi-line example cells) also produced the Text - type artifacts flagged in QA, so other components may still have missing rows — a full reconciliation of every table against the PDF is recommended.

Verified totals (post-update)

74 components · 145 IFC bindings · 687 parameters (685 from extraction + 2 recovered for Site Boundary). JSON validity, declared-vs-actual count integrity, and file completeness all pass.

Notes / assumptions

Enum resolution pass (Phase 2) — 2026-07-19

Resolved allowed_values coverage of input-limited parameters from 52/219 to 193/219 (26 pending). Applied by scripts/resolve_enums.py from a reviewable resolution file (_meta/enum_resolutions.json) — no parameters.json was hand-edited. Values not clearly confirmed were left pending, never guessed.

Resolved by rule

Pending — 26 parameter occurrences (22 distinct), with reasons (full detail in _meta/enum_resolutions.json):

Notes

Space family review (Phase 2 follow-up) — 2026-07-19

Enriched the Space family from the official IFC-SG space-usage / glossary pages and resolved the 7 Space (Usage) parameters that Phase 2 had deferred. Coverage of input-limited parameters rose from 193/219 to 200/219 (19 pending). All via resolve_enums.py + enum_resolutions.json.

Reference data added (not inlined as allowed_values):

Resolved (moved from pending to resolved):

Official-page quirks recorded (data kept faithful):

Scope / notes:

System types + official rules capture — 2026-07-19

System Types (canonicalized). The System glossary page renders a canonical "List of System Types" inline (18 values). Harvested verbatim into _reference/system_types.json. Resolved System / SystemType (1 binding) and Prefabricated Building Systems and MEP Components / SystemType (5 bindings) from it — coverage 200/219 → 206/219 (13 pending). The CoP-derived 6-value example is a subset of the 18.

Conflicts recorded (not silently merged):

Official "Actual Values" / rules capture (new reference dimension). _reference/parameter_rules.json now records official-page Actual Values, rules and notes the CoP corpus doesn't carry, from the Space (Area Requirement) page (IfcSpace/AREA_GFA): ALS_LandscapeType (8 values, incl. "Decked / Patterened Floor" [sic]), ALS_GreeneryFeatures (12), ALS_Species (4, example-only), AVF_IncludeAsGFA (Yes / No), the AGF_Name recommended-values rule sentence, and the "Shurbs" [sic] footnote. These are reference only — NOT promoted to allowed_values, because the CoP marks these parameters free-input; that free-input-vs-official-actual-values conflict is exactly what is recorded.

reference_values mechanism — 2026-07-19

Owner ruling: official canonical values should be visible on every component carrying a property, not only the CoP input-limited bindings. Introduced a second value kind so the two truths stay distinct and no soft value is mistaken for a hard rule:

Applied via reference_resolutions in enum_resolutions.json (18 explicit entries, no wildcards) → resolve_enums.py sets reference_values only on non-input-limited params lacking allowed_values:

41 params gained reference_values across 16 files; allowed_values coverage is unchanged (206/219). The schema now carries optional reference_values / reference_values_source.

Corpus-wide special-treatment rules sweep — 2026-07-19

Completed the page cache — all 74 official component glossary pages are now cached (53 newly fetched with UA Mozilla/5.0 + 0.5s throttle; 0 unreachable). Swept the pages for special- treatment rules — cardinality/scope/obligation statements and property-specific modelling rules — and, after a reviewer completion pass, extended _reference/parameter_rules.json from 6 to 59 entries (27 rule, 28 note, 4 actual_values; 6 borderline) across 34 components. Verbatim text, official typos flagged [sic]; each property-naming entry was verified against the component's parameters.json (property_as_printed recorded where the page spelling differs, e.g. Distribution Chamber's "System Type"). Canonical example, captured verbatim — Project Development Type: "Only one Project Development Type property applies to the entire IFC model" (scope: model).

Reference values on pending params (owner ruling) — 2026-07-19

Owner ruling: as long as values match the official source, provide them as a reference/suggestion even where the confirmed hard list stays disputed. resolve_enums.py now allows reference_values on input-limited params too, provided they carry no allowed_values (exclusivity absolute).