Skip to content

Capabilities and status

This page is deliberately conservative. It exists so that an engineer — or a coding agent — can scope work against what the code does, not against what the IFC schema contains or a crate name suggests.

Status vocabulary

TermMeaning
ImplementedExecutable behaviour with tests. Safe to build on.
PartialA real vertical slice exists; named gaps return typed errors.
ScaffoldModule and crate ownership exist. No behaviour. Files are doc-comment placeholders that reserve a name so the architecture is reviewable.
AbsentNot present in the workspace at all. Not even a reserved name.

A scaffold crate compiles, publishes, and appears in the feature list. It does not read, write, or interpret the entities its module names refer to.

Workspace census

Generated from the source tree by scripts/sync-capabilities.py, not estimated. "Stub files" counts source files of twelve lines or fewer — the placeholder shape described above. scripts/gate.sh fails if these numbers drift from the code.

CrateSource LOCFilesStub filesTest filesStatus
ifc-geometry31,395103334Partial
ifc-structural3,397331412Implemented
ifc-style3,3223105Implemented
ifc-properties3,11930143Implemented
ifc-alignment2,90929115Partial
ifc-template-catalog2,72629310Implemented
ifc-resource2,6472999Partial
ifc-validate2,4932302Implemented
ifc-material2,3982408Implemented
ifc-classification2,2032043Implemented
ifc-model2,08325510Implemented
ifc-cost2,0011602Implemented
ifc-schedule1,69124141Implemented
ifc-systems1,5862052Implemented
ifc-georef1,4231892Partial
ifc-schema1,3061144Implemented
ifc-constraint1,230601Implemented
ifc-spatial1,122919Implemented
ifc-xml1,045603Implemented
ifc-approval915501Implemented
openbim-ifc9016014Implemented
ifc-author729833Implemented
ifc-step516503Implemented

0 of 23 crates are scaffolds.

They exist because the layering decision (see ADR 0005) prefers declaring the intended home of a domain up front over discovering it later, but they must never be mistaken for working code.

Core: model, codecs, schema

CapabilityStatusEvidence
Entity graph with positional attributesImplementedifc-model::Model
Round-trip of entities the build does not understandImplementedopenbim-ifc/tests/costing_roundtrip.rs (runs with no domain crate compiled)
STEP (.ifc) read and writeImplementedifc-step; deterministic model order, finite scalar safeguards, generic syntax delegated to openbim-step
ifcXML read and writeImplementedifc-xml; explicit strict IFC4 ADD2 TC1 namespace profile and path-rich typed diagnostics; compatibility dialect is not claimed as generic XSD conformance
IFC-JSONAbsentWould be a third Codec impl; no crate exists
EXPRESS schema metadata, subtype queriesImplementedifc-schema
GlobalId base-64 encode/decodeImplementedifc-model::guid
Spatial containment tree traversalImplementedifc-spatial::SpatialTree; facade feature spatial. See below.
Objectified relationship traversalImplementedAll 42 concrete IfcRel* families are read. Spatial composition, containment, coverings, space boundaries, element connection and interference, assignment, declaration and system service in ifc-spatial; association and definition in ifc-classification, ifc-material, ifc-properties, ifc-resource, ifc-approval and ifc-constraint; connectivity in ifc-systems and ifc-structural; sequencing in ifc-schedule and ifc-cost; feature attachment in the openbim-ifc reachability check. Slot positions are asserted against the shipped IFC2x3/IFC4/IFC4x3 schemas in ifc-spatial/tests/slot_layout.rs, and openbim-ifc/tests/relationship_census.rs fails if a family loses its reader.
Distribution systems, ports and connectivityImplementedifc-systems reads systems and membership, ports through both IfcRelNests and the legacy IfcRelConnectsPortToElement, the connection network, flow roles and direction, zones with their WR1 membership rule, spatial containment vs referencing, and direction-aware upstream/downstream queries. Relationship-only: no geometry is read, so a geometry-free file still yields a full network.
Cost items, rates and rollupsImplementedifc-cost reads IfcCostItem nesting, IfcCostValue component trees with arithmetic operators, and totals a cost tree. Currencies are compared, never converted: a rollup mixing EUR and USD is refused. Typed drafts stage selected IFC4 values, items, schedules, nesting, and schedule assignments atomically.
Work schedules, tasks and sequencingImplementedifc-schedule reads IfcWorkPlan/IfcWorkSchedule, IfcTask with IfcTaskTime, IfcRelSequence with signed lag, work calendars and events, and produces a deterministic execution order. Cycles report the offending path.
Transactional authoringImplementedifc-model::Transaction stages structural edits, validates them against the projected end state, and applies them as a unit. A removal that would orphan a surviving reference is refused, as is a commit against a model whose revision moved since the transaction opened. ifc-model remains schema-agnostic; typed staging helpers live in domain crates, including classification, documents, libraries, materials, quantities, cost, style, structural, and resources.
Quantity authoringImplementedifc-properties stages quantity writes onto a caller-owned transaction, so a takeoff spanning many elements lands atomically. The declared measure type is preserved on every write.
Schema validationImplementedifc-validate checks references, required slots, aggregate shape, entity types, abstract instantiation, scalar forms and STRING(n) FIXED widths against the exact schema the file declares (IFC2x3 TC1, IFC4 ADD2 TC1, or IFC4X3 ADD2). Eighteen registered rule IDs cover ten native checks under a hard findings-storage cap, including external-reference identity, sequence endpoints, decomposition and assignment self-reference, material and path-connection priority bounds, and space-boundary physicality across all three concrete IfcRelSpaceBoundary subtypes. Aggregate bounds, arbitrary EXPRESS WHERE expressions, INVERSE semantics and other known gaps remain explicitly unsupported and reported; a clean report never implies full EXPRESS conformance.
Property sets and every property value familyImplementedifc-properties reads single, enumerated, bounded, list, table, reference and complex properties. The declared measure type (IfcLengthMeasure and friends) is retained, because it is the only statement of what a bare number means.
Occurrence/type property precedenceImplementedAn occurrence property set overrides a same-named set inherited from the object's type. The shadowed type set is kept, so a checker can explain why an effective value differs from the type default.
Quantities and unit resolutionImplementedSimple and complex quantities, SI prefixes carried as exact decimal exponents, conversion-based and derived units. WR21 (unit matches quantity kind) and WR22 (non-negative value) breaches are reported; ifcopenshell.validate checks neither. Quantities are read as authored assertions and never computed from geometry.
Type index (ids_of_type, of_type)ImplementedModel::ids_of_type, backed by index/type_index.rs
Reverse-reference index ("who references me")Implementedifc-model::ReverseIndex, built on demand; records the attribute slot
Bounded graph traversal with cycle reportsImplementedifc-model::{depth_first, breadth_first, find_cycle} with Budget/Stop
Dangling-reference detectionImplementedModel::dangling_references
Schema-checked entity construction (authoring)Implementedifc-author::EntityBuilder; facade feature author. See below.

Authoring

Applications that generate IFC name attributes; the schema decides positions.

rust
use ifc::EntityBuilder;                 // feature = "author"

let id = EntityBuilder::new(&schema, "IfcAnnotation")
    .text("GlobalId", "3vB2YO$MX4xv5uCqZZG05x")
    .text("Name", "Brandwand")
    .insert(&mut model)?;

Slot order comes from Schema::attributes, which returns inherited attributes first — the ordering positional STEP records depend on. IfcAnnotation gets seven slots because IFC4 declares seven, not because the caller counted.

Construction is refused, rather than silently accepted, for:

FailureExample
Unknown entityIfcAnnotaton (typo)
Unknown attributeIfcAnnotation.RefLatitude (belongs to IfcSite)
Attribute set twicetwo Name calls, instead of a silent overwrite
Required attribute unsetIfcAnnotation with no GlobalId
Declared-type mismatcha string where IfcLengthMeasure is declared
Scalar/aggregate confusiona scalar where LIST OF is declared
Malformed GlobalIdnot 22 characters in IFC's base-64 alphabet

A refused build leaves the model untouched.

What this is not. WHERE rules, inverse attributes, uniqueness, and cross-entity consistency need a whole model rather than one entity; ifc-validate owns those. Value checking is deliberately permissive where a declared type cannot be resolved — see ADR 0007 for why authoring is a schema-layer concern and not a model-layer one.

Model::push remains public and unchecked, for the case where an application must write an entity the schema does not declare.

Spatial traversal

IFC stores no parent pointers: a wall does not name its storey, a relationship entity names both ends. ifc-spatial reads those relationships into a tree.

rust
use ifc::{SpatialKind, SpatialTree};   // feature = "spatial"

let tree = SpatialTree::build(&model);

for storey in tree.of_kind(SpatialKind::Storey) {
    for element in tree.elements_of(storey.id) {
        // every element placed directly on this storey
    }
}

tree.container_of(wall);        // which storey is this wall on?
tree.ancestors(storey.id);      // storey -> building -> site -> project
tree.elements_recursive(root);  // everything beneath a container

The trap this closes. The two relationships that build the tree disagree about slot order — IfcRelAggregates puts the parent in slot 4, IfcRelContainedInSpatialStructure puts it in slot 5. Reading one like the other inverts containment silently. The constants are asserted against IFC2x3, IFC4 and IFC4x3 in ifc-spatial/tests/slot_layout.rs; see ADR 0008.

Real files, not the ideal shape. Omitted sites, elements hung directly off a building, duplicate storeys, relationships naming absent entities, and containment cycles are all handled and, where they are defects, reported through orphans() and dangling() rather than dropped. One corpus fixture turned out to use IfcRelAggregates exclusively with no containment relationship at all; that case is pinned in tests/real_files.rs.

What this is not. It reports what the file says and never rejects it — cardinality and WHERE rules belong to ifc-validate. It groups elements; it does not interpret their geometry or properties.

Construction resources

With facade feature resource, ifc-resource selects IFC4 from the model header and exposes borrowed views for labor, equipment, crew, construction material, construction product, and subcontract occurrences. It resolves authored IfcResourceTime, validates and queries IfcRelAssignsToResource including its authored RelatedObjectsType category constraint, and walks resource composition through IfcRelNests with authored order plus explicit cycle, multiple-parent, depth, and node failures. Selected records and relationships can be created through schema-checked transaction-staged drafts; they reject duplicate GlobalId values and cycle/second-parent creation before staging. See the construction-resource guide.

This is a partial, deliberately bounded profile covering IFC4 and IFC4X3. It does not level or schedule resources, calculate costs/durations/quantities, interpret calendars, or claim IFC2X3 support (the schema does not declare the entities this crate projects).

Geometry

ifc-geometry is the one substantial domain crate. It resolves IFC units, placements, profiles, and representation relationships, then lowers implemented families into the neutral axiolid-model DAG.

Representation-item lowering

The dispatcher keeps coverage as data so it is auditable from one table (ifc-geometry/src/lower/dispatch.rs):

FamilyStatus
IfcExtrudedAreaSolidImplemented
IfcRevolvedAreaSolidImplemented
IfcBooleanResultImplemented
IfcBooleanClippingResultImplemented
IfcMappedItemImplemented
IfcFacetedBrepImplemented
IfcFacetedBrepWithVoidsImplemented
IfcAdvancedBrepImplemented
IfcAdvancedBrepWithVoidsImplemented
IfcHalfSpaceSolidImplemented
IfcBoxedHalfSpaceImplemented
IfcPolygonalBoundedHalfSpaceImplemented
IfcTriangulatedFaceSetImplemented
IfcPolygonalFaceSetImplemented
IfcCsgSolidImplemented
IfcSweptDiskSolidImplemented
IfcSweptDiskSolidPolygonalImplemented
IfcSurfaceCurveSweptAreaSolidImplemented
IfcBlockImplemented
IfcSphereImplemented
IfcRightCircularCylinderImplemented
IfcRightCircularConeImplemented
IfcRectangularPyramidImplemented
IfcBoundingBoxImplemented
IfcExtrudedAreaSolidTaperedImplemented
IfcRevolvedAreaSolidTaperedImplemented
IfcFixedReferenceSweptAreaSolidImplemented
IfcSectionedSpineImplemented
IfcShellBasedSurfaceModelImplemented
IfcFaceBasedSurfaceModelImplemented
IfcGeometricSetImplemented
IfcGeometricCurveSetImplemented
IfcLineImplemented
IfcCircleImplemented
IfcEllipseImplemented
IfcPolylineImplemented
IfcIndexedPolyCurveImplemented
IfcCompositeCurveImplemented
IfcCompositeCurveOnSurfaceImplemented
IfcBoundaryCurveImplemented
IfcOuterBoundaryCurveImplemented
IfcTrimmedCurveImplemented
IfcOffsetCurve2DImplemented
IfcOffsetCurve3DImplemented
IfcPcurvePartial — 2 authored form(s) refused; see variants
IfcSurfaceCurvePartial — 1 authored form(s) refused; see variants
IfcIntersectionCurveImplemented
IfcSeamCurveImplemented
IfcBSplineCurveWithKnotsImplemented
IfcRationalBSplineCurveWithKnotsImplemented
IfcPlaneImplemented
IfcCylindricalSurfaceImplemented
IfcSphericalSurfaceImplemented
IfcToroidalSurfaceImplemented
IfcSurfaceOfLinearExtrusionImplemented
IfcSurfaceOfRevolutionImplemented
IfcRectangularTrimmedSurfaceImplemented
IfcCurveBoundedPlaneImplemented
IfcCurveBoundedSurfaceImplemented
IfcBSplineSurfaceWithKnotsImplemented
IfcRationalBSplineSurfaceWithKnotsImplemented
IfcPointOnCurveImplemented
IfcPointOnSurfaceImplemented

Partially supported variants

Families marked Partial above lower some authored forms exactly and refuse others by name. This table is generated from the PARTIAL catalog in ifc-geometry/src/lower/dispatch.rs, and tests/lower_dispatch_corpus.rs drives the real lowering path for every row -- so a wrong disposition here fails CI rather than merely misinforming a reader.

Some of these refusals exist because the schema permits a combination the geometry cannot honour, rather than because the feature is unimplemented. Those are listed with their reasoning in Schema looseness.

FamilyVariantStatusRationale
IfcPcurvereference curve is an IfcPolylineAdmittedan ordered 2D point sequence needs no evaluation
IfcPcurvereference curve is an IfcIndexedPolyCurve with no explicit Segments, or only IfcLineIndex segmentsAdmittedreads identically to a plain ordered point sequence
IfcPcurvereference curve is an IfcLine, IfcCircle or IfcEllipse positioned by an IfcAxis2Placement2DAdmitteddefining values are read verbatim in the surface's own (u, v) domain with no unit conversion
IfcPcurvereference conic positioned by an IfcAxis2Placement3DRefuseda 3D placement's axis has no meaning in a 2D parameter domain; admitting it would require inventing a projection
IfcPcurvereference curve is an IfcIndexedPolyCurve with an explicit IfcArcIndex segmentAdmitteda three-point arc composes exactly from a parameter-space circumcentre into Circle2 plus a Cartesian trim, mirroring the 3D path with no approximation
IfcPcurvereference curve is an explicit-knot IfcBSplineCurveWithKnots or IfcRationalBSplineCurveWithKnotsAdmittedevery field is dimensionless or a curve parameter; knots already pass through the 3D path unscaled, and control points are read as raw (u, v) pairs
IfcPcurvereference curve is a trimmed or composite curveAdmittedtrim parameters and segments stay in the surface (u, v) domain, unscaled, so no dimensional contract is needed
IfcPcurvereference curve is a convention-only IfcBSplineCurveRefuseda base spline carries no authored knot vector to preserve
IfcSurfaceCurveMasterRepresentation is Curve3D, PCurveS1, or PCurveS2 with the named side presentAdmittedeach side pairs a surface with its own p-curve, so the neutral MasterRepresentation names S1 and S2 exactly
IfcSurfaceCurveMasterRepresentation is PCurveS2 with only one associated p-curveRefusedthe master names a parametric side the curve does not have; the schema calls this inconsistent, so it is refused rather than resolved to the remaining p-curve

Coverage below is generated

The table above is derived from ifc-geometry/src/lower/dispatch.rs by scripts/sync-capabilities.py, and scripts/gate.sh fails when this page and that source disagree. It cannot drift from the code without breaking the build.

Unimplemented families return a typed GeometryError::Unsupported naming the source entity and the specific missing capability — never a panic, and never a silently substituted approximate shape.

Profile lowering

Swept solids reference a profile, so profile coverage bounds how much of a real model lowers. Steel sections carry their fillet radii, edge radii and flange slopes into the neutral model rather than being reduced to an outline, because a section without them has the wrong area and the wrong section modulus.

Profile familyStatus
IfcArbitraryClosedProfileDefImplemented
IfcArbitraryOpenProfileDefImplemented
IfcArbitraryProfileDefWithVoidsImplemented
IfcAsymmetricIShapeProfileDefImplemented
IfcCenterLineProfileDefImplemented
IfcCircleHollowProfileDefImplemented
IfcCircleProfileDefImplemented
IfcCompositeProfileDefImplemented
IfcCShapeProfileDefImplemented
IfcDerivedProfileDefImplemented
IfcEllipseProfileDefImplemented
IfcIShapeProfileDefImplemented
IfcLShapeProfileDefImplemented
IfcMirroredProfileDefImplemented
IfcRectangleHollowProfileDefImplemented
IfcRectangleProfileDefImplemented
IfcRoundedRectangleProfileDefImplemented
IfcTShapeProfileDefImplemented
IfcTrapeziumProfileDefImplemented
IfcUShapeProfileDefImplemented
IfcZShapeProfileDefImplemented
IfcProfileDefRefused — generic profile declaration carries no concrete geometry to lower

IfcArbitraryOpenProfileDef is implemented through the explicit lower_open_profile_node authored-path API. It is not an area profile and is therefore still refused when an extrusion or other area-based solid requests lower_profile.

Curves and placement

CapabilityStatusModule
IfcPolyline, IfcIndexedPolyCurveImplementedexact line and three-point arc segments
IfcCircle, IfcEllipseImplementedcurve/conic.rs
IfcLineImplementedcurve/line.rs
IfcTrimmedCurveImplementedcurve/trimmed.rs
IfcCompositeCurveImplementedcurve/composite.rs
Convention-only IfcBSplineCurvePartialtyped view only; lowering does not invent absent knots
IfcBSplineCurveWithKnots, IfcRationalBSplineCurveWithKnotsImplementedcurve/bspline.rs representation + exact neutral lowering
IfcOffsetCurve2D/3DImplementedcurve/offset.rs
IfcPcurve, IfcSurfaceCurve, IfcIntersectionCurvePartialexact supported forms; typed refusal otherwise
IfcAxis2Placement2D/3DImplementedresource/placement.rs
IfcCartesianTransformationOperator*Implementedresource/operator.rs
Unit resolution (SI, conversion-based)Implementedunits.rs

Curves lower in nested and curve-representation paths

lower/curve.rs lowers polylines/indexed poly-curves, conics, lines, trims, composites, offsets and surface-associated curves, plus explicit-knot polynomial/rational B-splines into the neutral graph. Convention-only base splines remain unsupported. Curves reach this lowerer through a sweep directrix, a surface boundary, a B-rep edge, or an IfcGeometricCurveSet member.

Bare curves are dispatch targets for Curve2D, Curve3D, and plan representations. Selection remains explicit: callers choose Body or Plan; a plan curve never silently replaces a body.

Explicit-knot surfaces

CapabilityStatusModule
Convention-only IfcBSplineSurfacePartialtyped view only. Lowering requires an explicit knot vector, so IfcBSplineSurfaceWithKnots lowers and the convention-only parent form does not: deriving the implied knots would be inventing geometry the file did not state.

Representation selection

Two selectors, deliberately disagreeing:

rust
use ifc::{select_shape_representation, select_plan_representation};

select_shape_representation(&model, wall)?;  // -> the Body   (3D viewer)
select_plan_representation(&model, wall)?;   // -> the FootPrint (drawing)

select_shape_representation prefers Body, then Facetation, then an unnamed representation, and refuses Axis/FootPrint so a 2D curve never silently replaces a solid.

select_plan_representation is its inverse. It prefers, in order:

  1. a PLAN_IDENTIFIERS match inside a PLAN_VIEW sub-context — drawable geometry the author explicitly targeted at a plan;
  2. otherwise the best PLAN_IDENTIFIERS match in any context: Plan, Annotation, FootPrint, Axis.

The two rules are intersected, not ordered. Authorial intent selects between drawable candidates; it does not make a bounding box drawable. ArchiCAD writes Box/BoundingBox representations inside PLAN_VIEW sub-contexts, so a context-first rule returns those boxes and never reaches the identifier list.

It returns None for a solid-only or box-only product. That is the honest answer, not a failure: deriving a plan from a solid requires sectioning, which this library does not do — see R9b/R10 on the roadmap.

Representation context

CapabilityStatusEvidence
IfcGeometricRepresentationContextImplementedRepresentationContext; identifier, type, precision, placement
IfcGeometricRepresentationSubContextImplementedparent, target scale, target view
TargetView (PLAN_VIEW, MODEL_VIEW, ...)Implementedtyped enum; unknown constants preserved, not flattened
Authoring a plan sub-contextPartialconstructible via EntityBuilder; no dedicated helper
rust
use ifc::plan_contexts;

for context in plan_contexts(&model) {
    context.target_scale();          // Some(0.01) for 1:100
    context.precision(&model);       // inherited from the parent context
}

The * trap this closes. A sub-context redeclares six inherited attributes as DERIVED, and real files write them as *:

text
IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#1,$,.MODEL_VIEW.,$)

* is not $ — it means "read this from my parent". Accessors that take &model (precision, world_coordinate_system, coordinate_space_dimension, true_north) walk ParentContext to resolve it. A consumer reading the slot directly gets the marker and loses the project's precision and placement. See ADR 0009.

Slot positions are asserted against IFC2x3, IFC4 and IFC4x3 in ifc-geometry/tests/context_slots.rs, including that the sub-context still inherits exactly six attributes — the off-by-six that would read TargetScale as the target view.

Presentation, annotation, and external references

These are the areas most relevant to drawing production and document/approval workflows. Presentation and annotation now have schema-resolved typed views and bounded transaction-staged authoring; rendering, drawing layout, and the approval resource remain outside the current domain contracts. External classification/document/library references have typed read/query/authoring coverage.

Entity / conceptStatusNote
IfcAnnotationImplementedStrict borrowed view and transaction-staged authoring; IFC4X3 PredefinedType remains version-conditional
IfcTextLiteral, IfcTextLiteralWithExtentImplementedStrict literal/placement/path/extent views and transaction-staged authoring
IfcAnnotationFillAreaImplementedType-checked outer/inner boundary views and transaction-staged authoring
IfcCurveStyle, IfcFillAreaStyleImplementedSchema-resolved curve/font/fill/hatch/tile views; no rendering claim
IfcSurfaceStyle and childrenImplementedRGB/factor, shading, rendering, lighting, refraction, and texture views; core surface graph authoring
IfcPresentationLayerAssignmentImplementedLayer membership/style/visibility view and styled-layer authoring
IfcStyledItemImplementedStrict direct assignment view/writer and deterministic direct-over-layer resolution; IFC2x3 wrappers are explicit
IfcShapeRepresentationAbsentGeneric Representation view exists; the subtype does not
IfcGeometricRepresentationSubContextPartialStrict inherited view and plan-context query exist; authoring uses generic EntityBuilder, not a dedicated helper
IfcLibraryReferenceImplementedStrict borrowed view and transaction-staged authoring
IfcLibraryInformationImplementedStrict borrowed view and transaction-staged authoring
IfcRelAssociatesLibraryImplementedDeterministic object lookup and transaction-staged authoring
IfcExternalReference and IfcLibrarySelectImplementedInherited fields are exposed by concrete views; select targets are type-checked
IfcExternalReferenceRelationshipImplementedifc-classification owns strict selected projections, deterministic lookup, and transaction-staged authoring
IfcApproval and selected approval relationshipsImplementedifc-approval owns bounded IFC4 projections, queries, and transaction-staged authoring; the whole IfcApprovalResource schema is not claimed
IfcMetric, IfcObjective, and selected constraint relationshipsImplementedifc-constraint preserves typed metric values and stages bounded IFC4 authoring without evaluating constraints
IfcClassificationReferenceImplementedBounded hierarchy, explicit occurrence/type sources, and authoring

Because ifc-model round-trips entities structurally, every row above reads and re-exports without loss. The status distinguishes that baseline from typed interpretation and authoring; only rows marked implemented expose those domain contracts.

Explicit non-goals

  • A CAD modelling kernel. Booleans, tessellation, and NURBS evaluation live in Axiolid or its providers.
  • Rendering, drawing layout, or paper-space composition.
  • Vendored ISO or buildingSMART schema payloads (the contributing guide).
  • Any C++ in the dependency graph.

How to verify a claim on this page

  1. Read the crate's public API and its tests/ directory.
  2. Read the crate's PLAN.md — it records implementation state, unlike AGENTS.md which records stable contracts.
  3. Run the gate: scripts/gate.sh.
  4. For geometry coverage, read ifc-geometry/src/lower/dispatch.rs; the IMPLEMENTED and PLANNED constants are asserted by tests.

Released under the AGPL-3.0-or-later licence. ISO and CEN standards material is not redistributed.