windcheck v0.1.0-beta
Pre-releaseBeta release of windcheck: a label-free transverse self-intersection census
for scroll segmentations, and a certified transform that removes the contacts
it finds.
Result
179 of 185 pinned traces emit reload-verified tifxyz outputs with zero
non-adjacent transverse contacts under both canonical triangulations — 154
transformed, 25 already clean — retaining 99.505% of represented surface
area. Every output was independently re-censused and certified: no mesh is
certified on the strength of the run that produced it. It is reloaded from disk
and censused again from scratch.
The remaining 6 traces are not censusable and are recorded as such in the index,
with the reason attached to each.
Corpus: five scrolls — Scroll 1 (55 segments), Scroll 5 (53), PHerc1667 (20),
PHerc0139 (38), PHerc0814 (19). Each segment is pinned to exactly one base
geometry and one volume.
What "clean" means here
One definition, used everywhere: the mesh, censused by engines/selfcross under
both quad triangulations (diagonal 0 and diagonal 1), with Chebyshev
adjacency exclusion so that quads sharing a corner are never reported against
each other, yields zero non-adjacent transverse contacts. Census parameters are
recorded in the index: cell 40.0, maxedge 60.0, exclude 1,
touch_tol 0.001, diagonals [0, 1].
This is a contact predicate, not a proximity threshold. An embedded surface
cannot pass through itself however tightly it is packed, so there is no distance
to argue about.
Quickstart
uv sync
clang++ -O3 -std=c++17 -pthread -o engines/selfcross engines/selfcross.cpp1. Audit a segment (report-only; never modifies anything)
uv run windcheck check data/scroll5_tifxyz/20251205115859-w094_20251205115859448_flatboi \
--volume 20241024131839 --out out/check/w094Prints a verdict, writes a machine-readable certificate, and emits a
viewer-loadable PointCollection of the crossing sites so they can be opened
directly in VC3D. On this segment: not clean, 4 transverse contacts under
diagonal 0 and 7 under diagonal 1, in 0.2 s.
2. Transform a segment (explicit, opt-in)
uv run windcheck transform data/scroll1_tifxyz/20231005123336 \
--out out/transform/20231005123336transform exits non-zero unless the reloaded output censuses clean, which
makes it usable as a post-export regression test or a CI gate.
Updated 31 July. The point collections this tool emitted were missing the
vc_pointcollections_json_versionenvelope that volume-cartographer's
PointCollectionsloader requires, so they could not be opened in VC3D. Fixed,
and the 38 published overlays were migrated in place. Geometry, censuses,
meshes, hashes and retention figures are unaffected; the source-tree digest
changes because the source did, and the superseded value is recorded in
out/release/index.json. The attached archives contain no overlays and are
unchanged. Also updated: check certificates now state the valid-vertex
count under both this tool's rule and the upstream loader's stricter one
(it discardsz <= 0before masking), and emitted meshes carry a
meta.jsonbbox recomputed from the points they contain rather than
inherited. Neither changes a census, mesh, hash or retention figure.
Auditing data published elsewhere
The same census was run over the entire verified_patches dataset for
PHercParis4: 84,316 patches, 96,715,651 valid cells, 40 minutes on one laptop,
no GPU. 84,311 are transverse-clean; five self-intersect, against 527 expected
at the rate published traces of the same scroll self-intersect when cut to the
same size. All five share one cause, a fold within two cells of the patch
boundary, and one cell of erosion clears every one of them.
Patches are also tested in pairs, because a per-patch verdict says nothing about assembly: of 459 box-overlapping pairs of individually clean patches, 10 interpenetrate, and 93.6% of those contacts are shallower than 10°. The failure mode is two patches disagreeing about where the same sheet is, not a sheet folding through itself.
Method, baseline and limits: docs/PATCH-AUDIT.md.
The per-patch records, one JSON object per patch with per-file SHA-256, are
attached as windcheck-patch-audit-records.jsonl.gz.
Provenance
Certificates cite no commit sha — a reader cannot check one. They cite a
source-tree digest recomputable from the published files alone:
source_tree_digest 63e65ca1cd17a19284ebbfdf179691b6ec3b4251f30f0fd56b909d00036c5553
files 81
code_version 0.1.0
policy_version round28-greedy-first-v1
policy_hash 26296e23cb4d08e4
Verify it against a checkout of this tag:
uv run python -m windcheck.provenance --verify 63e65ca1cd17a19284ebbfdf179691b6ec3b4251f30f0fd56b909d00036c5553Reading the results
- Released index, one entry per segment with hashes, dispositions, retention and
census outcomes:out/release/index.json - Corpus definition, selection rules and the two retention denominators:
docs/CORPUS.md - Step-by-step reproduction:
docs/REPRODUCE.md - Which files produce these claims, which are supporting utilities, and which
are retired experiments kept only because the digest covers them:
docs/HISTORY.md
Attached artifacts
One archive per scroll, containing that scroll's transformed meshes, per-segment
excision and repair certificates, run logs, and the shared corpus metadata. Each
archive carries an internal MANIFEST.json listing every file with its size and
SHA-256, and each ships with a .sha256 file for the archive itself.
| Archive | Bytes | SHA-256 |
|---|---|---|
windcheck-v0.1.0-beta-scroll1.tar.gz |
671,682,944 | c48de898ddcd2a190652b564babf089b764f539b103220528b468e1ae7e0afe6 |
windcheck-v0.1.0-beta-scroll5.tar.gz |
284,354,686 | f8487ba80ec057d91588447001152f5258545f4f82a85b13ef1533b45bd1346f |
windcheck-v0.1.0-beta-pherc1667.tar.gz |
103,373,889 | 23cc179150c1154c7a47efef2a5ded682a6048122073ed6f2e586edba0732287 |
windcheck-v0.1.0-beta-pherc0139.tar.gz |
33,904,258 | e03a92ea8d0f3ba1e58db7ca3ae2b36c379532bdd6f2b207df320472e9677da6 |
windcheck-v0.1.0-beta-pherc0814.tar.gz |
14,480,684 | f65230aaa6bfeb5b255be7460f2ddb749194b4772a5397b646285baf1ac07357 |
windcheck-v0.1.0-beta-repaired-bases.tar.gz |
16,903,620 | 416483d8461b6d8068d0199afe2de7f0484fcde5aa13cd28b2ee2be6bc33104c |
windcheck-patch-audit-records.jsonl.gz |
16,237,287 | a94c8d5cefba775d79063e464966e84dc19d2df5fcf4b3c7f2ed1d216d319ee9 |
A sixth archive carries the six segments that were already clean on a
displacement-repaired base. No cut was made on them, so they have no mesh in
the per-scroll archives, and the published original is not their certified
geometry. It holds the repaired mesh for each, with the certificate that
produced it and the census that found it clean, and a manifest.json whose
hashes match the input_hashes those segments carry in the index.
Paths inside each per-scroll archive are relative to the repository root, so
extracting one over a checkout puts every file where the index expects it. The
repaired-bases archive is laid out by scroll and segment instead, because those
meshes have no place in the excised corpus tree.
Source data is Vesuvius Challenge open data and is not redistributed here;
data/MANIFEST.json records the exact keys and hashes.