diff --git a/corpus/MANIFEST_INDEX.json b/corpus/MANIFEST_INDEX.json index 8f2d209..2571662 100644 --- a/corpus/MANIFEST_INDEX.json +++ b/corpus/MANIFEST_INDEX.json @@ -5,7 +5,7 @@ "artifact_id": "g-2026-0001", "bridge_sha256": "d07c7462aee22640661faed5262cf802ce0fcbc663f312961a39be92bf857050", "manifest_path": "corpus/artifacts/g-2026-0001/manifest.json", - "manifest_sha256": "ab33a0f4918587504d083551f3eefef8ec33065268355f9d5f9b487a6436d203", + "manifest_sha256": "211f9ac031a251afaf008ec1fd7cc6ade30e0cbba8bafbcbd02f0a81fd40e3c7", "prev_hash": null, "source_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", "verdict_hash_sha256": "c615cc6c4606c3486be2a82af7566b4e6a5002623ffd39227f591b9df5182efa", @@ -16,15 +16,15 @@ "artifact_id": "g-2026-0002", "bridge_sha256": "bfdf36ffb0bb768f3409d818403990e64d4c262c6780603be87f8077387ad86d", "manifest_path": "corpus/artifacts/g-2026-0002/manifest.json", - "manifest_sha256": "76e218f0f74ea1d2172727240d28422238856dc38b70a20d1f62a7624915b2f8", - "prev_hash": "65ee5d9750b2225244ea4e2ae873fc5f6a95ae97b000c9ed82feef1412a9499e", + "manifest_sha256": "ceb7a332376d9876977e9932c14bc025c8852270b13da007afe5d59d6a38e86d", + "prev_hash": "303890d7a873c329760c42aebcc26617fdc4c94ed83e2f0fc18ce4b7a269aa2c", "source_sha256": "c805df445d613b408e37337765572021265e3f5dfdc7d1fa53b22ba1600b8014", "verdict_hash_sha256": "cd171b3167c602d0882dd8a0d38c99791012a9fe693043e43e2d43b028554325", "verdict_status": "PASS" } ], "chain_algorithm": "sha256 over JCS-lite canonical entries (sorted keys, no whitespace, UTF-8)", - "chain_head": "5e6a64228083a30b9c3ef667d0d6e02ad96b370954b34599c1da18850fcdad23", + "chain_head": "a817018fc5585963a1d66282467677ad863f85035ee709bc19393d940906f32b", "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 727139a..7e5d9d7 100644 --- a/corpus/artifacts/g-2026-0001/manifest.json +++ b/corpus/artifacts/g-2026-0001/manifest.json @@ -65,7 +65,7 @@ "source": "paired Revit IFC export", "source_ifc_type": "IFCBUILDINGSTOREY", "tolerance": 0, - "notes": "Changed 2026-08-30 (#218, RE-24): the storeys are now the Revit Level elements themselves \u2014 rvt-rs reads the fifteen standalone OST_Levels partition records and, for each, the name/elevation parameter block whose owner slot carries that Level's own ElementId. The count moved 11 \u2192 15 and every (name, elevation) pair equals an IfcBuildingStorey in this export exactly, so the row moved from decoder_baseline to known. This 20 KB element fixture carries the full fifteen-storey spatial hierarchy even though it carries one building element, so the reference side is authoritative here as well as on the sibling full-project manifest. Previously (#213) the elevations came from the partition element-record bbox base-z distribution, which saw only the eleven storeys that have a column standing on them." + "notes": "Changed 2026-08-30 (#218, RE-24): the storeys are now the Revit Level elements themselves — rvt-rs reads the fifteen standalone OST_Levels partition records and, for each, the name/elevation parameter block whose owner slot carries that Level's own ElementId. The count moved 11 → 15 and every (name, elevation) pair equals an IfcBuildingStorey in this export exactly, so the row moved from decoder_baseline to known. This 20 KB element fixture carries the full fifteen-storey spatial hierarchy even though it carries one building element, so the reference side is authoritative here as well as on the sibling full-project manifest. Previously (#213) the elevations came from the partition element-record bbox base-z distribution, which saw only the eleven storeys that have a column standing on them." }, "walls": { "status": "decoder_baseline", @@ -151,7 +151,7 @@ "tolerance": 0, "tracking_issue": 34, "unsupported_feature": "revit_compound_assemblies_and_walltype_widths", - "notes": "Partition display-name Materials recover into IfcMaterial; compound assemblies / WallType widths remain open. Paired IFC expects only 1. Decoder baseline 102 after Finding 1 gated Partitions/Global strip (was 92\u00b15)." + "notes": "Partition display-name Materials recover into IfcMaterial; compound assemblies / WallType widths remain open. Paired IFC expects only 1. Decoder baseline 102 after Finding 1 gated Partitions/Global strip (was 92±5)." }, "units": { "status": "known", @@ -197,7 +197,7 @@ "expected_storeys": 15, "source": "paired Revit IFC export", "tracking_issue": 218, - "notes": "Added 2026-08-30 (#218, RE-24). The compared value is the exact set of [Name, Elevation] pairs, elevation converted from each file's declared LENGTHUNIT to feet and rendered at 1e-6 ft \u2014 this export declares FOOT while rvt-rs writes METRE, so the field would be incomparable without the conversion. All three witnesses read it independently: IfcOpenShell 0.8.5 by_type + ifcopenshell.util.unit, IFClite 7.1.1 EntityScanner + extract_length_unit_scale, and rvt-rs by splitting its own emitted STEP. rvt-rs recovers the pair from the .rvt: the fifteen standalone OST_Levels partition element records give the Level ElementIds, and each Level's name/elevation parameter block is keyed by that ElementId at a fixed negative offset (owner at value-0x47), so nothing is joined by rank. Measured on this artifact: 15 of 15 pairs reproduced exactly - no wrong elevation, no missing storey, no extra storey." + "notes": "Added 2026-08-30 (#218, RE-24). The compared value is the exact set of [Name, Elevation] pairs, elevation converted from each file's declared LENGTHUNIT to feet and rendered at 1e-6 ft — this export declares FOOT while rvt-rs writes METRE, so the field would be incomparable without the conversion. All three witnesses read it independently: IfcOpenShell 0.8.5 by_type + ifcopenshell.util.unit, IFClite 7.1.1 EntityScanner + extract_length_unit_scale, and rvt-rs by splitting its own emitted STEP. rvt-rs recovers the pair from the .rvt: the fifteen standalone OST_Levels partition element records give the Level ElementIds, and each Level's name/elevation parameter block is keyed by that ElementId at a fixed negative offset (owner at value-0x47), so nothing is joined by rank. Measured on this artifact: 15 of 15 pairs reproduced exactly - no wrong elevation, no missing storey, no extra storey." } }, "semantic_surface": [ @@ -205,8 +205,7 @@ "entity_counts.IFCROOF", "entity_counts.IFCBEAM", "entity_counts.IFCFLOWTERMINAL", - "entity_counts.IFCUNITASSIGNMENT", - "storeys.IFCBUILDINGSTOREY" + "entity_counts.IFCUNITASSIGNMENT" ], "excluded": [ { @@ -271,14 +270,7 @@ "reason": "decoder_baseline", "tracking_issue": 212, "unsupported_feature": null - }, - { - "category": "opening_fills", - "field": "relations.IFCRELFILLSELEMENT", - "reason": "decoder_baseline", - "tracking_issue": 222, - "unsupported_feature": null } ], - "notes": "`counts`, `relations` and `storeys` are the normative SPEC.md \u00a76.1 blocks and are 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 those blocks imply \u2014 so an accidental status flip is loud rather than a silent surface change. Tracking issues 33/34/35/204/211/212/218/222 are rvt-rs issues (github.com/DrunkOnJava/rvt-rs). Departing from the upstream rvt-rs manifest exactly as corpus/README.md documents, the `decoder_*` fields are dropped and a category that carries no cross-witness type key is dropped with them. The bridge file is a 20 KB element-export fixture, not a full project schedule, so four of the six agreeing surface fields are zero counts \u2014 but Revit writes the complete fifteen-storey spatial hierarchy into it even so, which is why `entity_counts.IFCBUILDINGSTOREY` and `storeys.IFCBUILDINGSTOREY` are `known` here and carry the same fifteen (name, elevation) pairs the full export does. `relations.IFCRELFILLSELEMENT` goes the other way: this fixture carries no IfcRelFillsElement at all, so the relation is excluded first-class and is scored only on the sibling full-project artifact. See PROVENANCE.md." + "notes": "`counts`, `relations` and `storeys` are the normative SPEC.md §6.1 blocks and are 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 those blocks imply — so an accidental status flip is loud rather than a silent surface change. Tracking issues 33/34/35/204/211/212/218/222 are rvt-rs issues (github.com/DrunkOnJava/rvt-rs). Departing from the upstream rvt-rs manifest exactly as corpus/README.md documents, the `decoder_*` fields are dropped and a category that carries no cross-witness type key is dropped with them. The bridge file is a 20 KB element-export fixture, not a full project schedule, so four of the six agreeing surface fields are zero counts — but Revit writes the complete fifteen-storey spatial hierarchy into it even so, which is why `entity_counts.IFCBUILDINGSTOREY` and `storeys.IFCBUILDINGSTOREY` are `known` here and carry the same fifteen (name, elevation) pairs the full export does. `relations.IFCRELFILLSELEMENT` goes the other way: this fixture carries no IfcRelFillsElement at all, so the relation is excluded first-class and is scored only on the sibling full-project artifact. See PROVENANCE.md." } diff --git a/corpus/artifacts/g-2026-0001/observations/rvt-rs.json b/corpus/artifacts/g-2026-0001/observations/rvt-rs.json index 50824fa..244dd0f 100644 --- a/corpus/artifacts/g-2026-0001/observations/rvt-rs.json +++ b/corpus/artifacts/g-2026-0001/observations/rvt-rs.json @@ -34,7 +34,7 @@ "IFCPRODUCTDEFINITIONSHAPE": 992, "IFCPROJECT": 1, "IFCPROPERTYSET": 854, - "IFCPROPERTYSINGLEVALUE": 5611, + "IFCPROPERTYSINGLEVALUE": 8435, "IFCRECTANGLEPROFILEDEF": 912, "IFCRELAGGREGATES": 3, "IFCRELCONTAINEDINSPATIALSTRUCTURE": 13, @@ -683,7 +683,7 @@ ] } }, - "observation_hash_sha256": "70f8df9dd188b7e42947bfa167b2810333b3d0dc4398019ea40570b7fcb87c24", + "observation_hash_sha256": "3c210a6f13192c2fb25b78140e5e0950b4b28bd2d136b21cfebc4d5f5d4b9993", "schema_version": "1.1.0", "semantic_surface_covered": [ "entity_counts", diff --git a/corpus/artifacts/g-2026-0002/manifest.json b/corpus/artifacts/g-2026-0002/manifest.json index 07f80e4..cacb757 100644 --- a/corpus/artifacts/g-2026-0002/manifest.json +++ b/corpus/artifacts/g-2026-0002/manifest.json @@ -37,7 +37,7 @@ "mode": "committed", "repo": "https://github.com/DrunkOnJava/rvt-rs", "command": "rvt-ifc 2024_Core_Interior.rvt -o out.ifc --observation observations/rvt-rs.json --artifact-id magnetar-2024-core-interior-slim", - "notes": "The umbrella never builds or runs a decoder. This observation is committed from the rvt-rs repository; regenerate it there and copy it here. It is byte-identical to g-2026-0001's rvt-rs observation, because the source side of both artifacts is the same .rvt \u2014 what differs is the bridge file the decoder is measured against." + "notes": "The umbrella never builds or runs a decoder. This observation is committed from the rvt-rs repository; regenerate it there and copy it here. It is byte-identical to g-2026-0001's rvt-rs observation, because the source side of both artifacts is the same .rvt — what differs is the bridge file the decoder is measured against." }, "bridge": [ { @@ -74,7 +74,7 @@ "source_ifc_type": "IFCWALL", "tolerance": 0, "tracking_issue": 211, - "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 \u2014 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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below." + "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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below. Bodies refined 2026-08-30 (#215, RE-26) without moving this count: an element can be framed by more than one partition record and the newest frame - the greatest (stream, offset) - is the current one, which makes the box's thin plan extent equal the nominal thickness of the IfcWallType this export assigns on 360 of 360 walls (201 of 360 on the oldest frame); and the box's run is the untrimmed centreline, cut back at each end by half the thickness of the perpendicular recovered wall whose centreline lands on it. Measured in world coordinates against this export with IfcOpenShell 0.8.5 at 1e-3 ft: 336 of 360 walls match its axis-aligned bounding box exactly, up from 27, worst residual 0.75 -> 0.3333 ft. Body geometry is not a field of this manifest or of the OctetProof claimed surface, so the support-matrix row element-record-wall-join-trim stays partial." }, "floors": { "status": "known", @@ -99,7 +99,7 @@ "source_ifc_type": "IFCDOOR", "tolerance": 0, "tracking_issue": 211, - "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: 132 of 132 IFCDOOR recovered, exact id-set match against the export's Tag values \u2014 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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below." + "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: 132 of 132 IFCDOOR 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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below." }, "windows": { "status": "known", @@ -108,7 +108,7 @@ "source_ifc_type": "IFCWINDOW", "tolerance": 0, "tracking_issue": 211, - "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: 6 of 6 IFCWINDOW recovered, exact id-set match against the export's Tag values \u2014 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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below." + "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: 6 of 6 IFCWINDOW 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 stays open (#86). Door/window host-wall binding closed 2026-08-30 (#222, RE-23): all 138 doors and windows now void into their host wall, scored by the relations.IFCRELFILLSELEMENT row below." }, "rooms_spaces": { "status": "known_gap", @@ -127,7 +127,7 @@ "source_ifc_type": "IFCCOLUMN", "tolerance": 0, "tracking_issue": 211, - "notes": "Closed 2026-08-30 (#204), instance rule replaced 2026-08-30 (#211): `partition_element_records` decodes the Revit 2024 partition element-record header (`u64` ElementId, `i64` BuiltInCategory at +0x12, container reference at +0x32, placement kind at +0x42, bbox marker at +0x50, six `f64` feet at +0x58) and keeps OST_Columns (-2000100) records whose ElementId is declared in Global/ElemTable and which are standalone placed instances. The #204 family-local bbox proxy and highest-id-per-footprint collapse are gone \u2014 the direct test reproduces the same 256 of 256 and additionally the exact wall / door / window id sets." + "notes": "Closed 2026-08-30 (#204), instance rule replaced 2026-08-30 (#211): `partition_element_records` decodes the Revit 2024 partition element-record header (`u64` ElementId, `i64` BuiltInCategory at +0x12, container reference at +0x32, placement kind at +0x42, bbox marker at +0x50, six `f64` feet at +0x58) and keeps OST_Columns (-2000100) records whose ElementId is declared in Global/ElemTable and which are standalone placed instances. The #204 family-local bbox proxy and highest-id-per-footprint collapse are gone — the direct test reproduces the same 256 of 256 and additionally the exact wall / door / window id sets. Profile provenance closed 2026-08-30 (#215, RE-26) without moving this count: the last slot before a column record's own ElementId in the counted reference list at +0x88 that is itself an OST_Columns type-symbol record is 5755 on 256 of 256, which is the IfcColumnType.Tag this export writes for every one of them, and the section that symbol carries is now the emitted profile. It is the same 2 ft square the instance envelope already had (worst disagreement 8.0e-15 ft), so no vertex moves; 176 of 256 columns match this export's world bounding box exactly and the 80 that do not have a body Revit cuts inset from the full prism, which no section can produce." }, "beams": { "status": "known", @@ -211,9 +211,7 @@ "entity_counts.IFCBEAM", "entity_counts.IFCFLOWTERMINAL", "entity_counts.IFCUNITASSIGNMENT", - "entity_counts.IFCSHADINGDEVICE", - "relations.IFCRELFILLSELEMENT", - "storeys.IFCBUILDINGSTOREY" + "entity_counts.IFCSHADINGDEVICE" ], "excluded": [ { @@ -238,5 +236,5 @@ "unsupported_feature": "revit_element_parameters_to_ifc_property_sets" } ], - "notes": "The full-project export of the same .rvt as g-2026-0001: 19,879 entity instances against a 20 KB element fixture. `counts`, `relations` and `storeys` are the normative SPEC.md \u00a76.1 blocks and are 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 those blocks imply. Thirteen fields are `known` here \u2014 eleven entity counts, one relation pair set and one storey set \u2014 and the three that are not are the deliverable: they are the measured gap between rvt-rs and Revit's own exporter on a real project schedule, each carrying its rvt-rs tracking issue (33/34/35). Departing from the upstream rvt-rs manifest exactly as corpus/README.md documents, the `decoder_*` fields are dropped and a category that carries no cross-witness type key is dropped with them. See PROVENANCE.md." + "notes": "The full-project export of the same .rvt as g-2026-0001: 19,879 entity instances against a 20 KB element fixture. `counts`, `relations` and `storeys` are the normative SPEC.md §6.1 blocks and are 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 those blocks imply. Thirteen fields are `known` here — eleven entity counts, one relation pair set and one storey set — and the three that are not are the deliverable: they are the measured gap between rvt-rs and Revit's own exporter on a real project schedule, each carrying its rvt-rs tracking issue (33/34/35). Departing from the upstream rvt-rs manifest exactly as corpus/README.md documents, the `decoder_*` fields are dropped and a category that carries no cross-witness type key is dropped with them. See PROVENANCE.md." } diff --git a/corpus/artifacts/g-2026-0002/observations/rvt-rs.json b/corpus/artifacts/g-2026-0002/observations/rvt-rs.json index 092f711..b221286 100644 --- a/corpus/artifacts/g-2026-0002/observations/rvt-rs.json +++ b/corpus/artifacts/g-2026-0002/observations/rvt-rs.json @@ -34,7 +34,7 @@ "IFCPRODUCTDEFINITIONSHAPE": 992, "IFCPROJECT": 1, "IFCPROPERTYSET": 854, - "IFCPROPERTYSINGLEVALUE": 5611, + "IFCPROPERTYSINGLEVALUE": 8435, "IFCRECTANGLEPROFILEDEF": 912, "IFCRELAGGREGATES": 3, "IFCRELCONTAINEDINSPATIALSTRUCTURE": 13, @@ -683,7 +683,7 @@ ] } }, - "observation_hash_sha256": "70f8df9dd188b7e42947bfa167b2810333b3d0dc4398019ea40570b7fcb87c24", + "observation_hash_sha256": "3c210a6f13192c2fb25b78140e5e0950b4b28bd2d136b21cfebc4d5f5d4b9993", "schema_version": "1.1.0", "semantic_surface_covered": [ "entity_counts",