From 4460f92605b144693f91c58d85836f88e49f849c Mon Sep 17 00:00:00 2001 From: Griffin Long <151978260+DrunkOnJava@users.noreply.github.com> Date: Sun, 30 Aug 2026 12:50:47 -0400 Subject: [PATCH] =?UTF-8?q?corpus:=20mirror=20rvt-rs=20#225=20=E2=80=94=20?= =?UTF-8?q?slabs=20and=20shading=20devices=20exact;=20full-project=20surfa?= =?UTF-8?q?ce=20is=2010=20fields;=20spec=201.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rvt-rs #225 (RE-22) recovers IFCSLAB 80/80 and IFCSHADINGDEVICE 20/20 by id set (per-instance IFC Export As overrides found in the file; the one missing slab was an OST_BuildingPad) and slab thickness 79/80 against the export's extrusion depths. The manifests gain a shading_devices category, so all three observations change on both artifacts; the full-project verdict is 10 surface fields / 4 excluded, the element fixture 4 / 9. SPEC.md mirrors rvt-rs docs/octetproof-spec.md 1.0.2 (worked examples labelled as dated snapshots). Index re-chained; validators pass. --- SPEC.md | 12 ++++-- corpus/MANIFEST_INDEX.json | 12 +++--- corpus/artifacts/g-2026-0001/manifest.json | 39 +++++++++++++------ .../g-2026-0001/observations/ifc-lite.json | 3 +- .../observations/ifcopenshell.json | 3 +- .../g-2026-0001/observations/rvt-rs.json | 39 ++++++++++--------- corpus/artifacts/g-2026-0001/verdict.json | 17 +++++--- corpus/artifacts/g-2026-0002/manifest.json | 31 ++++++++------- .../g-2026-0002/observations/ifc-lite.json | 3 +- .../observations/ifcopenshell.json | 3 +- .../g-2026-0002/observations/rvt-rs.json | 39 ++++++++++--------- corpus/artifacts/g-2026-0002/verdict.json | 13 ++----- 12 files changed, 122 insertions(+), 92 deletions(-) diff --git a/SPEC.md b/SPEC.md index f9e7b5c..e6d3e63 100644 --- a/SPEC.md +++ b/SPEC.md @@ -1,8 +1,8 @@ # Technical Specification: OctetProof — A License-Free Verification Protocol for Undocumented Binary Formats -**Version:** 1.0.1 +**Version:** 1.0.2 **Date:** 2026-08-30 -**Status:** Specification — 1.0.0. Supersedes the draft received from the project owner on 2026-08-30, which is retained verbatim at [`docs/octetproof-spec-draft.md`](octetproof-spec-draft.md) with its reviewer notes. The corrections applied here are listed in Section 19. +**Status:** Specification — 1.0.2. Supersedes the draft received from the project owner on 2026-08-30, which is retained verbatim at [`docs/octetproof-spec-draft.md`](octetproof-spec-draft.md) with its reviewer notes. The corrections applied here are listed in Section 19. **License of this document:** CC-BY-4.0 **Reference implementation:** rvt-rs (Apache-2.0) — in-repo instance; umbrella repository: [DrunkOnJava/octetproof](https://github.com/DrunkOnJava/octetproof) **Primary domain:** Building Information Modeling (BIM) closed formats, with generalization to any undocumented binary container format @@ -459,7 +459,7 @@ The source witness, rvt-rs reading the `.rvt` directly — the same file, abbrev } ``` -The committed hash `b6d9b6…` is over the full payload, not the abbreviation above; the abbreviated block is illustrative of shape only. Every other example in this section is byte-exact. +The committed hash `b6d9b6…` is over the full payload, not the abbreviation above; the abbreviated block is illustrative of shape only. Every other example in this section was byte-exact against the files committed on 2026-08-30; they are **dated snapshots of a decoder state**, not a live mirror of `research/witness/` (see 19b). Two properties of the payload are load-bearing. First, the two witnesses share only `entity_counts`; everything else in a payload is witness-specific and is not diffed. Second, a witness may report a type the other never emits (`IFCSHADINGDEVICE` here) — the diff is driven by the manifest's declared surface, not by the union of the payload keys, and a type absent from a payload counts as zero. @@ -487,7 +487,7 @@ The verdict is the gate's output for one artifact. It records the whole decision |`verdict_hash_sha256` |yes |SHA-256 over the canonicalized verdict excluding `timestamp` | |`timestamp` |optional|ISO-8601. Omitted by default so the verdict is byte-reproducible. | -The committed passing verdict for the worked example, complete: +The passing verdict for the worked example as committed on 2026-08-30, complete (a dated snapshot — see 19b): ```json { @@ -1064,6 +1064,10 @@ Every version, date, and license above was checked against the GitHub API on 202 ----- +## 19b. 1.0.2 (2026-08-30) + +Patch release, non-semantic (Section 16.1). The §6.2 and §6.3 worked examples quote the observation and verdict as committed in the reference implementation on 2026-08-30. Later decoder work in that repository changes those files by design — the slab recovery in rvt-rs #212 moves `entity_counts.IFCSLAB` from 64 to 80, adds `IFCSHADINGDEVICE`, and takes `floors` off the excluded list — so the examples are now labelled dated snapshots rather than a live mirror of `research/witness/`. The protocol, the schemas, the diff function and the status vocabulary are unchanged; nothing here is normative. Readers wanting the current artifacts should read the committed files, which CI keeps in replay agreement with a fresh run. + ## 19a. 1.0.1 (2026-08-30) Patch release, non-semantic (Section 16.1): the umbrella repository was created the same day as 1.0.0, so the header, Section 16.3 and the "planned" wording now point at [DrunkOnJava/octetproof](https://github.com/DrunkOnJava/octetproof). No schema, diff-function, or provenance change. diff --git a/corpus/MANIFEST_INDEX.json b/corpus/MANIFEST_INDEX.json index 9575e6b..a33fce9 100644 --- a/corpus/MANIFEST_INDEX.json +++ b/corpus/MANIFEST_INDEX.json @@ -5,10 +5,10 @@ "artifact_id": "g-2026-0001", "bridge_sha256": "d07c7462aee22640661faed5262cf802ce0fcbc663f312961a39be92bf857050", "manifest_path": "corpus/artifacts/g-2026-0001/manifest.json", - "manifest_sha256": "898ee2fe249574b4279da37fcaa6edb6cc680eb57e43b18686706462cd22147f", + "manifest_sha256": "6620d925a7a89688b991d4b1a8e10ead6191e73b4242502b8b014cdfbc0c3971", "prev_hash": null, "source_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", - "verdict_hash_sha256": "ae4679f6044a4c3caa0b2f3a6030648bc633b1d878957a759120f011f71ded5e", + "verdict_hash_sha256": "94d723919686963121c05c7475c3ea126e9f8d97fa4b9136c6e5656421c8b40a", "verdict_status": "PASS" }, { @@ -16,15 +16,15 @@ "artifact_id": "g-2026-0002", "bridge_sha256": "bfdf36ffb0bb768f3409d818403990e64d4c262c6780603be87f8077387ad86d", "manifest_path": "corpus/artifacts/g-2026-0002/manifest.json", - "manifest_sha256": "42bbeeaa0f0f7cf0fb9e6b8289b6910eedf9d49d4cbc38d7c894b3693c4dc1e7", - "prev_hash": "052f805331139ce12af539bc2537b44ff9428e436205ec5f93d131fd1f7d4c94", + "manifest_sha256": "f22783cd973aa9fb4968d72c4b0b47849f4da97574e0c71dcca36de37c39893a", + "prev_hash": "6e2a42634621ed26b655dbf1c3bc7cd1488650779e65cf02223a33c66450279f", "source_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", - "verdict_hash_sha256": "afa87bb0a4e35ea8e5fa9a1adb21b29f8a0ba532571c88fd00c14dabcd4c7145", + "verdict_hash_sha256": "48ef575a11505ee1fcbb02b37b3551e0e8d5618a1ec39aeb6d6cb250e085648c", "verdict_status": "PASS" } ], "chain_algorithm": "sha256 over JCS-lite canonical entries (sorted keys, no whitespace, UTF-8)", - "chain_head": "42f52b37d53389f1a1e08a26e84cea209e64c9cd3544d94a6e83851dba0add53", + "chain_head": "50fb3adb759b3d2ddb45a9b4e7d33a4c486cba749901777e7f58df1ec3aa7a58", "schema_version": "1.0.0", "signature": null, "signing_status": "not implemented — SPEC.md §12.2 requires an Ed25519 signature over the chain head; no maintainer key is published yet, so this chain is tamper-evident but not cryptographically anchored" diff --git a/corpus/artifacts/g-2026-0001/manifest.json b/corpus/artifacts/g-2026-0001/manifest.json index 00ba3f0..8898a8d 100644 --- a/corpus/artifacts/g-2026-0001/manifest.json +++ b/corpus/artifacts/g-2026-0001/manifest.json @@ -69,14 +69,13 @@ "notes": "The paired 20 KB element fixture carries none of this type; the same .rvt carries 360, scored against the full export in the sibling manifest magnetar-2024-core-interior-slim (#211). Recorded as a decoder baseline here so the reference side stays the element fixture and the count is not double-claimed." }, "floors": { - "status": "known_gap", - "expected": 1, - "source": "paired Revit IFC export; exported as IFCSHADINGDEVICE named Floor:Structural Slab", - "source_ifc_type": "IFCSHADINGDEVICE", + "status": "decoder_baseline", + "expected": 0, + "source": "paired Revit IFC export; this 20 KB element fixture carries no IFCSLAB", + "source_ifc_type": "IFCSLAB", "tolerance": 0, - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness", - "notes": "Production path recovers plan-loop IFCSLAB annotations (boundary only); paired IFC uses IFCSHADINGDEVICE." + "tracking_issue": 212, + "notes": "Changed 2026-08-30 (#212, RE-22): rvt-rs recovers 80 IFCSLAB from OST_Floors / OST_BuildingPad partition element records on this .rvt, replacing the 64 plan-loop boundary annotations it used to emit. This reference is an element-export fixture with one element in it and no IFCSLAB at all, so `expected` is 0 and the row is a decoder baseline, like walls / doors / windows / columns here. The authoritative measurement is the sibling full-project manifest, where the 80 id set matches Revit's export exactly at tolerance 0." }, "roofs": { "status": "known", @@ -161,7 +160,16 @@ "tolerance": 0, "tracking_issue": 35, "unsupported_feature": "revit_element_parameters_to_ifc_property_sets", - "notes": "Current decoder emits RvtFloorGeometry property sets for plan-loop slabs (boundary annotation) plus 754 RvtElementRecordGeometry sets for the columns, walls, doors and windows recovered from partition element records (#204/#211); not a match for the paired IFC property-set inventory, and no set carries a Revit element parameter yet (#35)." + "notes": "Current decoder emits 854 RvtElementRecordGeometry sets, one per element recovered from a partition element record - 256 columns, 360 walls, 132 doors, 6 windows, 80 slabs and 20 shading devices (#204/#211/#212). The 64 RvtFloorGeometry sets the plan-loop path used to emit went away with the plan-loop slabs on 2026-08-30. Not a match for the paired IFC property-set inventory, and no set carries a Revit element parameter yet (#35)." + }, + "shading_devices": { + "status": "decoder_baseline", + "expected": 1, + "source": "paired Revit IFC export; the fixture's single element is IFCSHADINGDEVICE 'Floor:Structural Slab:71411'", + "source_ifc_type": "IFCSHADINGDEVICE", + "tolerance": 0, + "tracking_issue": 212, + "notes": "Added 2026-08-30 (#212, RE-22). rvt-rs reads the per-element Revit 'IFC Export As' override out of the partition parameter block and emits 20 IFCSHADINGDEVICE on this .rvt. The fixture's one element, ElementId 71411, is one of those 20, so the set relation holds; the row is a decoder baseline because a one-element reference cannot score twenty. The sibling full-project manifest scores the same 20 as an exact id-set match at tolerance 0." } }, "semantic_surface": [ @@ -180,10 +188,10 @@ }, { "category": "floors", - "field": "entity_counts.IFCSHADINGDEVICE", - "reason": "known_gap", - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness" + "field": "entity_counts.IFCSLAB", + "reason": "decoder_baseline", + "tracking_issue": 212, + "unsupported_feature": null }, { "category": "doors", @@ -226,6 +234,13 @@ "reason": "known_gap", "tracking_issue": 35, "unsupported_feature": "revit_element_parameters_to_ifc_property_sets" + }, + { + "category": "shading_devices", + "field": "entity_counts.IFCSHADINGDEVICE", + "reason": "decoder_baseline", + "tracking_issue": 212, + "unsupported_feature": null } ], "notes": "`counts` is the normative SPEC.md §6.1 block and is what the gate reads; `semantic_surface` and `excluded` are the declared result, and tools/verdict.py fails with MANIFEST_ERROR if they disagree with what `counts` implies — so an accidental status flip is loud rather than a silent surface change. Tracking issues 31/33/34/35 are rvt-rs issues (github.com/DrunkOnJava/rvt-rs). The rvt-rs project-count manifest's `levels` category is omitted here: its status is `decoder_baseline` and it carries no `source_ifc_type`, so it is a decoder regression baseline, not a cross-witness category. The `decoder_*` fields are omitted for the same reason. The bridge file is a 20 KB element-export fixture, not a full project schedule, so seven of the eight agreeing surface fields are zero counts. See PROVENANCE.md." diff --git a/corpus/artifacts/g-2026-0001/observations/ifc-lite.json b/corpus/artifacts/g-2026-0001/observations/ifc-lite.json index 59620e6..9dcaf13 100644 --- a/corpus/artifacts/g-2026-0001/observations/ifc-lite.json +++ b/corpus/artifacts/g-2026-0001/observations/ifc-lite.json @@ -14,6 +14,7 @@ "IFCPROPERTYSET": 25, "IFCROOF": 0, "IFCSHADINGDEVICE": 1, + "IFCSLAB": 0, "IFCSPACE": 0, "IFCUNITASSIGNMENT": 1, "IFCWALL": 0, @@ -21,7 +22,7 @@ }, "ifc_schema": "IFC4" }, - "observation_hash_sha256": "8cf4046509bb788406e93261f0dcb10708fbf33ae195d12f8ddc99b41a93398f", + "observation_hash_sha256": "f8fef6590eb29b00247f511314b30b759f6f5b35489bab7ec125bf660792eebe", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" diff --git a/corpus/artifacts/g-2026-0001/observations/ifcopenshell.json b/corpus/artifacts/g-2026-0001/observations/ifcopenshell.json index 480af68..5a58b06 100644 --- a/corpus/artifacts/g-2026-0001/observations/ifcopenshell.json +++ b/corpus/artifacts/g-2026-0001/observations/ifcopenshell.json @@ -14,6 +14,7 @@ "IFCPROPERTYSET": 25, "IFCROOF": 0, "IFCSHADINGDEVICE": 1, + "IFCSLAB": 0, "IFCSPACE": 0, "IFCUNITASSIGNMENT": 1, "IFCWALL": 0, @@ -21,7 +22,7 @@ }, "ifc_schema": "IFC4" }, - "observation_hash_sha256": "8cf4046509bb788406e93261f0dcb10708fbf33ae195d12f8ddc99b41a93398f", + "observation_hash_sha256": "f8fef6590eb29b00247f511314b30b759f6f5b35489bab7ec125bf660792eebe", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" diff --git a/corpus/artifacts/g-2026-0001/observations/rvt-rs.json b/corpus/artifacts/g-2026-0001/observations/rvt-rs.json index c61df8e..08f316c 100644 --- a/corpus/artifacts/g-2026-0001/observations/rvt-rs.json +++ b/corpus/artifacts/g-2026-0001/observations/rvt-rs.json @@ -5,40 +5,41 @@ "input_hash_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", "input_role": "source", "observation": { - "building_elements_with_geometry": 754, + "building_elements_with_geometry": 854, "entity_counts": { "IFCAPPLICATION": 1, - "IFCAXIS2PLACEMENT2D": 754, - "IFCAXIS2PLACEMENT3D": 755, + "IFCAXIS2PLACEMENT2D": 854, + "IFCAXIS2PLACEMENT3D": 855, "IFCBUILDING": 1, "IFCBUILDINGSTOREY": 11, - "IFCCARTESIANPOINT": 1509, + "IFCCARTESIANPOINT": 1709, "IFCCOLUMN": 256, "IFCCONVERSIONBASEDUNIT": 4, "IFCDIMENSIONALEXPONENTS": 4, - "IFCDIRECTION": 756, + "IFCDIRECTION": 856, "IFCDOOR": 132, - "IFCEXTRUDEDAREASOLID": 754, + "IFCEXTRUDEDAREASOLID": 854, "IFCGEOMETRICREPRESENTATIONCONTEXT": 1, - "IFCLOCALPLACEMENT": 849, + "IFCLOCALPLACEMENT": 885, "IFCMATERIAL": 102, "IFCMEASUREWITHUNIT": 4, "IFCORGANIZATION": 1, "IFCOWNERHISTORY": 1, "IFCPERSON": 1, "IFCPERSONANDORGANIZATION": 1, - "IFCPRODUCTDEFINITIONSHAPE": 754, + "IFCPRODUCTDEFINITIONSHAPE": 854, "IFCPROJECT": 1, - "IFCPROPERTYSET": 818, - "IFCPROPERTYSINGLEVALUE": 4769, - "IFCRECTANGLEPROFILEDEF": 754, + "IFCPROPERTYSET": 854, + "IFCPROPERTYSINGLEVALUE": 5364, + "IFCRECTANGLEPROFILEDEF": 854, "IFCRELAGGREGATES": 3, "IFCRELCONTAINEDINSPATIALSTRUCTURE": 11, - "IFCRELDEFINESBYPROPERTIES": 818, - "IFCSHAPEREPRESENTATION": 754, + "IFCRELDEFINESBYPROPERTIES": 854, + "IFCSHADINGDEVICE": 20, + "IFCSHAPEREPRESENTATION": 854, "IFCSITE": 1, "IFCSIUNIT": 6, - "IFCSLAB": 64, + "IFCSLAB": 80, "IFCSPACE": 18, "IFCUNITASSIGNMENT": 1, "IFCWALL": 360, @@ -47,7 +48,8 @@ "exported_building_elements": { "IFCCOLUMN": 256, "IFCDOOR": 132, - "IFCSLAB": 64, + "IFCSHADINGDEVICE": 20, + "IFCSLAB": 80, "IFCSPACE": 18, "IFCWALL": 360, "IFCWINDOW": 6 @@ -55,7 +57,7 @@ "material_count": 102, "storey_count": 11 }, - "observation_hash_sha256": "d88897c6d9b8223350a831f4caf48d76d469a4d4f47815da56da6d34e9364fb7", + "observation_hash_sha256": "881da721e4ec87d7cf03424620b7595dea5fcce4f559a6246d562fa3a47ba9a4", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" @@ -63,17 +65,16 @@ "unsupported_entities": [ "partial_element_geometry", "revit_compound_assemblies_and_walltype_widths", - "floor_slab_extrusion_thickness", "door_window_host_wall_binding", "opening_index_to_ifc_openingelement_host_join", "schema_field_wall_instances", "revit_element_parameters_to_ifc_property_sets" ], "warnings": [ - "Unsupported or incomplete geometry was reported: unsupported_geometry_curve=18, unsupported_geometry_unresolved_host=138, unsupported_geometry_missing_level=29, unsupported_geometry_missing_dimensions=18, floor_boundary_annotation_only=64.", + "Unsupported or incomplete geometry was reported: unsupported_geometry_curve=18, unsupported_geometry_unresolved_host=138, unsupported_geometry_missing_level=78, unsupported_geometry_missing_dimensions=18.", "Unmapped Revit unit identifiers were preserved in diagnostics: autodesk.unit.unit:amperes-1.0.0, autodesk.unit.unit:britishThermalUnits-1.0.1, autodesk.unit.unit:britishThermalUnitsPerDegreeFahrenheit-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHour-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourCubicFoot-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourFootDegreeFahrenheit-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourSquareFoot-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourSquareFootDegreeFahrenheit-1.0.1", "11 building storey(s) lack a confident partition Level name and keep elevation fallback labels.", - "11 building storey elevation(s) were measured from partition element-record bounding boxes and 743 building element(s) bound to them by base elevation (#213); the 12 recovered Level name string(s) could not be paired with those elevations and are not asserted as storey names.", + "11 building storey elevation(s) were measured from partition element-record bounding boxes and 794 building element(s) bound to them by an exact record-face elevation match (base face, or top face for slabs and shading devices) (#213, #212); the 12 recovered Level name string(s) could not be paired with those elevations and are not asserted as storey names.", "Suppressed 18 low-confidence schema scan candidates from default export.", "Formats/Latest multipage integrity uncertain (checksum-page strip disabled; RVT_FORMATS_MULTIPAGE_UNVERIFIED)." ], diff --git a/corpus/artifacts/g-2026-0001/verdict.json b/corpus/artifacts/g-2026-0001/verdict.json index c3b0e67..cb525a5 100644 --- a/corpus/artifacts/g-2026-0001/verdict.json +++ b/corpus/artifacts/g-2026-0001/verdict.json @@ -11,10 +11,10 @@ }, { "category": "floors", - "field": "entity_counts.IFCSHADINGDEVICE", - "reason": "known_gap", - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness" + "field": "entity_counts.IFCSLAB", + "reason": "decoder_baseline", + "tracking_issue": 212, + "unsupported_feature": null }, { "category": "doors", @@ -57,6 +57,13 @@ "reason": "known_gap", "tracking_issue": 35, "unsupported_feature": "revit_element_parameters_to_ifc_property_sets" + }, + { + "category": "shading_devices", + "field": "entity_counts.IFCSHADINGDEVICE", + "reason": "decoder_baseline", + "tracking_issue": 212, + "unsupported_feature": null } ], "independence": { @@ -99,7 +106,7 @@ "entity_counts.IFCUNITASSIGNMENT" ], "status": "PASS", - "verdict_hash_sha256": "ae4679f6044a4c3caa0b2f3a6030648bc633b1d878957a759120f011f71ded5e", + "verdict_hash_sha256": "94d723919686963121c05c7475c3ea126e9f8d97fa4b9136c6e5656421c8b40a", "witnesses_compared": [ "ifc-lite", "ifcopenshell", diff --git a/corpus/artifacts/g-2026-0002/manifest.json b/corpus/artifacts/g-2026-0002/manifest.json index 0195b1e..3523535 100644 --- a/corpus/artifacts/g-2026-0002/manifest.json +++ b/corpus/artifacts/g-2026-0002/manifest.json @@ -66,7 +66,7 @@ "source_ifc_type": "IFCBUILDINGSTOREY", "tolerance": 0, "tracking_issue": 33, - "notes": "Changed 2026-08-30 (#213): storey elevations now come from the partition element-record bbox base-z distribution instead of from Level name strings, so the count moved 12 -> 11 and the elevations became real. The 256 recovered OST_Columns records stand on exactly 11 distinct base elevations - 0, 31, 46, 61, 76, 91, 106, 121, 136, 151, 166 ft - and every one of the 11 equals an IfcBuildingStorey.Elevation in this export, with no false positives; the export's remaining four (-40, -20, 15, 185.5 ft) carry no column record and are not recovered. The previous 12 came from Level-like name strings that all defaulted to elevation 0.0, so only one of them matched by accident. Names are not paired with the measured elevations: there were 12 name candidates against 11 elevations, and a rank join puts Level 6 at 91 ft where this export puts Level 7, so every storey keeps an elevation-derived name. ElementId <-> Level binding is still open (#86)." + "notes": "Changed 2026-08-30 (#213): storey elevations now come from the partition element-record bbox base-z distribution instead of from Level name strings, so the count moved 12 -> 11 and the elevations became real. The 256 recovered OST_Columns records stand on exactly 11 distinct base elevations - 0, 31, 46, 61, 76, 91, 106, 121, 136, 151, 166 ft - and every one of the 11 equals an IfcBuildingStorey.Elevation in this export, with no false positives; the export's remaining four (-40, -20, 15, 185.5 ft) carry no column record and are not recovered. The previous 12 came from Level-like name strings that all defaulted to elevation 0.0, so only one of them matched by accident. Names are not paired with the measured elevations: there were 12 name candidates against 11 elevations, and a rank join puts Level 6 at 91 ft where this export puts Level 7, so every storey keeps an elevation-derived name. ElementId <-> Level binding is still open (#86). Re-measured 2026-08-30 (#212, RE-22, #218): the record-backed slab set does not widen this. Slab record base elevations are 40 distinct values and not one of them is an IfcBuildingStorey.Elevation in this export - Revit hangs a floor plate below its level. Slab record top elevations are 26 distinct values, 13 of which are storey elevations (they add -40 ft and 185.5 ft, two of the four this recovery misses) and 13 of which are not (each sits 0.1667 ft below a storey, the structural-slab / architectural-topping interface). Admitting slab tops as an elevation source would buy two storeys for thirteen false ones, so ifc::STOREY_ELEVATION_SOURCE_TYPES stays IFCCOLUMN alone and the count stays 11." }, "walls": { "status": "known", @@ -78,14 +78,13 @@ "notes": "Closed 2026-08-30 (#211): the partition element-record prologue carries a container reference at +0x32 (0xffffffffffffffff = none) and a placement-kind word at +0x42 (0xffffef7f placed instance / 0xffff8000 type-symbol envelope). Records that are standalone AND placed reproduce Revit's exported ElementId set exactly. Measured on this artifact: 360 of 360 IFCWALL recovered, exact id-set match against the export's Tag values — no false positives, no misses, tolerance 0. Bodies are the record's own bounding box (envelope, not a resolved profile or wall location curve); base/top Level binding and door/window host-wall binding stay open (#86, door_window_host_wall_binding)." }, "floors": { - "status": "known_gap", + "status": "known", "expected": 80, "source": "full Revit IFC export", "source_ifc_type": "IFCSLAB", "tolerance": 0, - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness", - "notes": "rvt-rs emits 64 plan-loop IFCSLAB boundary annotations against 80 exported slabs; recall issue #83 still records 61/80, so its number is stale by three. The export also carries 20 IFCSHADINGDEVICE, which no decoder path claims and which this manifest deliberately does not score." + "tracking_issue": 212, + "notes": "Closed 2026-08-30 (#212, RE-22). The #211 instance rule (no container reference at +0x32, placement kind 0xffffef7f at +0x42) is exact on OST_Floors too - the 99 ElementIds it selects are all exported, 79 as IFCSLAB and 20 as IFCSHADINGDEVICE, so there were never any false positives. Two things were missing. (1) The 80th exported slab, 'Pad:Site Pad' ElementId 21975, carries BuiltInCategory OST_BuildingPad (-2001263), not OST_Floors; its record decodes with the same header shape and Revit's exporter maps a building pad to IfcSlab .FLOOR. (2) The IfcSlab / IfcShadingDevice split is a per-instance Revit 'IFC Export As' override - the reference export carries IFCSLABTYPE and IFCSHADINGDEVICETYPE rows with the same Tag (4166, 71848), so the same FloorType lands on both sides - and it is readable: the UTF-16LE string 'IfcShadingDevice' sits in the element's parameter block with the owning ElementId as a u64 220 bytes ahead of it and again at 286, both of which must agree and be declared in Global/ElemTable. Thirty entries pass that test on this file, naming exactly the 20 IFCSHADINGDEVICE Tag values. Measured: 80 of 80 IFCSLAB and 20 of 20 IFCSHADINGDEVICE, exact id-set matches against the export's Tag values - no false positives, no misses, tolerance 0, verified with IfcOpenShell 0.8.5 and IFClite 7.1.1. Bodies are the record's own bounding box (an envelope: the plan profile is the box rectangle, not the recovered floor boundary polygon), but the vertical extent is the slab's real thickness - it equals the export's IfcExtrudedAreaSolid.Depth on 79 of 80 slabs and sums to it on the 80th (22756 'Floor:Basement Slab', exported as 0.3333 ft + 1.1667 ft = the recorded 1.5 ft), which closes floor_slab_extrusion_thickness (#31). The 64 plan-loop boundary annotations this row used to score are retired on files where records decode. The export's 20 IFCSHADINGDEVICE are now scored by their own row." }, "roofs": { "status": "known", @@ -170,18 +169,29 @@ "tolerance": 0, "tracking_issue": 35, "unsupported_feature": "revit_element_parameters_to_ifc_property_sets", - "notes": "The ReferenceView_V1.2 export carries no IfcPropertySet at all (0, confirmed by both bridge readers); rvt-rs emits 64 RvtFloorGeometry sets for its plan-loop slab annotations plus 754 RvtElementRecordGeometry sets for the 256 columns, 360 walls, 132 doors and 6 windows recovered from partition element records (#204/#211). Neither side is a subset of the other, and no set carries a Revit element parameter yet (#35)." + "notes": "The ReferenceView_V1.2 export carries no IfcPropertySet at all (0, confirmed by both bridge readers); rvt-rs emits 854 RvtElementRecordGeometry sets, one per element recovered from a partition element record - 256 columns, 360 walls, 132 doors, 6 windows, 80 slabs and 20 shading devices (#204/#211/#212). The 64 RvtFloorGeometry sets the plan-loop path used to emit are gone with the plan-loop slabs. Neither side is a subset of the other, and no set carries a Revit element parameter yet (#35)." + }, + "shading_devices": { + "status": "known", + "expected": 20, + "source": "full Revit IFC export", + "source_ifc_type": "IFCSHADINGDEVICE", + "tolerance": 0, + "tracking_issue": 212, + "notes": "Added 2026-08-30 (#212, RE-22). Twenty OST_Floors instances carry a per-element Revit 'IFC Export As' override naming IfcShadingDevice, so Revit's exporter emits them as IFCSHADINGDEVICE rather than IFCSLAB even though they share a FloorType with elements that stay slabs. rvt-rs reads the override string out of the partition parameter block and honours it; measured 20 of 20 with an exact id-set match against the export's Tag values, tolerance 0. This manifest previously left these 20 unscored." } }, "semantic_surface": [ "entity_counts.IFCWALL", + "entity_counts.IFCSLAB", "entity_counts.IFCROOF", "entity_counts.IFCDOOR", "entity_counts.IFCWINDOW", "entity_counts.IFCCOLUMN", "entity_counts.IFCBEAM", "entity_counts.IFCFLOWTERMINAL", - "entity_counts.IFCUNITASSIGNMENT" + "entity_counts.IFCUNITASSIGNMENT", + "entity_counts.IFCSHADINGDEVICE" ], "excluded": [ { @@ -191,13 +201,6 @@ "tracking_issue": 33, "unsupported_feature": null }, - { - "category": "floors", - "field": "entity_counts.IFCSLAB", - "reason": "known_gap", - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness" - }, { "category": "rooms_spaces", "field": "entity_counts.IFCSPACE", diff --git a/corpus/artifacts/g-2026-0002/observations/ifc-lite.json b/corpus/artifacts/g-2026-0002/observations/ifc-lite.json index 45c4058..18275b8 100644 --- a/corpus/artifacts/g-2026-0002/observations/ifc-lite.json +++ b/corpus/artifacts/g-2026-0002/observations/ifc-lite.json @@ -14,6 +14,7 @@ "IFCMATERIAL": 10, "IFCPROPERTYSET": 0, "IFCROOF": 0, + "IFCSHADINGDEVICE": 20, "IFCSLAB": 80, "IFCSPACE": 116, "IFCUNITASSIGNMENT": 1, @@ -22,7 +23,7 @@ }, "ifc_schema": "IFC4" }, - "observation_hash_sha256": "882e1e0f7d546bed2b4cf94e0cb8867f257321235203adcb0ed48e8ef521b4f8", + "observation_hash_sha256": "951e6d45fa5c808e96099fb763b63952b543adaaf82555913df49555cd4929d4", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" diff --git a/corpus/artifacts/g-2026-0002/observations/ifcopenshell.json b/corpus/artifacts/g-2026-0002/observations/ifcopenshell.json index 35cff14..ef7d731 100644 --- a/corpus/artifacts/g-2026-0002/observations/ifcopenshell.json +++ b/corpus/artifacts/g-2026-0002/observations/ifcopenshell.json @@ -14,6 +14,7 @@ "IFCMATERIAL": 10, "IFCPROPERTYSET": 0, "IFCROOF": 0, + "IFCSHADINGDEVICE": 20, "IFCSLAB": 80, "IFCSPACE": 116, "IFCUNITASSIGNMENT": 1, @@ -22,7 +23,7 @@ }, "ifc_schema": "IFC4" }, - "observation_hash_sha256": "882e1e0f7d546bed2b4cf94e0cb8867f257321235203adcb0ed48e8ef521b4f8", + "observation_hash_sha256": "951e6d45fa5c808e96099fb763b63952b543adaaf82555913df49555cd4929d4", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" diff --git a/corpus/artifacts/g-2026-0002/observations/rvt-rs.json b/corpus/artifacts/g-2026-0002/observations/rvt-rs.json index 6d673bb..8af36b8 100644 --- a/corpus/artifacts/g-2026-0002/observations/rvt-rs.json +++ b/corpus/artifacts/g-2026-0002/observations/rvt-rs.json @@ -5,40 +5,41 @@ "input_hash_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", "input_role": "source", "observation": { - "building_elements_with_geometry": 754, + "building_elements_with_geometry": 854, "entity_counts": { "IFCAPPLICATION": 1, - "IFCAXIS2PLACEMENT2D": 754, - "IFCAXIS2PLACEMENT3D": 755, + "IFCAXIS2PLACEMENT2D": 854, + "IFCAXIS2PLACEMENT3D": 855, "IFCBUILDING": 1, "IFCBUILDINGSTOREY": 11, - "IFCCARTESIANPOINT": 1509, + "IFCCARTESIANPOINT": 1709, "IFCCOLUMN": 256, "IFCCONVERSIONBASEDUNIT": 4, "IFCDIMENSIONALEXPONENTS": 4, - "IFCDIRECTION": 756, + "IFCDIRECTION": 856, "IFCDOOR": 132, - "IFCEXTRUDEDAREASOLID": 754, + "IFCEXTRUDEDAREASOLID": 854, "IFCGEOMETRICREPRESENTATIONCONTEXT": 1, - "IFCLOCALPLACEMENT": 849, + "IFCLOCALPLACEMENT": 885, "IFCMATERIAL": 102, "IFCMEASUREWITHUNIT": 4, "IFCORGANIZATION": 1, "IFCOWNERHISTORY": 1, "IFCPERSON": 1, "IFCPERSONANDORGANIZATION": 1, - "IFCPRODUCTDEFINITIONSHAPE": 754, + "IFCPRODUCTDEFINITIONSHAPE": 854, "IFCPROJECT": 1, - "IFCPROPERTYSET": 818, - "IFCPROPERTYSINGLEVALUE": 4769, - "IFCRECTANGLEPROFILEDEF": 754, + "IFCPROPERTYSET": 854, + "IFCPROPERTYSINGLEVALUE": 5364, + "IFCRECTANGLEPROFILEDEF": 854, "IFCRELAGGREGATES": 3, "IFCRELCONTAINEDINSPATIALSTRUCTURE": 11, - "IFCRELDEFINESBYPROPERTIES": 818, - "IFCSHAPEREPRESENTATION": 754, + "IFCRELDEFINESBYPROPERTIES": 854, + "IFCSHADINGDEVICE": 20, + "IFCSHAPEREPRESENTATION": 854, "IFCSITE": 1, "IFCSIUNIT": 6, - "IFCSLAB": 64, + "IFCSLAB": 80, "IFCSPACE": 18, "IFCUNITASSIGNMENT": 1, "IFCWALL": 360, @@ -47,7 +48,8 @@ "exported_building_elements": { "IFCCOLUMN": 256, "IFCDOOR": 132, - "IFCSLAB": 64, + "IFCSHADINGDEVICE": 20, + "IFCSLAB": 80, "IFCSPACE": 18, "IFCWALL": 360, "IFCWINDOW": 6 @@ -55,7 +57,7 @@ "material_count": 102, "storey_count": 11 }, - "observation_hash_sha256": "d88897c6d9b8223350a831f4caf48d76d469a4d4f47815da56da6d34e9364fb7", + "observation_hash_sha256": "881da721e4ec87d7cf03424620b7595dea5fcce4f559a6246d562fa3a47ba9a4", "schema_version": "1.0.0", "semantic_surface_covered": [ "entity_counts" @@ -63,17 +65,16 @@ "unsupported_entities": [ "partial_element_geometry", "revit_compound_assemblies_and_walltype_widths", - "floor_slab_extrusion_thickness", "door_window_host_wall_binding", "opening_index_to_ifc_openingelement_host_join", "schema_field_wall_instances", "revit_element_parameters_to_ifc_property_sets" ], "warnings": [ - "Unsupported or incomplete geometry was reported: unsupported_geometry_curve=18, unsupported_geometry_unresolved_host=138, unsupported_geometry_missing_level=29, unsupported_geometry_missing_dimensions=18, floor_boundary_annotation_only=64.", + "Unsupported or incomplete geometry was reported: unsupported_geometry_curve=18, unsupported_geometry_unresolved_host=138, unsupported_geometry_missing_level=78, unsupported_geometry_missing_dimensions=18.", "Unmapped Revit unit identifiers were preserved in diagnostics: autodesk.unit.unit:amperes-1.0.0, autodesk.unit.unit:britishThermalUnits-1.0.1, autodesk.unit.unit:britishThermalUnitsPerDegreeFahrenheit-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHour-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourCubicFoot-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourFootDegreeFahrenheit-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourSquareFoot-1.0.1, autodesk.unit.unit:britishThermalUnitsPerHourSquareFootDegreeFahrenheit-1.0.1", "11 building storey(s) lack a confident partition Level name and keep elevation fallback labels.", - "11 building storey elevation(s) were measured from partition element-record bounding boxes and 743 building element(s) bound to them by base elevation (#213); the 12 recovered Level name string(s) could not be paired with those elevations and are not asserted as storey names.", + "11 building storey elevation(s) were measured from partition element-record bounding boxes and 794 building element(s) bound to them by an exact record-face elevation match (base face, or top face for slabs and shading devices) (#213, #212); the 12 recovered Level name string(s) could not be paired with those elevations and are not asserted as storey names.", "Suppressed 18 low-confidence schema scan candidates from default export.", "Formats/Latest multipage integrity uncertain (checksum-page strip disabled; RVT_FORMATS_MULTIPAGE_UNVERIFIED)." ], diff --git a/corpus/artifacts/g-2026-0002/verdict.json b/corpus/artifacts/g-2026-0002/verdict.json index c459b85..dd90b40 100644 --- a/corpus/artifacts/g-2026-0002/verdict.json +++ b/corpus/artifacts/g-2026-0002/verdict.json @@ -9,13 +9,6 @@ "tracking_issue": 33, "unsupported_feature": null }, - { - "category": "floors", - "field": "entity_counts.IFCSLAB", - "reason": "known_gap", - "tracking_issue": 31, - "unsupported_feature": "floor_slab_extrusion_thickness" - }, { "category": "rooms_spaces", "field": "entity_counts.IFCSPACE", @@ -73,16 +66,18 @@ "schema_version": "1.0.0", "semantic_surface": [ "entity_counts.IFCWALL", + "entity_counts.IFCSLAB", "entity_counts.IFCROOF", "entity_counts.IFCDOOR", "entity_counts.IFCWINDOW", "entity_counts.IFCCOLUMN", "entity_counts.IFCBEAM", "entity_counts.IFCFLOWTERMINAL", - "entity_counts.IFCUNITASSIGNMENT" + "entity_counts.IFCUNITASSIGNMENT", + "entity_counts.IFCSHADINGDEVICE" ], "status": "PASS", - "verdict_hash_sha256": "afa87bb0a4e35ea8e5fa9a1adb21b29f8a0ba532571c88fd00c14dabcd4c7145", + "verdict_hash_sha256": "48ef575a11505ee1fcbb02b37b3551e0e8d5618a1ec39aeb6d6cb250e085648c", "witnesses_compared": [ "ifc-lite", "ifcopenshell",