stylized-town/house-01@0.2.0

Quality report: Town house with swappable parts

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

See the asset

The files this report describes

GLB file
house-01.glb · 368 KB
GLB sha256
baec4c76252735b7caef8b8ff0c9ac927c5ae4c28062b7316b20ea90c8ee54ee
Manifest sha256
f5160091c74a08e1d8a0d217828b6fd3662b619879d37c266d387ba85d76b69c
Package sha256
628b6c16c394622de521efa93727eefa11f65d40b31c4938b0b758c27d002a2e
Published report sha256
c2f794f5f562f1835196b8f8b291d1a43cd5339c3f830cb0766ed6b2d82495ae
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 house-01.glb

Gates

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.json
  • generator-allowlisted — town2m-building@2.2.0 is allowlisted
  • source-inputs-schema — source-inputs.json is schema-valid
  • recipe-hash-bound — recorded recipe hash matches recipe.json
  • palette-hash-bound — recorded palette hash matches the palette file
  • generator-sources-bound — recorded generator source hash matches current generator code
  • input-rights — original-generated: no third-party inputs
  • ai-models — no AI model contributed to this asset
  • glb-built-from-recipe — build-info records the current recipe hash
  • blender-pinned — built with Blender 5.2.2 LTS
  • exporter-pinned — glTF exporter 5.2.40
G1 Build reproducibilityPassed 7 checks
  • regenerate — recipe regenerated in a fresh headless Blender process
  • fingerprint-geometry — geometry fingerprint matches
  • fingerprint-materials — materials fingerprint matches
  • fingerprint-nodes — nodes fingerprint matches
  • fingerprint-textures — textures fingerprint matches
  • fingerprint-animations — animations fingerprint matches
  • byte-identical — regenerated GLB is byte-identical
G2 Portable authoring source (.blend)Passed 7 checks
  • blend-opens — opened in a fresh --factory-startup process
  • no-linked-libraries — 0 linked libraries
  • no-missing-external-files — 0 of 0 external file references are missing
  • no-absolute-paths — 0 absolute file references
  • images-packed — 0 unpacked file images
  • expected-collections — missing collections: []
  • embedded-recipe — root carries the canonical recipe hash
G3 glTF compliance (Khronos validator)Passed 6 checks
  • glb-container — GLB v2, 376592 bytes
  • gltf-version — asset.version 2.0
  • khronos-validator — 0 errors, 0 warnings, 19 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 — 6144 triangles in 13 primitives
  • finite-attributes — 0 non-finite attribute values
  • single-root — scene roots: root
  • root-transform — root T[0, 0, 0] R[0, 0, 0, 1] S[1, 1, 1]
  • unique-node-names — node names unique
  • declared-nodes-present — all 36 declared nodes present
  • no-undeclared-nodes — no undeclared nodes
  • node-kinds — node kinds and materials match the contract
  • valid-indices — 0 triangles with out-of-range indices
  • degenerate-faces — 0 zero-area triangles (0%, limit 1%)
  • outward-winding — 10 closed primitives wound outward
  • normals — normals: missing on [], 0 triangles disagree with winding, 0 non-unit
  • finite-bounds — world bounds [-1.92, 0, -2.75] .. [1.92, 8.612, 3.09]
  • nonzero-bounds — world size [3.84, 8.612, 5.84] m
  • dimensions — measured [3.84, 8.612, 5.84] m vs target [3.84, 8.612, 5.84] (allowed ±[0.192, 0.4306, 0.292])
  • base-on-ground — min.y = 0 m (limit ±0.02)
  • inside-lot — bounds x -1.92..1.92, z -2.75..3.09 vs lot ±2 x ±3.1 m (tolerance 0.02)
  • world-scale — root world scale [1, 1, 1]
  • measurement-agreement — Node (glTF-Transform) and browser (GLTFLoader) bounds differ by 0 m
  • basis-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 59 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-lot-front — at [0, 0, 3.1] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-door-main — at [-0.7, 0.37, 2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-front-0-1 — at [0.85, 1.25, 2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-front-1-1 — at [-0.85, 4.15, 2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-front-1-2 — at [0.85, 4.15, 2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-back-0-1 — at [0.85, 1.25, -2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-back-0-2 — at [-0.85, 1.25, -2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-back-1-1 — at [0.85, 4.15, -2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-back-1-2 — at [-0.85, 4.15, -2.5] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-left-0-1 — at [-1.8, 1.25, -1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-left-0-2 — at [-1.8, 1.25, 1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-left-1-1 — at [-1.8, 4.15, -1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-left-1-2 — at [-1.8, 4.15, 1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-right-0-1 — at [1.8, 1.25, 1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-right-0-2 — at [1.8, 1.25, -1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-right-1-1 — at [1.8, 4.15, 1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-window-right-1-2 — at [1.8, 4.15, -1.2] (error 0 m), outward dot 1, up dot 1
  • anchor:anchor-roof — at [0, 6.15, 0] (error 0 m), outward dot 1, up dot 1
  • slot:anchor-door-main — slot anchor-door-main (door-socket) with default part node door: present
  • slot:anchor-window-front-0-1 — slot anchor-window-front-0-1 (window-socket) with default part node windows: present
  • slot:anchor-window-front-1-1 — slot anchor-window-front-1-1 (window-socket) with default part node windows: present
  • slot:anchor-window-front-1-2 — slot anchor-window-front-1-2 (window-socket) with default part node windows: present
  • slot:anchor-window-back-0-1 — slot anchor-window-back-0-1 (window-socket) with default part node windows: present
  • slot:anchor-window-back-0-2 — slot anchor-window-back-0-2 (window-socket) with default part node windows: present
  • slot:anchor-window-back-1-1 — slot anchor-window-back-1-1 (window-socket) with default part node windows: present
  • slot:anchor-window-back-1-2 — slot anchor-window-back-1-2 (window-socket) with default part node windows: present
  • slot:anchor-window-left-0-1 — slot anchor-window-left-0-1 (window-socket) with default part node windows: present
  • slot:anchor-window-left-0-2 — slot anchor-window-left-0-2 (window-socket) with default part node windows: present
  • slot:anchor-window-left-1-1 — slot anchor-window-left-1-1 (window-socket) with default part node windows: present
  • slot:anchor-window-left-1-2 — slot anchor-window-left-1-2 (window-socket) with default part node windows: present
  • slot:anchor-window-right-0-1 — slot anchor-window-right-0-1 (window-socket) with default part node windows: present
  • slot:anchor-window-right-0-2 — slot anchor-window-right-0-2 (window-socket) with default part node windows: present
  • slot:anchor-window-right-1-1 — slot anchor-window-right-1-1 (window-socket) with default part node windows: present
  • slot:anchor-window-right-1-2 — slot anchor-window-right-1-2 (window-socket) with default part node windows: present
  • slot:anchor-roof — slot anchor-roof (roof-socket-house) with default part node roof: present
  • multi-view — 6 of 6 contact-sheet views rendered
  • slot-group:windows — slot group windows: 15 window-socket slots baking stylized-town/window-01@0.1.0, all swapped together by "window-style" (docs/18 §18.5); the node must hold the union of the default part at every slot (slot-node:windows)
  • slot-default:anchor-door-main — door holds stylized-town/door-01@0.1.0 at anchor-door-main: 256 vertices within 0.1 mm (worst 0.0002 mm), materials mat-door, mat-trim, part recipe 819d022d3cbb as recorded by the host build
  • slot-default:anchor-window-front-0-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-front-0-1: 132 vertices within 0.1 mm (worst 0.0002 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-front-1-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-front-1-1: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-front-1-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-front-1-2: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-back-0-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-back-0-1: 132 vertices within 0.1 mm (worst 0.0001 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-back-0-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-back-0-2: 132 vertices within 0.1 mm (worst 0.0001 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-back-1-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-back-1-1: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-back-1-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-back-1-2: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-left-0-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-left-0-1: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-left-0-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-left-0-2: 132 vertices within 0.1 mm (worst 0.0002 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-left-1-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-left-1-1: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-left-1-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-left-1-2: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-right-0-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-right-0-1: 132 vertices within 0.1 mm (worst 0.0001 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-right-0-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-right-0-2: 132 vertices within 0.1 mm (worst 0.0001 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-right-1-1 — windows holds stylized-town/window-01@0.1.0 at anchor-window-right-1-1: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-window-right-1-2 — windows holds stylized-town/window-01@0.1.0 at anchor-window-right-1-2: 132 vertices within 0.1 mm (worst 0.0003 mm), materials mat-glass, mat-trim, part recipe 0d6939a3c0bb as recorded by the host build
  • slot-default:anchor-roof — roof holds stylized-town/roof-gable-01@0.1.0 at anchor-roof: 738 vertices within 0.1 mm (worst 0.0007 mm), materials mat-glass, mat-roof, mat-trim, mat-wall, part recipe 322091e944be as recorded by the host build
  • slot-node:door — door: every one of 256 baked vertices belongs to its slot default part; triangles per material match (mat-trim 224, mat-door 244)
  • slot-node:windows — windows: every one of 1980 baked vertices belongs to the default part at one of its 15 slots (slot group: the union of the default part placed by each slot's snap transform); triangles per material match (mat-trim 3480, mat-glass 180)
  • slot-node:roof — roof: every one of 738 baked vertices belongs to its slot default part; triangles per material match (mat-trim 464, mat-glass 24, mat-roof 836, mat-wall 32)
G6 Materials / texture correctnessPassed 6 checks
  • declared-materials — 7 declared materials present
  • no-undeclared-materials — no undeclared or duplicate materials
  • material-factors — metallic-roughness factors match the declared palette materials
  • pbr-runtime-material — GLTFLoader created metallic-roughness PBR materials
  • rendered-material-colors — rendered material colors within ±16/255 of the palette
  • no-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 rendered
  • tested-bytes — browser hashed the exact published bytes
  • console-errors — no console errors
  • page-errors — no uncaught page errors
  • network — no failed or missing resource requests
  • no-external-requests — no requests outside the local origin
  • webgl-context — WebGL context stable
  • gl-errors — gl.getError() == NO_ERROR after every render
  • draw-calls — 13 draw calls (ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver))
  • render-coverage — coverage per view: front 30.2%, back 30.2%, left 47.3%, right 47.3%, top 52.4%, iso 33%
  • not-black — max mean luminance of visible pixels 0.278 (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 — 376592 bytes (budget 3145728)
  • triangles — 6144 triangles (budget 20000)
  • materials — 7 materials (budget 8)
  • texture-size — largest texture 0px (budget 1024)
  • draw-calls — 13 draw calls in the iso view (budget 16)
  • 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 sheet
  • visual-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=false
  • human-approval — approved by Ricardo Carvalho
  • golden-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 baec4c762527, manifest 8f5406d0cdb0, distribution sources 59d6a893dddf
  • network-isolation — online phase: internal docker network (catalog + hostile registries only, no internet); offline phase: --network none
  • no-blender-environment — customer container: blender absent (command -v blender fails); python3 absent; node v22.21.1; three 0.186.1; SDK 0.5.1
  • clean-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 0
  • customization-isolation — customized bench wood #5A3A22 (own material true), original/source #AE855E/#AE855E, height ratio 1.2
  • guide-modular-host-written — entry file of get_integration_guide stylized-town/house-01@0.2.0 (three) written unchanged: src/host.ts 4c553ff2aae4
  • guides-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 ab13d2c09b45
  • host-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 0
  • host-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 0
  • install-idempotent — add stylized-town/bench-01@0.4.0 (registry from the lockfile, public): installed; kit add again: unchanged
  • install-via-mcp-url — get_download_url (entitlement ent-customer) -> agent-ready-assets kit add --url: installed; lockfile package sha256 17fd2f57c7c6339f == MCP == catalog
  • installed-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 pins
  • modular-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 unchanged
  • offline-customize-modular — customize stylized-town/house-01@0.2.0 (swap + colour + toggle) --dry-run: exit 0, config sha256 0c8e79f33ca0
  • offline-customize — customize --dry-run: config sha256 491b148ab9e3
  • offline-inspect — inspect stylized-town/bench-01@0.4.0: wood-color, size-scale, armrests
  • offline-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 resolved
  • offline-scene-validate — scene validate: PASS
  • offline-tamper-detected — one flipped byte in bench-01.glb -> verify exit 1 INTEGRITY_FAILED; restored -> exit 0
  • offline-verify — verify against assets.lock.json: exit 0
  • r3f-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 0
  • scene-snaps-resolved — scene validate --resolve: 77 attach_to snaps resolved (recommend_scene said 77), 0 outside 1 mm / opposed / aligned
  • scene-validate — recommend_scene -> src/scenes/town.scene.json: PASS, 161 instances
  • starter-starter-r3f:build — vite build: exit 0
  • starter-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 installed
  • starter-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 0
  • starter-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 0
  • starter-starter-r3f:verify-project-locally-validated — verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenes
  • starter-starter-r3f:verify — agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASS
  • starter-starter-vanilla:build — vite build: exit 0
  • starter-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 installed
  • starter-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 0
  • starter-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 0
  • starter-starter-vanilla:verify-project-locally-validated — verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenes
  • starter-starter-vanilla:verify — agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASS
  • vanilla-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 0
  • dimensions-match-manifest — stylized-town/house-01@0.2.0: measured 3.84 x 8.612 x 5.84 m vs manifest 3.84 x 8.612 x 5.84 m (tolerance 5% or 2 cm); GLB sha256 baec4c76252735b7...
  • installed-bytes-pinned — installed public/assets/stylized-town/assets/house-01/0.2.0/house-01.glb sha256 baec4c76252735b7 / manifest 8f5406d0cdb0ae6f vs catalog pins baec4c76252735b7 / 8f5406d0cdb0ae6f
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 unchanged
  • auth-no-token — kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchanged
  • auth-wrong-scope — kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchanged
  • hostile-archive-symlink — add evil/archive-symlink@1.0.0 -> exit 1 INTEGRITY_FAILED/SYMLINK_ENTRY; project unchanged
  • hostile-archive-traversal — add evil/archive-traversal@1.0.0 -> exit 1 INTEGRITY_FAILED/PATH_TRAVERSAL; project unchanged
  • hostile-corrupt-bytes — add evil/corrupt-bytes@1.0.0 -> exit 1 INTEGRITY_FAILED/PACKAGE_HASH_MISMATCH; project unchanged
  • hostile-cross-origin-ticket — add evil/cross-origin-ticket@1.0.0 -> exit 1 UNSAFE_ORIGIN/CROSS_ORIGIN; project unchanged
  • hostile-gzip-bomb — add evil/gzip-bomb@1.0.0 -> exit 1 INTEGRITY_FAILED/ARCHIVE_TOO_LARGE; project unchanged
  • hostile-manifest-path-escape — add evil/manifest-path-escape@1.0.0 -> exit 1 INTEGRITY_FAILED/MANIFEST_INVALID; project unchanged
  • hostile-phantom-capability — add evil/phantom-capability@1.0.0 -> exit 1 INTEGRITY_FAILED/CONTRACT_INVALID; project unchanged
  • hostile-redirect — add evil/redirect@1.0.0 -> exit 1 UNSAFE_ORIGIN/REDIRECT; project unchanged
  • insecure-scheme — add stylized-town/bench-01@0.4.0 --registry <internal http origin> -> exit 1 UNSAFE_ORIGIN/INSECURE_SCHEME; project unchanged
  • mcp-download-requires-entitlement — anonymous: ENTITLEMENT_REQUIRED; expired token: ENTITLEMENT_EXPIRED
  • no-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 15 checks
  • manifest-schema — manifest matches asset.schema.json v1.1.0
  • contract — 6 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:front-door — default "door-01" validates through the SDK
  • default-valid:window-style — default "window-01" validates through the SDK
  • default-valid:roof — default "roof-gable-01" validates through the SDK
  • default-valid:chimney — default true validates through the SDK
  • default-valid:wall-color — default "ivory" validates through the SDK
  • default-valid:roof-color — default "terracotta" validates through the SDK
  • glb-targets — every target resolves exactly once in the exact GLB bytes: front-door -> node #22; window-style -> node #34,34,34,34,34,34,34,34,34,34,34,34,34,34,34; roof -> node #29; chimney -> node #19; wall-color -> material #6; roof-color -> material #5
  • modularity — 18 connectors with unit/orthogonal frames, 17 slots and 1 optional parts consistent with the measured GLB names
  • glb-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 slot
  • declaration-binding — manifest customization/engines are exactly the declaration for stylized-town/house-01@0.2.0
  • recipe-knobs-not-advertised — none of the 17 publisher recipe parameters (e.g. kind, width-m) is advertised as a consumer capability
  • runtime-resolution-0.4 — SDK resolved front-door, window-style, roof, chimney, wall-color, roof-color 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 20 checks
  • modular-cases-ran — 143 SDK 0.4.0 corpus cases executed in Chromium through the SDK
  • modular-accepted-applied — 110 legal configurations applied (swaps, toggles, swatches and their combinations); browser config hashes equal the Node canonical hashes
  • modular-rejected-refused — 33 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 nothing
  • connectors-preserved — every other connector node stays within 1 mm and keeps its orientation
  • ground-contact — the lowest point stays within 2 cm of the authored asset
  • swap-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 true
  • visibility-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 surfaces
  • mandatory-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 copy
  • part-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 instance
  • modular-resource-release — release() restores the library for every case; 24 mount/render/release cycles: 0 part instances mounted / 0 released, owned materials 48 created / 48 disposed
  • modular-no-errors — no console or page errors
  • modular-network — no failed, missing or external requests
  • modular-webgl — no GL errors or context loss
  • modular-coverage-accounting — tested 110 accepted + 33 rejected SDK 0.4.0 cases (seed 20261023); every swap choice, both visibility states and every swatch individually; 96 SDK 0.4.0 combination cases (full-product over a sampled space of 96). The full legal value space was enumerated.
G16 Clean-room consumer E2E (no Blender)Passed 10 checks
  • evidence-binding — clean-room run bound to GLB baec4c762527, contract 54cc92d2ca42, SDK sources 92f097f4200b
  • no-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: none
  • published-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: 0
  • customer-build-dev-offline — development build (React Strict Mode checks active) succeeded offline
  • customer-build-offline — vite build of the plain Three.js + R3F pages succeeded with --network none
  • customer-typecheck — the customer code type-checks (tsc 7.0.2, strict) against the PUBLISHED .d.ts of the SDK tarballs
  • r3f-capabilities — React Three Fiber <Asset customize>, published SDK, --network none: front-door=door-02, window-style=window-02, roof=roof-hip-01, chimney=false, wall-color=paving, roof-color=curb-stone applied as declared (17 mounted part instance(s)); the unmodified instance mounts nothing, hides nothing and keeps the shared materials; source unchanged; a released extra instance leaves nothing behind
  • 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: 0
  • vanilla-capabilities — plain Three.js library.instantiate, published SDK, --network none: front-door=door-02, window-style=window-02, roof=roof-hip-01, chimney=false, wall-color=paving, roof-color=curb-stone applied as declared (17 mounted part instance(s)); the unmodified instance mounts nothing, hides nothing and keeps the shared materials; source unchanged; a released extra instance leaves nothing behind
G17 Agent / CLI contractPassed 18 checks
  • evidence-binding — clean-room run bound to GLB baec4c762527, contract 54cc92d2ca42, SDK sources 92f097f4200b
  • cli-capabilities-config — installed CLI, no MCP: inspect --capabilities -> front-door (modular-swap), window-style (modular-swap), roof (modular-swap), chimney (node-visibility), wall-color (material-color), roof-color (material-color); customize --dry-run of {"front-door":"door-02","window-style":"window-02","roof":"roof-hip-01","chimney":false,"wall-color":"paving","roof-color":"curb-stone"} -> exit 0, config sha256 506a884aacde
  • cli-refuses-unsupported-value — front-door="front-door-not-a-part" -> INCOMPATIBLE_PART/PART_NOT_ALLOWED: front-door: "front-door-not-a-part" is not an allowlisted part for this slot; allowed: "door-01" (stylized-town/door-01@0.1.0), "door-02" (s; nothing written
  • remote-mcp-binding — MCP discovery -> CLI install -> SDK checks of the M3 clean room, bound to this asset's bytes
  • mcp: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,armrests
  • mcp: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.0
  • mcp: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: true
  • mcp: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: true
  • mcp:mcp-recommend-snapped — recommend_scene town-customized: scene 1.1.0, 161 instances, 77 attach_to snaps (tested scene: 77), 871 free connectors
  • mcp: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.0
  • mcp: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), "doo
  • mcp: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-01
  • mcp:refuses-slats — slats: UNSUPPORTED_OPERATION
  • mcp: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: 110 accepted and 33 rejected cases (143 in total, every legal combination). A rejected case is a request the asset must refuse.

PresetValuesStatusConfig sha256
original{}Passeda035a28ab04a3cfe9b698dfbc23e830f55a18d61385dc6ba4a1ed34b1df3974c
front-door-door-02{"front-door":"door-02"}Passed969dd439e9a4e77b468e02ba292e94ea5e8677df7bf131fa1ff390212ad5efa9
window-style-window-02{"window-style":"window-02"}Passed1007a431668f03a5b0994f802ead7ea64b7ac26abda80fa1d32fa3c7f024ee9c
roof-roof-hip-01{"roof":"roof-hip-01"}Passedf57e8588bb771e333c32966f3d04ad4406c88708b1e6f5ef7593a5df7c282832
chimney-false{"chimney":false}Passedfee79cb05f2874f4c979b5fb85535131f904e53cc0d7717e65816c1f5c67ebb9
wall-color-paving{"wall-color":"paving"}Passed11c3f6ada3919f61326b7147d37b6f444e6b8d1ce1826248efbd06b260a70694
wall-color-leaf{"wall-color":"leaf"}Passed05fa92f84367557dc8bc90b263704863caebeea1ba7da08337d5982e135d11e7
roof-color-curb-stone{"roof-color":"curb-stone"}Passed8f311329dd721a8946189770f5f3f384a273bd40d8661885aa461d1f8c10ba22
all-alternatives{"front-door":"door-02","window-style":"window-02","roof":"roof-hip-01","chimney":false,"wall-color":"paving","roof-color":"curb-stone"}Passed506a884aacde1f3bea4337cc5b7427e459ea9085f15a5a73402c648358a87dda

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.