diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e02c605 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +* text=auto eol=lf +*.cff text eol=lf +*.csv text eol=lf +*.dxf text eol=lf +*.json text eol=lf +*.md text eol=lf +*.mjs text eol=lf +*.nc1 text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.xlsx binary +*.zip binary diff --git a/CHANGELOG.md b/CHANGELOG.md index 45f5ce0..3b0f2e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,13 @@ All notable changes to public benchmark suites and sample assets are recorded here. Released dataset inputs are immutable; semantic input changes create a new suite version. -## Unreleased +## 1.0.1 - 2026-07-21 + +- Enforced LF line endings for generated and checksummed text assets so clean + Windows, macOS, and Linux checkouts reproduce the committed bytes. +- Added the confirmed public repository and canonical guide to citation metadata. + +## 1.0.0 - 2026-07-21 - Added the initial 13-case synthetic 1D suite and methodology v1. - Added synthetic DXF and DSTV/NC1 import fixtures. diff --git a/CITATION.cff b/CITATION.cff index 89e2a5e..78fe720 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -5,7 +5,10 @@ type: dataset authors: - name: Technodweep version: 1.0.0 +date-released: 2026-07-21 license: CC-BY-4.0 +repository-code: "https://github.com/technodweep/cutnesting-benchmarks" +url: "https://cutnesting.com/benchmarks/1d-cutting/" keywords: - cutting stock - nesting diff --git a/README.md b/README.md index 71266c2..122e372 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,12 @@ No reference-machine result is published yet. Development runs must remain clearly labeled as local diagnostics and must not be copied into marketing claims. See [results/README.md](results/README.md). +The current immutable dataset release is +[v1.0.1](https://github.com/technodweep/cutnesting-benchmarks/releases/tag/v1.0.1). +Release `v1.0.0` is superseded because Windows checkout line-ending conversion +prevented byte-for-byte template verification; benchmark case semantics did not +change in `v1.0.1`. + ## Licensing - Dataset cases, sample files, templates, and documentation: CC BY 4.0. See diff --git a/SHA256SUMS b/SHA256SUMS index ffdb714..a011cc3 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,53 +1,54 @@ 0320ed1ae154dac21719844b3b528eae7c4317145bcfe527047917755f957ddb datasets/1d/v1/cases/1d-kerf-exact-fit.json 053f4fb4b195271d458c8cffb3340dee3b90cbf577a4ade64babf73a559fe06f datasets/1d/v1/cases/1d-steel-fabrication.json -092be2892d2dfd6811947879bacbc17d73163a163b8bee4fa2f7e41379c8697f samples/dxf/unitless-rectangle.dxf 0af41137f18d762612180d83e5829e12b6c08c0cf8e48475ed14ce809af5ceb8 datasets/1d/v1/cases/1d-aluminium-profile.json 0d7fdb8681b884bd548e656d281453537d892269cc430e77531acb989fb8ca7b samples/README.md 10370f0d118b25a5845ab3272b3048d78ed431c85964319da538424d7c8e0787 datasets/1d/v1/manifest.json 110a2ea93050ba4e4c3e2844a3a80360a1834c34fa6c85140caa5ce1d1c5a33d datasets/1d/v1/cases/1d-asymmetric-trim.json -12b54b0d2f112eebbef39d13424b586574ec200a74dcb757c5deb472f77ec0f6 samples/nc1/radius-too-large.nc1 227d419d4d0bb2eeb7165f6aa69c25ac9c80ef0d6496fb8cfc2fb5cdd08a725e datasets/1d/v1/cases/1d-mixed-finite-stock.json 2291cdc07004e2ceeba3b68a061dc705f0c4e0d43a09e8574bd46a37aff08277 templates/1d-wood.csv 2e831894024b572c937b6910d640d750d05da7d551cadaf4443caa412ed18dfd datasets/1d/v1/cases/1d-offcut-threshold.json -33dd7fc4e34e876a32e8fd28760f66e909ba1e7de62d35c32ccc393ffbd16195 README.md -340f79e38c1e9c54e4c4f7fa7a10f779595171562b39d69b86b7ce04c3b5a708 samples/nc1/unsupported-profile.nc1 379c6258142310a26b56e19a12090219a7842230c93043add22165d92543ed8a datasets/1d/v1/cases/1d-oversized-cut.json 3872aa21644f029e59717c5d383b8f56cae2ddc46f714569658504c3f9b0e7ba CONTRIBUTING.md 389631286dcf8f56adac4738d308f494a2d5a07739ece075b328f523b2f0dfde templates/2d-sheet-and-plate.xlsx 3f9b228cb1790199f4f5d57c0c5273d0bc31afc56085cf84a45f18d62291c55a templates/definitions.json 4075b6de75729e73d7c885871b65ed82977f2cb410da0fda05a8a8ff3acfb12c datasets/1d/v1/cases/1d-high-piece-count.json +416bdf8ab60a5c061d0f03bb3b6b7ca72d3de33a13b0be2ce248d6905590af56 samples/dxf/self-intersection.dxf 469b6ae250e6ed87b69eb74c4a4465a5a115d4f9177f43ff05ea3f8c49305cba docs/dstv-nc1-supported-subset.md -4f057e5f5625c18c5c5f1abe368d98ffae0ea89ef0be4fa038ba30e6aa346500 CITATION.cff 530c7acb6679f73e273f6837c91113de1a4ac4f891340137186237e921238411 templates/1d-pipe.csv 54d511cc31cd3abf7bfcdff8b5375fbf6380d641e0613d6da74315ac35131fb0 templates/1d-aluminium.csv 575c34472b5be7655cec94cbf64e3cf10d4e1fbb48b3dd7379d1497d32f7c9d2 datasets/1d/v1/cases/1d-stock-exhausted.json 5c6a1002bfe7181ff28461564609d19833dd0619600949d5f19fa02adcc61d4d templates/README.md +61515a9f1f98ce6615cee16851055fb5ee0c6c1e8c8c461a99c960aeaef6a6c8 .gitattributes 62a4cd80cacd5038ee4db3aa59f2eb505f974911f8073f8e3b7aee466b65766a SECURITY.md 672ed6618f1e15138e5a7aa747c2a84671664ec83b5062c17f1d96f763ba9e53 methodology/v1.md 67ea1f3f5aa0366ba04cbfa4d40a7ddb6e51112cfb49e3cbf4b705f2473473b4 datasets/1d/v1/cases/1d-exact-fit.json 68bf7443fae19274bad90ab0ee55f571fb2387b2dbeb3cfa04bba408b1c4f3b5 schemas/1d-result.schema.json 7225ad3c3de17ec306e427b4f9880cddc19460f9e90bdb4443269ceb59a05239 datasets/README.md -7692b25145f8cca22f75134a24a81aefb6db8507b2115aaaa06d0a1829d0fbc8 CHANGELOG.md -77dfc7641646c9f915ee54d20bd0b1ea5d66d0c6eeffa8f743e1516deb22791c samples/dxf/self-intersection.dxf +754fe4464a7ea94ab81eebe10a69f07ccb27abace529301fab6673b2e98a648c samples/nc1/unsupported-profile.nc1 8403f1fc3b7e8f9d0bee935cbcdef1469007cb086256facc2cb89b1dbb57f405 results/README.md 8b616e1bb088f6fb56910aa453e74aaae1c5411928f8622b25374c3eec0d1e80 LICENSE 8c899cfafd3434d17c6b3530160924e6b3aae38c8247e02c17d151af0e8bfb4d scripts/generate-templates.mjs +8e4cbbe934b9f3f1ff4478ec7387ba22b042966c3df45b08d2e43cda7f2c771e samples/dxf/unsupported-entity.dxf 95f51b0bbfbcde9d53690fdf5055714a0b7ada002c76b799f907ef0e70c6b361 datasets/1d/v1/cases/1d-pipe-batch.json 965da75f235f334eb556cf63e12306627a1dad9ecc2ff05aed75be6f57292776 scripts/validate-repository.mjs 988e03e819c1fd5064f1a48e1cf72b9e11a5b1b067630234f4647363b69901f3 docs/repository-contract.md -9e7c7dad84df75e01601c22b4afa3458fd1553d0bfb93afb475c951079a18383 samples/dxf/unitless-open-contour.dxf +9cc055698c8c63b83eda5b2bdf21e57b49a80989365730438f9bc1fdeb349c9e samples/dxf/unitless-open-contour.dxf +9e47e498a7f75119e124d12613407228452a0beb4041086db8046020aade65da samples/nc1/radius-too-large.nc1 +a34257ca65ac5f44b99f05b2d180931de5796c0f78fea81d29d94987b16717d4 samples/dxf/layer-block-insert.dxf +a4980b24140bd58dda422718e4b189f208715976b670c33f257c224b20c9942f samples/nc1/plate-radius.nc1 aac5abb1eacaee94944a150db7d0facf886c71a26def8a36e4be7db3137f3bfc .gitignore -ba553dce6c7e6058ce11002f162bb8cf517d683fd08aaddb9cc4d5e192c0af57 package.json c4aa3a77b37562ab4206221aab32cf68a89c3de33f411533c08547097d61a7a2 templates/1d-steel.csv c680e32b10dee44df1f84b3f57e8c7c75591e01ee2686ffc53ec9ce7e05e25dc datasets/1d/v1/cases/1d-cost-tradeoff.json -c69cab60731a7e60036138b23e57b7a2f842475692fad5132df695f4e6068427 scripts/verify-checksums.mjs +c835f63b88d549850553fb6c9ffe01c3c9cfc197b6a3c74334deeb6cc2c8f896 package.json cb1136ac89f569865b72f8af974ec059abe7914013f0c32f1396d8b99e874a28 schemas/1d-case.schema.json cb6c36568a75c8d10b06ec7d8731789e56023b11cc8d498cfca57703c13a9ad1 datasets/1d/v1/cases/1d-wood-furniture.json -cec44b1e590e04b98c94fe10b58e7f2ceef9a8e38c44c502fe7fa68c4eb993e4 samples/dxf/layer-block-insert.dxf -d06f3820426f42512831c0bafa3a82dfc26525ed72e3edffec02f53e37ad5e48 samples/nc1/plate-radius.nc1 +d4a1e22458b89677bdffa737876f92e78fef7fc7afcca7d70343872f7bda6121 README.md d52a2c32095f4035f5d23002f14a2310548ee469f1a9175a8c893362f653fbc6 schemas/manifest.schema.json -d8c42e7b49d05cd04a59481dd71d87654bbf2592ed8cd7cf3cd5bd86b365e432 samples/dxf/unsupported-entity.dxf +da697e0db4946a0c42bb8aa4aa8c65546561ec8434fc52ead383804fb087fcce CHANGELOG.md +e5067d3ddbfbffc4a53bc184199a1ff67c64bac88c83ce3fb9b4549010f40d85 CITATION.cff e603eb378f7453f5e14ce87bc5ea0285b93f0fbce3a6edb225190df987ebdace samples/manifest.json e6dc9fea66d59eb62cdc747718fc784bb962952ff7501280b15ba6472042fc36 templates/2d-sheet-and-plate.csv f1ce8f5048968c79ad8e7406696389708e3fb51ee08626b23a80916b9e5d1984 LICENSE-DATA.md +f27e13aa8a94fc76ce4766ed9f3910ad00e28cfd48d6ff42177e11dc799cc65a scripts/verify-checksums.mjs +f839d9a035286c9dddde94329a0bbffd0d0880eaf985687b1588cf1020c17866 samples/dxf/unitless-rectangle.dxf ff9ea556c36d48d767b4d6f87f9aa61e58248e8683fa90d3ee4a8c7ff0d0604a .github/workflows/validate.yml diff --git a/package.json b/package.json index 652f0f4..6d5fbb5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cutnesting-benchmarks", - "version": "1.0.0", + "version": "1.0.1", "private": true, "type": "module", "description": "Public benchmark datasets and sample files for cutting and nesting workflows.", diff --git a/scripts/verify-checksums.mjs b/scripts/verify-checksums.mjs index f9fcb9f..a66eade 100644 --- a/scripts/verify-checksums.mjs +++ b/scripts/verify-checksums.mjs @@ -31,6 +31,7 @@ if (write) { } if (actual !== expected) { console.error("SHA256SUMS is missing or stale."); + reportDifference(actual, expected); console.error("Run npm run generate:checksums and commit the result."); process.exitCode = 1; } else { @@ -38,9 +39,20 @@ if (write) { } } +function reportDifference(actual, expected) { + const actualLines = new Set(actual.split(/\r?\n/u).filter(Boolean)); + const expectedLines = new Set(expected.split(/\r?\n/u).filter(Boolean)); + const missing = [...expectedLines].filter((line) => !actualLines.has(line)); + const stale = [...actualLines].filter((line) => !expectedLines.has(line)); + + for (const line of missing) console.error(`Expected: ${line}`); + for (const line of stale) console.error(`Found: ${line}`); +} + async function walk(directory) { const output = []; for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.name === ".git") continue; if (entry.isDirectory() && ignoredDirectories.has(entry.name)) continue; const path = join(directory, entry.name); if (entry.isDirectory()) output.push(...(await walk(path)));