diff --git a/Cargo.lock b/Cargo.lock
index 3c8f13ff..eaaf2949 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1063,7 +1063,7 @@ dependencies = [
[[package]]
name = "ifc-model"
-version = "0.4.3"
+version = "0.4.4"
dependencies = [
"ahash",
"cargo_metadata",
@@ -1332,7 +1332,7 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "openbim-ifc"
-version = "0.39.2"
+version = "0.39.3"
dependencies = [
"calamine",
"flate2",
diff --git a/Cargo.toml b/Cargo.toml
index 4cd7dc87..7b7a34b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -31,7 +31,7 @@ openbim-ifc = { path = "crates/openbim-ifc", version = "0.39.0", default-feature
openbim-ifc-binding-core = { path = "crates/openbim-ifc-binding-core", version = "0.1.0", default-features = false }
ifc-step = { path = "crates/ifc-step", version = "0.6.0" }
ifc-xml = { path = "crates/ifc-xml", version = "0.5.0" }
-ifc-model = { path = "crates/ifc-model", version = "0.4.3" }
+ifc-model = { path = "crates/ifc-model", version = "0.4.4" }
ifc-geometry = { path = "crates/ifc-geometry", version = "0.32.0", default-features = false }
ifc-properties = { path = "crates/ifc-properties", version = "0.10.0", default-features = false }
ifc-template-catalog = { path = "crates/ifc-template-catalog", version = "0.4.0", default-features = false }
diff --git a/crates/ifc-model/CHANGELOG.md b/crates/ifc-model/CHANGELOG.md
index 8aa04189..7815f41a 100644
--- a/crates/ifc-model/CHANGELOG.md
+++ b/crates/ifc-model/CHANGELOG.md
@@ -12,6 +12,8 @@ everything released before per-crate changelogs began.
## [Unreleased]
+## [0.4.4] - 2026-10-29
+
### Fixed (#595)
- `Model::set_attribute` and `Model::set_attributes` panic before any write
@@ -185,7 +187,8 @@ First release under per-crate versioning. See the
[repository changelog](../../CHANGELOG.md) for the family-wide history
that produced this version.
-[Unreleased]: https://github.com/openbimrs/ifc/compare/ifc-model-v0.4.3...HEAD
+[Unreleased]: https://github.com/openbimrs/ifc/compare/ifc-model-v0.4.4...HEAD
+[0.4.4]: https://github.com/openbimrs/ifc/releases/tag/ifc-model-v0.4.4
[0.4.3]: https://github.com/openbimrs/ifc/releases/tag/ifc-model-v0.4.3
[0.4.2]: https://github.com/openbimrs/ifc/releases/tag/ifc-model-v0.4.2
[0.4.1]: https://github.com/openbimrs/ifc/releases/tag/ifc-model-v0.4.1
diff --git a/crates/ifc-model/Cargo.toml b/crates/ifc-model/Cargo.toml
index b8ca8fe5..d2ac5bc5 100644
--- a/crates/ifc-model/Cargo.toml
+++ b/crates/ifc-model/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "ifc-model"
-version = "0.4.3"
+version = "0.4.4"
edition = "2021"
rust-version = "1.99"
license = "AGPL-3.0-or-later OR LicenseRef-Commercial"
diff --git a/crates/openbim-ifc/CHANGELOG.md b/crates/openbim-ifc/CHANGELOG.md
index 977208ea..41b39d32 100644
--- a/crates/openbim-ifc/CHANGELOG.md
+++ b/crates/openbim-ifc/CHANGELOG.md
@@ -12,6 +12,8 @@ everything released before per-crate changelogs began.
## [Unreleased]
+## [0.39.3] - 2026-10-29
+
### Added (#595)
- `Model::preview` (from `ifc-model` 0.4.4); the `authoring` bench measures it
@@ -1399,7 +1401,8 @@ First release under per-crate versioning. See the
[repository changelog](../../CHANGELOG.md) for the family-wide history
that produced this version.
-[Unreleased]: https://github.com/openbimrs/ifc/compare/openbim-ifc-v0.39.2...HEAD
+[Unreleased]: https://github.com/openbimrs/ifc/compare/openbim-ifc-v0.39.3...HEAD
+[0.39.3]: https://github.com/openbimrs/ifc/releases/tag/openbim-ifc-v0.39.3
[0.39.2]: https://github.com/openbimrs/ifc/releases/tag/openbim-ifc-v0.39.2
[0.39.1]: https://github.com/openbimrs/ifc/releases/tag/openbim-ifc-v0.39.1
[0.39.0]: https://github.com/openbimrs/ifc/releases/tag/openbim-ifc-v0.39.0
diff --git a/crates/openbim-ifc/Cargo.toml b/crates/openbim-ifc/Cargo.toml
index 0de2558a..3c5fadb5 100644
--- a/crates/openbim-ifc/Cargo.toml
+++ b/crates/openbim-ifc/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "openbim-ifc"
-version = "0.39.2"
+version = "0.39.3"
edition = "2021"
rust-version = "1.99"
license = "AGPL-3.0-or-later OR LicenseRef-Commercial"
diff --git a/docs/.vitepress/data/facts.json b/docs/.vitepress/data/facts.json
index 0daf2ebb..8364cfa9 100644
--- a/docs/.vitepress/data/facts.json
+++ b/docs/.vitepress/data/facts.json
@@ -175,10 +175,10 @@
"url": "https://crates.io/crates/ifc-model"
}
],
- "released": "0.4.3",
- "released_date": "2026-10-28",
+ "released": "0.4.4",
+ "released_date": "2026-10-29",
"status": "implemented",
- "version": "0.4.3"
+ "version": "0.4.4"
},
"ifc-occurrence": {
"description": "Built element and distribution occurrence classes and their type pairing.",
@@ -400,10 +400,10 @@
"url": "https://crates.io/crates/openbim-ifc"
}
],
- "released": "0.39.2",
+ "released": "0.39.3",
"released_date": "2026-10-29",
"status": "implemented",
- "version": "0.39.2"
+ "version": "0.39.3"
},
"openbim-ifc-binding-core": {
"description": "Host-independent core shared by the openbim-ifc language bindings (WebAssembly, C ABI, Python).",
diff --git a/docs/guide/install.md b/docs/guide/install.md
index 6c15fefb..0ce52afa 100644
--- a/docs/guide/install.md
+++ b/docs/guide/install.md
@@ -8,7 +8,7 @@ one reads the same in the others.
| Language | Package | Latest release | Install | Requires | Reference |
| --- | --- | --- | --- | --- | --- |
-| Rust | [`openbim-ifc`](https://crates.io/crates/openbim-ifc) | 0.39.2 (2026-10-29) | `cargo add openbim-ifc` | Rust `1.99.0` | [`openbim-ifc`](/reference/crates/openbim-ifc) |
+| Rust | [`openbim-ifc`](https://crates.io/crates/openbim-ifc) | 0.39.3 (2026-10-29) | `cargo add openbim-ifc` | Rust `1.99.0` | [`openbim-ifc`](/reference/crates/openbim-ifc) |
| JavaScript / TypeScript | [`@openbim/ifc`](https://www.npmjs.com/package/@openbim/ifc) | 0.15.0 (2026-10-28) | `npm install @openbim/ifc` | Node `>=18` | [`openbim-ifc-wasm`](/reference/crates/openbim-ifc-wasm) |
| Python | [`openbim-ifc`](https://pypi.org/project/openbim-ifc/) | 0.15.0 (2026-10-28) | `pip install openbim-ifc` | Python `>=3.9` | [`openbim-ifc-py`](/reference/crates/openbim-ifc-py) |
| C / C++ | [`openbim_ifc`](https://github.com/openbimrs/ifc/releases/tag/openbim-ifc-capi-v0.1.20) (CMake, prebuilt archives) | 0.1.20 (2026-10-28) | `find_package(openbim_ifc)` | a C11 or C++17 compiler and CMake 3.21; Rust to build from source | [`openbim-ifc-capi`](/reference/crates/openbim-ifc-capi) |
diff --git a/docs/reference/crates/ifc-model.md b/docs/reference/crates/ifc-model.md
index ff99a897..c39273d8 100644
--- a/docs/reference/crates/ifc-model.md
+++ b/docs/reference/crates/ifc-model.md
@@ -11,7 +11,7 @@ The IFC entity graph: storage and structural queries, free of domain semantics a
| | |
| --- | --- |
| Status | Implemented |
-| Latest release | 0.4.3 (2026-10-28) |
+| Latest release | 0.4.4 (2026-10-29) |
| Registries | [crates.io `ifc-model`](https://crates.io/crates/ifc-model) |
| API documentation | [rustdoc](/api/rustdoc/ifc_model/index.html){target="_self"} · [docs.rs](https://docs.rs/ifc-model) |
| Source | [`crates/ifc-model/`](https://github.com/openbimrs/ifc/tree/main/crates/ifc-model) |
@@ -29,25 +29,20 @@ serialization.
## Changes
-Latest release, 0.4.3 (2026-10-28):
+Latest release, 0.4.4 (2026-10-29):
-### Added (#587)
+### Fixed (#595)
-- `Model::reverse_index`: the reverse index, built on the first call and kept
- current by every write, undo and redo after that; equal to
- `ReverseIndex::build` at every moment.
-- `Model::global_id_candidates`: the entities whose first attribute is the
- text of a `Guid`, ascending by id, kept the same way.
-- `Model::drop_derived_indexes`, to free both.
-- `PartialEq` and `Eq` on `ReverseIndex`.
+- `Model::set_attribute` and `Model::set_attributes` panic before any write
+ for an attribute index of `usize::MAX`, instead of wrapping in release builds
+ and truncating the entity, or leaving the first edits of a batch unrecorded.
-### Changed (#587)
+### Added (#595)
-- `Transaction::preflight` reads the model's own reverse index when something
- built it, instead of scanning the model for a commit that removes.
-- Undoing a batch is linear in the batch: file order and type buckets are
- searched from the end.
-
-Semver: minor.
+- `Model::preview` runs a change and rolls it back exactly, the revision
+ included: entities, orders, header, next free id, diagnostics and the
+ maintained indexes are put back, and a `History`, `Transaction` or `Inverse`
+ made before it stays valid. Revisions drawn inside are never reissued.
+ Semver: minor (additive).
Full history: [`crates/ifc-model/CHANGELOG.md`](https://github.com/openbimrs/ifc/blob/main/crates/ifc-model/CHANGELOG.md)
diff --git a/docs/reference/crates/openbim-ifc.md b/docs/reference/crates/openbim-ifc.md
index 29cd2d25..efe3e569 100644
--- a/docs/reference/crates/openbim-ifc.md
+++ b/docs/reference/crates/openbim-ifc.md
@@ -11,7 +11,7 @@ Facade for the openBIM IFC crates: pick codecs and domains as features.
| | |
| --- | --- |
| Status | Implemented |
-| Latest release | 0.39.2 (2026-10-29) |
+| Latest release | 0.39.3 (2026-10-29) |
| Registries | [crates.io `openbim-ifc`](https://crates.io/crates/openbim-ifc) |
| API documentation | [rustdoc](/api/rustdoc/ifc/index.html){target="_self"} · [docs.rs](https://docs.rs/openbim-ifc) |
| Source | [`crates/openbim-ifc/`](https://github.com/openbimrs/ifc/tree/main/crates/openbim-ifc) |
@@ -103,17 +103,11 @@ Facade for the openBIM IFC crates: pick codecs and domains as features.
## Changes
-Latest release, 0.39.2 (2026-10-29):
+Latest release, 0.39.3 (2026-10-29):
-### Fixed (#596)
+### Added (#595)
-- A layer, profile or constituent set, or an IFC2X3 `IfcMaterialList`,
- naming several materials no longer refuses the product before looking at
- them: with no styled material it has no colour, with all styled
- materials agreeing on rgb and transparency it takes that colour, and
- anything else (differing styles, or a mix of styled and unstyled
- materials) is `ColourError::AmbiguousMaterial`.
-
-Semver: patch.
+- `Model::preview` (from `ifc-model` 0.4.4); the `authoring` bench measures it
+ against a clone.
Full history: [`crates/openbim-ifc/CHANGELOG.md`](https://github.com/openbimrs/ifc/blob/main/crates/openbim-ifc/CHANGELOG.md)
diff --git a/docs/reference/index.md b/docs/reference/index.md
index f385498a..a6929e53 100644
--- a/docs/reference/index.md
+++ b/docs/reference/index.md
@@ -10,14 +10,14 @@ Every page here is generated from the crate itself: its manifest, its crate docu
| Crate | Status | Latest release | Description |
| --- | --- | --- | --- |
-| [`openbim-ifc`](./crates/openbim-ifc) | Implemented | 0.39.2 | Facade for the openBIM IFC crates: pick codecs and domains as features. |
+| [`openbim-ifc`](./crates/openbim-ifc) | Implemented | 0.39.3 | Facade for the openBIM IFC crates: pick codecs and domains as features. |
## Model, codecs, schema, authoring and validation
| Crate | Status | Latest release | Description |
| --- | --- | --- | --- |
| [`ifc-author`](./crates/ifc-author) | Implemented | 0.4.2 | Schema-checked IFC authoring: construct entities by attribute name with arity and type validation. |
-| [`ifc-model`](./crates/ifc-model) | Implemented | 0.4.3 | The IFC entity graph: storage and structural queries, free of domain semantics and serialization. |
+| [`ifc-model`](./crates/ifc-model) | Implemented | 0.4.4 | The IFC entity graph: storage and structural queries, free of domain semantics and serialization. |
| [`ifc-schema`](./crates/ifc-schema) | Implemented | 0.3.5 | IFC schema as data: entity table, supertype chain, attribute names. |
| [`ifc-step`](./crates/ifc-step) | Implemented | 0.6.2 | STEP physical file (ISO 10303-21) codec for the IFC model. |
| [`ifc-validate`](./crates/ifc-validate) | Implemented | 0.8.2 | Schema conformance: WHERE rules, cardinality, GUID and reference integrity. |