{"asset":"stylized-town/shop-01@0.2.0","id":"shop-01","version":"0.2.0","title":"Corner shop with swappable parts","schema":"agent-ready-assets public QA report v1 (sanitized subset of qa/report.json)","published_sha256":"4b5f7486088c7a5c5d8b9f67421ff63b1fff2b396264550be38803f8dd5cbe73","artifact":{"path":"shop-01.glb","sha256":"670cfa58804b048a9c27cb8bfe99687c6c066edefa4d792cb9870902eb723d85","size_bytes":219052},"package_sha256":"4b4f878c7e48cbbc8d70d2b1e4505342db484d7f393f26260f645304bc8b5f82","manifest_sha256":"39549e3e6f86eb57628ef052b5e38bdc6f80ed8cc68acd3da7ce506ccd1ad1d2","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, 219052 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":"3264 triangles in 11 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 18 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":"9 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, -2.275] .. [1.925, 4.56, 3.18]"},{"id":"nonzero-bounds","status":"PASSED","message":"world size [3.85, 4.56, 5.455] m"},{"id":"dimensions","status":"PASSED","message":"measured [3.85, 4.56, 5.455] m vs target [3.85, 4.56, 5.455] (allowed ±[0.1925, 0.228, 0.2728])"},{"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 -2.275..3.18 vs lot ±2 x ±3.2 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, 3.2] (error 0 m), outward dot 1, up dot 1"},{"id":"anchor:anchor-door-main","status":"PASSED","message":"at [-1.05, 0.32, 2.2] (error 0 m), outward dot 1, up dot 1"},{"id":"anchor:anchor-awning","status":"PASSED","message":"at [0, 3.05, 2.2] (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.0003 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":"7 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":"11 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 67.7%, back 67.7%, left 57.3%, right 57.3%, top 57.1%, iso 41.5%"},{"id":"not-black","status":"PASSED","message":"max mean luminance of visible pixels 0.2837 (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":"219052 bytes (budget 3145728)"},{"id":"triangles","status":"PASSED","message":"3264 triangles (budget 20000)"},{"id":"materials","status":"PASSED","message":"7 materials (budget 8)"},{"id":"texture-size","status":"PASSED","message":"largest texture 1024px (budget 1024)"},{"id":"draw-calls","status":"PASSED","message":"11 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 670cfa58804b, manifest 1872ce115a99, 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/shop-01@0.2.0: measured 3.85 x 4.56 x 5.455 m vs manifest 3.85 x 4.56 x 5.455 m (tolerance 5% or 2 cm); GLB sha256 670cfa58804b048a..."},{"id":"installed-bytes-pinned","status":"PASSED","message":"installed public/assets/stylized-town/assets/shop-01/0.2.0/shop-01.glb sha256 670cfa58804b048a / manifest 1872ce115a990d62 vs catalog pins 670cfa58804b048a / 1872ce115a990d62"}]},{"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":"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)"},{"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:wall-color","status":"PASSED","message":"default \"ivory\" 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; wall-color -> material #6"},{"id":"modularity","status":"PASSED","message":"3 connectors with unit/orthogonal frames, 1 slots and 1 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/shop-01@0.2.0"},{"id":"recipe-knobs-not-advertised","status":"PASSED","message":"none of the 25 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, 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":"41 SDK 0.4.0 corpus cases executed in Chromium through the SDK"},{"id":"modular-accepted-applied","status":"PASSED","message":"20 legal configurations applied (swaps, toggles, swatches and their combinations); browser config hashes equal the Node canonical hashes"},{"id":"modular-rejected-refused","status":"PASSED","message":"21 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 20 accepted + 21 rejected SDK 0.4.0 cases (seed 20261023); every swap choice, both visibility states and every swatch individually; 12 SDK 0.4.0 combination cases (full-product over a sampled space of 12). 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 670cfa58804b, contract 1949407b7133, 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, wall-color=paving 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, wall-color=paving 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 670cfa58804b, contract 1949407b7133, SDK sources 92f097f4200b"},{"id":"cli-capabilities-config","status":"PASSED","message":"installed CLI, no MCP: inspect --capabilities -> front-door (modular-swap), awning (node-visibility), wall-color (material-color); customize --dry-run of {\"front-door\":\"door-01\",\"awning\":false,\"wall-color\":\"paving\"} -> exit 0, config sha256 8fa189b372db"},{"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":20,"rejected":21,"total":41,"exhaustive":true,"pairwise_combinations":12},"presets":[{"id":"original","values":{},"config_sha256":"f2a8635c1debe9e5af7655e3f8b12e372a498893707a1f7310f04c204203d21c","status":"PASSED"},{"id":"front-door-door-01","values":{"front-door":"door-01"},"config_sha256":"3da2d14c7efc5a86c72d5f2bcd16c137cb6a33d3d10a018e1132b84c1be7584a","status":"PASSED"},{"id":"awning-false","values":{"awning":false},"config_sha256":"47777ecaf2917be5523d7a697acee52a410f49fd3625fe2ad97f944686db2c42","status":"PASSED"},{"id":"wall-color-paving","values":{"wall-color":"paving"},"config_sha256":"9063e205c75ee11ea3e9263f732bfcafa0a5a8ec25790903a804cdf236fd4388","status":"PASSED"},{"id":"wall-color-curb-stone","values":{"wall-color":"curb-stone"},"config_sha256":"5c80b916e9ebb6e0aa0c96cb361a6a8efbb32cc77c1f87441f8d640ba4246945","status":"PASSED"},{"id":"all-alternatives","values":{"front-door":"door-01","awning":false,"wall-color":"paving"},"config_sha256":"8fa189b372db8ba318efffb164eb09404c3972eb1e09eec907b838f080ff8256","status":"PASSED"}]},"sanitization":{"redactions":0,"rules":[],"dropped_fields":[]}}
