diff --git a/dancer/README.md b/dancer/README.md index 4b8793f5..5a247620 100644 --- a/dancer/README.md +++ b/dancer/README.md @@ -53,13 +53,21 @@ This command assembles art with the byte-preserved `config-before-setup-order.js Both shoulders are compared to the same painting without changing PNG bytes. The right upper-arm part carries the extra contour and stays behind the torso at setup. Whole-right-arm keys start at crossed frame 0, elbow-positive frame 46 and shoulder-in frame 8 on the 12 fps grid, with the forearm directly under the upper arm. During those holds the contour returns in the accepted order; lifting the forearm alone was rejected for introducing a filled sleeve patch. The five earlier left-front key times remain; all offsets are recomputed for the frozen setup order. Both opposite-arm contributor loss and each same-arm contributor reassignment measure zero against the accepted build at matching frames over all 19 clips at 12 fps. The two earlier sleeve/chest key-boundary pops remain recorded nonblockers, and thigh-out viewport clipping remains out of scope. Setup-painting readings for each shoulder are informational, with per-slot values in the current provenance record. -The adopted canonical producer bytes are in `producer/rig/`. A fresh rebuild and byte/RGBA inventory comparison runs as: +The adopted canonical producer bytes are in `producer/` (`parts.json` and 28 unpadded part PNGs under `producer/parts/`, plus `rig.json`, `motion.json`, `mesh_report.json` and 28 4 px-padded rig images under `producer/rig/`). Carrying `producer/parts.json` and `producer/parts/` allows the `rig` stage to be re-run directly from a clean checkout without re-assembling: + +```sh +rig-parts rig --config dancer/config.json --parts dancer/producer --out work/rig +``` + +(`meshes.bottomwear.explicit.image_sha256` in `config.json` is `bf18e918b65b666d6ea8f90fa4770e9a5a9f59f144e9172a05e9a68694c0d963`, the SHA-256 of the unpadded `209x205` decoded RGBA buffer of `producer/parts/bottomwear.png`, where `@rig-c/parts@1.64.0`'s `pushBackFringe` cleared 19 fringe pixels over `thigh_r` (18 px) and `thigh_l` (1 px); `producer/rig/images/bottomwear.png` is the `217x213` 4 px-padded PNG written by `rig`, whose file SHA-256 is `2c9aea3750d0cc5c8e769f0b3948ca7311cfef470b31fd2d698c722fc0ba5d79` and whose interior `209x205` decoded RGBA buffer has the same `bf18e918b65b...` hash. Post-`rig-c/parts#791` assembly skips `pushBackFringe` across `turnMovingPartPair` physics-bound parts, leaving those 19 fringe pixels on `bottomwear` with decoded RGBA SHA-256 `a9faf2ac32a3dfd687816fda8a10bbed06eaa06bf3a35bc64a1687e9c37fa0ed`.) + +A fresh rebuild and byte/RGBA inventory comparison runs as: ```sh bun tools/verify-producer.mjs --out work/fresh-producer ``` -Choose a new output directory for each rebuild. The verifier refuses changed/missing files, changed decoded PNG pixels, a red check, or changed active config/package pins. It verifies all 31 producer files; it does not claim the original accepted dance can be played on this different producer rig. +Choose a new output directory for each rebuild. The verifier refuses changed/missing files, changed decoded PNG pixels, a red check, or changed active config/package pins. It verifies all 60 producer files; it does not claim the original accepted dance can be played on this different producer rig. The current frozen producer install pins `@rig-c/parts` 1.64.0, direct `rig-c` 2.67.2 and official `@esotericsoftware/spine-core` 4.3.13. Parts resolves its own compatible rig-c 2.70.0, recorded in `bun.lock`; that is the compiler its build/check invokes. The new Nova producer runs use Bun 1.4.4. Historical dance replay keeps its separate frozen package pins. `check-inputs.py` checks file hashes and config/map closure; it does not render or establish rig correctness. diff --git a/dancer/build.sh b/dancer/build.sh index 6348f769..bb29e300 100644 --- a/dancer/build.sh +++ b/dancer/build.sh @@ -4,4 +4,6 @@ set -eu python3 check-inputs.py out=${1:-work/build} sh build-setup-order-candidate.sh "$out" -exec bun --bun run work/runtime/node_modules/.bin/rig-parts check --rig "$out/rig" --parts "$out/assemble/rig" --requirements requirements.json --out "$out/check" +cp "$out/assemble/rig/parts.json" "$out/parts.json" +cp -R "$out/assemble/rig/parts" "$out/parts" +exec bun --bun run work/runtime/node_modules/.bin/rig-parts check --rig "$out/rig" --parts "$out" --requirements requirements.json --out "$out/check" diff --git a/dancer/check-inputs.py b/dancer/check-inputs.py index 6dac80de..8e2b0e40 100644 --- a/dancer/check-inputs.py +++ b/dancer/check-inputs.py @@ -56,4 +56,5 @@ for file,row in current['files'].items(): data=(Path('producer')/file).read_bytes() assert len(data)==row['bytes'] and hashlib.sha256(data).hexdigest()==row['sha256'], 'PRODUCER_FILE_HASH: '+file + assert current['files']['parts/bottomwear.png']['rgba']['sha256']==json.loads(Path('config.json').read_text())['meshes']['bottomwear']['explicit']['image_sha256'], 'PRODUCER_EXPLICIT_PART_RGBA_HASH: bottomwear' print('PRODUCER CLOSURE PASS: canonical adopted file bytes and active config/package pins.') diff --git a/dancer/producer-manifest.json b/dancer/producer-manifest.json index 6e08af0a..94b3526e 100644 --- a/dancer/producer-manifest.json +++ b/dancer/producer-manifest.json @@ -3,6 +3,262 @@ "configSHA256": "d53c0670a92ce1cce883aa18eae230b1fb8af3f35d6531d92d6063826fa7e093", "packageSHA256": "7dbfb6bdb3bc5a1479d69c5d157202bf7cf574ffe1a7240eb1fed94d9079781a", "files": { + "parts.json": { + "bytes": 16502, + "sha256": "4d1329716e1e1ca233e47e4fbb85fc692af3d9b13fdff08b0c53570f4ef71a96" + }, + "parts/bottomwear.png": { + "bytes": 53433, + "sha256": "9fc726f47c63b2ff9717a148d46e17c89fc2b95de47b73e9f6706af0d9c3c7eb", + "rgba": { + "width": 209, + "height": 205, + "sha256": "bf18e918b65b666d6ea8f90fa4770e9a5a9f59f144e9172a05e9a68694c0d963" + } + }, + "parts/brow_l.png": { + "bytes": 295, + "sha256": "ec9174cd2283ed0cedc6bcef2dbaebd2481fdaa544b91703887e244c910a506d", + "rgba": { + "width": 28, + "height": 4, + "sha256": "4c89b03f3693f1eabc478e05bdc45c926e29a09754314f2b9e993ca2af1873b6" + } + }, + "parts/brow_r.png": { + "bytes": 217, + "sha256": "7d840eb396f019bc0c14c7558f7544032ba1f13568049146e551b143e2e02441", + "rgba": { + "width": 23, + "height": 5, + "sha256": "177b5acab1aba6f01e1372bba9249f90cd8140c6d17705d5f4236b8173dfea34" + } + }, + "parts/ear_l.png": { + "bytes": 1775, + "sha256": "68b988b1ab9090426a66bff11ac8c87f8861ac9642641f42e2ca9350cd6a162d", + "rgba": { + "width": 21, + "height": 34, + "sha256": "13447b88840dda3dad54ef491b79868a572b8a0d8d2ea7329595b430f61e5800" + } + }, + "parts/ear_r.png": { + "bytes": 1888, + "sha256": "e8919ba8e262878357f08bf538f1133a2cf416d079192b1791c200f7fd6f807a", + "rgba": { + "width": 22, + "height": 34, + "sha256": "72141c6155ff5acde3ba9ca3b17784d86f600b65721c8c4578eeb0c4889ab13c" + } + }, + "parts/eyewhite_l.png": { + "bytes": 1519, + "sha256": "74f1ba6a3565eacda6f6304668f475b1a040b5f90f3dbc69dadd8944edbee5b0", + "rgba": { + "width": 32, + "height": 23, + "sha256": "b9da7929343896630f34269bec57216c8d50bad910856fffe4f67d32152cc59a" + } + }, + "parts/eyewhite_r.png": { + "bytes": 1479, + "sha256": "db6145c620a6a2f1b3f747b2dc274ee5203eca86199de8239e3adf514bc6a505", + "rgba": { + "width": 29, + "height": 23, + "sha256": "458559f454ba046c441df659b012eb10809d20ec5202399fd935c5d78febbf45" + } + }, + "parts/face.png": { + "bytes": 16735, + "sha256": "d3613cc8c97267e629abb243ba1f4085a7b11f435b6aeb5e7ee6889982e4b549", + "rgba": { + "width": 106, + "height": 128, + "sha256": "f4798d17fd949915f0872864061c01107386c9d192023133f6690857e8888a88" + } + }, + "parts/forearm_l.png": { + "bytes": 33460, + "sha256": "f4c121b2b83cd66ac243572096dff312fa809fa2568e664d3d4f92e95571522d", + "rgba": { + "width": 162, + "height": 217, + "sha256": "ed7f627e413a76f7194d07f236459ecd302322dabc4a529df0b0cd633512fdf5" + } + }, + "parts/forearm_r.png": { + "bytes": 36187, + "sha256": "056e030ee19ee7a70516310cbb38c29afab55237559a6da9ba49d2fc6c3b4c7e", + "rgba": { + "width": 168, + "height": 227, + "sha256": "3079bcd4a8a96b156473a7f088f8c94ffbdfa0a3b29bac0845caea6ee73ebd13" + } + }, + "parts/hair_back.png": { + "bytes": 32985, + "sha256": "7add7a5339538a8e366339dfe50282360cca7508d9ed9191443b5fec9a08578e", + "rgba": { + "width": 136, + "height": 202, + "sha256": "72bd6adb36f37ccbd1750d391a0f13966201f1aa757ea22a7a342c265ef75aa9" + } + }, + "parts/hair_front.png": { + "bytes": 32344, + "sha256": "983c6b7240fce7a0a5870dfb3611e3c9abc9f6fb07803f4d2082cadb53ce828c", + "rgba": { + "width": 143, + "height": 187, + "sha256": "1fadcd19e25c2e4f7742f7643d5bee1ca89f84f56bc95a84a75987b275cd8a3f" + } + }, + "parts/hairpin.png": { + "bytes": 6736, + "sha256": "13f73a0b25dec14d090c0bea2efed8e70e77408e81208ea0a184d7d37716b19b", + "rgba": { + "width": 83, + "height": 34, + "sha256": "928be71deb0066fd2454afdf2f6347f77df3b677c40ae983416ca5ed7d6fe5e9" + } + }, + "parts/iris_l.png": { + "bytes": 1382, + "sha256": "a48c2573b57e71672fca5272ac2fd05d0233c0ae8fa6194adbe951ba2f53556d", + "rgba": { + "width": 19, + "height": 22, + "sha256": "d1d2e77968bf8997b56138f82b634384fa09c193997dfe82b39b0420b83d2944" + } + }, + "parts/iris_r.png": { + "bytes": 1426, + "sha256": "2af3a5485e5e5e39a31e377cad3ae480fecb6ae5046040c1265f4ef372a6c22f", + "rgba": { + "width": 21, + "height": 22, + "sha256": "22b4276067a276dea69b6a9ae3efcf6a26f42d464ce6c4af4a0c21d4a7505382" + } + }, + "parts/lash_l.png": { + "bytes": 1319, + "sha256": "978b195e316642497bc52559d2238e9fdb7387ae129293b6ff3e879e215285cf", + "rgba": { + "width": 36, + "height": 27, + "sha256": "5924b2f3b78ad0b529a00fb77b28f4ff48d59ec43ce7332efb8832b0f2c2fcc3" + } + }, + "parts/lash_r.png": { + "bytes": 1362, + "sha256": "a230d8268a474213cec2b481f3d7809940d14722d8ad6325f29db6fed75d95a9", + "rgba": { + "width": 37, + "height": 31, + "sha256": "e50a490c9302404cec6fe7b767610e327ce13e676f0e413949e85b813eb96f54" + } + }, + "parts/mouth.png": { + "bytes": 614, + "sha256": "721921c0c54af947ba8732c4e49235d11da70b2beedfe0e49c5ce8217c1adcf1", + "rgba": { + "width": 158, + "height": 90, + "sha256": "7ebb75e0a0381d76b4d52be04457d26f8665489826c2173e59a0599a93360533" + } + }, + "parts/neck.png": { + "bytes": 3676, + "sha256": "517cb2591329a061df6cfbf806d43d750ff07faf7579122dc21458df9b8b4edf", + "rgba": { + "width": 45, + "height": 71, + "sha256": "309923e42b0b3e46a0460408a0099b0d772a916ff63504bd3beca54964a8bcb6" + } + }, + "parts/shins.png": { + "bytes": 56686, + "sha256": "b47ce22da3ea90aab5df1f3622c2ee122f98e196e42eaa8a1e0e8f72722e21b3", + "rgba": { + "width": 174, + "height": 284, + "sha256": "969feaa942cc4da6c9240fb78145c2710bc9418e79caeee8848255630c800aee" + } + }, + "parts/shoe_l.png": { + "bytes": 16886, + "sha256": "f84a2fc0f31cc99a72d08f0c7d4ce4e7c2cf48ab56b5e93707035c5ddb2f8aa8", + "rgba": { + "width": 66, + "height": 108, + "sha256": "9b98c92a274dd3f10ea0220de26fe4fe192f4da06bf34ceb093c4a3589d1492c" + } + }, + "parts/shoe_r.png": { + "bytes": 16906, + "sha256": "07b881ffff56b07ca9e5ae26118082926676eac51bc865b3ac3b9501c185f898", + "rgba": { + "width": 66, + "height": 107, + "sha256": "de796bccccfc380b4f5f03ccf38da34717197724a8a88814cbfeb4bb38bc4625" + } + }, + "parts/sleevefront_l.png": { + "bytes": 3240, + "sha256": "810313dc87c6d5addd40338979683654bceef79cdfee1dabcdf87258d809dfea", + "rgba": { + "width": 19, + "height": 84, + "sha256": "906e7398c94c533daa9ee053d759fdbd7cf9b49c7541387fd17031a034dcd1ad" + } + }, + "parts/thigh_l.png": { + "bytes": 25558, + "sha256": "4c24fb4213c1c9a47490f6deec8768fa9e7c3931e40a44c91391083655bb2aba", + "rgba": { + "width": 80, + "height": 233, + "sha256": "c3e671fb7d23bd7b70197680e3d06890661d4a1723cc624e8595e5fa8aac502e" + } + }, + "parts/thigh_r.png": { + "bytes": 25548, + "sha256": "f5e3d263167c871e36c20e855b69d1f7167d4cec6a8941fe576b571e091d76bd", + "rgba": { + "width": 83, + "height": 233, + "sha256": "904ece9f63148389a4d51157e22a8a433a482aad6efcb69116d6f72956d15a19" + } + }, + "parts/topwear.png": { + "bytes": 65231, + "sha256": "e316e517d45eba3a36bcbbca9a95f4ed3fac2f7ae0b651d9a7e676b879a7e65a", + "rgba": { + "width": 160, + "height": 198, + "sha256": "dba6e7e0862537e4156b63b494ca6ba7b163c392ebccb2c6630861f1c98025c8" + } + }, + "parts/upperarm_l.png": { + "bytes": 23372, + "sha256": "cda8d67951a4b730525f91337b382038a4321e5b1bc6b87119ec69a615afe14b", + "rgba": { + "width": 105, + "height": 167, + "sha256": "0b22df922bdca826cd5cc831c443ba4bf25743789810ffa5f0141aa8ee05580e" + } + }, + "parts/upperarm_r.png": { + "bytes": 23781, + "sha256": "6be8e4ba54ba505e6b1b27030fc93afdd9dfcd6acdaec806eb96743d93788865", + "rgba": { + "width": 105, + "height": 156, + "sha256": "08629f872e9948a94e67020945f6bd692c0aa12430fd626aa77e4773241e3a8e" + } + }, "rig/images/bottomwear.png": { "bytes": 53567, "sha256": "2c9aea3750d0cc5c8e769f0b3948ca7311cfef470b31fd2d698c722fc0ba5d79", diff --git a/dancer/producer/parts.json b/dancer/producer/parts.json new file mode 100644 index 00000000..6f27e60a --- /dev/null +++ b/dancer/producer/parts.json @@ -0,0 +1,777 @@ +{ + "rig_size": [ + 832, + 1216 + ], + "scale_rig_per_source": 0.5, + "parts": [ + { + "name": "hair_back", + "from": "head:back hair", + "x": 349, + "y": 75, + "w": 136, + "h": 202, + "opaque_px": 19131, + "visible_px": 3401, + "occluded_px": 15730, + "projected_core_px": 1606, + "source_px_taken": 1606, + "visible_not_projected_px": 1795, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 3 + }, + { + "name": "shins", + "from": "full:legwear", + "x": 329, + "y": 797, + "w": 174, + "h": 284, + "opaque_px": 23820, + "visible_px": 20097, + "occluded_px": 3723, + "projected_core_px": 15543, + "source_px_taken": 15508, + "visible_not_projected_px": 4589, + "refused_drift_px": 35, + "merged_px": 0, + "seam_override_px": 25 + }, + { + "name": "thigh_r", + "from": "full:legwear", + "cut_from": "shins", + "x": 329, + "y": 592, + "w": 83, + "h": 233, + "opaque_px": 14682, + "visible_px": 9998, + "occluded_px": 4684, + "projected_core_px": 8213, + "source_px_taken": 8212, + "visible_not_projected_px": 1786, + "refused_drift_px": 1, + "merged_px": 0, + "seam_override_px": 1 + }, + { + "name": "thigh_l", + "from": "full:legwear", + "cut_from": "shins", + "x": 422, + "y": 592, + "w": 80, + "h": 233, + "opaque_px": 14455, + "visible_px": 9887, + "occluded_px": 4568, + "projected_core_px": 8152, + "source_px_taken": 8152, + "visible_not_projected_px": 1735, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0 + }, + { + "name": "shoe_l", + "from": "full:footwear", + "x": 429, + "y": 1053, + "w": 66, + "h": 108, + "opaque_px": 5311, + "visible_px": 5311, + "occluded_px": 0, + "projected_core_px": 3830, + "source_px_taken": 3818, + "visible_not_projected_px": 1493, + "refused_drift_px": 254, + "merged_px": 0, + "seam_override_px": 62, + "fringe_pushed_back": [ + { + "part": "shins", + "px": 5 + } + ] + }, + { + "name": "shoe_r", + "from": "full:footwear", + "cut_from": "shoe_l", + "x": 337, + "y": 1053, + "w": 66, + "h": 107, + "opaque_px": 5354, + "visible_px": 5354, + "occluded_px": 0, + "projected_core_px": 3822, + "source_px_taken": 3821, + "visible_not_projected_px": 1533, + "refused_drift_px": 260, + "merged_px": 0, + "seam_override_px": 50, + "fringe_pushed_back": [ + { + "part": "shins", + "px": 3 + } + ] + }, + { + "name": "neck", + "from": "head:neck", + "x": 393, + "y": 256, + "w": 45, + "h": 71, + "opaque_px": 2612, + "visible_px": 26, + "occluded_px": 2586, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 26, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0 + }, + { + "name": "bottomwear", + "from": "full:bottomwear", + "x": 311, + "y": 464, + "w": 209, + "h": 205, + "opaque_px": 31283, + "visible_px": 31200, + "occluded_px": 83, + "projected_core_px": 27883, + "source_px_taken": 27883, + "visible_not_projected_px": 3317, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 1, + "fringe_pushed_back": [ + { + "part": "thigh_r", + "px": 18 + }, + { + "part": "thigh_l", + "px": 1 + } + ] + }, + { + "name": "forearm_l", + "from": "full:handwear-l", + "x": 488, + "y": 429, + "w": 162, + "h": 217, + "opaque_px": 12173, + "visible_px": 9687, + "occluded_px": 2486, + "projected_core_px": 7061, + "source_px_taken": 7061, + "visible_not_projected_px": 2626, + "refused_drift_px": 3, + "merged_px": 0, + "seam_override_px": 22 + }, + { + "name": "forearm_r", + "from": "full:handwear-r", + "x": 178, + "y": 418, + "w": 168, + "h": 227, + "opaque_px": 13146, + "visible_px": 10776, + "occluded_px": 2370, + "projected_core_px": 8023, + "source_px_taken": 8023, + "visible_not_projected_px": 2753, + "refused_drift_px": 7, + "merged_px": 0, + "seam_override_px": 41 + }, + { + "name": "sleevefront_l", + "from": "full:handwear-l", + "cut_from": "forearm_l", + "x": 450, + "y": 329, + "w": 19, + "h": 84, + "opaque_px": 868, + "visible_px": 868, + "occluded_px": 0, + "projected_core_px": 547, + "source_px_taken": 375, + "visible_not_projected_px": 493, + "refused_drift_px": 205, + "merged_px": 0, + "seam_override_px": 216, + "fringe_pushed_back": [ + { + "part": "topwear", + "px": 32 + } + ] + }, + { + "name": "upperarm_r", + "from": "full:handwear-r", + "cut_from": "forearm_r", + "x": 273, + "y": 318, + "w": 105, + "h": 156, + "opaque_px": 8761, + "visible_px": 8761, + "occluded_px": 0, + "projected_core_px": 7266, + "source_px_taken": 7246, + "visible_not_projected_px": 1515, + "refused_drift_px": 124, + "merged_px": 0, + "seam_override_px": 160, + "fringe_pushed_back": [ + { + "part": "topwear", + "px": 72 + } + ] + }, + { + "name": "upperarm_l", + "from": "full:handwear-l", + "cut_from": "forearm_l", + "x": 458, + "y": 319, + "w": 105, + "h": 167, + "opaque_px": 8825, + "visible_px": 8825, + "occluded_px": 0, + "projected_core_px": 7504, + "source_px_taken": 7494, + "visible_not_projected_px": 1331, + "refused_drift_px": 140, + "merged_px": 0, + "seam_override_px": 149, + "fringe_pushed_back": [ + { + "part": "topwear", + "px": 50 + } + ] + }, + { + "name": "topwear", + "from": "full:topwear", + "x": 336, + "y": 279, + "w": 160, + "h": 198, + "opaque_px": 25245, + "visible_px": 18932, + "occluded_px": 6313, + "projected_core_px": 16303, + "source_px_taken": 16295, + "visible_not_projected_px": 2637, + "refused_drift_px": 107, + "merged_px": 0, + "seam_override_px": 73, + "fringe_pushed_back": [ + { + "part": "neck", + "px": 15 + } + ] + }, + { + "name": "ear_l", + "from": "head:ears-l", + "x": 455, + "y": 222, + "w": 21, + "h": 34, + "opaque_px": 445, + "visible_px": 87, + "occluded_px": 358, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 87, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 7, + "fringe_pushed_back": [ + { + "part": "hair_back", + "px": 1 + } + ] + }, + { + "name": "ear_r", + "from": "head:ears-r", + "x": 356, + "y": 222, + "w": 22, + "h": 34, + "opaque_px": 463, + "visible_px": 85, + "occluded_px": 378, + "projected_core_px": 3, + "source_px_taken": 3, + "visible_not_projected_px": 82, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 9 + }, + { + "name": "face", + "from": "head:face", + "x": 364, + "y": 158, + "w": 106, + "h": 128, + "opaque_px": 10258, + "visible_px": 5937, + "occluded_px": 4321, + "projected_core_px": 4190, + "source_px_taken": 4187, + "visible_not_projected_px": 1750, + "refused_drift_px": 39, + "merged_px": 0, + "seam_override_px": 65, + "fringe_pushed_back": [ + { + "part": "neck", + "px": 6 + }, + { + "part": "topwear", + "px": 2 + }, + { + "part": "ear_r", + "px": 2 + }, + { + "part": "hair_back", + "px": 1 + } + ] + }, + { + "name": "mouth", + "from": "head:mouth", + "x": 402, + "y": 257, + "w": 158, + "h": 90, + "opaque_px": 82, + "visible_px": 82, + "occluded_px": 0, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 82, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0 + }, + { + "name": "brow_r", + "from": "head:eyebrow-r", + "x": 383, + "y": 198, + "w": 23, + "h": 5, + "opaque_px": 24, + "visible_px": 19, + "occluded_px": 5, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 19, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0, + "fringe_pushed_back": [ + { + "part": "face", + "px": 25 + } + ] + }, + { + "name": "brow_l", + "from": "head:eyebrow-l", + "x": 430, + "y": 199, + "w": 28, + "h": 4, + "opaque_px": 49, + "visible_px": 9, + "occluded_px": 40, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 9, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0, + "fringe_pushed_back": [ + { + "part": "face", + "px": 1 + } + ] + }, + { + "name": "eyewhite_r", + "from": "head:eyewhite-r", + "x": 374, + "y": 217, + "w": 29, + "h": 23, + "opaque_px": 505, + "visible_px": 192, + "occluded_px": 313, + "projected_core_px": 5, + "source_px_taken": 5, + "visible_not_projected_px": 187, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 3 + }, + { + "name": "eyewhite_l", + "from": "head:eyewhite-l", + "x": 431, + "y": 218, + "w": 32, + "h": 23, + "opaque_px": 527, + "visible_px": 212, + "occluded_px": 315, + "projected_core_px": 23, + "source_px_taken": 23, + "visible_not_projected_px": 189, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 0, + "fringe_pushed_back": [ + { + "part": "face", + "px": 6 + } + ] + }, + { + "name": "iris_r", + "from": "head:irides-r", + "x": 380, + "y": 218, + "w": 21, + "h": 22, + "opaque_px": 331, + "visible_px": 295, + "occluded_px": 36, + "projected_core_px": 105, + "source_px_taken": 105, + "visible_not_projected_px": 190, + "refused_drift_px": 1, + "merged_px": 0, + "seam_override_px": 8, + "fringe_pushed_back": [ + { + "part": "eyewhite_r", + "px": 5 + } + ] + }, + { + "name": "iris_l", + "from": "head:irides-l", + "x": 436, + "y": 218, + "w": 19, + "h": 22, + "opaque_px": 328, + "visible_px": 308, + "occluded_px": 20, + "projected_core_px": 118, + "source_px_taken": 118, + "visible_not_projected_px": 190, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 7, + "fringe_pushed_back": [ + { + "part": "face", + "px": 4 + }, + { + "part": "eyewhite_l", + "px": 1 + } + ] + }, + { + "name": "lash_r", + "from": "head:eyelash-r", + "x": 369, + "y": 211, + "w": 37, + "h": 31, + "opaque_px": 309, + "visible_px": 309, + "occluded_px": 0, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 309, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 1, + "fringe_pushed_back": [ + { + "part": "face", + "px": 34 + }, + { + "part": "eyewhite_r", + "px": 4 + } + ] + }, + { + "name": "hairpin", + "from": "head:headwear", + "x": 375, + "y": 106, + "w": 83, + "h": 34, + "opaque_px": 1861, + "visible_px": 1138, + "occluded_px": 723, + "projected_core_px": 452, + "source_px_taken": 449, + "visible_not_projected_px": 689, + "refused_drift_px": 5, + "merged_px": 0, + "seam_override_px": 56, + "fringe_pushed_back": [ + { + "part": "hair_back", + "px": 3 + } + ] + }, + { + "name": "lash_l", + "from": "head:eyelash-l", + "x": 431, + "y": 212, + "w": 36, + "h": 27, + "opaque_px": 307, + "visible_px": 285, + "occluded_px": 22, + "projected_core_px": 0, + "source_px_taken": 0, + "visible_not_projected_px": 285, + "refused_drift_px": 0, + "merged_px": 0, + "seam_override_px": 1, + "fringe_pushed_back": [ + { + "part": "face", + "px": 26 + }, + { + "part": "eyewhite_l", + "px": 1 + } + ] + }, + { + "name": "hair_front", + "from": "head:front hair", + "x": 346, + "y": 120, + "w": 143, + "h": 187, + "opaque_px": 11501, + "visible_px": 11501, + "occluded_px": 0, + "projected_core_px": 7715, + "source_px_taken": 7715, + "visible_not_projected_px": 3786, + "refused_drift_px": 88, + "merged_px": 0, + "seam_override_px": 33, + "fringe_pushed_back": [ + { + "part": "face", + "px": 35 + }, + { + "part": "ear_r", + "px": 5 + } + ] + } + ], + "ghost_px": { + "full:back hair": 55, + "full:bottomwear": 46, + "full:ears-l": 0, + "full:ears-r": 0, + "full:earwear": 8, + "full:eyebrow-l": 0, + "full:eyebrow-r": 0, + "full:eyelash-l": 0, + "full:eyelash-r": 0, + "full:eyewear": 7, + "full:eyewhite-l": 0, + "full:eyewhite-r": 0, + "full:face": 24, + "full:footwear": 6, + "full:front hair": 53, + "full:handwear-l": 0, + "full:handwear-r": 0, + "full:headwear": 5, + "full:irides-l": 0, + "full:irides-r": 0, + "full:legwear": 857, + "full:mouth": 8, + "full:neck": 66, + "full:neckwear": 7, + "full:nose": 43, + "full:objects": 8, + "full:tail": 7, + "full:topwear": 52, + "full:wings": 385, + "head:back hair": 47, + "head:bottomwear": 7, + "head:ears-l": 0, + "head:ears-r": 0, + "head:earwear": 7, + "head:eyebrow-l": 0, + "head:eyebrow-r": 0, + "head:eyelash-l": 0, + "head:eyelash-r": 0, + "head:eyewear": 6, + "head:eyewhite-l": 0, + "head:eyewhite-r": 0, + "head:face": 65, + "head:footwear": 8, + "head:front hair": 53, + "head:handwear-l": 4, + "head:handwear-r": 0, + "head:headwear": 47, + "head:irides-l": 0, + "head:irides-r": 0, + "head:legwear": 8, + "head:mouth": 22, + "head:neck": 31, + "head:neckwear": 8, + "head:nose": 54, + "head:objects": 7, + "head:tail": 8, + "head:topwear": 17, + "head:wings": 8 + }, + "recomposite": { + "mean_abs": 1.071, + "within_limit": 8, + "within_share": 0.9767, + "error_limit": 40, + "error_px": 6864, + "covered_alpha": 128, + "uncovered_error_px": 1852, + "hole_count": 530, + "holes_listed": 5, + "holes": [ + { + "px": 57, + "x": 442, + "y": 276, + "w": 17, + "h": 28, + "borders": [ + { + "part": "hair_front", + "px": 41 + }, + { + "part": "topwear", + "px": 32 + } + ] + }, + { + "px": 50, + "x": 473, + "y": 234, + "w": 8, + "h": 41, + "borders": [ + { + "part": "hair_front", + "px": 41 + } + ] + }, + { + "px": 39, + "x": 204, + "y": 618, + "w": 12, + "h": 19, + "borders": [ + { + "part": "forearm_r", + "px": 33 + } + ] + }, + { + "px": 37, + "x": 353, + "y": 131, + "w": 25, + "h": 34, + "borders": [ + { + "part": "hair_back", + "px": 60 + }, + { + "part": "hairpin", + "px": 4 + } + ] + }, + { + "px": 34, + "x": 377, + "y": 78, + "w": 24, + "h": 24, + "borders": [ + { + "part": "hair_back", + "px": 48 + } + ] + } + ] + } +} diff --git a/dancer/producer/parts/bottomwear.png b/dancer/producer/parts/bottomwear.png new file mode 100644 index 00000000..e304a1c5 Binary files /dev/null and b/dancer/producer/parts/bottomwear.png differ diff --git a/dancer/producer/parts/brow_l.png b/dancer/producer/parts/brow_l.png new file mode 100644 index 00000000..9f5d9c75 Binary files /dev/null and b/dancer/producer/parts/brow_l.png differ diff --git a/dancer/producer/parts/brow_r.png b/dancer/producer/parts/brow_r.png new file mode 100644 index 00000000..738bfeb0 Binary files /dev/null and b/dancer/producer/parts/brow_r.png differ diff --git a/dancer/producer/parts/ear_l.png b/dancer/producer/parts/ear_l.png new file mode 100644 index 00000000..fff0bdd6 Binary files /dev/null and b/dancer/producer/parts/ear_l.png differ diff --git a/dancer/producer/parts/ear_r.png b/dancer/producer/parts/ear_r.png new file mode 100644 index 00000000..d846b985 Binary files /dev/null and b/dancer/producer/parts/ear_r.png differ diff --git a/dancer/producer/parts/eyewhite_l.png b/dancer/producer/parts/eyewhite_l.png new file mode 100644 index 00000000..4112d3e3 Binary files /dev/null and b/dancer/producer/parts/eyewhite_l.png differ diff --git a/dancer/producer/parts/eyewhite_r.png b/dancer/producer/parts/eyewhite_r.png new file mode 100644 index 00000000..2361a597 Binary files /dev/null and b/dancer/producer/parts/eyewhite_r.png differ diff --git a/dancer/producer/parts/face.png b/dancer/producer/parts/face.png new file mode 100644 index 00000000..9341dad7 Binary files /dev/null and b/dancer/producer/parts/face.png differ diff --git a/dancer/producer/parts/forearm_l.png b/dancer/producer/parts/forearm_l.png new file mode 100644 index 00000000..b57d7504 Binary files /dev/null and b/dancer/producer/parts/forearm_l.png differ diff --git a/dancer/producer/parts/forearm_r.png b/dancer/producer/parts/forearm_r.png new file mode 100644 index 00000000..ce764803 Binary files /dev/null and b/dancer/producer/parts/forearm_r.png differ diff --git a/dancer/producer/parts/hair_back.png b/dancer/producer/parts/hair_back.png new file mode 100644 index 00000000..f51d6f0b Binary files /dev/null and b/dancer/producer/parts/hair_back.png differ diff --git a/dancer/producer/parts/hair_front.png b/dancer/producer/parts/hair_front.png new file mode 100644 index 00000000..4cd12f8a Binary files /dev/null and b/dancer/producer/parts/hair_front.png differ diff --git a/dancer/producer/parts/hairpin.png b/dancer/producer/parts/hairpin.png new file mode 100644 index 00000000..1be7ad9d Binary files /dev/null and b/dancer/producer/parts/hairpin.png differ diff --git a/dancer/producer/parts/iris_l.png b/dancer/producer/parts/iris_l.png new file mode 100644 index 00000000..0f66713a Binary files /dev/null and b/dancer/producer/parts/iris_l.png differ diff --git a/dancer/producer/parts/iris_r.png b/dancer/producer/parts/iris_r.png new file mode 100644 index 00000000..46a77636 Binary files /dev/null and b/dancer/producer/parts/iris_r.png differ diff --git a/dancer/producer/parts/lash_l.png b/dancer/producer/parts/lash_l.png new file mode 100644 index 00000000..992de471 Binary files /dev/null and b/dancer/producer/parts/lash_l.png differ diff --git a/dancer/producer/parts/lash_r.png b/dancer/producer/parts/lash_r.png new file mode 100644 index 00000000..717b1ddd Binary files /dev/null and b/dancer/producer/parts/lash_r.png differ diff --git a/dancer/producer/parts/mouth.png b/dancer/producer/parts/mouth.png new file mode 100644 index 00000000..b35c700c Binary files /dev/null and b/dancer/producer/parts/mouth.png differ diff --git a/dancer/producer/parts/neck.png b/dancer/producer/parts/neck.png new file mode 100644 index 00000000..ca40aed4 Binary files /dev/null and b/dancer/producer/parts/neck.png differ diff --git a/dancer/producer/parts/shins.png b/dancer/producer/parts/shins.png new file mode 100644 index 00000000..51e97417 Binary files /dev/null and b/dancer/producer/parts/shins.png differ diff --git a/dancer/producer/parts/shoe_l.png b/dancer/producer/parts/shoe_l.png new file mode 100644 index 00000000..1db6a203 Binary files /dev/null and b/dancer/producer/parts/shoe_l.png differ diff --git a/dancer/producer/parts/shoe_r.png b/dancer/producer/parts/shoe_r.png new file mode 100644 index 00000000..223a4a9b Binary files /dev/null and b/dancer/producer/parts/shoe_r.png differ diff --git a/dancer/producer/parts/sleevefront_l.png b/dancer/producer/parts/sleevefront_l.png new file mode 100644 index 00000000..b6082a41 Binary files /dev/null and b/dancer/producer/parts/sleevefront_l.png differ diff --git a/dancer/producer/parts/thigh_l.png b/dancer/producer/parts/thigh_l.png new file mode 100644 index 00000000..5e8feb9e Binary files /dev/null and b/dancer/producer/parts/thigh_l.png differ diff --git a/dancer/producer/parts/thigh_r.png b/dancer/producer/parts/thigh_r.png new file mode 100644 index 00000000..9e6802bc Binary files /dev/null and b/dancer/producer/parts/thigh_r.png differ diff --git a/dancer/producer/parts/topwear.png b/dancer/producer/parts/topwear.png new file mode 100644 index 00000000..8f54b938 Binary files /dev/null and b/dancer/producer/parts/topwear.png differ diff --git a/dancer/producer/parts/upperarm_l.png b/dancer/producer/parts/upperarm_l.png new file mode 100644 index 00000000..bba5fca5 Binary files /dev/null and b/dancer/producer/parts/upperarm_l.png differ diff --git a/dancer/producer/parts/upperarm_r.png b/dancer/producer/parts/upperarm_r.png new file mode 100644 index 00000000..2a56f3ed Binary files /dev/null and b/dancer/producer/parts/upperarm_r.png differ diff --git a/dancer/source-manifest.json b/dancer/source-manifest.json index 7d89a93d..99c2cf87 100644 --- a/dancer/source-manifest.json +++ b/dancer/source-manifest.json @@ -12,13 +12,13 @@ }, { "path": "README.md", - "bytes": 16516, - "sha256": "06f0283ba49ae8fd954e710ff1ee275c7af5be2fb176dd89f64775ea7db4d894", + "bytes": 17769, + "sha256": "87f91dadff6c6cbbddb38185787036ae37f3d3dfcbc3795fbb17dd29b7139190", "sourceSHA256": "4740c3709acf23594af59dec1b77bd6193a8c84b189544b56465824de1c82366", "origin": "Owner-accepted v3 transfer, 2026-10-24; trial PR57 source ee5ec1ad56b3d97e7af6fd85e1957cc0ff9ee7a4", "role": "Corpus-only v3 declaration, replay or measured evidence", "contentIdentical": false, - "change": "Issue84 amended whole-arm draw-order keys; frozen setup and original PNG bytes preserved. Same-arm and opposite-arm contributors audited independently." + "change": "Issue #88: carry producer/parts.json and producer/parts/*.png so the rig stage is reproducible from the tree." }, { "path": "accepted-dance/bun.lock", @@ -1060,13 +1060,13 @@ }, { "path": "build.sh", - "bytes": 365, - "sha256": "5296cdf06025d056e3f568652652242186d49b492e0efe0ebe010bf0786f481c", + "bytes": 449, + "sha256": "fc22bd9d6f683050d1d3836ccb7cc936c07a1a2190c3c0c8acf2331b549cdad0", "sourceSHA256": "d38e00ec57c13cb0662c21788d12b0a0a01ce8164a1ae71649eda547cd7d18c2", "origin": "Owner-accepted v3 transfer, 2026-10-24; trial PR57 source ee5ec1ad56b3d97e7af6fd85e1957cc0ff9ee7a4", "role": "Corpus-only v3 declaration, replay or measured evidence", "contentIdentical": false, - "change": "Approved issue82 setup-order recipe, source draw-order keys and regenerated producer; original art bytes preserved." + "change": "Issue #88: carry producer/parts.json and producer/parts/*.png so the rig stage is reproducible from the tree." }, { "path": "bun.lock", @@ -1079,13 +1079,13 @@ }, { "path": "check-inputs.py", - "bytes": 4029, - "sha256": "6bd139c5997516c5637e3aebda8622a48d3c0429202033fa2f951d16ba8e3ef4", + "bytes": 4244, + "sha256": "8e6d6c53c543c24e949b86af3a3045c59c3fa49589c5fea3245f148523ee5fbb", "sourceSHA256": "584b80f031cdaf791615d3394e4e05539002d847730b49d4ea6549ec9142af2f", "origin": "Owner-accepted v3 transfer, 2026-10-24; trial PR57 source ee5ec1ad56b3d97e7af6fd85e1957cc0ff9ee7a4", "role": "Corpus-only v3 declaration, replay or measured evidence", "contentIdentical": false, - "change": "Explicit producer adoption and preserved historical replay, issue 71." + "change": "Issue #88: carry producer/parts.json and producer/parts/*.png so the rig stage is reproducible from the tree." }, { "path": "config-base.json", @@ -1769,7 +1769,7 @@ "bytes": 9285, "sha256": "9dca5394f6c0cf9cc72e2456b53b41adf898b963a6081d9f6f9b3c2ad6191096", "sourceSHA256": "9dca5394f6c0cf9cc72e2456b53b41adf898b963a6081d9f6f9b3c2ad6191096", - "origin": "the accepted dance\u2019s map, 2026-10-22", + "origin": "the accepted dance’s map, 2026-10-22", "role": "accepted body/alternate map", "contentIdentical": true }, @@ -1821,13 +1821,13 @@ }, { "path": "producer-manifest.json", - "bytes": 9764, - "sha256": "d07590d45c02e075d6a0ba1435ec0f6dff418e5166c30db0e2f4fcc3135339f1", + "bytes": 18086, + "sha256": "702a0ab2e51659c34d7cf3150f7259c19d46297365499abc896997780650df0a", "sourceSHA256": "1514d846e0352f6ac02506a551f23519dc39d12178d6b933045c629fd4db1fde", "origin": "Explicit producer adoption, issue 71", "role": "Producer replay and verification", "contentIdentical": false, - "change": "Issue84 amended whole-arm draw-order keys; frozen setup and original PNG bytes preserved. Same-arm and opposite-arm contributors audited independently." + "change": "Issue #88: carry producer/parts.json and producer/parts/*.png so the rig stage is reproducible from the tree." }, { "path": "producer/rig/images/bottomwear.png", @@ -2313,12 +2313,13 @@ }, { "path": "tools/verify-producer.mjs", - "bytes": 4145, - "sha256": "f431cad9bdc7b7b3dddbcdb322de9e8cc4a434f8d3c3c132f2fef41bd3bc3650", + "bytes": 4523, + "sha256": "7b2eda79ba3e74014ee3e746e8d68fe6297a964c1cc10c29a92d3e1b31205756", "sourceSHA256": "67279cfd9fda7194f68e375ee0076864a480030fb67ab848bc5283a56ffe7bb3", "origin": "Explicit producer adoption, issue 71", "role": "Producer replay and verification", - "contentIdentical": false + "contentIdentical": false, + "change": "Issue #88: carry producer/parts.json and producer/parts/*.png so the rig stage is reproducible from the tree." }, { "path": "tools/verify-producer.test.mjs", @@ -2410,6 +2411,267 @@ "role": "Current order-only recipe and sampled evidence", "contentIdentical": false, "change": "Issue84 amended whole-arm draw-order keys; frozen setup and original PNG bytes preserved. Same-arm and opposite-arm contributors audited independently." + }, + { + "path": "producer/parts.json", + "bytes": 16502, + "sha256": "4d1329716e1e1ca233e47e4fbb85fc692af3d9b13fdff08b0c53570f4ef71a96", + "sourceSHA256": "4d1329716e1e1ca233e47e4fbb85fc692af3d9b13fdff08b0c53570f4ef71a96", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/bottomwear.png", + "bytes": 53433, + "sha256": "9fc726f47c63b2ff9717a148d46e17c89fc2b95de47b73e9f6706af0d9c3c7eb", + "sourceSHA256": "9fc726f47c63b2ff9717a148d46e17c89fc2b95de47b73e9f6706af0d9c3c7eb", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/brow_l.png", + "bytes": 295, + "sha256": "ec9174cd2283ed0cedc6bcef2dbaebd2481fdaa544b91703887e244c910a506d", + "sourceSHA256": "ec9174cd2283ed0cedc6bcef2dbaebd2481fdaa544b91703887e244c910a506d", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/brow_r.png", + "bytes": 217, + "sha256": "7d840eb396f019bc0c14c7558f7544032ba1f13568049146e551b143e2e02441", + "sourceSHA256": "7d840eb396f019bc0c14c7558f7544032ba1f13568049146e551b143e2e02441", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/ear_l.png", + "bytes": 1775, + "sha256": "68b988b1ab9090426a66bff11ac8c87f8861ac9642641f42e2ca9350cd6a162d", + "sourceSHA256": "68b988b1ab9090426a66bff11ac8c87f8861ac9642641f42e2ca9350cd6a162d", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/ear_r.png", + "bytes": 1888, + "sha256": "e8919ba8e262878357f08bf538f1133a2cf416d079192b1791c200f7fd6f807a", + "sourceSHA256": "e8919ba8e262878357f08bf538f1133a2cf416d079192b1791c200f7fd6f807a", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/eyewhite_l.png", + "bytes": 1519, + "sha256": "74f1ba6a3565eacda6f6304668f475b1a040b5f90f3dbc69dadd8944edbee5b0", + "sourceSHA256": "74f1ba6a3565eacda6f6304668f475b1a040b5f90f3dbc69dadd8944edbee5b0", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/eyewhite_r.png", + "bytes": 1479, + "sha256": "db6145c620a6a2f1b3f747b2dc274ee5203eca86199de8239e3adf514bc6a505", + "sourceSHA256": "db6145c620a6a2f1b3f747b2dc274ee5203eca86199de8239e3adf514bc6a505", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/face.png", + "bytes": 16735, + "sha256": "d3613cc8c97267e629abb243ba1f4085a7b11f435b6aeb5e7ee6889982e4b549", + "sourceSHA256": "d3613cc8c97267e629abb243ba1f4085a7b11f435b6aeb5e7ee6889982e4b549", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/forearm_l.png", + "bytes": 33460, + "sha256": "f4c121b2b83cd66ac243572096dff312fa809fa2568e664d3d4f92e95571522d", + "sourceSHA256": "f4c121b2b83cd66ac243572096dff312fa809fa2568e664d3d4f92e95571522d", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/forearm_r.png", + "bytes": 36187, + "sha256": "056e030ee19ee7a70516310cbb38c29afab55237559a6da9ba49d2fc6c3b4c7e", + "sourceSHA256": "056e030ee19ee7a70516310cbb38c29afab55237559a6da9ba49d2fc6c3b4c7e", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/hair_back.png", + "bytes": 32985, + "sha256": "7add7a5339538a8e366339dfe50282360cca7508d9ed9191443b5fec9a08578e", + "sourceSHA256": "7add7a5339538a8e366339dfe50282360cca7508d9ed9191443b5fec9a08578e", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/hair_front.png", + "bytes": 32344, + "sha256": "983c6b7240fce7a0a5870dfb3611e3c9abc9f6fb07803f4d2082cadb53ce828c", + "sourceSHA256": "983c6b7240fce7a0a5870dfb3611e3c9abc9f6fb07803f4d2082cadb53ce828c", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/hairpin.png", + "bytes": 6736, + "sha256": "13f73a0b25dec14d090c0bea2efed8e70e77408e81208ea0a184d7d37716b19b", + "sourceSHA256": "13f73a0b25dec14d090c0bea2efed8e70e77408e81208ea0a184d7d37716b19b", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/iris_l.png", + "bytes": 1382, + "sha256": "a48c2573b57e71672fca5272ac2fd05d0233c0ae8fa6194adbe951ba2f53556d", + "sourceSHA256": "a48c2573b57e71672fca5272ac2fd05d0233c0ae8fa6194adbe951ba2f53556d", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/iris_r.png", + "bytes": 1426, + "sha256": "2af3a5485e5e5e39a31e377cad3ae480fecb6ae5046040c1265f4ef372a6c22f", + "sourceSHA256": "2af3a5485e5e5e39a31e377cad3ae480fecb6ae5046040c1265f4ef372a6c22f", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/lash_l.png", + "bytes": 1319, + "sha256": "978b195e316642497bc52559d2238e9fdb7387ae129293b6ff3e879e215285cf", + "sourceSHA256": "978b195e316642497bc52559d2238e9fdb7387ae129293b6ff3e879e215285cf", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/lash_r.png", + "bytes": 1362, + "sha256": "a230d8268a474213cec2b481f3d7809940d14722d8ad6325f29db6fed75d95a9", + "sourceSHA256": "a230d8268a474213cec2b481f3d7809940d14722d8ad6325f29db6fed75d95a9", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/mouth.png", + "bytes": 614, + "sha256": "721921c0c54af947ba8732c4e49235d11da70b2beedfe0e49c5ce8217c1adcf1", + "sourceSHA256": "721921c0c54af947ba8732c4e49235d11da70b2beedfe0e49c5ce8217c1adcf1", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/neck.png", + "bytes": 3676, + "sha256": "517cb2591329a061df6cfbf806d43d750ff07faf7579122dc21458df9b8b4edf", + "sourceSHA256": "517cb2591329a061df6cfbf806d43d750ff07faf7579122dc21458df9b8b4edf", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/shins.png", + "bytes": 56686, + "sha256": "b47ce22da3ea90aab5df1f3622c2ee122f98e196e42eaa8a1e0e8f72722e21b3", + "sourceSHA256": "b47ce22da3ea90aab5df1f3622c2ee122f98e196e42eaa8a1e0e8f72722e21b3", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/shoe_l.png", + "bytes": 16886, + "sha256": "f84a2fc0f31cc99a72d08f0c7d4ce4e7c2cf48ab56b5e93707035c5ddb2f8aa8", + "sourceSHA256": "f84a2fc0f31cc99a72d08f0c7d4ce4e7c2cf48ab56b5e93707035c5ddb2f8aa8", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/shoe_r.png", + "bytes": 16906, + "sha256": "07b881ffff56b07ca9e5ae26118082926676eac51bc865b3ac3b9501c185f898", + "sourceSHA256": "07b881ffff56b07ca9e5ae26118082926676eac51bc865b3ac3b9501c185f898", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/sleevefront_l.png", + "bytes": 3240, + "sha256": "810313dc87c6d5addd40338979683654bceef79cdfee1dabcdf87258d809dfea", + "sourceSHA256": "810313dc87c6d5addd40338979683654bceef79cdfee1dabcdf87258d809dfea", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/thigh_l.png", + "bytes": 25558, + "sha256": "4c24fb4213c1c9a47490f6deec8768fa9e7c3931e40a44c91391083655bb2aba", + "sourceSHA256": "4c24fb4213c1c9a47490f6deec8768fa9e7c3931e40a44c91391083655bb2aba", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/thigh_r.png", + "bytes": 25548, + "sha256": "f5e3d263167c871e36c20e855b69d1f7167d4cec6a8941fe576b571e091d76bd", + "sourceSHA256": "f5e3d263167c871e36c20e855b69d1f7167d4cec6a8941fe576b571e091d76bd", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/topwear.png", + "bytes": 65231, + "sha256": "e316e517d45eba3a36bcbbca9a95f4ed3fac2f7ae0b651d9a7e676b879a7e65a", + "sourceSHA256": "e316e517d45eba3a36bcbbca9a95f4ed3fac2f7ae0b651d9a7e676b879a7e65a", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/upperarm_l.png", + "bytes": 23372, + "sha256": "cda8d67951a4b730525f91337b382038a4321e5b1bc6b87119ec69a615afe14b", + "sourceSHA256": "cda8d67951a4b730525f91337b382038a4321e5b1bc6b87119ec69a615afe14b", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true + }, + { + "path": "producer/parts/upperarm_r.png", + "bytes": 23781, + "sha256": "6be8e4ba54ba505e6b1b27030fc93afdd9dfcd6acdaec806eb96743d93788865", + "sourceSHA256": "6be8e4ba54ba505e6b1b27030fc93afdd9dfcd6acdaec806eb96743d93788865", + "origin": "Issue #88: assembled producer parts carried for direct rig stage replay", + "role": "Corpus-owned reproducible source or measured evidence", + "contentIdentical": true } ] } diff --git a/dancer/tools/verify-producer.mjs b/dancer/tools/verify-producer.mjs index 661f1df8..04a2adc3 100644 --- a/dancer/tools/verify-producer.mjs +++ b/dancer/tools/verify-producer.mjs @@ -25,12 +25,14 @@ export async function inventory(root) { const file = join(dir, name); return statSync(file).isDirectory() ? walk(file) : [file]; }); + if (!existsSync(join(root, 'parts.json')) || !existsSync(join(root, 'parts'))) refuse('PRODUCER_PARTS: no producer-written parts'); if (!existsSync(join(root, 'rig/rig.json'))) refuse('PRODUCER_RIG: no producer-written rig'); const install = spawnSync('sh', ['tools/ensure-runtime.sh'], { cwd: dancer, stdio: 'inherit' }); if (install.error || install.status !== 0) refuse('PRODUCER_RUNTIME: frozen install failed'); const { readPlate } = await import(pathToFileURL(join(dancer, 'work/runtime/node_modules/rig-c/tools/plate.ts')).href); const files = {}; - for (const file of walk(join(root, 'rig'))) { + const entries = [join(root, 'parts.json'), ...walk(join(root, 'parts')), ...walk(join(root, 'rig'))].sort(); + for (const file of entries) { const data = readFileSync(file); const row = { bytes: data.length, sha256: sha(data) }; if (file.endsWith('.png')) { @@ -59,6 +61,8 @@ async function main() { if (args[0] === '--record') { if (existsSync(accepted) || existsSync(manifest)) refuse('PRODUCER_ALREADY_RECORDED: do not overwrite accepted bytes'); mkdirSync(accepted); + cpSync(join(input, 'parts.json'), join(accepted, 'parts.json')); + cpSync(join(input, 'parts'), join(accepted, 'parts'), { recursive: true }); cpSync(join(input, 'rig'), join(accepted, 'rig'), { recursive: true }); writeFileSync(manifest, JSON.stringify({ spec: 'dancer-producer/1', configSHA256: sha(readFileSync(join(dancer, 'config.json'))), packageSHA256: sha(readFileSync(join(dancer, 'package.json'))), files: actual }, null, 2) + '\n'); }