stylized-town/bench-01@0.4.0
Quality report: Park bench
The result of the publisher's automated checks on the exact file named below. It is not an independent certification.
Status
- Automated checks
- Passed
- Overall
- Passed
- Review by a person
- APPROVED
- Eligible for release
- Yes
The files this report describes
- GLB file
bench-01.glb· 62 KB- GLB sha256
- 5e09ffce53e232f18133e5aa0e6a8bc81ca2239801d26dcbaf79594bdba7db96
- Manifest sha256
- a55b01135b861ed8b215d3a3c6583c3a80d025829b73895fa30bfb278a59c587
- Package sha256
- f88fd40ea6bc1fa38116f6a3c06413c0da5ba497a36f60c5229cf950a26af2ba
- Published report sha256
- 8d32a34221c76117d15285b3ba666d17d1e6101d90b81f507ee32527b69ce70c
- Release policy
kitnevo-production-1
Check your copy
Compute the sha256 of the installed file and compare it with the GLB sha256 above. If they match, your file is the file that was tested. The same report is available as JSON.
Terminalcopy as is
shasum -a 256 bench-01.glbGates
Each gate groups the checks of one topic. Open a gate to read its checks and their messages.
G0Passed
G1Passed
G2Passed
G3Passed
G4Passed
G5Passed
G6Passed
G7Passed
G8Not applicable
G9Not applicable
G10Passed
G11Passed
G12Passed
G13Passed
G14Passed
G15Passed
G16Passed
G17Passed
G0 Provenance / licensePassed 11 checks
recipe-schema— recipe matches schemas/recipe.schema.jsongenerator-allowlisted— town2m-bench@1.1.0 is allowlistedsource-inputs-schema— source-inputs.json is schema-validrecipe-hash-bound— recorded recipe hash matches recipe.jsonpalette-hash-bound— recorded palette hash matches the palette filegenerator-sources-bound— recorded generator source hash matches current generator codeinput-rights— original-generated: no third-party inputsai-models— no AI model contributed to this assetglb-built-from-recipe— build-info records the current recipe hashblender-pinned— built with Blender 5.2.2 LTSexporter-pinned— glTF exporter 5.2.40
G1 Build reproducibilityPassed 7 checks
regenerate— recipe regenerated in a fresh headless Blender processfingerprint-geometry— geometry fingerprint matchesfingerprint-materials— materials fingerprint matchesfingerprint-nodes— nodes fingerprint matchesfingerprint-textures— textures fingerprint matchesfingerprint-animations— animations fingerprint matchesbyte-identical— regenerated GLB is byte-identical
G2 Portable authoring source (.blend)Passed 7 checks
blend-opens— opened in a fresh --factory-startup processno-linked-libraries— 0 linked librariesno-missing-external-files— 0 of 0 external file references are missingno-absolute-paths— 0 absolute file referencesimages-packed— 0 unpacked file imagesexpected-collections— missing collections: []embedded-recipe— root carries the canonical recipe hash
G3 glTF compliance (Khronos validator)Passed 6 checks
glb-container— GLB v2, 63124 bytesgltf-version— asset.version 2.0khronos-validator— 0 errors, 0 warnings, 2 infos (validator 2.0.0-dev.3.10)no-required-extensions— no required extensions (baseline loader needs no decoders)extension-allowlist— extensionsUsed ⊆ allowlist (0 used)self-contained— all buffers and images embedded
G4 Shape / units / transformsPassed 21 checks
has-geometry— 1012 triangles in 6 primitivesfinite-attributes— 0 non-finite attribute valuessingle-root— scene roots: rootroot-transform— root T[0, 0, 0] R[0, 0, 0, 1] S[1, 1, 1]unique-node-names— node names uniquedeclared-nodes-present— all 9 declared nodes presentno-undeclared-nodes— no undeclared nodesnode-kinds— node kinds and materials match the contractvalid-indices— 0 triangles with out-of-range indicesdegenerate-faces— 0 zero-area triangles (0%, limit 1%)outward-winding— 6 closed primitives wound outwardnormals— normals: missing on [], 0 triangles disagree with winding, 0 non-unitfinite-bounds— world bounds [-0.8, 0, -0.3235] .. [0.8, 0.85, 0.325]nonzero-bounds— world size [1.6, 0.85, 0.6485] mdimensions— measured [1.6, 0.85, 0.6485] m vs target [1.6, 0.85, 0.65] (allowed ±[0.08, 0.0425, 0.0325])base-on-ground— min.y = 0 m (limit ±0.02)horizontal-pivot— bounds center x=0, z=0.0008world-scale— root world scale [1, 1, 1]measurement-agreement— Node (glTF-Transform) and browser (GLTFLoader) bounds differ by 0 mbasis-fixture— Blender +X/-Y/+Z arrows load as Three.js +X/+Z/+Y (Y-up, +Z front)basis-exporter-match— basis fixture exported by 5.2.40, asset by 5.2.40
G5 Facing and modular alignmentPassed 4 checks
front-marker-direction— marker +Z axis [0, 0, 1] · declared front [0, 0, 1] = 1 (min 0.99)front-marker-side— marker sits on the declared front side (alignment 1)anchor:anchor-base— at [0, 0, 0] (error 0 m), outward dot 1, up dot 1multi-view— 6 of 6 contact-sheet views rendered
G6 Materials / texture correctnessPassed 6 checks
declared-materials— 2 declared materials presentno-undeclared-materials— no undeclared or duplicate materialsmaterial-factors— metallic-roughness factors match the declared palette materialspbr-runtime-material— GLTFLoader created metallic-roughness PBR materialsrendered-material-colors— rendered material colors within ±16/255 of the paletteno-placeholder-render— no placeholder-magenta in rendered views
G7 Web load and render (Chromium + Three.js)Passed 11 checks
loader-ready— GLTFLoader parsed the GLB and the scene renderedtested-bytes— browser hashed the exact published bytesconsole-errors— no console errorspage-errors— no uncaught page errorsnetwork— no failed or missing resource requestsno-external-requests— no requests outside the local originwebgl-context— WebGL context stablegl-errors— gl.getError() == NO_ERROR after every renderdraw-calls— 6 draw calls (ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver))render-coverage— coverage per view: front 18%, back 18%, left 15.9%, right 16%, top 25.1%, iso 22%not-black— max mean luminance of visible pixels 0.222 (min 0.02)
G8 Animation / skinNot applicable 1 check
animations— no animations declared or present (static asset)
G9 Optimized variant parityNot applicable 1 check
optimized-variant— no optimized GLB variant in this package (baseline only)
G10 Performance budgetsPassed 6 checks
glb-size— 63124 bytes (budget 1048576)triangles— 1012 triangles (budget 5000)materials— 2 materials (budget 4)texture-size— largest texture 0px (budget 1024)draw-calls— 6 draw calls in the iso view (budget 8)load-timing— browser timings recorded in browser.json; advisory only (software renderer, not a device benchmark)
G11 Visual consistency + human approvalPassed 4 checks
contact-sheet— 6/6 views in the contact sheetvisual-qa— V1-V13 PASSED (V1 PASSED, V2 PASSED, V3 PASSED, V4 PASSED, V5 PASSED, V6 PASSED, V7 PASSED, V8 PASSED, V9 NOT_APPLICABLE, V10 PASSED, V11 PASSED, V12 PASSED, V13 PASSED; technical baseline MATCHED); qa/visual/index.html. Objective checks only: counts_as_approval=falsehuman-approval— approved by Ricardo Carvalhogolden-diff— fresh renders vs approved screenshots: front 0%, back 0%, left 0%, right 0%, top 0%, iso 0% (limit 0.2%)
G12 Download / installPassed 48 checks
evidence-binding— clean-room run bound to GLB 5e09ffce53e2, manifest e1c586c3d9ee, distribution sources 59d6a893dddfnetwork-isolation— online phase: internal docker network (catalog + hostile registries only, no internet); offline phase: --network noneno-blender-environment— customer container: blender absent (command -v blender fails); python3 absent; node v22.21.1; three 0.186.1; SDK 0.5.1clean-room-steps— step exit codes {"transcript_online":0,"offline_cli":0,"typecheck":0,"build":0,"browser_tests":0,"verify_project":0,"starters_online":0,"starters_offline":0}bench-guide— bench page (MCP asset guide: original + tested preset): ready; 6.3% of the canvas drawn; GLBs served from the project (28 distinct); console errors 0, page errors 0, failed 0, external 0customization-isolation— customized bench wood #5A3A22 (own material true), original/source #AE855E/#AE855E, height ratio 1.2guide-modular-host-written— entry file of get_integration_guide stylized-town/house-01@0.2.0 (three) written unchanged: src/host.ts 4c553ff2aae4guides-written-verbatim— entry files from get_integration_guide written unchanged (html entry paths renamed for the r3f and bench pages): src/main.ts 014d359257ed, src/r3f.tsx e86f723d879b, src/bench.ts ab13d2c09b45host-guide— modular host page (MCP asset guide: original + swapped part): ready; 24.2% of the canvas drawn; GLBs served from the project (29 distinct); console errors 0, page errors 0, failed 0, external 0host-install-pulls-parts— add stylized-town/house-01@0.2.0 in a fresh project: exit 0 installed; lockfile 7 packages (6 pinned parts, all present); verify exit 0install-idempotent— add stylized-town/bench-01@0.4.0 (registry from the lockfile, public): installed; kit add again: unchangedinstall-via-mcp-url— get_download_url (entitlement ent-customer) -> agent-ready-assets kit add --url: installed; lockfile package sha256 17fd2f57c7c6339f == MCP == cataloginstalled-files-verified— verify: stylized-town/bench-01@0.4.0 PASS (13 files); stylized-town@0.4.0 PASS (256 files)installed-pins-match-catalog— for every kit asset: installed GLB + manifest sha256 (CLI inspect) == MCP get_asset pinsmodular-swap-isolation— stylized-town/cafe-01@0.1.0 front-door=door-01: mounted anchor-door-main:stylized-town/door-01@0.1.0 (declared anchor-door-main:stylized-town/door-01@0.1.0); an unmodified instance mounts 0 parts (baked default); shared source unchangedoffline-customize-modular— customize stylized-town/house-01@0.2.0 (swap + colour + toggle) --dry-run: exit 0, config sha256 0c8e79f33ca0offline-customize— customize --dry-run: config sha256 491b148ab9e3offline-inspect— inspect stylized-town/bench-01@0.4.0: wood-color, size-scale, armrestsoffline-network-disabled— <internal https origin> unreachable (container runs with --network none)offline-reinstall-noop— kit add stylized-town@0.4.0 with no network: unchanged (lockfile fast path)offline-scene-snaps— scene validate --resolve offline: exit 0, 77 attach_to snaps resolvedoffline-scene-validate— scene validate: PASSoffline-tamper-detected— one flipped byte in bench-01.glb -> verify exit 1 INTEGRITY_FAILED; restored -> exit 0offline-verify— verify against assets.lock.json: exit 0r3f-town— React Three Fiber town (MCP kit guide, r3f): ready; 99.7% of the canvas drawn; GLBs served from the project (28 distinct); console errors 0, page errors 0, failed 0, external 0scene-snaps-resolved— scene validate --resolve: 77 attach_to snaps resolved (recommend_scene said 77), 0 outside 1 mm / opposed / alignedscene-validate— recommend_scene -> src/scenes/town.scene.json: PASS, 161 instancesstarter-starter-r3f:build— vite build: exit 0starter-starter-r3f:kit-add— pnpm run kit:add (agent-ready-assets kit add stylized-town@0.4.0 --to public/assets, the kit src/scenes/starter.scene.json pins: stylized-town@0.4.0): exit 0 installedstarter-starter-r3f:no-credential-in-project— no project file contains the token (the lockfile records the entitlement id only)starter-starter-r3f:reinstall-offline-noop— kit add stylized-town@0.4.0 with no network, registry or token: unchanged (lockfile fast path)starter-starter-r3f:renders— starter-r3f: data-ready true; 7 instances (6 snapped); 93.8% of the canvas drawn; 6 distinct GLBs served from the project; console errors 0, page errors 0, failed 0, external 0starter-starter-r3f:scene-validate— scene validate src/scenes/starter.scene.json --resolve: exit 0, scene 1.1.0, 7 instances, 6 snapped (max mate distance 0.0e+0 m)starter-starter-r3f:typecheck— tsc --noEmit: exit 0starter-starter-r3f:verify-project-locally-validated— verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenesstarter-starter-r3f:verify— agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASSstarter-starter-vanilla:build— vite build: exit 0starter-starter-vanilla:kit-add— pnpm run kit:add (agent-ready-assets kit add stylized-town@0.4.0 --to public/assets, the kit src/scenes/starter.scene.json pins: stylized-town@0.4.0): exit 0 installedstarter-starter-vanilla:no-credential-in-project— no project file contains the token (the lockfile records the entitlement id only)starter-starter-vanilla:reinstall-offline-noop— kit add stylized-town@0.4.0 with no network, registry or token: unchanged (lockfile fast path)starter-starter-vanilla:renders— starter-vanilla: data-ready true; 7 instances (6 snapped); 96.1% of the canvas drawn; 6 distinct GLBs served from the project; console errors 0, page errors 0, failed 0, external 0starter-starter-vanilla:scene-validate— scene validate src/scenes/starter.scene.json --resolve: exit 0, scene 1.1.0, 7 instances, 6 snapped (max mate distance 0.0e+0 m)starter-starter-vanilla:typecheck— tsc --noEmit: exit 0starter-starter-vanilla:verify-project-locally-validated— verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenesstarter-starter-vanilla:verify— agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASSvanilla-town— plain Three.js town (MCP kit guide, three): ready; 36.1% of the canvas drawn; GLBs served from the project (28 distinct); console errors 0, page errors 0, failed 0, external 0dimensions-match-manifest— stylized-town/bench-01@0.4.0: measured 1.6 x 0.85 x 0.6485 m vs manifest 1.6 x 0.85 x 0.64845 m (tolerance 5% or 2 cm); GLB sha256 5e09ffce53e232f1...installed-bytes-pinned— installed public/assets/stylized-town/assets/bench-01/0.4.0/bench-01.glb sha256 5e09ffce53e232f1 / manifest e1c586c3d9ee2240 vs catalog pins 5e09ffce53e232f1 / e1c586c3d9ee2240
G13 Source / package securityPassed 17 checks
security-suite— 110/110 hostile/auth/ticket/server/MCP/metadata/credential cases refused exactly as expected with no side effects (hostile-registry 33, origin 3, entitlement 5, install 7, offline 3, project-safety 12, server 12, mcp 19, metadata 6, modular 8, credentials 2)credential-hygiene— the catalog server log of the clean-room run contains no token and no download ticket (tickets are redacted)auth-expired-token— kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_EXPIRED/ENTITLEMENT_EXPIRED; project unchangedauth-no-token— kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchangedauth-wrong-scope— kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchangedhostile-archive-symlink— add evil/archive-symlink@1.0.0 -> exit 1 INTEGRITY_FAILED/SYMLINK_ENTRY; project unchangedhostile-archive-traversal— add evil/archive-traversal@1.0.0 -> exit 1 INTEGRITY_FAILED/PATH_TRAVERSAL; project unchangedhostile-corrupt-bytes— add evil/corrupt-bytes@1.0.0 -> exit 1 INTEGRITY_FAILED/PACKAGE_HASH_MISMATCH; project unchangedhostile-cross-origin-ticket— add evil/cross-origin-ticket@1.0.0 -> exit 1 UNSAFE_ORIGIN/CROSS_ORIGIN; project unchangedhostile-gzip-bomb— add evil/gzip-bomb@1.0.0 -> exit 1 INTEGRITY_FAILED/ARCHIVE_TOO_LARGE; project unchangedhostile-manifest-path-escape— add evil/manifest-path-escape@1.0.0 -> exit 1 INTEGRITY_FAILED/MANIFEST_INVALID; project unchangedhostile-phantom-capability— add evil/phantom-capability@1.0.0 -> exit 1 INTEGRITY_FAILED/CONTRACT_INVALID; project unchangedhostile-redirect— add evil/redirect@1.0.0 -> exit 1 UNSAFE_ORIGIN/REDIRECT; project unchangedinsecure-scheme— add stylized-town/bench-01@0.4.0 --registry <internal http origin> -> exit 1 UNSAFE_ORIGIN/INSECURE_SCHEME; project unchangedmcp-download-requires-entitlement— anonymous: ENTITLEMENT_REQUIRED; expired token: ENTITLEMENT_EXPIREDno-credential-in-project— no token in any project file (lockfile records the entitlement id only)tls-untrusted-certificate— add stylized-town/bench-01@0.4.0 -> exit 1 UNSAFE_ORIGIN/TLS_UNTRUSTED; project unchanged
G14 Capability contractPassed 14 checks
manifest-schema— manifest matches asset.schema.json v1.1.0contract— 3 capabilities with valid typed inputs/defaults/references; every operation is implemented by SDK 0.5.1 (material-color, uniform-scale, node-visibility, modular-swap)default-valid:wood-color— default "#AE855E" validates through the SDKdefault-valid:size-scale— default 1 validates through the SDKdefault-valid:armrests— default true validates through the SDKglb-targets— every target resolves exactly once in the exact GLB bytes: wood-color -> material #1; size-scale -> node #8; armrests -> node #1,2modularity— 1 connectors with unit/orthogonal frames, 0 slots and 2 optional parts consistent with the measured GLB namesglb-modularity— every snappable connector is one GLB node whose frame equals the manifest frame (<= 1 mm, dot >= 0.999); optional parts hold no anchor, marker or slotdeclaration-binding— manifest customization/engines are exactly the declaration for stylized-town/bench-01@0.4.0recipe-knobs-not-advertised— none of the 13 publisher recipe parameters (e.g. width-m, height-m) is advertised as a consumer capabilityruntime-resolution— SDK resolved every capability on the loaded scene exactly as declared (wood-color: mat-wood/backrest/seat; size-scale: root)defaults-reproduce-baseline— all-default instance vs unmodified asset: max material color delta 0 sRGB levels, bounds delta 0 mruntime-resolution-0.4— SDK resolved armrests on the loaded scene exactly as declared (slot anchors, baked nodes, hideable nodes, swatch materials)defaults-reproduce-baseline-0.4— all-default instance: 0 mounted parts, 0 hidden nodes, max colour delta 0, bounds delta 0 m
G15 Variation correctnessPassed 42 checks
all-cases-ran— 158 corpus cases executed in Chromium through the SDKaccepted-cases-applied— 119 legal configurations applied; browser config hashes equal the Node canonical hashesrejected-cases-refused— 39 invalid/unsupported configurations refused with the expected structured codereject-no-side-effects— no rejected request created, changed or leaked anything (stats, source, other instances, scene)target-color— target material of every accepted case is an instance-owned copy with exactly the requested sRGB color, rendered within 16 levels under probe lightmaterial-properties-preserved— recolor changes only the base color: type, emissive, roughness, metalness and maps are unchangedoff-target-unchanged— non-target surfaces keep the shared material and render unchanged (probe <= 2, region mean <= 1, p99 <= 6; background untouched)visible-change— every requested color >= 24 levels from the default visibly changes the target region; default-colored cases do notscale-bounds— measured world bounds equal the authored bounds x size-scale within 0.0001 mbase-contact— scaled instances keep their base at y=0 and their pivot at the originroot-transform-preserved— scale lives on the SDK wrapper; the GLB root keeps its identity transform (canonical 1 m units)front-orientation— front marker stays on +Z (dot >= 0.99)stable-ids— customized instances keep every semantic mesh/material idinstance-isolation— no case changed the shared source, an unmodified instance or another customized instanceresource-release— release() returns the library to its prior state for every case; 60 mount/render/release cycles: owned materials 60 created / 60 disposed, GPU geometries 6 -> 6, textures 1 -> 1; shared cache survives while used and is evicted aftersuccessive-absolute— successive customizations are absolute (unspecified -> default), earlier instances keep their state, {} restores the authored assetinput-mutation— mutating the request object after application has no effect; instance values are frozenno-errors— no console or page errorsnetwork— no failed, missing or external requestswebgl— no GL errors or context lossevidence-screenshots— 16 preset renders + 2 multi-instance line-ups saved; line-ups left the shared source unchangedcoverage-accounting— tested 119 accepted + 39 rejected cases (seed 20261023; 96 pairwise combinations; per capability wood-color 108/12, size-scale 104/15, armrests 10/4). NOT exhaustive: untested legal configs are SUPPORTED_BUT_UNTESTED.modular-cases-ran— 158 SDK 0.4.0 corpus cases executed in Chromium through the SDKmodular-accepted-applied— 119 legal configurations applied (swaps, toggles, swatches and their combinations); browser config hashes equal the Node canonical hashesmodular-rejected-refused— 39 invalid requests refused with the documented code (non-allowlisted parts, wrong types, free colours on swatches, unknown keys)modular-reject-no-side-effects— no refused request created, changed or leaked anything (stats, sources, other instances)plug-mates-slot— every mounted part's plug node mates its slot anchor node within 1 mm, opposed outward (dot <= -0.999) and aligned up (dot >= 0.999)baked-default-replaced— a swapped slot no longer contains its baked default part; a default choice keeps exactly one visible baked part and mounts nothingconnectors-preserved— every other connector node stays within 1 mm and keeps its orientationground-contact— the lowest point stays within 2 cm of the authored assetswap-bounds— no bounds face moves outward by more than 0.5 m; buildings stay inside their lot (1 mm)visibility-applied— node-visibility hides exactly the declared node on this instance and shows it when truevisibility-coverage— every hidden node removes visible pixels of the instance (fixed camera): a smaller silhouette, or >= 0.02% of the frame showing its own depth-tested surfacesmandatory-nodes-visible— anchors, markers, slot parts and non-optional parts never disappear (Q5)swatch-color— swatches/colours land on every host target material through an instance-owned copypart-color— recolour targets also land on every mounted part with a material of that name (instance-owned copies)modular-isolation— no case changed a shared source, the unmodified instance or another customized instancemodular-resource-release— release() restores the library for every case; 24 mount/render/release cycles: 0 part instances mounted / 0 released, owned materials 24 created / 24 disposedmodular-no-errors— no console or page errorsmodular-network— no failed, missing or external requestsmodular-webgl— no GL errors or context lossmodular-coverage-accounting— tested 119 accepted + 39 rejected SDK 0.4.0 cases (seed 20261023); every swap choice, both visibility states and every swatch individually; 8 SDK 0.4.0 combination cases (full-product over a sampled space of 8) plus 88 colour x scale pairs. NOT exhaustive: untested legal configs are SUPPORTED_BUT_UNTESTED.
G16 Clean-room consumer E2E (no Blender)Passed 26 checks
evidence-binding— clean-room run bound to GLB 5e09ffce53e2, contract 58c9781b89a6, SDK sources 92f097f4200bno-blender-environment— 9/9 clean-room assertions passed (blender-not-on-path, blender-bin-unset, blender-not-installed, bpy-not-importable, publisher-scripts-absent, no-blend-sources, no-blender-mcp-packages, consumer-code-has-no-blender-path, installed-sdk-has-no-blender-path)network-disabled— container network: nonepublished-artifacts-only— customer project installed 15 dependencies from packed SDK tarballs + public npm registry (pnpm install --frozen-lockfile during the image build; tests run with --network none); workspace links: 0; unpublished/private packages: 0customer-build-dev-offline— development build (React Strict Mode checks active) succeeded offlinecustomer-build-offline— vite build of the plain Three.js + R3F pages succeeded with --network nonecustomer-typecheck— the customer code type-checks (tsc 7.0.2, strict) against the PUBLISHED .d.ts of the SDK tarballskit-files-unchanged— 251 kit files (manifests, GLBs, thumbnails) unchanged; the original GLB is never writtenr3f-capabilities— React Three Fiber <Asset customize>, published SDK, --network none: wood-color=#2E5A88, size-scale=1.2, armrests=false applied as declared; the unmodified instance mounts nothing, hides nothing and keeps the shared materials; source unchanged; a released extra instance leaves nothing behindr3f-loads— page loaded the kit through the SDK; console/page errors 0, failed requests 0, external requests 0r3f-original-unchanged— original bench still uses the shared source material #AE855E, rendered sRGB(170,130,92); the recolor did not reach itr3f-recolor— recolored bench: seat material #5A3A22 (instance-owned copy), rendered sRGB(88,57,33) vs requested #5A3A22r3f-scale— scaled bench: size ratio 1.20000 x 1.20000 x 1.20000 (want 1.2), base at y=0.000000, wood stays default #AE855Er3f-scene-assembly— 161/161 pinned instances (explorable town: snapped tiles, modular buildings, street furniture) from scenes/town.scene.json; ground contact ok; road anchor joints 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000 m (<= 0.01); per-instance customizations as declared; 77 attach_to snaps measured within 1 mm, outward opposedr3f-shared-cache-unchanged— the cached source (materials + geometry hashes) equals a freshly loaded copy; GLB requested 5x, pinned sha256 5e09ffce53e2…r3f-strict-mode-lifecycle— React dev build with <StrictMode> around and inside <Canvas>: 8 steps (mount-3 3/2, re-customize-b 3/2, same-values-new-object 3/2, unmount-all 0/0, flash-mount 0/0, unmount-before-load 0/0, remount-2 2/1, final-unmount 0/0); mismatches: none; final live 0, owned materials 0, cache evicted true (GPU geometries after evict: 0); GPU geometries 6 -> 6, textures 1 -> 1, programs 1 -> 1; render double-invocation observed (2 renders / 1 effect mounts, 0 unmounts)r3f-unsupported-refused— { slats: 8 } -> UNSUPPORTED_OPERATION/UNKNOWN_CAPABILITY, legal alternatives wood-color, size-scale, armrests; still exactly 3 live instances (nothing half-created)sdk-from-published-tarballs— 5 SDK packages installed from 5 packed tarballs (agent-ready-assets-contracts-0.5.1.tgz a5bdf0e8e61f, agent-ready-assets-customization-0.5.1.tgz 27f8d9e5f236, agent-ready-assets-runtime-three-0.5.1.tgz 375568d160e0, agent-ready-assets-runtime-r3f-0.5.1.tgz 301dab5c77f2, agent-ready-assets-asset-cli-0.5.1.tgz f23727fa70b4); workspace/link specs in lockfile: 0; packages not from the tarballs: 0vanilla-capabilities— plain Three.js library.instantiate, published SDK, --network none: wood-color=#2E5A88, size-scale=1.2, armrests=false applied as declared; the unmodified instance mounts nothing, hides nothing and keeps the shared materials; source unchanged; a released extra instance leaves nothing behindvanilla-loads— page loaded the kit through the SDK; console/page errors 0, failed requests 0, external requests 0vanilla-original-unchanged— original bench still uses the shared source material #AE855E, rendered sRGB(171,130,92); the recolor did not reach itvanilla-recolor— recolored bench: seat material #5A3A22 (instance-owned copy), rendered sRGB(88,57,33) vs requested #5A3A22vanilla-scale— scaled bench: size ratio 1.20000 x 1.20000 x 1.20000 (want 1.2), base at y=0.000000, wood stays default #AE855Evanilla-scene-assembly— 161/161 pinned instances (explorable town: snapped tiles, modular buildings, street furniture) from scenes/town.scene.json; ground contact ok; road anchor joints 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000 m (<= 0.01); per-instance customizations as declared; 77 attach_to snaps measured within 1 mm, outward opposedvanilla-shared-cache-unchanged— the cached source (materials + geometry hashes) equals a freshly loaded copy; GLB requested 2x, pinned sha256 5e09ffce53e2…vanilla-unsupported-refused— { slats: 8 } -> UNSUPPORTED_OPERATION/UNKNOWN_CAPABILITY, legal alternatives wood-color, size-scale, armrests; still exactly 3 live instances (nothing half-created)
G17 Agent / CLI contractPassed 32 checks
evidence-binding— clean-room run bound to GLB 5e09ffce53e2, contract 58c9781b89a6, SDK sources 92f097f4200bagent-transcript-path-b— 44/44 scripted agent steps matched their expected outcome (read kit -> doctor -> inspect -> customize x2 -> 6 refusals -> modular host: read, inspect, swap + colour + toggle, 2 refusals, snapped scene, incompatible snap refused -> 8 capability assets: inspect, dry-run config, refused value -> verify-project)cli-capabilities-config— installed CLI, no MCP: inspect --capabilities -> wood-color (material-color), size-scale (uniform-scale), armrests (node-visibility); customize --dry-run of {"wood-color":"#2E5A88","size-scale":1.2,"armrests":false} -> exit 0, config sha256 75318b47070dcli-customize-declarative— walnut and large configs written as canonical declarative JSON; GLBs written outside the kit: 0cli-doctor-no-blender— exit 0cli-inspect-exact-capabilities— inspect returns exactly the manifest capabilities (ids, typed inputs, targets): identicalcli-inspect-l1-truthful— the lamp is reported with exactly its declared capabilities (light); none recolours itcli-json-contract— 41 CLI --json responses, all valid against cli-output.schema.json (from the published @agent-ready-assets/contracts)cli-no-side-effects-on-refusal— none of the 17 refused requests created or changed a filecli-output-sandbox— writing outside the project is refused and nothing appears therecli-refuses-export-glb— exit 4 NOT_IMPLEMENTED/EXPORT_GLB_NOT_SUPPORTEDcli-refuses-invalid-parameter— size-scale 2 -> INVALID_PARAMETER/OUT_OF_RANGE: size-scale: 2 outside [0.85, 1.2]cli-refuses-unsupported— slats -> UNSUPPORTED_OPERATION (alternatives: wood-color,size-scale,armrests; hint: seat_slats, back_slats are publisher-only Blender recipe parameters (declared.recipe_param…); lamp recolor -> UNSUPPORTED_OPERATION ("glass-color" is not an advertised Blender-free capability; supported Blender-fr…)cli-refuses-unsupported-value— wood-color="red" -> INVALID_PARAMETER/MALFORMED_COLOR: wood-color: expected #RRGGBB color (6 hex digits, sRGB), got "red"; nothing writtencli-scene-snapping— scenes/town.scene.json: PASS, 161 instances, 77 snapped within tolerance; bench onto a road end -> INCOMPATIBLE_PART/SNAP_INCOMPATIBLEcli-version-mismatch— exit 1 VERSION_MISMATCH/VERSION_MISMATCHverify-project-locally-validated— LOCALLY_VALIDATED: 3 configs + 1 scene rendered in 156.0.8078.4 (ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver)); 40 browser checks; report .agent-ready-assets/verify/report.jsonremote-mcp-binding— MCP discovery -> CLI install -> SDK checks of the M3 clean room, bound to this asset's bytesmcp:customize-modular— stylized-town/house-01@0.2.0 {"front-door":"door-02","wall-color":"paving","chimney":false} -> exit 0 src/generated/host-modular.customization.json (config sha256 0c8e79f33ca0)mcp:customize-supported— wood-color #2E6B4F + size-scale 1.1 -> src/generated/bench-green.customization.json (config sha256 491b148ab9e3)mcp:mcp-capabilities— bench: wood-color, size-scale, armrests (recipe knobs flagged as non-customer: width_m, height_m, depth_m); lamp: L2, capabilities light (none recolours it)mcp:mcp-cli-capabilities-consistent— MCP get_customization_capabilities == installed manifest via CLI inspect: wood-color,size-scale,armrestsmcp:mcp-discovery— list_kits -> stylized-town@0.4.0; search "park bench" -> stylized-town/bench-01@0.4.0, stylized-town/lawn-tile-01@0.1.0, stylized-town/shrub-01@0.2.0, stylized-town/tree-01@0.2.0, stylized-town/tree-02@0.1.0, stylized-town/bus-stop-01@0.1.0; get_kit -> stylized-town/awning-01@0.1.0, stylized-town/bench-01@0.4.0, stylized-town/bus-stop-01@0.1.0, stylized-town/cafe-01@0.1.0, stylized-town/door-01@0.1.0, stylized-town/door-02@0.1.0, stylized-town/fence-01@0.2.0, stylized-town/hedge-01@0.1.0, stylized-town/house-01@0.2.0, stylized-town/house-02@0.1.0, stylized-town/lawn-tile-01@0.1.0, stylized-town/mailbox-01@0.1.0, stylized-town/market-stall-01@0.1.0, stylized-town/plaza-tile-01@0.1.0, stylized-town/road-corner-01@0.2.0, stylized-town/road-cross-01@0.1.0, stylized-town/road-crosswalk-01@0.1.0, stylized-town/road-straight-01@0.3.0, stylized-town/road-tee-01@0.2.0, stylized-town/roof-gable-01@0.1.0, stylized-town/roof-hip-01@0.1.0, stylized-town/shop-01@0.2.0, stylized-town/shrub-01@0.2.0, stylized-town/street-lamp-01@0.3.0, stylized-town/townhall-01@0.1.0, stylized-town/trash-bin-01@0.2.0, stylized-town/tree-01@0.2.0, stylized-town/tree-02@0.1.0, stylized-town/window-01@0.1.0, stylized-town/window-02@0.1.0mcp:mcp-modular-capabilities— stylized-town/house-01@0.2.0: front-door -> door-01*=stylized-town/door-01@0.1.0 (plug door-plug), door-02=stylized-town/door-02@0.1.0 (plug door-plug); window-style -> window-01*=stylized-town/window-01@0.1.0 (plug window-plug), window-02=stylized-town/window-02@0.1.0 (plug window-plug); roof -> roof-gable-01*=stylized-town/roof-gable-01@0.1.0 (plug roof-plug-house), roof-hip-01=stylized-town/roof-hip-01@0.1.0 (plug roof-plug-house); snapping 1.1.0, 1 connectors; 6 pinned parts; storeys listed as unsupported: truemcp:mcp-modular-guide— get_customization_guide stylized-town/house-01@0.2.0: 14 unsupported examples (storeys refused, foreign part PART_NOT_ALLOWED); code uses instance.parts: truemcp:mcp-recommend-snapped— recommend_scene town-customized: scene 1.1.0, 161 instances, 77 attach_to snaps (tested scene: 77), 871 free connectorsmcp:mcp-tools-read-only— 10 tools (search_assets, get_asset, list_kits, get_kit, recommend_scene, get_integration_guide, get_customization_capabilities, get_customization_guide, get_validation_report, get_download_url), all readOnlyHint; server agent-ready-assets-catalog@0.1.0mcp:refuses-foreign-part— front-door=window-01 -> INCOMPATIBLE_PART/PART_NOT_ALLOWED: front-door: "window-01" is not an allowlisted part for this slot; allowed: "door-01" (stylized-town/door-01@0.1.0), "doomcp:refuses-roof-config— roof-color: before install KIT_NOT_FOUND (nothing to validate against yet), after install UNSUPPORTED_OPERATION: "roof-color" is not an advertised Blender-free capability; supported Blender-free capabilities of stylized-town/bench-01mcp:refuses-slats— slats: UNSUPPORTED_OPERATIONmcp:refuses-storeys— "three storeys" (storeys: 3) -> UNSUPPORTED_OPERATION/UNKNOWN_CAPABILITY: "storeys" is not an advertised Blender-free capability; supported Blender-free capabilities of stylized-town/house-01@0.mcp:roof-request-via-capability— stylized-town/house-01@0.2.0 declares roof-color (enum, swatches terracotta/curb-stone): "terracotta" (#C97755, closest to red #B22222) -> customize exit 0, src/generated/red-roof.customization.json; roof-color on the bench is still refused (see refuses-roof-config)
Customization evidence
Tested with SDK 0.5.1: 119 accepted and 39 rejected cases (158 in total, 96 pairwise combinations). A rejected case is a request the asset must refuse.
| Preset | Values | Status | Config sha256 |
|---|---|---|---|
original | {} | Passed | 721a7ab6ef313fb05f45e427fde2734a6b216e8d1cadc127231632fb323cfc43 |
walnut | {"wood-color":"#5A3A22"} | Passed | 9eefe42841c00786b0dac3998620d02eccad527e7abb7beb7ecb3572990526c3 |
light-oak | {"wood-color":"#C9A27A"} | Passed | bfed4635963b1cec282654552ef45309e66528500eaeb58007ec6daf1e2cf8cb |
painted-blue | {"wood-color":"#4F6D7A"} | Passed | 6da6d1712dcc5740e43fbfee1863be3ce79e32b7774b44b41cba018b9e30887d |
smallest | {"size-scale":0.85} | Passed | 41811912d2a71b630f40d6c6296e5af33899fe169aeb3c6f96402c7e6d986e3c |
largest | {"size-scale":1.2} | Passed | fedc5a3bc63967dab2cc4b2cc64334ae80b1c6e39c09e0dc613109f030a705d9 |
walnut-large | {"wood-color":"#5A3A22","size-scale":1.2} | Passed | b0e807e669f082ef443b2cc2e4c8cbed903f3a640e1ae284c477eed2ff53f105 |
armrests-false | {"armrests":false} | Passed | 33776a507ad8cf74e939875d6ae9411b1bc470d7059bddda1823b015bbb67e75 |
Test environment
- blender_build
- 5.2.2 LTS
- gltf_exporter
- 5.2.40
- node
- v22.21.1
- three
- 186
- chromium
- 156.0.8078.4
- playwright
- 1.64.1
- webgl_renderer
- ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver)
- renderer_policy
- swiftshader
- gltf_validator
- 2.0.0-dev.3.10
- gltf_transform
- 4.5.1
Prepared for publication: 0 fragments that identified test machines or networks were redacted. Fields not shown: none.