Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions SPEC.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -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.
Expand Down
12 changes: 6 additions & 6 deletions corpus/MANIFEST_INDEX.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,26 @@
"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"
},
{
"alias": "magnetar-2024-core-interior-slim",
"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"
Expand Down
39 changes: 27 additions & 12 deletions corpus/artifacts/g-2026-0001/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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": [
Expand All @@ -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",
Expand Down Expand Up @@ -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."
Expand Down
3 changes: 2 additions & 1 deletion corpus/artifacts/g-2026-0001/observations/ifc-lite.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@
"IFCPROPERTYSET": 25,
"IFCROOF": 0,
"IFCSHADINGDEVICE": 1,
"IFCSLAB": 0,
"IFCSPACE": 0,
"IFCUNITASSIGNMENT": 1,
"IFCWALL": 0,
"IFCWINDOW": 0
},
"ifc_schema": "IFC4"
},
"observation_hash_sha256": "8cf4046509bb788406e93261f0dcb10708fbf33ae195d12f8ddc99b41a93398f",
"observation_hash_sha256": "f8fef6590eb29b00247f511314b30b759f6f5b35489bab7ec125bf660792eebe",
"schema_version": "1.0.0",
"semantic_surface_covered": [
"entity_counts"
Expand Down
3 changes: 2 additions & 1 deletion corpus/artifacts/g-2026-0001/observations/ifcopenshell.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@
"IFCPROPERTYSET": 25,
"IFCROOF": 0,
"IFCSHADINGDEVICE": 1,
"IFCSLAB": 0,
"IFCSPACE": 0,
"IFCUNITASSIGNMENT": 1,
"IFCWALL": 0,
"IFCWINDOW": 0
},
"ifc_schema": "IFC4"
},
"observation_hash_sha256": "8cf4046509bb788406e93261f0dcb10708fbf33ae195d12f8ddc99b41a93398f",
"observation_hash_sha256": "f8fef6590eb29b00247f511314b30b759f6f5b35489bab7ec125bf660792eebe",
"schema_version": "1.0.0",
"semantic_surface_covered": [
"entity_counts"
Expand Down
39 changes: 20 additions & 19 deletions corpus/artifacts/g-2026-0001/observations/rvt-rs.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -47,33 +48,33 @@
"exported_building_elements": {
"IFCCOLUMN": 256,
"IFCDOOR": 132,
"IFCSLAB": 64,
"IFCSHADINGDEVICE": 20,
"IFCSLAB": 80,
"IFCSPACE": 18,
"IFCWALL": 360,
"IFCWINDOW": 6
},
"material_count": 102,
"storey_count": 11
},
"observation_hash_sha256": "d88897c6d9b8223350a831f4caf48d76d469a4d4f47815da56da6d34e9364fb7",
"observation_hash_sha256": "881da721e4ec87d7cf03424620b7595dea5fcce4f559a6246d562fa3a47ba9a4",
"schema_version": "1.0.0",
"semantic_surface_covered": [
"entity_counts"
],
"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)."
],
Expand Down
17 changes: 12 additions & 5 deletions corpus/artifacts/g-2026-0001/verdict.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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": {
Expand Down Expand Up @@ -99,7 +106,7 @@
"entity_counts.IFCUNITASSIGNMENT"
],
"status": "PASS",
"verdict_hash_sha256": "ae4679f6044a4c3caa0b2f3a6030648bc633b1d878957a759120f011f71ded5e",
"verdict_hash_sha256": "94d723919686963121c05c7475c3ea126e9f8d97fa4b9136c6e5656421c8b40a",
"witnesses_compared": [
"ifc-lite",
"ifcopenshell",
Expand Down
Loading