{"asset":"stylized-town/cafe-01@0.1.0","id":"cafe-01","version":"0.1.0","title":"Cafe with terrace","schema":"agent-ready-assets public QA report v1 (sanitized subset of qa/report.json)","published_sha256":"a3de404ef771034f441d9e08a20a2e43bc39bba3ca5a2bc02ba9dd5b99f1076c","artifact":{"path":"cafe-01.glb","sha256":"01ae267e82ea58a07728660721c3419927702fd332b0b3cf9b9ac83a21d5fcd1","size_bytes":381492},"package_sha256":"31ca57302c8827db75e66268ab74040d8bce6c323b458514d17e7c1c11d8d978","manifest_sha256":"2eab96b45fe69b059b32b6836dceace1be8ffbd15429f8947069e32f1458d3a2","release_policy":"kitnevo-production-1","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"},"automated_status":"PASSED","overall_status":"PASSED","release_eligible":true,"release_blockers":[],"visual_approval":{"status":"APPROVED"},"gates":[{"id":"G0","name":"Provenance / license","status":"PASSED","checks":[{"id":"recipe-schema","status":"PASSED","message":"recipe matches schemas/recipe.schema.json"},{"id":"generator-allowlisted","status":"PASSED","message":"town2m-building@2.2.0 is allowlisted"},{"id":"source-inputs-schema","status":"PASSED","message":"source-inputs.json is schema-valid"},{"id":"recipe-hash-bound","status":"PASSED","message":"recorded recipe hash matches recipe.json"},{"id":"palette-hash-bound","status":"PASSED","message":"recorded palette hash matches the palette file"},{"id":"generator-sources-bound","status":"PASSED","message":"recorded generator source hash matches current generator code"},{"id":"input-rights","status":"PASSED","message":"original-generated: no third-party inputs"},{"id":"ai-models","status":"PASSED","message":"no AI model contributed to this asset"},{"id":"glb-built-from-recipe","status":"PASSED","message":"build-info records the current recipe hash"},{"id":"blender-pinned","status":"PASSED","message":"built with Blender 5.2.2 LTS"},{"id":"exporter-pinned","status":"PASSED","message":"glTF exporter 5.2.40"},{"id":"generated-input:textures/awning-stripes-basecolor.png","status":"PASSED","message":"textures/awning-stripes-basecolor.png hash matches provenance record"}]},{"id":"G1","name":"Build reproducibility","status":"PASSED","checks":[{"id":"regenerate","status":"PASSED","message":"recipe regenerated in a fresh headless Blender process"},{"id":"fingerprint-geometry","status":"PASSED","message":"geometry fingerprint matches"},{"id":"fingerprint-materials","status":"PASSED","message":"materials fingerprint matches"},{"id":"fingerprint-nodes","status":"PASSED","message":"nodes fingerprint matches"},{"id":"fingerprint-textures","status":"PASSED","message":"textures fingerprint matches"},{"id":"fingerprint-animations","status":"PASSED","message":"animations fingerprint matches"},{"id":"byte-identical","status":"PASSED","message":"regenerated GLB is byte-identical"}]},{"id":"G2","name":"Portable authoring source (.blend)","status":"PASSED","checks":[{"id":"blend-opens","status":"PASSED","message":"opened in a fresh --factory-startup process"},{"id":"no-linked-libraries","status":"PASSED","message":"0 linked libraries"},{"id":"no-missing-external-files","status":"PASSED","message":"0 of 0 external file references are missing"},{"id":"no-absolute-paths","status":"PASSED","message":"0 absolute file references"},{"id":"images-packed","status":"PASSED","message":"0 unpacked file images"},{"id":"expected-collections","status":"PASSED","message":"missing collections: []"},{"id":"embedded-recipe","status":"PASSED","message":"root carries the canonical recipe hash"}]},{"id":"G3","name":"glTF compliance (Khronos validator)","status":"PASSED","checks":[{"id":"glb-container","status":"PASSED","message":"GLB v2, 381492 bytes"},{"id":"gltf-version","status":"PASSED","message":"asset.version 2.0"},{"id":"khronos-validator","status":"PASSED","message":"0 errors, 0 warnings, 4 infos (validator 2.0.0-dev.3.10)"},{"id":"no-required-extensions","status":"PASSED","message":"no required extensions (baseline loader needs no decoders)"},{"id":"extension-allowlist","status":"PASSED","message":"extensionsUsed ⊆ allowlist (0 used)"},{"id":"self-contained","status":"PASSED","message":"all buffers and images embedded"}]},{"id":"G4","name":"Shape / units / transforms","status":"PASSED","checks":[{"id":"has-geometry","status":"PASSED","message":"6020 triangles in 14 primitives"},{"id":"finite-attributes","status":"PASSED","message":"0 non-finite attribute values"},{"id":"single-root","status":"PASSED","message":"scene roots: root"},{"id":"root-transform","status":"PASSED","message":"root T[0, 0, 0] R[0, 0, 0, 1] S[1, 1, 1]"},{"id":"unique-node-names","status":"PASSED","message":"node names unique"},{"id":"declared-nodes-present","status":"PASSED","message":"all 22 declared nodes present"},{"id":"no-undeclared-nodes","status":"PASSED","message":"no undeclared nodes"},{"id":"node-kinds","status":"PASSED","message":"node kinds and materials match the contract"},{"id":"valid-indices","status":"PASSED","message":"0 triangles with out-of-range indices"},{"id":"degenerate-faces","status":"PASSED","message":"0 zero-area triangles (0%, limit 1%)"},{"id":"outward-winding","status":"PASSED","message":"12 closed primitives wound outward"},{"id":"normals","status":"PASSED","message":"normals: missing on [], 0 triangles disagree with winding, 0 non-unit"},{"id":"finite-bounds","status":"PASSED","message":"world bounds [-1.925, 0, -3.875] .. [1.925, 5.53, 3.75]"},{"id":"nonzero-bounds","status":"PASSED","message":"world size [3.85, 5.53, 7.625] m"},{"id":"dimensions","status":"PASSED","message":"measured [3.85, 5.53, 7.625] m vs target [3.85, 5.53, 7.625] (allowed ±[0.1925, 0.2765, 0.3813])"},{"id":"base-on-ground","status":"PASSED","message":"min.y = 0 m (limit ±0.02)"},{"id":"inside-lot","status":"PASSED","message":"bounds x -1.925..1.925, z -3.875..3.75 vs lot ±2 x ±4 m (tolerance 0.02)"},{"id":"world-scale","status":"PASSED","message":"root world scale [1, 1, 1]"},{"id":"measurement-agreement","status":"PASSED","message":"Node (glTF-Transform) and browser (GLTFLoader) bounds differ by 0 m"},{"id":"basis-fixture","status":"PASSED","message":"Blender +X/-Y/+Z arrows load as Three.js +X/+Z/+Y (Y-up, +Z front)"},{"id":"basis-exporter-match","status":"PASSED","message":"basis fixture exported by 5.2.40, asset by 5.2.40"}]},{"id":"G5","name":"Facing and modular alignment","status":"PASSED","checks":[{"id":"front-marker-direction","status":"PASSED","message":"marker +Z axis [0, 0, 1] · declared front [0, 0, 1] = 1 (min 0.99)"},{"id":"front-marker-side","status":"PASSED","message":"marker sits on the declared front side (alignment 1)"},{"id":"anchor:anchor-lot-front","status":"PASSED","message":"at [0, 0, 4] (error 0 m), outward dot 1, up dot 1"},{"id":"anchor:anchor-door-main","status":"PASSED","message":"at [1.05, 0.32, 0.6] (error 0 m), outward dot 1, up dot 1"},{"id":"anchor:anchor-awning","status":"PASSED","message":"at [0, 3.05, 0.6] (error 0 m), outward dot 1, up dot 1"},{"id":"slot:anchor-door-main","status":"PASSED","message":"slot anchor-door-main (door-socket) with default part node door: present"},{"id":"multi-view","status":"PASSED","message":"6 of 6 contact-sheet views rendered"},{"id":"slot-groups","status":"PASSED","message":"2 slots/baked parts, each with its own anchor and baked node (no slot group)"},{"id":"slot-default:anchor-door-main","status":"PASSED","message":"door holds stylized-town/door-02@0.1.0 at anchor-door-main: 328 vertices within 0.1 mm (worst 0.0002 mm), materials mat-door, mat-glass, mat-trim, part recipe c22872af3a7d as recorded by the host build"},{"id":"baked-part:anchor-awning","status":"PASSED","message":"awning holds stylized-town/awning-01@0.1.0 at anchor-awning: 204 vertices within 0.1 mm (worst 0.0004 mm), materials mat-awning, mat-trim, part recipe 7070763a0c65 as recorded by the host build"},{"id":"slot-node:door","status":"PASSED","message":"door: every one of 328 baked vertices belongs to its slot default part; triangles per material match (mat-trim 224, mat-glass 12, mat-door 364)"},{"id":"slot-node:awning","status":"PASSED","message":"awning: every one of 204 baked vertices belongs to its slot default part; triangles per material match (mat-awning 176, mat-trim 196)"}]},{"id":"G6","name":"Materials / texture correctness","status":"PASSED","checks":[{"id":"declared-materials","status":"PASSED","message":"8 declared materials present"},{"id":"no-undeclared-materials","status":"PASSED","message":"no undeclared or duplicate materials"},{"id":"material-factors","status":"PASSED","message":"metallic-roughness factors match the declared palette materials"},{"id":"texture-decode:awning-stripes-basecolor","status":"PASSED","message":"image/png decodes (1024x1024)"},{"id":"texture-size:awning-stripes-basecolor","status":"PASSED","message":"size 1024x1024 vs declared 1024x1024"},{"id":"texture-mime:awning-stripes-basecolor","status":"PASSED","message":"mime image/png"},{"id":"texture-uv:awning-stripes-basecolor","status":"PASSED","message":"textured primitives carry TEXCOORD_0"},{"id":"texture-swatches:awning-stripes-basecolor","status":"PASSED","message":"2 declared sRGB swatches match the embedded image"},{"id":"texture-placeholder:awning-stripes-basecolor","status":"PASSED","message":"0% placeholder-magenta texels"},{"id":"pbr-runtime-material","status":"PASSED","message":"GLTFLoader created metallic-roughness PBR materials"},{"id":"runtime-colorspace","status":"PASSED","message":"color textures sRGB, data textures linear, all decoded by the browser"},{"id":"rendered-swatches","status":"PASSED","message":"rendered texture swatches within ±16/255 of declared sRGB"},{"id":"rendered-material-colors","status":"PASSED","message":"rendered material colors within ±16/255 of the palette"},{"id":"no-placeholder-render","status":"PASSED","message":"no placeholder-magenta in rendered views"}]},{"id":"G7","name":"Web load and render (Chromium + Three.js)","status":"PASSED","checks":[{"id":"loader-ready","status":"PASSED","message":"GLTFLoader parsed the GLB and the scene rendered"},{"id":"tested-bytes","status":"PASSED","message":"browser hashed the exact published bytes"},{"id":"console-errors","status":"PASSED","message":"no console errors"},{"id":"page-errors","status":"PASSED","message":"no uncaught page errors"},{"id":"network","status":"PASSED","message":"no failed or missing resource requests"},{"id":"no-external-requests","status":"PASSED","message":"no requests outside the local origin"},{"id":"webgl-context","status":"PASSED","message":"WebGL context stable"},{"id":"gl-errors","status":"PASSED","message":"gl.getError() == NO_ERROR after every render"},{"id":"draw-calls","status":"PASSED","message":"14 draw calls (ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver))"},{"id":"render-coverage","status":"PASSED","message":"coverage per view: front 52.4%, back 52.4%, left 31.6%, right 31.6%, top 39.8%, iso 30.5%"},{"id":"not-black","status":"PASSED","message":"max mean luminance of visible pixels 0.211 (min 0.02)"}]},{"id":"G8","name":"Animation / skin","status":"NOT_APPLICABLE","checks":[{"id":"animations","status":"NOT_APPLICABLE","message":"no animations declared or present (static asset)"}]},{"id":"G9","name":"Optimized variant parity","status":"NOT_APPLICABLE","checks":[{"id":"optimized-variant","status":"NOT_APPLICABLE","message":"no optimized GLB variant in this package (baseline only)"}]},{"id":"G10","name":"Performance budgets","status":"PASSED","checks":[{"id":"glb-size","status":"PASSED","message":"381492 bytes (budget 3145728)"},{"id":"triangles","status":"PASSED","message":"6020 triangles (budget 20000)"},{"id":"materials","status":"PASSED","message":"8 materials (budget 8)"},{"id":"texture-size","status":"PASSED","message":"largest texture 1024px (budget 1024)"},{"id":"draw-calls","status":"PASSED","message":"14 draw calls in the iso view (budget 16)"},{"id":"load-timing","status":"PASSED","message":"browser timings recorded in browser.json; advisory only (software renderer, not a device benchmark)"}]},{"id":"G11","name":"Visual consistency + human approval","status":"PASSED","checks":[{"id":"contact-sheet","status":"PASSED","message":"6/6 views in the contact sheet"},{"id":"visual-qa","status":"PASSED","message":"V1-V13 PASSED (V1 PASSED, V2 PASSED, V3 PASSED, V4 PASSED, V5 PASSED, V6 PASSED, V7 PASSED, V8 PASSED, V9 PASSED, V10 PASSED, V11 PASSED, V12 PASSED, V13 PASSED; technical baseline MATCHED); qa/visual/index.html. Objective checks only: counts_as_approval=false"},{"id":"human-approval","status":"PASSED","message":"approved by Ricardo Carvalho"},{"id":"golden-diff","status":"PASSED","message":"fresh renders vs approved screenshots: front 0%, back 0%, left 0%, right 0%, top 0%, iso 0% (limit 0.2%)"}]},{"id":"G12","name":"Download / install","status":"PASSED","checks":[{"id":"evidence-binding","status":"PASSED","message":"clean-room run bound to GLB 01ae267e82ea, manifest 69470d1ce716, distribution sources 59d6a893dddf"},{"id":"network-isolation","status":"PASSED","message":"online phase: internal docker network (catalog + hostile registries only, no internet); offline phase: --network none"},{"id":"no-blender-environment","status":"PASSED","message":"customer container: blender absent (command -v blender fails); python3 absent; node v22.21.1; three 0.186.1; SDK 0.5.1"},{"id":"clean-room-steps","status":"PASSED","message":"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}"},{"id":"bench-guide","status":"PASSED","message":"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"},{"id":"customization-isolation","status":"PASSED","message":"customized bench wood #5A3A22 (own material true), original/source #AE855E/#AE855E, height ratio 1.2"},{"id":"guide-modular-host-written","status":"PASSED","message":"entry file of get_integration_guide stylized-town/house-01@0.2.0 (three) written unchanged: src/host.ts 4c553ff2aae4"},{"id":"guides-written-verbatim","status":"PASSED","message":"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"},{"id":"host-guide","status":"PASSED","message":"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"},{"id":"host-install-pulls-parts","status":"PASSED","message":"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"},{"id":"install-idempotent","status":"PASSED","message":"add stylized-town/bench-01@0.4.0 (registry from the lockfile, public): installed; kit add again: unchanged"},{"id":"install-via-mcp-url","status":"PASSED","message":"get_download_url (entitlement ent-customer) -> agent-ready-assets kit add --url: installed; lockfile package sha256 17fd2f57c7c6339f == MCP == catalog"},{"id":"installed-files-verified","status":"PASSED","message":"verify: stylized-town/bench-01@0.4.0 PASS (13 files); stylized-town@0.4.0 PASS (256 files)"},{"id":"installed-pins-match-catalog","status":"PASSED","message":"for every kit asset: installed GLB + manifest sha256 (CLI inspect) == MCP get_asset pins"},{"id":"modular-swap-isolation","status":"PASSED","message":"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"},{"id":"offline-customize-modular","status":"PASSED","message":"customize stylized-town/house-01@0.2.0 (swap + colour + toggle) --dry-run: exit 0, config sha256 0c8e79f33ca0"},{"id":"offline-customize","status":"PASSED","message":"customize --dry-run: config sha256 491b148ab9e3"},{"id":"offline-inspect","status":"PASSED","message":"inspect stylized-town/bench-01@0.4.0: wood-color, size-scale, armrests"},{"id":"offline-network-disabled","status":"PASSED","message":"<internal https origin> unreachable (container runs with --network none)"},{"id":"offline-reinstall-noop","status":"PASSED","message":"kit add stylized-town@0.4.0 with no network: unchanged (lockfile fast path)"},{"id":"offline-scene-snaps","status":"PASSED","message":"scene validate --resolve offline: exit 0, 77 attach_to snaps resolved"},{"id":"offline-scene-validate","status":"PASSED","message":"scene validate: PASS"},{"id":"offline-tamper-detected","status":"PASSED","message":"one flipped byte in bench-01.glb -> verify exit 1 INTEGRITY_FAILED; restored -> exit 0"},{"id":"offline-verify","status":"PASSED","message":"verify against assets.lock.json: exit 0"},{"id":"r3f-town","status":"PASSED","message":"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"},{"id":"scene-snaps-resolved","status":"PASSED","message":"scene validate --resolve: 77 attach_to snaps resolved (recommend_scene said 77), 0 outside 1 mm / opposed / aligned"},{"id":"scene-validate","status":"PASSED","message":"recommend_scene -> src/scenes/town.scene.json: PASS, 161 instances"},{"id":"starter-starter-r3f:build","status":"PASSED","message":"vite build: exit 0"},{"id":"starter-starter-r3f:kit-add","status":"PASSED","message":"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"},{"id":"starter-starter-r3f:no-credential-in-project","status":"PASSED","message":"no project file contains the token (the lockfile records the entitlement id only)"},{"id":"starter-starter-r3f:reinstall-offline-noop","status":"PASSED","message":"kit add stylized-town@0.4.0 with no network, registry or token: unchanged (lockfile fast path)"},{"id":"starter-starter-r3f:renders","status":"PASSED","message":"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"},{"id":"starter-starter-r3f:scene-validate","status":"PASSED","message":"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)"},{"id":"starter-starter-r3f:typecheck","status":"PASSED","message":"tsc --noEmit: exit 0"},{"id":"starter-starter-r3f:verify-project-locally-validated","status":"PASSED","message":"verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenes"},{"id":"starter-starter-r3f:verify","status":"PASSED","message":"agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASS"},{"id":"starter-starter-vanilla:build","status":"PASSED","message":"vite build: exit 0"},{"id":"starter-starter-vanilla:kit-add","status":"PASSED","message":"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"},{"id":"starter-starter-vanilla:no-credential-in-project","status":"PASSED","message":"no project file contains the token (the lockfile records the entitlement id only)"},{"id":"starter-starter-vanilla:reinstall-offline-noop","status":"PASSED","message":"kit add stylized-town@0.4.0 with no network, registry or token: unchanged (lockfile fast path)"},{"id":"starter-starter-vanilla:renders","status":"PASSED","message":"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"},{"id":"starter-starter-vanilla:scene-validate","status":"PASSED","message":"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)"},{"id":"starter-starter-vanilla:typecheck","status":"PASSED","message":"tsc --noEmit: exit 0"},{"id":"starter-starter-vanilla:verify-project-locally-validated","status":"PASSED","message":"verify-project --browser chromium: exit 0, LOCALLY_VALIDATED; 0 configs + 1 scenes"},{"id":"starter-starter-vanilla:verify","status":"PASSED","message":"agent-ready-assets verify: exit 0 stylized-town@0.4.0 PASS"},{"id":"vanilla-town","status":"PASSED","message":"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"},{"id":"dimensions-match-manifest","status":"PASSED","message":"stylized-town/cafe-01@0.1.0: measured 3.85 x 5.53 x 7.625 m vs manifest 3.85 x 5.53 x 7.625 m (tolerance 5% or 2 cm); GLB sha256 01ae267e82ea58a0..."},{"id":"installed-bytes-pinned","status":"PASSED","message":"installed public/assets/stylized-town/assets/cafe-01/0.1.0/cafe-01.glb sha256 01ae267e82ea58a0 / manifest 69470d1ce716024c vs catalog pins 01ae267e82ea58a0 / 69470d1ce716024c"}]},{"id":"G13","name":"Source / package security","status":"PASSED","checks":[{"id":"security-suite","status":"PASSED","message":"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)"},{"id":"credential-hygiene","status":"PASSED","message":"the catalog server log of the clean-room run contains no token and no download ticket (tickets are redacted)"},{"id":"auth-expired-token","status":"PASSED","message":"kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_EXPIRED/ENTITLEMENT_EXPIRED; project unchanged"},{"id":"auth-no-token","status":"PASSED","message":"kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchanged"},{"id":"auth-wrong-scope","status":"PASSED","message":"kit add stylized-town@0.4.0 -> exit 3 ENTITLEMENT_REQUIRED/ENTITLEMENT_REQUIRED; project unchanged"},{"id":"hostile-archive-symlink","status":"PASSED","message":"add evil/archive-symlink@1.0.0 -> exit 1 INTEGRITY_FAILED/SYMLINK_ENTRY; project unchanged"},{"id":"hostile-archive-traversal","status":"PASSED","message":"add evil/archive-traversal@1.0.0 -> exit 1 INTEGRITY_FAILED/PATH_TRAVERSAL; project unchanged"},{"id":"hostile-corrupt-bytes","status":"PASSED","message":"add evil/corrupt-bytes@1.0.0 -> exit 1 INTEGRITY_FAILED/PACKAGE_HASH_MISMATCH; project unchanged"},{"id":"hostile-cross-origin-ticket","status":"PASSED","message":"add evil/cross-origin-ticket@1.0.0 -> exit 1 UNSAFE_ORIGIN/CROSS_ORIGIN; project unchanged"},{"id":"hostile-gzip-bomb","status":"PASSED","message":"add evil/gzip-bomb@1.0.0 -> exit 1 INTEGRITY_FAILED/ARCHIVE_TOO_LARGE; project unchanged"},{"id":"hostile-manifest-path-escape","status":"PASSED","message":"add evil/manifest-path-escape@1.0.0 -> exit 1 INTEGRITY_FAILED/MANIFEST_INVALID; project unchanged"},{"id":"hostile-phantom-capability","status":"PASSED","message":"add evil/phantom-capability@1.0.0 -> exit 1 INTEGRITY_FAILED/CONTRACT_INVALID; project unchanged"},{"id":"hostile-redirect","status":"PASSED","message":"add evil/redirect@1.0.0 -> exit 1 UNSAFE_ORIGIN/REDIRECT; project unchanged"},{"id":"insecure-scheme","status":"PASSED","message":"add stylized-town/bench-01@0.4.0 --registry <internal http origin> -> exit 1 UNSAFE_ORIGIN/INSECURE_SCHEME; project unchanged"},{"id":"mcp-download-requires-entitlement","status":"PASSED","message":"anonymous: ENTITLEMENT_REQUIRED; expired token: ENTITLEMENT_EXPIRED"},{"id":"no-credential-in-project","status":"PASSED","message":"no token in any project file (lockfile records the entitlement id only)"},{"id":"tls-untrusted-certificate","status":"PASSED","message":"add stylized-town/bench-01@0.4.0 -> exit 1 UNSAFE_ORIGIN/TLS_UNTRUSTED; project unchanged"}]},{"id":"G14","name":"Capability contract","status":"PASSED","checks":[{"id":"manifest-schema","status":"PASSED","message":"manifest matches asset.schema.json v1.1.0"},{"id":"contract","status":"PASSED","message":"4 capabilities with valid typed inputs/defaults/references; every operation is implemented by SDK 0.5.1 (material-color, uniform-scale, node-visibility, modular-swap)"},{"id":"default-valid:front-door","status":"PASSED","message":"default \"door-02\" validates through the SDK"},{"id":"default-valid:awning","status":"PASSED","message":"default true validates through the SDK"},{"id":"default-valid:terrace","status":"PASSED","message":"default true validates through the SDK"},{"id":"default-valid:wall-color","status":"PASSED","message":"default \"paving\" validates through the SDK"},{"id":"glb-targets","status":"PASSED","message":"every target resolves exactly once in the exact GLB bytes: front-door -> node #9; awning -> node #5; terrace -> node #17; wall-color -> material #7"},{"id":"modularity","status":"PASSED","message":"3 connectors with unit/orthogonal frames, 1 slots and 2 optional parts consistent with the measured GLB names"},{"id":"glb-modularity","status":"PASSED","message":"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"},{"id":"declaration-binding","status":"PASSED","message":"manifest customization/engines are exactly the declaration for stylized-town/cafe-01@0.1.0"},{"id":"recipe-knobs-not-advertised","status":"PASSED","message":"none of the 36 publisher recipe parameters (e.g. kind, width-m) is advertised as a consumer capability"},{"id":"runtime-resolution-0.4","status":"PASSED","message":"SDK resolved front-door, awning, terrace, wall-color on the loaded scene exactly as declared (slot anchors, baked nodes, hideable nodes, swatch materials)"},{"id":"defaults-reproduce-baseline-0.4","status":"PASSED","message":"all-default instance: 0 mounted parts, 0 hidden nodes, max colour delta 0, bounds delta 0 m"}]},{"id":"G15","name":"Variation correctness","status":"PASSED","checks":[{"id":"modular-cases-ran","status":"PASSED","message":"59 SDK 0.4.0 corpus cases executed in Chromium through the SDK"},{"id":"modular-accepted-applied","status":"PASSED","message":"34 legal configurations applied (swaps, toggles, swatches and their combinations); browser config hashes equal the Node canonical hashes"},{"id":"modular-rejected-refused","status":"PASSED","message":"25 invalid requests refused with the documented code (non-allowlisted parts, wrong types, free colours on swatches, unknown keys)"},{"id":"modular-reject-no-side-effects","status":"PASSED","message":"no refused request created, changed or leaked anything (stats, sources, other instances)"},{"id":"plug-mates-slot","status":"PASSED","message":"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)"},{"id":"baked-default-replaced","status":"PASSED","message":"a swapped slot no longer contains its baked default part; a default choice keeps exactly one visible baked part and mounts nothing"},{"id":"connectors-preserved","status":"PASSED","message":"every other connector node stays within 1 mm and keeps its orientation"},{"id":"ground-contact","status":"PASSED","message":"the lowest point stays within 2 cm of the authored asset"},{"id":"swap-bounds","status":"PASSED","message":"no bounds face moves outward by more than 0.5 m; buildings stay inside their lot (1 mm)"},{"id":"visibility-applied","status":"PASSED","message":"node-visibility hides exactly the declared node on this instance and shows it when true"},{"id":"visibility-coverage","status":"PASSED","message":"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"},{"id":"mandatory-nodes-visible","status":"PASSED","message":"anchors, markers, slot parts and non-optional parts never disappear (Q5)"},{"id":"swatch-color","status":"PASSED","message":"swatches/colours land on every host target material through an instance-owned copy"},{"id":"part-color","status":"PASSED","message":"recolour targets also land on every mounted part with a material of that name (instance-owned copies)"},{"id":"modular-isolation","status":"PASSED","message":"no case changed a shared source, the unmodified instance or another customized instance"},{"id":"modular-resource-release","status":"PASSED","message":"release() restores the library for every case; 24 mount/render/release cycles: 24 part instances mounted / 24 released, owned materials 24 created / 24 disposed"},{"id":"modular-no-errors","status":"PASSED","message":"no console or page errors"},{"id":"modular-network","status":"PASSED","message":"no failed, missing or external requests"},{"id":"modular-webgl","status":"PASSED","message":"no GL errors or context loss"},{"id":"modular-coverage-accounting","status":"PASSED","message":"tested 34 accepted + 25 rejected SDK 0.4.0 cases (seed 20261023); every swap choice, both visibility states and every swatch individually; 24 SDK 0.4.0 combination cases (full-product over a sampled space of 24). The full legal value space was enumerated."}]},{"id":"G16","name":"Clean-room consumer E2E (no Blender)","status":"PASSED","checks":[{"id":"evidence-binding","status":"PASSED","message":"clean-room run bound to GLB 01ae267e82ea, contract b01bb013d6ac, SDK sources 92f097f4200b"},{"id":"no-blender-environment","status":"PASSED","message":"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)"},{"id":"network-disabled","status":"PASSED","message":"container network: none"},{"id":"published-artifacts-only","status":"PASSED","message":"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"},{"id":"customer-build-dev-offline","status":"PASSED","message":"development build (React Strict Mode checks active) succeeded offline"},{"id":"customer-build-offline","status":"PASSED","message":"vite build of the plain Three.js + R3F pages succeeded with --network none"},{"id":"customer-typecheck","status":"PASSED","message":"the customer code type-checks (tsc 7.0.2, strict) against the PUBLISHED .d.ts of the SDK tarballs"},{"id":"r3f-capabilities","status":"PASSED","message":"React Three Fiber <Asset customize>, published SDK, --network none: front-door=door-01, awning=false, terrace=false, wall-color=ivory applied as declared (1 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"},{"id":"sdk-from-published-tarballs","status":"PASSED","message":"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"},{"id":"vanilla-capabilities","status":"PASSED","message":"plain Three.js library.instantiate, published SDK, --network none: front-door=door-01, awning=false, terrace=false, wall-color=ivory applied as declared (1 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"}]},{"id":"G17","name":"Agent / CLI contract","status":"PASSED","checks":[{"id":"evidence-binding","status":"PASSED","message":"clean-room run bound to GLB 01ae267e82ea, contract b01bb013d6ac, SDK sources 92f097f4200b"},{"id":"cli-capabilities-config","status":"PASSED","message":"installed CLI, no MCP: inspect --capabilities -> front-door (modular-swap), awning (node-visibility), terrace (node-visibility), wall-color (material-color); customize --dry-run of {\"front-door\":\"door-01\",\"awning\":false,\"terrace\":false,\"wall-color\":\"ivory\"} -> exit 0, config sha256 d554dd8c824b"},{"id":"cli-customize-modular","status":"PASSED","message":"src/generated/cafe-01-modular.customization.json: {\"awning\":false,\"front-door\":\"door-01\",\"wall-color\":\"ivory\"} (config sha256 22a3c20b58d6)"},{"id":"cli-inspect-modular","status":"PASSED","message":"stylized-town/cafe-01@0.1.0: front-door (modular-swap: door-01/door-02), awning (node-visibility), terrace (node-visibility), wall-color (material-color: paving/ivory/lantern-glow); 3 connectors, 1 slots"},{"id":"cli-refuses-modular","status":"PASSED","message":"front-door=front-door-99 -> INCOMPATIBLE_PART/PART_NOT_ALLOWED (front-door: \"front-door-99\" is not an allowlisted part for this slot; allowed: \"door-01\" (stylized-t…); storeys 3 -> UNSUPPORTED_OPERATION/UNKNOWN_CAPABILITY; nothing written"},{"id":"cli-refuses-unsupported-value","status":"PASSED","message":"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"},{"id":"remote-mcp-binding","status":"PASSED","message":"MCP discovery -> CLI install -> SDK checks of the M3 clean room, bound to this asset's bytes"},{"id":"mcp:customize-modular","status":"PASSED","message":"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)"},{"id":"mcp:customize-supported","status":"PASSED","message":"wood-color #2E6B4F + size-scale 1.1 -> src/generated/bench-green.customization.json (config sha256 491b148ab9e3)"},{"id":"mcp:mcp-capabilities","status":"PASSED","message":"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)"},{"id":"mcp:mcp-cli-capabilities-consistent","status":"PASSED","message":"MCP get_customization_capabilities == installed manifest via CLI inspect: wood-color,size-scale,armrests"},{"id":"mcp:mcp-discovery","status":"PASSED","message":"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"},{"id":"mcp:mcp-modular-capabilities","status":"PASSED","message":"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"},{"id":"mcp:mcp-modular-guide","status":"PASSED","message":"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"},{"id":"mcp:mcp-recommend-snapped","status":"PASSED","message":"recommend_scene town-customized: scene 1.1.0, 161 instances, 77 attach_to snaps (tested scene: 77), 871 free connectors"},{"id":"mcp:mcp-tools-read-only","status":"PASSED","message":"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"},{"id":"mcp:refuses-foreign-part","status":"PASSED","message":"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"},{"id":"mcp:refuses-roof-config","status":"PASSED","message":"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"},{"id":"mcp:refuses-slats","status":"PASSED","message":"slats: UNSUPPORTED_OPERATION"},{"id":"mcp:refuses-storeys","status":"PASSED","message":"\"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."},{"id":"mcp:roof-request-via-capability","status":"PASSED","message":"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":{"status":"PASSED","sdk_version":"0.5.1","tested_cases":{"accepted":34,"rejected":25,"total":59,"exhaustive":true,"pairwise_combinations":24},"presets":[{"id":"original","values":{},"config_sha256":"1cccfca527eb49dd3b2afc1b6b51b2f3e716b60bbb268d1a461cfcd2bbdb7d9d","status":"PASSED"},{"id":"front-door-door-01","values":{"front-door":"door-01"},"config_sha256":"bf44a0844f1ea313a6b515d8ad4466180beda4db8b248d886e55422b45e5fe3a","status":"PASSED"},{"id":"awning-false","values":{"awning":false},"config_sha256":"db3c2a01511a726551f1da4944ecf1f3002153840899c65e7269bbe93ddf7d47","status":"PASSED"},{"id":"terrace-false","values":{"terrace":false},"config_sha256":"eef865544ccc8eb223f0b3952ee4ade271ed00985269b701bf2d63c1bd8da51e","status":"PASSED"},{"id":"wall-color-ivory","values":{"wall-color":"ivory"},"config_sha256":"99892529504e9a6a3960547f08b6bab50c333895ff4f910894ccbd3cc72da03f","status":"PASSED"},{"id":"wall-color-lantern-glow","values":{"wall-color":"lantern-glow"},"config_sha256":"0b0828bb37e214540f2a1c1af9c0fcedcf688721030cb6a44a09be52f9198a89","status":"PASSED"},{"id":"all-alternatives","values":{"front-door":"door-01","awning":false,"terrace":false,"wall-color":"ivory"},"config_sha256":"d554dd8c824b6cb93c66e59d90445feaa98d87c9b3ef8cb3fce9dbf9c0bb951a","status":"PASSED"}]},"sanitization":{"redactions":0,"rules":[],"dropped_fields":[]}}
