[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-iwsdk-scene-composer":3,"mdc--f058z6-key":34,"related-org-meta-iwsdk-scene-composer":1370,"related-repo-meta-iwsdk-scene-composer":1560},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"iwsdk-scene-composer","compose editable static IWSDK scenes","Compose editable static IWSDK scenes from text, images, or hybrid references using a shared application asset manifest, v1 scene JSON, modular scene files, and the managed editor's validation and rendering tools. Use for 3D environments, props, architecture, staged scenes, procedural Three.js assets, custom PBR or shader materials, glTF assets, prefabs, patterns, lighting, camera matching, or visual review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"meta","Meta Open Source","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmeta.png","facebook",[13,17,20],{"name":14,"slug":15,"type":16},"IWSDK","iwsdk","tag",{"name":18,"slug":19,"type":16},"Engineering","engineering",{"name":21,"slug":22,"type":16},"Design","design",358,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fimmersive-web-sdk","2026-08-03T06:27:16.782981",null,73,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"WebXR made simple. Full-featured framework with interactions, locomotion, and spatial UI. Powered by Three.js.","https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fimmersive-web-sdk\u002Ftree\u002FHEAD\u002Fpackages\u002Fstarter-assets\u002Fclaude-injections\u002Fskills\u002Fiwsdk-scene-composer","---\nname: iwsdk-scene-composer\ndescription: Compose editable static IWSDK scenes from text, images, or hybrid references using a shared application asset manifest, v1 scene JSON, modular scene files, and the managed editor's validation and rendering tools. Use for 3D environments, props, architecture, staged scenes, procedural Three.js assets, custom PBR or shader materials, glTF assets, prefabs, patterns, lighting, camera matching, or visual review.\n---\n\n# IWSDK Scene Composer\n\nAuthor native IWSDK assets and scene files. Application code owns geometry and\nmaterials; scene JSON owns composition; the managed editor provides visual feedback\nand human transform\u002Fcomponent adjustment.\n\nRead these references when relevant:\n\n- [scene-format.md](references\u002Fscene-format.md) before editing scene JSON;\n- [asset-authoring.md](references\u002Fasset-authoring.md) before creating or changing\n  glTF or procedural assets;\n- [text-intake.md](references\u002Ftext-intake.md) for text-only requests;\n- [image-intake.md](references\u002Fimage-intake.md) for image or hybrid requests;\n- [composition-patterns.md](references\u002Fcomposition-patterns.md) for decomposition\n  and repetition strategies;\n- [review-and-stop.md](references\u002Freview-and-stop.md) before final review.\n\n## Fixed Boundaries\n\n- Use only `iwsdk.scene.v1`. There is no compatibility schema.\n- Scene files are the composition source of truth. Create and edit them with normal\n  filesystem tools under `public\u002Fscenes\u002F`.\n- Scene JSON has one renderable content kind: `asset`. It does not define models,\n  primitive geometry, material resources, or material overrides.\n- The default export of the configured application asset manifest is the asset source\n  of truth. It may contain URL-backed glTF and UIKitML entries plus parentless\n  `Object3D` prototypes with arbitrary Three.js geometry and materials.\n- The application runtime and editor import the same manifest module independently.\n  Never depend on shared object identity, iframe messaging, DOM state, or a live\n  runtime world when defining assets.\n- Humans use the editor for selection, hierarchy, transforms, components, root\n  lighting, and preview visibility. They do not edit geometry or materials there.\n- Agents may edit asset TypeScript and scene JSON, then use the editor to validate and\n  render the result.\n\nThe public scene MCP surface is intentionally small:\n\n```text\nscene_open\nscene_render_file\nscene_get_state\nscene_get_capabilities\nscene_screenshot\nscene_select\nscene_set_camera\nscene_set_preview_visibility\nscene_measure_image_regions\n```\n\nDocument creation and mutation happen through direct file edits. Do not look for MCP\ncreate\u002Fadd\u002Fupdate\u002Fremove\u002Fpatch\u002Fsave\u002Fcompose\u002Freview\u002Fpublish tools.\n\nWhen MCP is unavailable, use the CLI equivalents:\n\n```bash\nnpx iwsdk dev status\nnpx iwsdk dev up\nnpx iwsdk scene capabilities --raw\nnpx iwsdk scene render-file \\\n  --input-json '{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\",\"viewId\":\"hero\"}' \\\n  --output-file artifacts\u002Froom.png\nnpx iwsdk scene open \\\n  --input-json '{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\"}' --raw\nnpx iwsdk scene state --raw\n```\n\n`iwsdk dev up` starts the server in the background, launches the configured\nmanaged editor browser, and waits for the command bridge. Do not edit\n`vite.config.ts` to change browser mode as an ad hoc startup workaround.\n\n`scene_render_file` renders a file without replacing the editor's active document,\nbut it still uses the managed editor browser for manifest evaluation and WebGL.\nIf startup reports `dev_browser_not_ready`, inspect `iwsdk dev status` and\n`iwsdk dev logs --tail 100`. Retry only when the diagnostics indicate a transient\nstartup failure. Do not invent a custom CPU or Playwright renderer and present it as\nauthoritative editor evidence. Preserve the structured failure, continue\ntype\u002Fschema\u002Fbuild checks that remain meaningful, and report the visual-verification\ngate as blocked.\n\nCamera parameters are intentionally distinct: `view` accepts only the built-in\npresets (`current`, `top`, `front`, `back`, `left`, `right`, `quarter`, `orbit`),\nwhile `viewId` selects an exact camera declared in `authoring.views`. Once a level\nloads, its saved hero view owns runtime framing and supersedes the initial\n`World.create({ render: { camera } })` pose.\n\n## Workflow\n\n### 1. Specify\n\nTurn the request into a compact implementation brief:\n\n- required and optional features;\n- source evidence regions for image input;\n- silhouette, proportions, parts, negative space, contacts, and material response;\n- hero and diagnostic views;\n- measurable acceptance criteria;\n- assumptions, uncertainty, and fidelity ceiling.\n\nA single image proves visible composition, not hidden geometry. Do not silently invent\noccluded detail or lower requested fidelity.\n\n### 2. Plan Assets And Modules\n\nCall `scene_get_capabilities` once. Inspect `src\u002Fassets.ts` and existing asset modules.\nFor every visible form, choose one of:\n\n1. reuse an existing manifest asset;\n2. add a glTF entry to the manifest;\n3. register a UIKitML file with `AssetType.UIKitML`;\n4. create a deterministic parentless `Object3D` prototype in code and register it;\n5. assemble existing assets with a scene prefab or module.\n\nCreate custom geometry and materials in asset code, not JSON. Prefer separate\n`*.scene-asset.ts` modules for substantial procedural assets and import their\nprototypes into `src\u002Fassets.ts`.\n\nPlan independent semantic groups as standalone scene modules. Give each module a\nlocal origin, size envelope, attachment points, required views, and asset IDs. Asset\nand component IDs are application-global; imported node and prefab IDs are\nnamespaced.\n\n### 3. Build\n\nAuthor assets first, then scene JSON. Build in dependency order:\n\n1. support\u002Fstage and representative lighting;\n2. large composition masses;\n3. identity-critical groups;\n4. repeated secondary detail;\n5. hero camera and final environment.\n\nUse meters, stable descriptive IDs, deterministic ordering, and explicit transforms.\nGroups supply hierarchy, never visible mass. Use `castShadow` and `receiveShadow` on\nasset nodes only when needed. Use prefabs and patterns for repetition; keep repeated\nasset prototypes resource-sharing friendly.\n\n### 4. Validate And Materialize\n\nWith the managed editor command-ready, call `scene_render_file` on every changed\nmodule, then the root. It composes imports, validates schema and manifest references,\nlowers the scene, and returns a PNG plus diagnostics without changing the active\ndocument. Fix failures in the owning asset or scene file.\n\nAfter the root passes, call `scene_open` once for live collaboration. The editor\nwatches the root and imported files. A valid file change swaps the preview atomically;\nan invalid change preserves the last valid render and reports diagnostics. Unsaved\nhuman edits produce a conflict instead of being overwritten.\n\nUse `scene_get_state` for selection, hashes, diagnostics, dirty\u002Fconflict state, runtime\nreadiness, and render statistics. Use camera, screenshot, selection, and preview\nvisibility tools only when their live-editor context is useful.\n\n### 5. Review And Refine\n\nReview in three passes:\n\n1. **Layout**: hierarchy, scale, support contacts, and arrangement.\n2. **Geometry**: silhouette, proportions, parts, negative space, and alternate views.\n3. **Final**: material response, color, lighting, environment, and hero framing.\n\nKeep review orchestration and evidence outside the editor. The editor supplies\nauthoritative screenshots, hashes, camera state, diagnostics, and render measurements.\nDerive comparisons, defect lists, lineage, and stop decisions in ordinary task files.\n\nFix the highest-impact defect in its owning asset or scene module, rerender that file,\nthen rerender the root. Default to two focused correction rounds. Stop earlier on a\nrepeated defect, oscillation, plateau, missing input\u002Fasset, or representation ceiling.\n\n### 6. Finish\n\nFinish only when:\n\n- every root and module file validates and renders;\n- the active editor state is clean and conflict-free;\n- required views are nonblank and correctly framed;\n- required features pass measurable and visual checks;\n- manifest asset IDs resolve in both editor and application runtime;\n- the application build and selected scene load without blocking errors.\n\nIf a required gate is unavailable, finish with an explicit blocked or\naccepted-with-gaps result. Passing a local schema check, production build, or custom\ndiagnostic image does not substitute for authoritative editor renders and state.\n\n## Modular Composition\n\n```json\n{\n  \"version\": \"iwsdk.scene.v1\",\n  \"units\": \"meters\",\n  \"imports\": [\n    {\n      \"id\": \"reading-nook\",\n      \"src\": \".\u002Fmodules\u002Freading-nook.iwsdk.scene.json\",\n      \"transform\": { \"position\": [1.8, 0, -0.6] }\n    }\n  ],\n  \"resources\": {},\n  \"nodes\": []\n}\n```\n\nEach module must be valid by itself. Imports resolve recursively in declaration order.\nThe import entry becomes a transform group. The root owns global components,\nenvironment, metadata, and authoring settings. Cycles, unsafe IDs, missing files,\nduplicate namespaced IDs, and invalid modules fail composition.\n\nFor parallel work, assign one module file per worker. Never let two workers edit one\nfile. Render modules independently, import only passing modules, then correct\ncross-module scale, contact, occlusion, lighting, and framing at the root.\n\n## Regeneration And Provenance\n\nPreserve stable IDs and module boundaries when revising. Never overwrite unrelated\nhuman-authored files. Record the skill\u002Fruntime versions, input hashes, root\u002Fmodule\npaths, capability hash, source\u002Fcomposed\u002Fruntime hashes, assumptions, and fidelity\nceiling in authoring metadata or adjacent task evidence.\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,53,58,130,137,208,213,225,230,235,465,484,519,614,620,627,632,665,670,676,697,741,760,765,771,776,804,825,831,843,856,869,875,880,914,919,924,930,935,968,973,979,1343,1348,1353,1359,1364],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","IWSDK Scene Composer",{"type":40,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Author native IWSDK assets and scene files. Application code owns geometry and\nmaterials; scene JSON owns composition; the managed editor provides visual feedback\nand human transform\u002Fcomponent adjustment.",{"type":40,"tag":48,"props":54,"children":55},{},[56],{"type":45,"value":57},"Read these references when relevant:",{"type":40,"tag":59,"props":60,"children":61},"ul",{},[62,75,86,97,108,119],{"type":40,"tag":63,"props":64,"children":65},"li",{},[66,73],{"type":40,"tag":67,"props":68,"children":70},"a",{"href":69},"references\u002Fscene-format.md",[71],{"type":45,"value":72},"scene-format.md",{"type":45,"value":74}," before editing scene JSON;",{"type":40,"tag":63,"props":76,"children":77},{},[78,84],{"type":40,"tag":67,"props":79,"children":81},{"href":80},"references\u002Fasset-authoring.md",[82],{"type":45,"value":83},"asset-authoring.md",{"type":45,"value":85}," before creating or changing\nglTF or procedural assets;",{"type":40,"tag":63,"props":87,"children":88},{},[89,95],{"type":40,"tag":67,"props":90,"children":92},{"href":91},"references\u002Ftext-intake.md",[93],{"type":45,"value":94},"text-intake.md",{"type":45,"value":96}," for text-only requests;",{"type":40,"tag":63,"props":98,"children":99},{},[100,106],{"type":40,"tag":67,"props":101,"children":103},{"href":102},"references\u002Fimage-intake.md",[104],{"type":45,"value":105},"image-intake.md",{"type":45,"value":107}," for image or hybrid requests;",{"type":40,"tag":63,"props":109,"children":110},{},[111,117],{"type":40,"tag":67,"props":112,"children":114},{"href":113},"references\u002Fcomposition-patterns.md",[115],{"type":45,"value":116},"composition-patterns.md",{"type":45,"value":118}," for decomposition\nand repetition strategies;",{"type":40,"tag":63,"props":120,"children":121},{},[122,128],{"type":40,"tag":67,"props":123,"children":125},{"href":124},"references\u002Freview-and-stop.md",[126],{"type":45,"value":127},"review-and-stop.md",{"type":45,"value":129}," before final review.",{"type":40,"tag":131,"props":132,"children":134},"h2",{"id":133},"fixed-boundaries",[135],{"type":45,"value":136},"Fixed Boundaries",{"type":40,"tag":59,"props":138,"children":139},{},[140,154,167,180,193,198,203],{"type":40,"tag":63,"props":141,"children":142},{},[143,145,152],{"type":45,"value":144},"Use only ",{"type":40,"tag":146,"props":147,"children":149},"code",{"className":148},[],[150],{"type":45,"value":151},"iwsdk.scene.v1",{"type":45,"value":153},". There is no compatibility schema.",{"type":40,"tag":63,"props":155,"children":156},{},[157,159,165],{"type":45,"value":158},"Scene files are the composition source of truth. Create and edit them with normal\nfilesystem tools under ",{"type":40,"tag":146,"props":160,"children":162},{"className":161},[],[163],{"type":45,"value":164},"public\u002Fscenes\u002F",{"type":45,"value":166},".",{"type":40,"tag":63,"props":168,"children":169},{},[170,172,178],{"type":45,"value":171},"Scene JSON has one renderable content kind: ",{"type":40,"tag":146,"props":173,"children":175},{"className":174},[],[176],{"type":45,"value":177},"asset",{"type":45,"value":179},". It does not define models,\nprimitive geometry, material resources, or material overrides.",{"type":40,"tag":63,"props":181,"children":182},{},[183,185,191],{"type":45,"value":184},"The default export of the configured application asset manifest is the asset source\nof truth. It may contain URL-backed glTF and UIKitML entries plus parentless\n",{"type":40,"tag":146,"props":186,"children":188},{"className":187},[],[189],{"type":45,"value":190},"Object3D",{"type":45,"value":192}," prototypes with arbitrary Three.js geometry and materials.",{"type":40,"tag":63,"props":194,"children":195},{},[196],{"type":45,"value":197},"The application runtime and editor import the same manifest module independently.\nNever depend on shared object identity, iframe messaging, DOM state, or a live\nruntime world when defining assets.",{"type":40,"tag":63,"props":199,"children":200},{},[201],{"type":45,"value":202},"Humans use the editor for selection, hierarchy, transforms, components, root\nlighting, and preview visibility. They do not edit geometry or materials there.",{"type":40,"tag":63,"props":204,"children":205},{},[206],{"type":45,"value":207},"Agents may edit asset TypeScript and scene JSON, then use the editor to validate and\nrender the result.",{"type":40,"tag":48,"props":209,"children":210},{},[211],{"type":45,"value":212},"The public scene MCP surface is intentionally small:",{"type":40,"tag":214,"props":215,"children":220},"pre",{"className":216,"code":218,"language":45,"meta":219},[217],"language-text","scene_open\nscene_render_file\nscene_get_state\nscene_get_capabilities\nscene_screenshot\nscene_select\nscene_set_camera\nscene_set_preview_visibility\nscene_measure_image_regions\n","",[221],{"type":40,"tag":146,"props":222,"children":223},{"__ignoreMap":219},[224],{"type":45,"value":218},{"type":40,"tag":48,"props":226,"children":227},{},[228],{"type":45,"value":229},"Document creation and mutation happen through direct file edits. Do not look for MCP\ncreate\u002Fadd\u002Fupdate\u002Fremove\u002Fpatch\u002Fsave\u002Fcompose\u002Freview\u002Fpublish tools.",{"type":40,"tag":48,"props":231,"children":232},{},[233],{"type":45,"value":234},"When MCP is unavailable, use the CLI equivalents:",{"type":40,"tag":214,"props":236,"children":240},{"className":237,"code":238,"language":239,"meta":219,"style":219},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx iwsdk dev status\nnpx iwsdk dev up\nnpx iwsdk scene capabilities --raw\nnpx iwsdk scene render-file \\\n  --input-json '{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\",\"viewId\":\"hero\"}' \\\n  --output-file artifacts\u002Froom.png\nnpx iwsdk scene open \\\n  --input-json '{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\"}' --raw\nnpx iwsdk scene state --raw\n","bash",[241],{"type":40,"tag":146,"props":242,"children":243},{"__ignoreMap":219},[244,272,293,320,347,376,390,415,440],{"type":40,"tag":245,"props":246,"children":249},"span",{"class":247,"line":248},"line",1,[250,256,262,267],{"type":40,"tag":245,"props":251,"children":253},{"style":252},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[254],{"type":45,"value":255},"npx",{"type":40,"tag":245,"props":257,"children":259},{"style":258},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[260],{"type":45,"value":261}," iwsdk",{"type":40,"tag":245,"props":263,"children":264},{"style":258},[265],{"type":45,"value":266}," dev",{"type":40,"tag":245,"props":268,"children":269},{"style":258},[270],{"type":45,"value":271}," status\n",{"type":40,"tag":245,"props":273,"children":275},{"class":247,"line":274},2,[276,280,284,288],{"type":40,"tag":245,"props":277,"children":278},{"style":252},[279],{"type":45,"value":255},{"type":40,"tag":245,"props":281,"children":282},{"style":258},[283],{"type":45,"value":261},{"type":40,"tag":245,"props":285,"children":286},{"style":258},[287],{"type":45,"value":266},{"type":40,"tag":245,"props":289,"children":290},{"style":258},[291],{"type":45,"value":292}," up\n",{"type":40,"tag":245,"props":294,"children":296},{"class":247,"line":295},3,[297,301,305,310,315],{"type":40,"tag":245,"props":298,"children":299},{"style":252},[300],{"type":45,"value":255},{"type":40,"tag":245,"props":302,"children":303},{"style":258},[304],{"type":45,"value":261},{"type":40,"tag":245,"props":306,"children":307},{"style":258},[308],{"type":45,"value":309}," scene",{"type":40,"tag":245,"props":311,"children":312},{"style":258},[313],{"type":45,"value":314}," capabilities",{"type":40,"tag":245,"props":316,"children":317},{"style":258},[318],{"type":45,"value":319}," --raw\n",{"type":40,"tag":245,"props":321,"children":323},{"class":247,"line":322},4,[324,328,332,336,341],{"type":40,"tag":245,"props":325,"children":326},{"style":252},[327],{"type":45,"value":255},{"type":40,"tag":245,"props":329,"children":330},{"style":258},[331],{"type":45,"value":261},{"type":40,"tag":245,"props":333,"children":334},{"style":258},[335],{"type":45,"value":309},{"type":40,"tag":245,"props":337,"children":338},{"style":258},[339],{"type":45,"value":340}," render-file",{"type":40,"tag":245,"props":342,"children":344},{"style":343},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[345],{"type":45,"value":346}," \\\n",{"type":40,"tag":245,"props":348,"children":350},{"class":247,"line":349},5,[351,356,362,367,372],{"type":40,"tag":245,"props":352,"children":353},{"style":258},[354],{"type":45,"value":355},"  --input-json",{"type":40,"tag":245,"props":357,"children":359},{"style":358},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[360],{"type":45,"value":361}," '",{"type":40,"tag":245,"props":363,"children":364},{"style":258},[365],{"type":45,"value":366},"{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\",\"viewId\":\"hero\"}",{"type":40,"tag":245,"props":368,"children":369},{"style":358},[370],{"type":45,"value":371},"'",{"type":40,"tag":245,"props":373,"children":374},{"style":343},[375],{"type":45,"value":346},{"type":40,"tag":245,"props":377,"children":379},{"class":247,"line":378},6,[380,385],{"type":40,"tag":245,"props":381,"children":382},{"style":258},[383],{"type":45,"value":384},"  --output-file",{"type":40,"tag":245,"props":386,"children":387},{"style":258},[388],{"type":45,"value":389}," artifacts\u002Froom.png\n",{"type":40,"tag":245,"props":391,"children":393},{"class":247,"line":392},7,[394,398,402,406,411],{"type":40,"tag":245,"props":395,"children":396},{"style":252},[397],{"type":45,"value":255},{"type":40,"tag":245,"props":399,"children":400},{"style":258},[401],{"type":45,"value":261},{"type":40,"tag":245,"props":403,"children":404},{"style":258},[405],{"type":45,"value":309},{"type":40,"tag":245,"props":407,"children":408},{"style":258},[409],{"type":45,"value":410}," open",{"type":40,"tag":245,"props":412,"children":413},{"style":343},[414],{"type":45,"value":346},{"type":40,"tag":245,"props":416,"children":418},{"class":247,"line":417},8,[419,423,427,432,436],{"type":40,"tag":245,"props":420,"children":421},{"style":258},[422],{"type":45,"value":355},{"type":40,"tag":245,"props":424,"children":425},{"style":358},[426],{"type":45,"value":361},{"type":40,"tag":245,"props":428,"children":429},{"style":258},[430],{"type":45,"value":431},"{\"path\":\"public\u002Fscenes\u002Froom.iwsdk.scene.json\"}",{"type":40,"tag":245,"props":433,"children":434},{"style":358},[435],{"type":45,"value":371},{"type":40,"tag":245,"props":437,"children":438},{"style":258},[439],{"type":45,"value":319},{"type":40,"tag":245,"props":441,"children":443},{"class":247,"line":442},9,[444,448,452,456,461],{"type":40,"tag":245,"props":445,"children":446},{"style":252},[447],{"type":45,"value":255},{"type":40,"tag":245,"props":449,"children":450},{"style":258},[451],{"type":45,"value":261},{"type":40,"tag":245,"props":453,"children":454},{"style":258},[455],{"type":45,"value":309},{"type":40,"tag":245,"props":457,"children":458},{"style":258},[459],{"type":45,"value":460}," state",{"type":40,"tag":245,"props":462,"children":463},{"style":258},[464],{"type":45,"value":319},{"type":40,"tag":48,"props":466,"children":467},{},[468,474,476,482],{"type":40,"tag":146,"props":469,"children":471},{"className":470},[],[472],{"type":45,"value":473},"iwsdk dev up",{"type":45,"value":475}," starts the server in the background, launches the configured\nmanaged editor browser, and waits for the command bridge. Do not edit\n",{"type":40,"tag":146,"props":477,"children":479},{"className":478},[],[480],{"type":45,"value":481},"vite.config.ts",{"type":45,"value":483}," to change browser mode as an ad hoc startup workaround.",{"type":40,"tag":48,"props":485,"children":486},{},[487,493,495,501,503,509,511,517],{"type":40,"tag":146,"props":488,"children":490},{"className":489},[],[491],{"type":45,"value":492},"scene_render_file",{"type":45,"value":494}," renders a file without replacing the editor's active document,\nbut it still uses the managed editor browser for manifest evaluation and WebGL.\nIf startup reports ",{"type":40,"tag":146,"props":496,"children":498},{"className":497},[],[499],{"type":45,"value":500},"dev_browser_not_ready",{"type":45,"value":502},", inspect ",{"type":40,"tag":146,"props":504,"children":506},{"className":505},[],[507],{"type":45,"value":508},"iwsdk dev status",{"type":45,"value":510}," and\n",{"type":40,"tag":146,"props":512,"children":514},{"className":513},[],[515],{"type":45,"value":516},"iwsdk dev logs --tail 100",{"type":45,"value":518},". Retry only when the diagnostics indicate a transient\nstartup failure. Do not invent a custom CPU or Playwright renderer and present it as\nauthoritative editor evidence. Preserve the structured failure, continue\ntype\u002Fschema\u002Fbuild checks that remain meaningful, and report the visual-verification\ngate as blocked.",{"type":40,"tag":48,"props":520,"children":521},{},[522,524,530,532,538,540,546,547,553,554,560,561,567,568,574,575,581,582,588,590,596,598,604,606,612],{"type":45,"value":523},"Camera parameters are intentionally distinct: ",{"type":40,"tag":146,"props":525,"children":527},{"className":526},[],[528],{"type":45,"value":529},"view",{"type":45,"value":531}," accepts only the built-in\npresets (",{"type":40,"tag":146,"props":533,"children":535},{"className":534},[],[536],{"type":45,"value":537},"current",{"type":45,"value":539},", ",{"type":40,"tag":146,"props":541,"children":543},{"className":542},[],[544],{"type":45,"value":545},"top",{"type":45,"value":539},{"type":40,"tag":146,"props":548,"children":550},{"className":549},[],[551],{"type":45,"value":552},"front",{"type":45,"value":539},{"type":40,"tag":146,"props":555,"children":557},{"className":556},[],[558],{"type":45,"value":559},"back",{"type":45,"value":539},{"type":40,"tag":146,"props":562,"children":564},{"className":563},[],[565],{"type":45,"value":566},"left",{"type":45,"value":539},{"type":40,"tag":146,"props":569,"children":571},{"className":570},[],[572],{"type":45,"value":573},"right",{"type":45,"value":539},{"type":40,"tag":146,"props":576,"children":578},{"className":577},[],[579],{"type":45,"value":580},"quarter",{"type":45,"value":539},{"type":40,"tag":146,"props":583,"children":585},{"className":584},[],[586],{"type":45,"value":587},"orbit",{"type":45,"value":589},"),\nwhile ",{"type":40,"tag":146,"props":591,"children":593},{"className":592},[],[594],{"type":45,"value":595},"viewId",{"type":45,"value":597}," selects an exact camera declared in ",{"type":40,"tag":146,"props":599,"children":601},{"className":600},[],[602],{"type":45,"value":603},"authoring.views",{"type":45,"value":605},". Once a level\nloads, its saved hero view owns runtime framing and supersedes the initial\n",{"type":40,"tag":146,"props":607,"children":609},{"className":608},[],[610],{"type":45,"value":611},"World.create({ render: { camera } })",{"type":45,"value":613}," pose.",{"type":40,"tag":131,"props":615,"children":617},{"id":616},"workflow",[618],{"type":45,"value":619},"Workflow",{"type":40,"tag":621,"props":622,"children":624},"h3",{"id":623},"_1-specify",[625],{"type":45,"value":626},"1. Specify",{"type":40,"tag":48,"props":628,"children":629},{},[630],{"type":45,"value":631},"Turn the request into a compact implementation brief:",{"type":40,"tag":59,"props":633,"children":634},{},[635,640,645,650,655,660],{"type":40,"tag":63,"props":636,"children":637},{},[638],{"type":45,"value":639},"required and optional features;",{"type":40,"tag":63,"props":641,"children":642},{},[643],{"type":45,"value":644},"source evidence regions for image input;",{"type":40,"tag":63,"props":646,"children":647},{},[648],{"type":45,"value":649},"silhouette, proportions, parts, negative space, contacts, and material response;",{"type":40,"tag":63,"props":651,"children":652},{},[653],{"type":45,"value":654},"hero and diagnostic views;",{"type":40,"tag":63,"props":656,"children":657},{},[658],{"type":45,"value":659},"measurable acceptance criteria;",{"type":40,"tag":63,"props":661,"children":662},{},[663],{"type":45,"value":664},"assumptions, uncertainty, and fidelity ceiling.",{"type":40,"tag":48,"props":666,"children":667},{},[668],{"type":45,"value":669},"A single image proves visible composition, not hidden geometry. Do not silently invent\noccluded detail or lower requested fidelity.",{"type":40,"tag":621,"props":671,"children":673},{"id":672},"_2-plan-assets-and-modules",[674],{"type":45,"value":675},"2. Plan Assets And Modules",{"type":40,"tag":48,"props":677,"children":678},{},[679,681,687,689,695],{"type":45,"value":680},"Call ",{"type":40,"tag":146,"props":682,"children":684},{"className":683},[],[685],{"type":45,"value":686},"scene_get_capabilities",{"type":45,"value":688}," once. Inspect ",{"type":40,"tag":146,"props":690,"children":692},{"className":691},[],[693],{"type":45,"value":694},"src\u002Fassets.ts",{"type":45,"value":696}," and existing asset modules.\nFor every visible form, choose one of:",{"type":40,"tag":698,"props":699,"children":700},"ol",{},[701,706,711,724,736],{"type":40,"tag":63,"props":702,"children":703},{},[704],{"type":45,"value":705},"reuse an existing manifest asset;",{"type":40,"tag":63,"props":707,"children":708},{},[709],{"type":45,"value":710},"add a glTF entry to the manifest;",{"type":40,"tag":63,"props":712,"children":713},{},[714,716,722],{"type":45,"value":715},"register a UIKitML file with ",{"type":40,"tag":146,"props":717,"children":719},{"className":718},[],[720],{"type":45,"value":721},"AssetType.UIKitML",{"type":45,"value":723},";",{"type":40,"tag":63,"props":725,"children":726},{},[727,729,734],{"type":45,"value":728},"create a deterministic parentless ",{"type":40,"tag":146,"props":730,"children":732},{"className":731},[],[733],{"type":45,"value":190},{"type":45,"value":735}," prototype in code and register it;",{"type":40,"tag":63,"props":737,"children":738},{},[739],{"type":45,"value":740},"assemble existing assets with a scene prefab or module.",{"type":40,"tag":48,"props":742,"children":743},{},[744,746,752,754,759],{"type":45,"value":745},"Create custom geometry and materials in asset code, not JSON. Prefer separate\n",{"type":40,"tag":146,"props":747,"children":749},{"className":748},[],[750],{"type":45,"value":751},"*.scene-asset.ts",{"type":45,"value":753}," modules for substantial procedural assets and import their\nprototypes into ",{"type":40,"tag":146,"props":755,"children":757},{"className":756},[],[758],{"type":45,"value":694},{"type":45,"value":166},{"type":40,"tag":48,"props":761,"children":762},{},[763],{"type":45,"value":764},"Plan independent semantic groups as standalone scene modules. Give each module a\nlocal origin, size envelope, attachment points, required views, and asset IDs. Asset\nand component IDs are application-global; imported node and prefab IDs are\nnamespaced.",{"type":40,"tag":621,"props":766,"children":768},{"id":767},"_3-build",[769],{"type":45,"value":770},"3. Build",{"type":40,"tag":48,"props":772,"children":773},{},[774],{"type":45,"value":775},"Author assets first, then scene JSON. Build in dependency order:",{"type":40,"tag":698,"props":777,"children":778},{},[779,784,789,794,799],{"type":40,"tag":63,"props":780,"children":781},{},[782],{"type":45,"value":783},"support\u002Fstage and representative lighting;",{"type":40,"tag":63,"props":785,"children":786},{},[787],{"type":45,"value":788},"large composition masses;",{"type":40,"tag":63,"props":790,"children":791},{},[792],{"type":45,"value":793},"identity-critical groups;",{"type":40,"tag":63,"props":795,"children":796},{},[797],{"type":45,"value":798},"repeated secondary detail;",{"type":40,"tag":63,"props":800,"children":801},{},[802],{"type":45,"value":803},"hero camera and final environment.",{"type":40,"tag":48,"props":805,"children":806},{},[807,809,815,817,823],{"type":45,"value":808},"Use meters, stable descriptive IDs, deterministic ordering, and explicit transforms.\nGroups supply hierarchy, never visible mass. Use ",{"type":40,"tag":146,"props":810,"children":812},{"className":811},[],[813],{"type":45,"value":814},"castShadow",{"type":45,"value":816}," and ",{"type":40,"tag":146,"props":818,"children":820},{"className":819},[],[821],{"type":45,"value":822},"receiveShadow",{"type":45,"value":824}," on\nasset nodes only when needed. Use prefabs and patterns for repetition; keep repeated\nasset prototypes resource-sharing friendly.",{"type":40,"tag":621,"props":826,"children":828},{"id":827},"_4-validate-and-materialize",[829],{"type":45,"value":830},"4. Validate And Materialize",{"type":40,"tag":48,"props":832,"children":833},{},[834,836,841],{"type":45,"value":835},"With the managed editor command-ready, call ",{"type":40,"tag":146,"props":837,"children":839},{"className":838},[],[840],{"type":45,"value":492},{"type":45,"value":842}," on every changed\nmodule, then the root. It composes imports, validates schema and manifest references,\nlowers the scene, and returns a PNG plus diagnostics without changing the active\ndocument. Fix failures in the owning asset or scene file.",{"type":40,"tag":48,"props":844,"children":845},{},[846,848,854],{"type":45,"value":847},"After the root passes, call ",{"type":40,"tag":146,"props":849,"children":851},{"className":850},[],[852],{"type":45,"value":853},"scene_open",{"type":45,"value":855}," once for live collaboration. The editor\nwatches the root and imported files. A valid file change swaps the preview atomically;\nan invalid change preserves the last valid render and reports diagnostics. Unsaved\nhuman edits produce a conflict instead of being overwritten.",{"type":40,"tag":48,"props":857,"children":858},{},[859,861,867],{"type":45,"value":860},"Use ",{"type":40,"tag":146,"props":862,"children":864},{"className":863},[],[865],{"type":45,"value":866},"scene_get_state",{"type":45,"value":868}," for selection, hashes, diagnostics, dirty\u002Fconflict state, runtime\nreadiness, and render statistics. Use camera, screenshot, selection, and preview\nvisibility tools only when their live-editor context is useful.",{"type":40,"tag":621,"props":870,"children":872},{"id":871},"_5-review-and-refine",[873],{"type":45,"value":874},"5. Review And Refine",{"type":40,"tag":48,"props":876,"children":877},{},[878],{"type":45,"value":879},"Review in three passes:",{"type":40,"tag":698,"props":881,"children":882},{},[883,894,904],{"type":40,"tag":63,"props":884,"children":885},{},[886,892],{"type":40,"tag":887,"props":888,"children":889},"strong",{},[890],{"type":45,"value":891},"Layout",{"type":45,"value":893},": hierarchy, scale, support contacts, and arrangement.",{"type":40,"tag":63,"props":895,"children":896},{},[897,902],{"type":40,"tag":887,"props":898,"children":899},{},[900],{"type":45,"value":901},"Geometry",{"type":45,"value":903},": silhouette, proportions, parts, negative space, and alternate views.",{"type":40,"tag":63,"props":905,"children":906},{},[907,912],{"type":40,"tag":887,"props":908,"children":909},{},[910],{"type":45,"value":911},"Final",{"type":45,"value":913},": material response, color, lighting, environment, and hero framing.",{"type":40,"tag":48,"props":915,"children":916},{},[917],{"type":45,"value":918},"Keep review orchestration and evidence outside the editor. The editor supplies\nauthoritative screenshots, hashes, camera state, diagnostics, and render measurements.\nDerive comparisons, defect lists, lineage, and stop decisions in ordinary task files.",{"type":40,"tag":48,"props":920,"children":921},{},[922],{"type":45,"value":923},"Fix the highest-impact defect in its owning asset or scene module, rerender that file,\nthen rerender the root. Default to two focused correction rounds. Stop earlier on a\nrepeated defect, oscillation, plateau, missing input\u002Fasset, or representation ceiling.",{"type":40,"tag":621,"props":925,"children":927},{"id":926},"_6-finish",[928],{"type":45,"value":929},"6. Finish",{"type":40,"tag":48,"props":931,"children":932},{},[933],{"type":45,"value":934},"Finish only when:",{"type":40,"tag":59,"props":936,"children":937},{},[938,943,948,953,958,963],{"type":40,"tag":63,"props":939,"children":940},{},[941],{"type":45,"value":942},"every root and module file validates and renders;",{"type":40,"tag":63,"props":944,"children":945},{},[946],{"type":45,"value":947},"the active editor state is clean and conflict-free;",{"type":40,"tag":63,"props":949,"children":950},{},[951],{"type":45,"value":952},"required views are nonblank and correctly framed;",{"type":40,"tag":63,"props":954,"children":955},{},[956],{"type":45,"value":957},"required features pass measurable and visual checks;",{"type":40,"tag":63,"props":959,"children":960},{},[961],{"type":45,"value":962},"manifest asset IDs resolve in both editor and application runtime;",{"type":40,"tag":63,"props":964,"children":965},{},[966],{"type":45,"value":967},"the application build and selected scene load without blocking errors.",{"type":40,"tag":48,"props":969,"children":970},{},[971],{"type":45,"value":972},"If a required gate is unavailable, finish with an explicit blocked or\naccepted-with-gaps result. Passing a local schema check, production build, or custom\ndiagnostic image does not substitute for authoritative editor renders and state.",{"type":40,"tag":131,"props":974,"children":976},{"id":975},"modular-composition",[977],{"type":45,"value":978},"Modular Composition",{"type":40,"tag":214,"props":980,"children":984},{"className":981,"code":982,"language":983,"meta":219,"style":219},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"version\": \"iwsdk.scene.v1\",\n  \"units\": \"meters\",\n  \"imports\": [\n    {\n      \"id\": \"reading-nook\",\n      \"src\": \".\u002Fmodules\u002Freading-nook.iwsdk.scene.json\",\n      \"transform\": { \"position\": [1.8, 0, -0.6] }\n    }\n  ],\n  \"resources\": {},\n  \"nodes\": []\n}\n","json",[985],{"type":40,"tag":146,"props":986,"children":987},{"__ignoreMap":219},[988,996,1038,1075,1100,1108,1146,1183,1265,1273,1282,1308,1334],{"type":40,"tag":245,"props":989,"children":990},{"class":247,"line":248},[991],{"type":40,"tag":245,"props":992,"children":993},{"style":358},[994],{"type":45,"value":995},"{\n",{"type":40,"tag":245,"props":997,"children":998},{"class":247,"line":274},[999,1004,1010,1015,1020,1025,1029,1033],{"type":40,"tag":245,"props":1000,"children":1001},{"style":358},[1002],{"type":45,"value":1003},"  \"",{"type":40,"tag":245,"props":1005,"children":1007},{"style":1006},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1008],{"type":45,"value":1009},"version",{"type":40,"tag":245,"props":1011,"children":1012},{"style":358},[1013],{"type":45,"value":1014},"\"",{"type":40,"tag":245,"props":1016,"children":1017},{"style":358},[1018],{"type":45,"value":1019},":",{"type":40,"tag":245,"props":1021,"children":1022},{"style":358},[1023],{"type":45,"value":1024}," \"",{"type":40,"tag":245,"props":1026,"children":1027},{"style":258},[1028],{"type":45,"value":151},{"type":40,"tag":245,"props":1030,"children":1031},{"style":358},[1032],{"type":45,"value":1014},{"type":40,"tag":245,"props":1034,"children":1035},{"style":358},[1036],{"type":45,"value":1037},",\n",{"type":40,"tag":245,"props":1039,"children":1040},{"class":247,"line":295},[1041,1045,1050,1054,1058,1062,1067,1071],{"type":40,"tag":245,"props":1042,"children":1043},{"style":358},[1044],{"type":45,"value":1003},{"type":40,"tag":245,"props":1046,"children":1047},{"style":1006},[1048],{"type":45,"value":1049},"units",{"type":40,"tag":245,"props":1051,"children":1052},{"style":358},[1053],{"type":45,"value":1014},{"type":40,"tag":245,"props":1055,"children":1056},{"style":358},[1057],{"type":45,"value":1019},{"type":40,"tag":245,"props":1059,"children":1060},{"style":358},[1061],{"type":45,"value":1024},{"type":40,"tag":245,"props":1063,"children":1064},{"style":258},[1065],{"type":45,"value":1066},"meters",{"type":40,"tag":245,"props":1068,"children":1069},{"style":358},[1070],{"type":45,"value":1014},{"type":40,"tag":245,"props":1072,"children":1073},{"style":358},[1074],{"type":45,"value":1037},{"type":40,"tag":245,"props":1076,"children":1077},{"class":247,"line":322},[1078,1082,1087,1091,1095],{"type":40,"tag":245,"props":1079,"children":1080},{"style":358},[1081],{"type":45,"value":1003},{"type":40,"tag":245,"props":1083,"children":1084},{"style":1006},[1085],{"type":45,"value":1086},"imports",{"type":40,"tag":245,"props":1088,"children":1089},{"style":358},[1090],{"type":45,"value":1014},{"type":40,"tag":245,"props":1092,"children":1093},{"style":358},[1094],{"type":45,"value":1019},{"type":40,"tag":245,"props":1096,"children":1097},{"style":358},[1098],{"type":45,"value":1099}," [\n",{"type":40,"tag":245,"props":1101,"children":1102},{"class":247,"line":349},[1103],{"type":40,"tag":245,"props":1104,"children":1105},{"style":358},[1106],{"type":45,"value":1107},"    {\n",{"type":40,"tag":245,"props":1109,"children":1110},{"class":247,"line":378},[1111,1116,1121,1125,1129,1133,1138,1142],{"type":40,"tag":245,"props":1112,"children":1113},{"style":358},[1114],{"type":45,"value":1115},"      \"",{"type":40,"tag":245,"props":1117,"children":1118},{"style":252},[1119],{"type":45,"value":1120},"id",{"type":40,"tag":245,"props":1122,"children":1123},{"style":358},[1124],{"type":45,"value":1014},{"type":40,"tag":245,"props":1126,"children":1127},{"style":358},[1128],{"type":45,"value":1019},{"type":40,"tag":245,"props":1130,"children":1131},{"style":358},[1132],{"type":45,"value":1024},{"type":40,"tag":245,"props":1134,"children":1135},{"style":258},[1136],{"type":45,"value":1137},"reading-nook",{"type":40,"tag":245,"props":1139,"children":1140},{"style":358},[1141],{"type":45,"value":1014},{"type":40,"tag":245,"props":1143,"children":1144},{"style":358},[1145],{"type":45,"value":1037},{"type":40,"tag":245,"props":1147,"children":1148},{"class":247,"line":392},[1149,1153,1158,1162,1166,1170,1175,1179],{"type":40,"tag":245,"props":1150,"children":1151},{"style":358},[1152],{"type":45,"value":1115},{"type":40,"tag":245,"props":1154,"children":1155},{"style":252},[1156],{"type":45,"value":1157},"src",{"type":40,"tag":245,"props":1159,"children":1160},{"style":358},[1161],{"type":45,"value":1014},{"type":40,"tag":245,"props":1163,"children":1164},{"style":358},[1165],{"type":45,"value":1019},{"type":40,"tag":245,"props":1167,"children":1168},{"style":358},[1169],{"type":45,"value":1024},{"type":40,"tag":245,"props":1171,"children":1172},{"style":258},[1173],{"type":45,"value":1174},".\u002Fmodules\u002Freading-nook.iwsdk.scene.json",{"type":40,"tag":245,"props":1176,"children":1177},{"style":358},[1178],{"type":45,"value":1014},{"type":40,"tag":245,"props":1180,"children":1181},{"style":358},[1182],{"type":45,"value":1037},{"type":40,"tag":245,"props":1184,"children":1185},{"class":247,"line":417},[1186,1190,1195,1199,1203,1208,1212,1218,1222,1226,1231,1236,1241,1246,1250,1255,1260],{"type":40,"tag":245,"props":1187,"children":1188},{"style":358},[1189],{"type":45,"value":1115},{"type":40,"tag":245,"props":1191,"children":1192},{"style":252},[1193],{"type":45,"value":1194},"transform",{"type":40,"tag":245,"props":1196,"children":1197},{"style":358},[1198],{"type":45,"value":1014},{"type":40,"tag":245,"props":1200,"children":1201},{"style":358},[1202],{"type":45,"value":1019},{"type":40,"tag":245,"props":1204,"children":1205},{"style":358},[1206],{"type":45,"value":1207}," {",{"type":40,"tag":245,"props":1209,"children":1210},{"style":358},[1211],{"type":45,"value":1024},{"type":40,"tag":245,"props":1213,"children":1215},{"style":1214},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1216],{"type":45,"value":1217},"position",{"type":40,"tag":245,"props":1219,"children":1220},{"style":358},[1221],{"type":45,"value":1014},{"type":40,"tag":245,"props":1223,"children":1224},{"style":358},[1225],{"type":45,"value":1019},{"type":40,"tag":245,"props":1227,"children":1228},{"style":358},[1229],{"type":45,"value":1230}," [",{"type":40,"tag":245,"props":1232,"children":1233},{"style":1214},[1234],{"type":45,"value":1235},"1.8",{"type":40,"tag":245,"props":1237,"children":1238},{"style":358},[1239],{"type":45,"value":1240},",",{"type":40,"tag":245,"props":1242,"children":1243},{"style":1214},[1244],{"type":45,"value":1245}," 0",{"type":40,"tag":245,"props":1247,"children":1248},{"style":358},[1249],{"type":45,"value":1240},{"type":40,"tag":245,"props":1251,"children":1252},{"style":1214},[1253],{"type":45,"value":1254}," -0.6",{"type":40,"tag":245,"props":1256,"children":1257},{"style":358},[1258],{"type":45,"value":1259},"]",{"type":40,"tag":245,"props":1261,"children":1262},{"style":358},[1263],{"type":45,"value":1264}," }\n",{"type":40,"tag":245,"props":1266,"children":1267},{"class":247,"line":442},[1268],{"type":40,"tag":245,"props":1269,"children":1270},{"style":358},[1271],{"type":45,"value":1272},"    }\n",{"type":40,"tag":245,"props":1274,"children":1276},{"class":247,"line":1275},10,[1277],{"type":40,"tag":245,"props":1278,"children":1279},{"style":358},[1280],{"type":45,"value":1281},"  ],\n",{"type":40,"tag":245,"props":1283,"children":1285},{"class":247,"line":1284},11,[1286,1290,1295,1299,1303],{"type":40,"tag":245,"props":1287,"children":1288},{"style":358},[1289],{"type":45,"value":1003},{"type":40,"tag":245,"props":1291,"children":1292},{"style":1006},[1293],{"type":45,"value":1294},"resources",{"type":40,"tag":245,"props":1296,"children":1297},{"style":358},[1298],{"type":45,"value":1014},{"type":40,"tag":245,"props":1300,"children":1301},{"style":358},[1302],{"type":45,"value":1019},{"type":40,"tag":245,"props":1304,"children":1305},{"style":358},[1306],{"type":45,"value":1307}," {},\n",{"type":40,"tag":245,"props":1309,"children":1311},{"class":247,"line":1310},12,[1312,1316,1321,1325,1329],{"type":40,"tag":245,"props":1313,"children":1314},{"style":358},[1315],{"type":45,"value":1003},{"type":40,"tag":245,"props":1317,"children":1318},{"style":1006},[1319],{"type":45,"value":1320},"nodes",{"type":40,"tag":245,"props":1322,"children":1323},{"style":358},[1324],{"type":45,"value":1014},{"type":40,"tag":245,"props":1326,"children":1327},{"style":358},[1328],{"type":45,"value":1019},{"type":40,"tag":245,"props":1330,"children":1331},{"style":358},[1332],{"type":45,"value":1333}," []\n",{"type":40,"tag":245,"props":1335,"children":1337},{"class":247,"line":1336},13,[1338],{"type":40,"tag":245,"props":1339,"children":1340},{"style":358},[1341],{"type":45,"value":1342},"}\n",{"type":40,"tag":48,"props":1344,"children":1345},{},[1346],{"type":45,"value":1347},"Each module must be valid by itself. Imports resolve recursively in declaration order.\nThe import entry becomes a transform group. The root owns global components,\nenvironment, metadata, and authoring settings. Cycles, unsafe IDs, missing files,\nduplicate namespaced IDs, and invalid modules fail composition.",{"type":40,"tag":48,"props":1349,"children":1350},{},[1351],{"type":45,"value":1352},"For parallel work, assign one module file per worker. Never let two workers edit one\nfile. Render modules independently, import only passing modules, then correct\ncross-module scale, contact, occlusion, lighting, and framing at the root.",{"type":40,"tag":131,"props":1354,"children":1356},{"id":1355},"regeneration-and-provenance",[1357],{"type":45,"value":1358},"Regeneration And Provenance",{"type":40,"tag":48,"props":1360,"children":1361},{},[1362],{"type":45,"value":1363},"Preserve stable IDs and module boundaries when revising. Never overwrite unrelated\nhuman-authored files. Record the skill\u002Fruntime versions, input hashes, root\u002Fmodule\npaths, capability hash, source\u002Fcomposed\u002Fruntime hashes, assumptions, and fidelity\nceiling in authoring metadata or adjacent task evidence.",{"type":40,"tag":1365,"props":1366,"children":1367},"style",{},[1368],{"type":45,"value":1369},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1371,"total":1559},[1372,1394,1408,1429,1450,1467,1478,1496,1509,1524,1536,1546],{"slug":1373,"name":1373,"fn":1374,"description":1375,"org":1376,"tags":1377,"stars":1391,"repoUrl":1392,"updatedAt":1393},"relay-best-practices","write idiomatic Relay code","Best practices for writing idiomatic Relay code. ALWAYS use this skill when writing or modifying React components that use Relay for data fetching. Covers fragments, queries, mutations, pagination, and common anti-patterns. Use when you see `useFragment`, `useLazyLoadQuery`, `usePreloadedQuery`, `useMutation`, `usePaginationFragment`, `graphql` template literals, `react-relay` imports, or `__generated__\u002F*.graphql` files. Also use when asked to explain Relay concepts, debug Relay issues, or review Relay code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1378,1379,1382,1385,1388],{"name":18,"slug":19,"type":16},{"name":1380,"slug":1381,"type":16},"Frontend","frontend",{"name":1383,"slug":1384,"type":16},"GraphQL","graphql",{"name":1386,"slug":1387,"type":16},"React","react",{"name":1389,"slug":1390,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":1395,"name":1395,"fn":1396,"description":1397,"org":1398,"tags":1399,"stars":1391,"repoUrl":1392,"updatedAt":1407},"relay-performance","optimize Relay application performance","Performance best practices for Relay applications. Use when optimizing data fetching, reducing re-renders, configuring caching, or improving time to first meaningful paint. Covers query placement, @defer, pagination, fetch policies, garbage collection, fragment granularity, and server-side filtering. Companion to the relay-best-practices skill which covers correctness and architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1400,1401,1402,1405,1406],{"name":1380,"slug":1381,"type":16},{"name":1383,"slug":1384,"type":16},{"name":1403,"slug":1404,"type":16},"Performance","performance",{"name":1386,"slug":1387,"type":16},{"name":1389,"slug":1390,"type":16},"2026-06-10T07:30:28.726513",{"slug":1409,"name":1409,"fn":1410,"description":1411,"org":1412,"tags":1413,"stars":1426,"repoUrl":1427,"updatedAt":1428},"add-shape-types-to-torch-model","annotate PyTorch models with tensor shapes","Port a PyTorch model to use pyrefly's tensor shape type system (Tensor[[B, C, H, W]], Int[T]). Use this skill whenever the user wants to add shape annotations to a PyTorch model, type a model with tensor dimensions, port a model to use shape tracking, or annotate model forward methods with tensor shapes. Also use when the user mentions tensor shape ports, Int types for PyTorch, or pyrefly shape checking on a model file. Invoke BEFORE starting any model port — the skill's gated workflow prevents common failure modes.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1414,1417,1420,1423],{"name":1415,"slug":1416,"type":16},"Data Modeling","data-modeling",{"name":1418,"slug":1419,"type":16},"Deep Learning","deep-learning",{"name":1421,"slug":1422,"type":16},"Python","python",{"name":1424,"slug":1425,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":1430,"name":1430,"fn":1431,"description":1432,"org":1433,"tags":1434,"stars":1447,"repoUrl":1448,"updatedAt":1449},"camera-streaming","configure camera streaming and photo capture","Stream, video frames, photo capture, resolution\u002Fframe rate configuration",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1435,1438,1441,1444],{"name":1436,"slug":1437,"type":16},"Camera","camera",{"name":1439,"slug":1440,"type":16},"Hardware","hardware",{"name":1442,"slug":1443,"type":16},"iOS","ios",{"name":1445,"slug":1446,"type":16},"Video","video",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-05-15T06:14:43.555881",{"slug":1451,"name":1451,"fn":1452,"description":1453,"org":1454,"tags":1455,"stars":1447,"repoUrl":1448,"updatedAt":1466},"dat-conventions","develop iOS applications with DAT SDK","Swift patterns, async\u002Fawait, naming conventions, key types for DAT SDK iOS development",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1456,1457,1460,1463],{"name":1442,"slug":1443,"type":16},{"name":1458,"slug":1459,"type":16},"Mobile","mobile",{"name":1461,"slug":1462,"type":16},"SDK","sdk",{"name":1464,"slug":1465,"type":16},"Swift","swift","2026-05-15T06:14:42.334435",{"slug":1468,"name":1468,"fn":1469,"description":1470,"org":1471,"tags":1472,"stars":1447,"repoUrl":1448,"updatedAt":1477},"debugging","debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1473,1475,1476],{"name":1474,"slug":1468,"type":16},"Debugging",{"name":18,"slug":19,"type":16},{"name":1442,"slug":1443,"type":16},"2026-05-15T06:14:38.626606",{"slug":1479,"name":1479,"fn":1480,"description":1481,"org":1482,"tags":1483,"stars":1447,"repoUrl":1448,"updatedAt":1495},"display-access","manage display capabilities on wearable devices","Display capability setup, display-capable device selection, UI DSL, icons, buttons, images, and video playback",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1484,1485,1488,1491,1494],{"name":21,"slug":22,"type":16},{"name":1486,"slug":1487,"type":16},"Images","images",{"name":1489,"slug":1490,"type":16},"Interaction","interaction",{"name":1492,"slug":1493,"type":16},"UI Components","ui-components",{"name":1445,"slug":1446,"type":16},"2026-05-15T06:14:39.844502",{"slug":1497,"name":1497,"fn":1498,"description":1499,"org":1500,"tags":1501,"stars":1447,"repoUrl":1448,"updatedAt":1508},"getting-started","set up Meta wearable SDK integration","SDK setup, Swift Package Manager integration, Info.plist configuration, and first connection to Meta glasses",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1502,1505,1506,1507],{"name":1503,"slug":1504,"type":16},"Configuration","configuration",{"name":1442,"slug":1443,"type":16},{"name":1461,"slug":1462,"type":16},{"name":1464,"slug":1465,"type":16},"2026-05-15T06:14:41.086639",{"slug":1510,"name":1510,"fn":1511,"description":1512,"org":1513,"tags":1514,"stars":1447,"repoUrl":1448,"updatedAt":1523},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1515,1516,1517,1520],{"name":1442,"slug":1443,"type":16},{"name":1458,"slug":1459,"type":16},{"name":1518,"slug":1519,"type":16},"QA","qa",{"name":1521,"slug":1522,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":1525,"name":1525,"fn":1526,"description":1527,"org":1528,"tags":1529,"stars":1447,"repoUrl":1448,"updatedAt":1535},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1530,1531,1532],{"name":1436,"slug":1437,"type":16},{"name":1442,"slug":1443,"type":16},{"name":1533,"slug":1534,"type":16},"Permissions","permissions","2026-05-15T06:14:46.030253",{"slug":1537,"name":1537,"fn":1538,"description":1539,"org":1540,"tags":1541,"stars":1447,"repoUrl":1448,"updatedAt":1545},"sample-app-guide","build wearable apps with camera streaming","Building a complete DAT app with camera streaming and photo capture",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1542,1543,1544],{"name":1436,"slug":1437,"type":16},{"name":1442,"slug":1443,"type":16},{"name":1458,"slug":1459,"type":16},"2026-05-15T06:14:36.185947",{"slug":1547,"name":1547,"fn":1548,"description":1549,"org":1550,"tags":1551,"stars":1447,"repoUrl":1448,"updatedAt":1558},"session-lifecycle","monitor device session lifecycle states","Device session states, pause\u002Fresume, availability monitoring",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1552,1553,1554,1557],{"name":1442,"slug":1443,"type":16},{"name":1458,"slug":1459,"type":16},{"name":1555,"slug":1556,"type":16},"Monitoring","monitoring",{"name":1403,"slug":1404,"type":16},"2026-05-15T06:14:44.790925",29,{"items":1561,"total":442},[1562,1578,1593,1605,1617,1631,1647],{"slug":1563,"name":1563,"fn":1564,"description":1565,"org":1566,"tags":1567,"stars":23,"repoUrl":24,"updatedAt":1577},"iwsdk-debug","debug continuous behavior in WebXR","Debug continuous behavior in WebXR scenes — physics, animations, collisions, game loops, or any real-time interaction that happens too fast for an agent to observe. Uses ECS pause\u002Fstep\u002Fsnapshot\u002Fdiff to freeze time and inspect state frame by frame.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1568,1569,1572,1573,1574],{"name":1474,"slug":1468,"type":16},{"name":1570,"slug":1571,"type":16},"Immersive","immersive",{"name":1489,"slug":1490,"type":16},{"name":14,"slug":15,"type":16},{"name":1575,"slug":1576,"type":16},"WebXR","webxr","2026-08-03T06:00:14.723239",{"slug":1579,"name":1579,"fn":1580,"description":1581,"org":1582,"tags":1583,"stars":23,"repoUrl":24,"updatedAt":1592},"iwsdk-depth-occlusion","implement depth sensing and occlusion in IWSDK","Guide for implementing depth sensing and occlusion in IWSDK projects. Use when adding depth-based occlusion to hide virtual objects behind real-world surfaces, configuring DepthSensingSystem, choosing occlusion modes, or troubleshooting objects that disappear or fail to occlude.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1584,1587,1588,1591],{"name":1585,"slug":1586,"type":16},"AR","ar",{"name":14,"slug":15,"type":16},{"name":1589,"slug":1590,"type":16},"VR","vr",{"name":1575,"slug":1576,"type":16},"2026-07-21T05:39:07.241041",{"slug":1594,"name":1594,"fn":1595,"description":1596,"org":1597,"tags":1598,"stars":23,"repoUrl":24,"updatedAt":1604},"iwsdk-grab","grab and move objects in WebXR scenes","Grab an object in the WebXR scene using emulated controllers. Use when the user wants to pick up, move, or test grabbing an object. Supports OneHandGrabbable and TwoHandsGrabbable components which use proximity-based grip (squeeze button), not trigger.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1599,1600,1601,1602,1603],{"name":1585,"slug":1586,"type":16},{"name":1570,"slug":1571,"type":16},{"name":1489,"slug":1490,"type":16},{"name":1589,"slug":1590,"type":16},{"name":1575,"slug":1576,"type":16},"2026-08-03T06:00:15.729887",{"slug":1606,"name":1606,"fn":1607,"description":1608,"org":1609,"tags":1610,"stars":23,"repoUrl":24,"updatedAt":1616},"iwsdk-migrate-0-5","migrate IWSDK applications to version 0.5","Migrate an IWSDK 0.4.x application to IWSDK 0.5.0. Use when upgrading an existing IWSDK project across the 0.5 boundary, replacing Meta Spatial Editor or GLXF, removing retired Vite plugins, moving UIKitML to runtime-loaded assets, adopting native scene JSON, or resolving 0.5 migration errors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1611,1612,1613],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":1614,"slug":1615,"type":16},"Migration","migration","2026-08-03T06:27:16.342257",{"slug":1618,"name":1618,"fn":1619,"description":1620,"org":1621,"tags":1622,"stars":23,"repoUrl":24,"updatedAt":1630},"iwsdk-physics","implement physics in IWSDK projects","Guide for implementing physics in IWSDK projects. Use when adding physics simulation, configuring rigid bodies, collision shapes, applying forces, creating grabbable physics objects, or troubleshooting physics behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1623,1624,1625,1626,1629],{"name":1570,"slug":1571,"type":16},{"name":1489,"slug":1490,"type":16},{"name":14,"slug":15,"type":16},{"name":1627,"slug":1628,"type":16},"Physics","physics",{"name":1575,"slug":1576,"type":16},"2026-08-03T06:00:16.693714",{"slug":1632,"name":1632,"fn":1633,"description":1634,"org":1635,"tags":1636,"stars":23,"repoUrl":24,"updatedAt":1646},"iwsdk-planner","plan IWSDK projects and architecture","IWSDK experience pipeline and planning guide. Use when building a new IWSDK app\u002Fgame end-to-end, planning new IWSDK features, designing systems\u002Fcomponents, reviewing IWSDK code architecture, or when the user asks about IWSDK patterns, ECS design, signals, or reactive programming. Runs a phased ideation → design → grounding → architecture → build → verify → ship pipeline, orchestrating sub-agents per phase where the harness supports them.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1637,1640,1641,1642,1645],{"name":1638,"slug":1639,"type":16},"Architecture","architecture",{"name":1570,"slug":1571,"type":16},{"name":14,"slug":15,"type":16},{"name":1643,"slug":1644,"type":16},"Strategy","strategy",{"name":1575,"slug":1576,"type":16},"2026-08-03T06:00:11.725103",{"slug":1648,"name":1648,"fn":1649,"description":1650,"org":1651,"tags":1652,"stars":23,"repoUrl":24,"updatedAt":1658},"iwsdk-ray","implement ray-based interactions in WebXR","Ray-based interactions in the WebXR scene — click objects, press UI buttons, or distance-grab with DistanceGrabbable. Use when the user wants to point at and interact with something at a distance, click a UI button, or test ray-based selection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1653,1654,1655,1656,1657],{"name":1585,"slug":1586,"type":16},{"name":1570,"slug":1571,"type":16},{"name":1489,"slug":1490,"type":16},{"name":1589,"slug":1590,"type":16},{"name":1575,"slug":1576,"type":16},"2026-08-03T06:00:13.705148"]