Intentional deviations of the new single-tool converter relative to the old
two-stage pipeline (IFCtoLBD 2.44.4 + lbd_to_ficr_converter.py) and its golden
output golden/Duplex_A_20110907_ficr.ttl. Rule ids (MIG-/IMP-) match the
buckets in the classified diff report produced by ifc-to-ficr verify.
- TBox updated to v1.1.1 by the maintainer (5 unused properties removed: 3 object, 2 datatype). All terms emitted by the converter remain present — no conversion behaviour change (Duplex output identical: 2,606 triples).
- Fingerprint gate relaxed to a warning. The TBox is under active development, so a fingerprint mismatch now logs a WARNING instead of aborting; the pinned reference was refreshed to v1.1.1 (2098/241/62/40/96). Output safety continues to rely on the hard gates: startup mapping-target validation and the emitted-term check.
- Output header now reports the TBox version read dynamically from
owl:versionInfoinstead of a hard-coded string.
FiCR_ontology/is no longer tracked (added to.gitignore): the ontology is developed in the FiCR Ontology project and updated frequently; users must placeficr.ttl+bot.ttlthere locally (see README).- GitHub repository renamed
ifc2FiCR->IFCtoFiCR; local remote URL updated.
- IfcPlate no longer maps to ficr:FloorSlab. Exposed by
Clinic_Architectural.ifc(first model with plates): all 172 IfcPlate instances are glazed curtain-wall panels (DecomposesIfcCurtainWall), which the verbatim-portedPlate -> FloorSlabrule (intended for structural plates) misclassified as floor slabs — semantically wrong for fire analysis. Plates now fall back tobot:Element, consistent with the treatment of curtain-wall mullions; they stay reachable from theirficr:Wall-typed curtain wall viabot:hasSubElement. The archived Duplex baseline contains no plates, so its output is unaffected.
- golden/ dissolved. The three baseline data files (
Duplex_A_20110907 .ifc/.ttl/_ficr.ttl) moved intoarchive/legacy_pipeline/, joining the tools that produced them (kept for reproducibility). The development-time verification result they anchored is recorded in the 1.1.0 notes below. - Verification machinery removed.
verify.py, theverifyCLI subcommand (exit code 5) and the pytest suite (tests/) were development-time scaffolding for the golden diff; the tool is now convert-only. Runtime safety gates remain: schema gate, TBox fingerprint gate, and the emitted-term gate. - Ontology directory renamed by the maintainer:
onto/->FiCR_ontology/(contents unchanged:ficr.ttlfrozen v1.1.0 +bot.ttl). CLI defaults, error messages, output headers and docs updated accordingly. The legacyficr.propertiesartifact moved to the archive. - README rewritten for the simplified layout.
lbd_outputs/working directory removed (nothing writes there; the--emit-intermediatedebug dump defaults to<input>_lbd.ttlnext to the input). Build artifactifc_to_ficr.egg-info/deleted (regenerates on install).
onto/ficr.ttlreplaced with the final frozen TBox v1.1.0, edited and saved in Protégé; consistency verified with HermiT. Edits:ficr:hasREIremoved,ficr:NotRequiredremoved,ficr:hasActualREIkept with itsficr:FabricElementdomain dropped. The file is read-only and authoritative.
- REI retarget.
_map_fire_ratingsnow emitsficr:hasActualREI(xsd:integer) instead of the removedficr:hasREI. The golden dataset's fireRating values are all placeholders, so the REI channel is empty and this change produces zero verification diffs. The layer-2 normalizer gained the rename ruleficr:hasREI -> ficr:hasActualREI(counted in the report; expected 0 hits on the golden). - TBox fingerprint gate.
tbox.pyhard-codes the fingerprint of the frozen TBox (2110 total triples; in theficr#namespace: 241 classes, 65 object properties, 42 datatype properties, 96 named individuals). Any mismatch at startup is a hard error: "onto/ficr.ttl is not the frozen v1.1.0 TBox".
- Archive restructure.
IFCtoLBD_CLI_2_44_4.jarandlbd_to_ficr_converter.pymoved fromgolden/toarchive/legacy_pipeline/(with a README explaining the superseded two-stage pipeline).golden/now contains only the three baseline data files (.ifc, LBD.ttl, FiCR.ttl); their paths are unchanged. README.mdrewritten for the single-tool pipeline (new namespace, CLI, verification methodology).
- MIG-01 — pure ABox. The old output embedded ~79 inline schema-stub
triples (
owl:Class/owl:DatatypeProperty/owl:ObjectPropertytypings plusrdfs:range) so Protégé would type predicates without the TBox. The new output contains instance data only; the TBox is referenced viaowl:imports <https://w3id.org/ficr>. - MIG-02 — ontology header retarget.
owl:importsnow points tohttps://w3id.org/ficr(frozen TBox v1.1.0) instead ofhttps://w3id.org/bam/ficr, and therdfs:commenttext was updated accordingly. The ontology node IRI pattern (https://lbd.example.com/instances/<output-stem>) is unchanged. - Namespace migration. All
ficr:terms moved fromhttps://w3id.org/bam/ficr#tohttps://w3id.org/ficr#. Rename table applied during verification normalisation:ficr:hasElementUsage -> ficr:hasPhysicalObjectFireSafetyRole,ficr:islocatedIn -> ficr:isLocatedIn. Both renames matched 0 triples in the golden output — the old converter never emitted either term.
- IMP-01 — roof slab no longer double-typed as FloorSlab. The old
converter mapped every LBD type triple independently, so the roof slab
(IfcSlab with PredefinedType=ROOF, typed
beo:Slab+beo:Slab-ROOFin LBD) received bothficr:FloorSlab(viabeo:Slab) andficr:RoofSlab(viabeo:Slab-ROOF). The new class mapping is keyed by (IFC entity, PredefinedType) and resolves each element to exactly one most specific class:(IfcSlab, ROOF) -> ficr:RoofSlab. Asserting bothficr:FloorSlabandficr:RoofSlabon one instance was a contradiction (floor vs roof), not a feature. Affects 1 triple in the golden diff.
- TBox term gate. Every emitted
ficr:/bot:term is validated against the frozen TBox (onto/ficr.ttl+onto/bot.ttl); an unknown term is a hard error (exit 4). The old converter silently dropped unknown mapped properties and never validated classes. - Schema gate. Non-IFC2X3 input exits with code 3 and a message listing supported schemas, instead of undefined behaviour.
- OmniClass classification data comes from Revit property-set strings
(
'OmniClass Table 13 Category','Category Description'); the IFC file contains noIfcClassificationReference/IfcRelAssociatesClassificationentities, so the spec's stated channel is realised via these Psets. bot:hasSubElementcombines element-to-elementIfcRelAggregates(stair/roof decomposition, 11 triples) with host->filler pairs derived fromIfcRelVoidsElement+IfcRelFillsElement(wall->door, roof->window, 38 triples).- Elements without direct spatial containment inherit containment from the
spatial node their
ObjectPlacementis relative to (stair flights, stringers, railings -> storey); openings are excluded. Placement chain only, no coordinates. - Revit placeholder property values (string value equal to the property name,
e.g.
'Area'='Area','FireRating'='FireRating') are skipped, matching the golden extraction; type-object property sets are not traversed.