[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-iwsdk-debug":3,"mdc--y5wbtx-key":40,"related-org-meta-iwsdk-debug":849,"related-repo-meta-iwsdk-debug":1039},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"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},"meta","Meta Open Source","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmeta.png","facebook",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"IWSDK","iwsdk","tag",{"name":18,"slug":19,"type":16},"Interaction","interaction",{"name":21,"slug":22,"type":16},"Immersive","immersive",{"name":24,"slug":25,"type":16},"WebXR","webxr",{"name":27,"slug":28,"type":16},"Debugging","debugging",358,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fimmersive-web-sdk","2026-04-06T18:11:37.886889",null,73,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"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-debug","---\nname: iwsdk-debug\ndescription: 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.\nargument-hint: [description of behavior to debug]\n---\n\n# Debug Continuous Behavior\n\nReal-time behavior (physics, animations, collisions, game loops) happens too fast for an agent to observe directly. By the time you take a screenshot, the action is over. This skill uses ECS time-control tools to freeze, step, and diff state frame by frame.\n\nUser request is in `$ARGUMENTS`.\n\n## Core Workflow\n\nEvery debugging session follows this pattern:\n\n1. **Set up** the scenario (position objects, aim controllers, etc.)\n2. **`ecs_pause`** — freeze ECS updates right before the interesting moment\n3. **`ecs_snapshot({ \"label\": \"before\" })`** — capture state before the action\n4. **Trigger** the action (release grip, apply force, start animation, etc.)\n5. **`ecs_step(count, delta)`** — advance a few frames at fixed timestep\n6. **`browser_screenshot`** — visually verify what happened\n7. **`ecs_snapshot({ \"label\": \"after\" })`** — capture state after stepping\n8. **`ecs_diff({ \"from\": \"before\", \"to\": \"after\" })`** — see exactly what changed\n9. **Repeat** steps 5-8, stepping further until the behavior completes\n10. **`ecs_resume`** — return to normal execution when done\n\nThe key insight: **pause BEFORE triggering the action**, not after. If you pause after, you've already missed the first frames.\n\n## Tool Reference\n\n| Tool                                              | Purpose                                                                             |\n| ------------------------------------------------- | ----------------------------------------------------------------------------------- |\n| `ecs_pause`                                       | Freeze all ECS system updates. Render loop continues — screenshots still work.      |\n| `ecs_step({\"count\":N,\"delta\":SECONDS})`           | Advance N frames with fixed timestep (seconds). Must pause first.                   |\n| `ecs_resume`                                      | Resume normal execution. First frame uses capped delta to avoid physics explosions. |\n| `ecs_snapshot({\"label\":\"...\"})`                   | Capture full ECS state. Stores up to 2 snapshots.                                   |\n| `ecs_diff({\"from\":\"...\",\"to\":\"...\"})`             | Compare two snapshots. Shows added\u002Fremoved entities and field-level value changes.  |\n| `ecs_toggle_system({\"name\":\"...\",\"paused\":true})` | Pause\u002Fresume a single system. Use `ecs_list_systems` to discover names.             |\n| `browser_screenshot`                              | Visual verification — works while paused since the render loop continues.           |\n\n## Stepping Guidelines\n\n- **`delta`** is in seconds. Common values: `0.016` (60fps), `0.0139` (72fps\u002FQuest refresh rate).\n- **Start small** — step 1-3 frames first to catch the initial moment, then step more.\n- **Don't overshoot** — stepping 100 frames at once defeats the purpose. Step in batches of 5-20.\n\n## Patterns\n\nShort domain-specific tips. Apply the core workflow above, plus these hints.\n\n### Physics (falling, bouncing, collisions)\n\n- Pause BEFORE releasing the object or applying force.\n- Step 1-3 frames at `delta: 0.016` to catch initial acceleration.\n- In diffs, check `PhysicsBody._linearVelocity` and `PhysicsBody._angularVelocity` to see motion direction and speed.\n- Check `Transform.position` to track movement.\n- If an object falls through a surface: verify the surface entity has both `PhysicsBody` (Static) and `PhysicsShape` (TriMesh for complex geometry).\n- Use `ecs_query_entity` to inspect `PhysicsShape` and `PhysicsBody` on both the falling object and the surface.\n\n### Grab and Throw\n\n- Pause while the object is still held (trigger\u002Fgrip engaged).\n- Release the input (set button value to 0) while paused.\n- Step frame by frame to observe the release velocity.\n- In diffs, `PhysicsBody._linearVelocity` shows the throw direction and speed.\n- If the object doesn't move after release: check that it has `PhysicsBody` with `state: Dynamic`.\n\n### Animations and Transitions\n\n- Step 1 frame at a time with `delta` matching your target framerate.\n- Compare `Transform.position`, `Transform.orientation`, and `Transform.scale` across snapshots to track interpolation.\n- Use screenshots between steps to observe visual progression.\n\n### Collision Detection\n\n- Pause just before two objects meet.\n- Step 1 frame at a time.\n- Watch for `PhysicsBody._linearVelocity` sign changes (indicates bounce\u002Fimpact).\n- Watch for `PhysicsBody._angularVelocity` spikes (indicates tumbling from impact).\n- If objects pass through each other: check `PhysicsShape` exists on both entities, and verify shape types are appropriate (use `TriMesh` for complex static geometry).\n\n### System Isolation\n\n- Use `ecs_list_systems` to see all systems and their priorities.\n- Use `ecs_toggle_system({ \"name\": \"SystemName\", \"paused\": true })` to pause a suspect system while others run.\n- Step forward and observe — if the bug disappears, that system is the cause.\n- Remember to unpause the system when done.\n\n## Notes\n\n- **Snapshots overwrite** — only 2 are stored. Label them clearly (\"before\"\u002F\"after\") and diff before taking new ones.\n- **Resume is safe** — the first frame after resume uses a capped delta to prevent physics explosions from accumulated time.\n- **Render loop continues while paused** — screenshots always work, and the XR session stays alive.\n- **Stepping requires pause** — `ecs_step` will fail if you haven't called `ecs_pause` first.\n",{"data":41,"body":44},{"name":4,"description":6,"argument-hint":42},[43],"description of behavior to debug",{"type":45,"children":46},"root",[47,56,62,76,83,88,222,234,240,392,398,452,458,463,470,572,578,627,633,681,687,743,749,785,791],{"type":48,"tag":49,"props":50,"children":52},"element","h1",{"id":51},"debug-continuous-behavior",[53],{"type":54,"value":55},"text","Debug Continuous Behavior",{"type":48,"tag":57,"props":58,"children":59},"p",{},[60],{"type":54,"value":61},"Real-time behavior (physics, animations, collisions, game loops) happens too fast for an agent to observe directly. By the time you take a screenshot, the action is over. This skill uses ECS time-control tools to freeze, step, and diff state frame by frame.",{"type":48,"tag":57,"props":63,"children":64},{},[65,67,74],{"type":54,"value":66},"User request is in ",{"type":48,"tag":68,"props":69,"children":71},"code",{"className":70},[],[72],{"type":54,"value":73},"$ARGUMENTS",{"type":54,"value":75},".",{"type":48,"tag":77,"props":78,"children":80},"h2",{"id":79},"core-workflow",[81],{"type":54,"value":82},"Core Workflow",{"type":48,"tag":57,"props":84,"children":85},{},[86],{"type":54,"value":87},"Every debugging session follows this pattern:",{"type":48,"tag":89,"props":90,"children":91},"ol",{},[92,104,118,132,142,156,170,184,198,208],{"type":48,"tag":93,"props":94,"children":95},"li",{},[96,102],{"type":48,"tag":97,"props":98,"children":99},"strong",{},[100],{"type":54,"value":101},"Set up",{"type":54,"value":103}," the scenario (position objects, aim controllers, etc.)",{"type":48,"tag":93,"props":105,"children":106},{},[107,116],{"type":48,"tag":97,"props":108,"children":109},{},[110],{"type":48,"tag":68,"props":111,"children":113},{"className":112},[],[114],{"type":54,"value":115},"ecs_pause",{"type":54,"value":117}," — freeze ECS updates right before the interesting moment",{"type":48,"tag":93,"props":119,"children":120},{},[121,130],{"type":48,"tag":97,"props":122,"children":123},{},[124],{"type":48,"tag":68,"props":125,"children":127},{"className":126},[],[128],{"type":54,"value":129},"ecs_snapshot({ \"label\": \"before\" })",{"type":54,"value":131}," — capture state before the action",{"type":48,"tag":93,"props":133,"children":134},{},[135,140],{"type":48,"tag":97,"props":136,"children":137},{},[138],{"type":54,"value":139},"Trigger",{"type":54,"value":141}," the action (release grip, apply force, start animation, etc.)",{"type":48,"tag":93,"props":143,"children":144},{},[145,154],{"type":48,"tag":97,"props":146,"children":147},{},[148],{"type":48,"tag":68,"props":149,"children":151},{"className":150},[],[152],{"type":54,"value":153},"ecs_step(count, delta)",{"type":54,"value":155}," — advance a few frames at fixed timestep",{"type":48,"tag":93,"props":157,"children":158},{},[159,168],{"type":48,"tag":97,"props":160,"children":161},{},[162],{"type":48,"tag":68,"props":163,"children":165},{"className":164},[],[166],{"type":54,"value":167},"browser_screenshot",{"type":54,"value":169}," — visually verify what happened",{"type":48,"tag":93,"props":171,"children":172},{},[173,182],{"type":48,"tag":97,"props":174,"children":175},{},[176],{"type":48,"tag":68,"props":177,"children":179},{"className":178},[],[180],{"type":54,"value":181},"ecs_snapshot({ \"label\": \"after\" })",{"type":54,"value":183}," — capture state after stepping",{"type":48,"tag":93,"props":185,"children":186},{},[187,196],{"type":48,"tag":97,"props":188,"children":189},{},[190],{"type":48,"tag":68,"props":191,"children":193},{"className":192},[],[194],{"type":54,"value":195},"ecs_diff({ \"from\": \"before\", \"to\": \"after\" })",{"type":54,"value":197}," — see exactly what changed",{"type":48,"tag":93,"props":199,"children":200},{},[201,206],{"type":48,"tag":97,"props":202,"children":203},{},[204],{"type":54,"value":205},"Repeat",{"type":54,"value":207}," steps 5-8, stepping further until the behavior completes",{"type":48,"tag":93,"props":209,"children":210},{},[211,220],{"type":48,"tag":97,"props":212,"children":213},{},[214],{"type":48,"tag":68,"props":215,"children":217},{"className":216},[],[218],{"type":54,"value":219},"ecs_resume",{"type":54,"value":221}," — return to normal execution when done",{"type":48,"tag":57,"props":223,"children":224},{},[225,227,232],{"type":54,"value":226},"The key insight: ",{"type":48,"tag":97,"props":228,"children":229},{},[230],{"type":54,"value":231},"pause BEFORE triggering the action",{"type":54,"value":233},", not after. If you pause after, you've already missed the first frames.",{"type":48,"tag":77,"props":235,"children":237},{"id":236},"tool-reference",[238],{"type":54,"value":239},"Tool Reference",{"type":48,"tag":241,"props":242,"children":243},"table",{},[244,263],{"type":48,"tag":245,"props":246,"children":247},"thead",{},[248],{"type":48,"tag":249,"props":250,"children":251},"tr",{},[252,258],{"type":48,"tag":253,"props":254,"children":255},"th",{},[256],{"type":54,"value":257},"Tool",{"type":48,"tag":253,"props":259,"children":260},{},[261],{"type":54,"value":262},"Purpose",{"type":48,"tag":264,"props":265,"children":266},"tbody",{},[267,284,301,317,334,351,376],{"type":48,"tag":249,"props":268,"children":269},{},[270,279],{"type":48,"tag":271,"props":272,"children":273},"td",{},[274],{"type":48,"tag":68,"props":275,"children":277},{"className":276},[],[278],{"type":54,"value":115},{"type":48,"tag":271,"props":280,"children":281},{},[282],{"type":54,"value":283},"Freeze all ECS system updates. Render loop continues — screenshots still work.",{"type":48,"tag":249,"props":285,"children":286},{},[287,296],{"type":48,"tag":271,"props":288,"children":289},{},[290],{"type":48,"tag":68,"props":291,"children":293},{"className":292},[],[294],{"type":54,"value":295},"ecs_step({\"count\":N,\"delta\":SECONDS})",{"type":48,"tag":271,"props":297,"children":298},{},[299],{"type":54,"value":300},"Advance N frames with fixed timestep (seconds). Must pause first.",{"type":48,"tag":249,"props":302,"children":303},{},[304,312],{"type":48,"tag":271,"props":305,"children":306},{},[307],{"type":48,"tag":68,"props":308,"children":310},{"className":309},[],[311],{"type":54,"value":219},{"type":48,"tag":271,"props":313,"children":314},{},[315],{"type":54,"value":316},"Resume normal execution. First frame uses capped delta to avoid physics explosions.",{"type":48,"tag":249,"props":318,"children":319},{},[320,329],{"type":48,"tag":271,"props":321,"children":322},{},[323],{"type":48,"tag":68,"props":324,"children":326},{"className":325},[],[327],{"type":54,"value":328},"ecs_snapshot({\"label\":\"...\"})",{"type":48,"tag":271,"props":330,"children":331},{},[332],{"type":54,"value":333},"Capture full ECS state. Stores up to 2 snapshots.",{"type":48,"tag":249,"props":335,"children":336},{},[337,346],{"type":48,"tag":271,"props":338,"children":339},{},[340],{"type":48,"tag":68,"props":341,"children":343},{"className":342},[],[344],{"type":54,"value":345},"ecs_diff({\"from\":\"...\",\"to\":\"...\"})",{"type":48,"tag":271,"props":347,"children":348},{},[349],{"type":54,"value":350},"Compare two snapshots. Shows added\u002Fremoved entities and field-level value changes.",{"type":48,"tag":249,"props":352,"children":353},{},[354,363],{"type":48,"tag":271,"props":355,"children":356},{},[357],{"type":48,"tag":68,"props":358,"children":360},{"className":359},[],[361],{"type":54,"value":362},"ecs_toggle_system({\"name\":\"...\",\"paused\":true})",{"type":48,"tag":271,"props":364,"children":365},{},[366,368,374],{"type":54,"value":367},"Pause\u002Fresume a single system. Use ",{"type":48,"tag":68,"props":369,"children":371},{"className":370},[],[372],{"type":54,"value":373},"ecs_list_systems",{"type":54,"value":375}," to discover names.",{"type":48,"tag":249,"props":377,"children":378},{},[379,387],{"type":48,"tag":271,"props":380,"children":381},{},[382],{"type":48,"tag":68,"props":383,"children":385},{"className":384},[],[386],{"type":54,"value":167},{"type":48,"tag":271,"props":388,"children":389},{},[390],{"type":54,"value":391},"Visual verification — works while paused since the render loop continues.",{"type":48,"tag":77,"props":393,"children":395},{"id":394},"stepping-guidelines",[396],{"type":54,"value":397},"Stepping Guidelines",{"type":48,"tag":399,"props":400,"children":401},"ul",{},[402,432,442],{"type":48,"tag":93,"props":403,"children":404},{},[405,414,416,422,424,430],{"type":48,"tag":97,"props":406,"children":407},{},[408],{"type":48,"tag":68,"props":409,"children":411},{"className":410},[],[412],{"type":54,"value":413},"delta",{"type":54,"value":415}," is in seconds. Common values: ",{"type":48,"tag":68,"props":417,"children":419},{"className":418},[],[420],{"type":54,"value":421},"0.016",{"type":54,"value":423}," (60fps), ",{"type":48,"tag":68,"props":425,"children":427},{"className":426},[],[428],{"type":54,"value":429},"0.0139",{"type":54,"value":431}," (72fps\u002FQuest refresh rate).",{"type":48,"tag":93,"props":433,"children":434},{},[435,440],{"type":48,"tag":97,"props":436,"children":437},{},[438],{"type":54,"value":439},"Start small",{"type":54,"value":441}," — step 1-3 frames first to catch the initial moment, then step more.",{"type":48,"tag":93,"props":443,"children":444},{},[445,450],{"type":48,"tag":97,"props":446,"children":447},{},[448],{"type":54,"value":449},"Don't overshoot",{"type":54,"value":451}," — stepping 100 frames at once defeats the purpose. Step in batches of 5-20.",{"type":48,"tag":77,"props":453,"children":455},{"id":454},"patterns",[456],{"type":54,"value":457},"Patterns",{"type":48,"tag":57,"props":459,"children":460},{},[461],{"type":54,"value":462},"Short domain-specific tips. Apply the core workflow above, plus these hints.",{"type":48,"tag":464,"props":465,"children":467},"h3",{"id":466},"physics-falling-bouncing-collisions",[468],{"type":54,"value":469},"Physics (falling, bouncing, collisions)",{"type":48,"tag":399,"props":471,"children":472},{},[473,478,491,512,525,546],{"type":48,"tag":93,"props":474,"children":475},{},[476],{"type":54,"value":477},"Pause BEFORE releasing the object or applying force.",{"type":48,"tag":93,"props":479,"children":480},{},[481,483,489],{"type":54,"value":482},"Step 1-3 frames at ",{"type":48,"tag":68,"props":484,"children":486},{"className":485},[],[487],{"type":54,"value":488},"delta: 0.016",{"type":54,"value":490}," to catch initial acceleration.",{"type":48,"tag":93,"props":492,"children":493},{},[494,496,502,504,510],{"type":54,"value":495},"In diffs, check ",{"type":48,"tag":68,"props":497,"children":499},{"className":498},[],[500],{"type":54,"value":501},"PhysicsBody._linearVelocity",{"type":54,"value":503}," and ",{"type":48,"tag":68,"props":505,"children":507},{"className":506},[],[508],{"type":54,"value":509},"PhysicsBody._angularVelocity",{"type":54,"value":511}," to see motion direction and speed.",{"type":48,"tag":93,"props":513,"children":514},{},[515,517,523],{"type":54,"value":516},"Check ",{"type":48,"tag":68,"props":518,"children":520},{"className":519},[],[521],{"type":54,"value":522},"Transform.position",{"type":54,"value":524}," to track movement.",{"type":48,"tag":93,"props":526,"children":527},{},[528,530,536,538,544],{"type":54,"value":529},"If an object falls through a surface: verify the surface entity has both ",{"type":48,"tag":68,"props":531,"children":533},{"className":532},[],[534],{"type":54,"value":535},"PhysicsBody",{"type":54,"value":537}," (Static) and ",{"type":48,"tag":68,"props":539,"children":541},{"className":540},[],[542],{"type":54,"value":543},"PhysicsShape",{"type":54,"value":545}," (TriMesh for complex geometry).",{"type":48,"tag":93,"props":547,"children":548},{},[549,551,557,559,564,565,570],{"type":54,"value":550},"Use ",{"type":48,"tag":68,"props":552,"children":554},{"className":553},[],[555],{"type":54,"value":556},"ecs_query_entity",{"type":54,"value":558}," to inspect ",{"type":48,"tag":68,"props":560,"children":562},{"className":561},[],[563],{"type":54,"value":543},{"type":54,"value":503},{"type":48,"tag":68,"props":566,"children":568},{"className":567},[],[569],{"type":54,"value":535},{"type":54,"value":571}," on both the falling object and the surface.",{"type":48,"tag":464,"props":573,"children":575},{"id":574},"grab-and-throw",[576],{"type":54,"value":577},"Grab and Throw",{"type":48,"tag":399,"props":579,"children":580},{},[581,586,591,596,608],{"type":48,"tag":93,"props":582,"children":583},{},[584],{"type":54,"value":585},"Pause while the object is still held (trigger\u002Fgrip engaged).",{"type":48,"tag":93,"props":587,"children":588},{},[589],{"type":54,"value":590},"Release the input (set button value to 0) while paused.",{"type":48,"tag":93,"props":592,"children":593},{},[594],{"type":54,"value":595},"Step frame by frame to observe the release velocity.",{"type":48,"tag":93,"props":597,"children":598},{},[599,601,606],{"type":54,"value":600},"In diffs, ",{"type":48,"tag":68,"props":602,"children":604},{"className":603},[],[605],{"type":54,"value":501},{"type":54,"value":607}," shows the throw direction and speed.",{"type":48,"tag":93,"props":609,"children":610},{},[611,613,618,620,626],{"type":54,"value":612},"If the object doesn't move after release: check that it has ",{"type":48,"tag":68,"props":614,"children":616},{"className":615},[],[617],{"type":54,"value":535},{"type":54,"value":619}," with ",{"type":48,"tag":68,"props":621,"children":623},{"className":622},[],[624],{"type":54,"value":625},"state: Dynamic",{"type":54,"value":75},{"type":48,"tag":464,"props":628,"children":630},{"id":629},"animations-and-transitions",[631],{"type":54,"value":632},"Animations and Transitions",{"type":48,"tag":399,"props":634,"children":635},{},[636,648,676],{"type":48,"tag":93,"props":637,"children":638},{},[639,641,646],{"type":54,"value":640},"Step 1 frame at a time with ",{"type":48,"tag":68,"props":642,"children":644},{"className":643},[],[645],{"type":54,"value":413},{"type":54,"value":647}," matching your target framerate.",{"type":48,"tag":93,"props":649,"children":650},{},[651,653,658,660,666,668,674],{"type":54,"value":652},"Compare ",{"type":48,"tag":68,"props":654,"children":656},{"className":655},[],[657],{"type":54,"value":522},{"type":54,"value":659},", ",{"type":48,"tag":68,"props":661,"children":663},{"className":662},[],[664],{"type":54,"value":665},"Transform.orientation",{"type":54,"value":667},", and ",{"type":48,"tag":68,"props":669,"children":671},{"className":670},[],[672],{"type":54,"value":673},"Transform.scale",{"type":54,"value":675}," across snapshots to track interpolation.",{"type":48,"tag":93,"props":677,"children":678},{},[679],{"type":54,"value":680},"Use screenshots between steps to observe visual progression.",{"type":48,"tag":464,"props":682,"children":684},{"id":683},"collision-detection",[685],{"type":54,"value":686},"Collision Detection",{"type":48,"tag":399,"props":688,"children":689},{},[690,695,700,712,723],{"type":48,"tag":93,"props":691,"children":692},{},[693],{"type":54,"value":694},"Pause just before two objects meet.",{"type":48,"tag":93,"props":696,"children":697},{},[698],{"type":54,"value":699},"Step 1 frame at a time.",{"type":48,"tag":93,"props":701,"children":702},{},[703,705,710],{"type":54,"value":704},"Watch for ",{"type":48,"tag":68,"props":706,"children":708},{"className":707},[],[709],{"type":54,"value":501},{"type":54,"value":711}," sign changes (indicates bounce\u002Fimpact).",{"type":48,"tag":93,"props":713,"children":714},{},[715,716,721],{"type":54,"value":704},{"type":48,"tag":68,"props":717,"children":719},{"className":718},[],[720],{"type":54,"value":509},{"type":54,"value":722}," spikes (indicates tumbling from impact).",{"type":48,"tag":93,"props":724,"children":725},{},[726,728,733,735,741],{"type":54,"value":727},"If objects pass through each other: check ",{"type":48,"tag":68,"props":729,"children":731},{"className":730},[],[732],{"type":54,"value":543},{"type":54,"value":734}," exists on both entities, and verify shape types are appropriate (use ",{"type":48,"tag":68,"props":736,"children":738},{"className":737},[],[739],{"type":54,"value":740},"TriMesh",{"type":54,"value":742}," for complex static geometry).",{"type":48,"tag":464,"props":744,"children":746},{"id":745},"system-isolation",[747],{"type":54,"value":748},"System Isolation",{"type":48,"tag":399,"props":750,"children":751},{},[752,763,775,780],{"type":48,"tag":93,"props":753,"children":754},{},[755,756,761],{"type":54,"value":550},{"type":48,"tag":68,"props":757,"children":759},{"className":758},[],[760],{"type":54,"value":373},{"type":54,"value":762}," to see all systems and their priorities.",{"type":48,"tag":93,"props":764,"children":765},{},[766,767,773],{"type":54,"value":550},{"type":48,"tag":68,"props":768,"children":770},{"className":769},[],[771],{"type":54,"value":772},"ecs_toggle_system({ \"name\": \"SystemName\", \"paused\": true })",{"type":54,"value":774}," to pause a suspect system while others run.",{"type":48,"tag":93,"props":776,"children":777},{},[778],{"type":54,"value":779},"Step forward and observe — if the bug disappears, that system is the cause.",{"type":48,"tag":93,"props":781,"children":782},{},[783],{"type":54,"value":784},"Remember to unpause the system when done.",{"type":48,"tag":77,"props":786,"children":788},{"id":787},"notes",[789],{"type":54,"value":790},"Notes",{"type":48,"tag":399,"props":792,"children":793},{},[794,804,814,824],{"type":48,"tag":93,"props":795,"children":796},{},[797,802],{"type":48,"tag":97,"props":798,"children":799},{},[800],{"type":54,"value":801},"Snapshots overwrite",{"type":54,"value":803}," — only 2 are stored. Label them clearly (\"before\"\u002F\"after\") and diff before taking new ones.",{"type":48,"tag":93,"props":805,"children":806},{},[807,812],{"type":48,"tag":97,"props":808,"children":809},{},[810],{"type":54,"value":811},"Resume is safe",{"type":54,"value":813}," — the first frame after resume uses a capped delta to prevent physics explosions from accumulated time.",{"type":48,"tag":93,"props":815,"children":816},{},[817,822],{"type":48,"tag":97,"props":818,"children":819},{},[820],{"type":54,"value":821},"Render loop continues while paused",{"type":54,"value":823}," — screenshots always work, and the XR session stays alive.",{"type":48,"tag":93,"props":825,"children":826},{},[827,832,834,840,842,847],{"type":48,"tag":97,"props":828,"children":829},{},[830],{"type":54,"value":831},"Stepping requires pause",{"type":54,"value":833}," — ",{"type":48,"tag":68,"props":835,"children":837},{"className":836},[],[838],{"type":54,"value":839},"ecs_step",{"type":54,"value":841}," will fail if you haven't called ",{"type":48,"tag":68,"props":843,"children":845},{"className":844},[],[846],{"type":54,"value":115},{"type":54,"value":848}," first.",{"items":850,"total":1038},[851,875,889,910,931,948,957,975,988,1003,1015,1025],{"slug":852,"name":852,"fn":853,"description":854,"org":855,"tags":856,"stars":872,"repoUrl":873,"updatedAt":874},"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},[857,860,863,866,869],{"name":858,"slug":859,"type":16},"Engineering","engineering",{"name":861,"slug":862,"type":16},"Frontend","frontend",{"name":864,"slug":865,"type":16},"GraphQL","graphql",{"name":867,"slug":868,"type":16},"React","react",{"name":870,"slug":871,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":876,"name":876,"fn":877,"description":878,"org":879,"tags":880,"stars":872,"repoUrl":873,"updatedAt":888},"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},[881,882,883,886,887],{"name":861,"slug":862,"type":16},{"name":864,"slug":865,"type":16},{"name":884,"slug":885,"type":16},"Performance","performance",{"name":867,"slug":868,"type":16},{"name":870,"slug":871,"type":16},"2026-06-10T07:30:28.726513",{"slug":890,"name":890,"fn":891,"description":892,"org":893,"tags":894,"stars":907,"repoUrl":908,"updatedAt":909},"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},[895,898,901,904],{"name":896,"slug":897,"type":16},"Data Modeling","data-modeling",{"name":899,"slug":900,"type":16},"Deep Learning","deep-learning",{"name":902,"slug":903,"type":16},"Python","python",{"name":905,"slug":906,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":911,"name":911,"fn":912,"description":913,"org":914,"tags":915,"stars":928,"repoUrl":929,"updatedAt":930},"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},[916,919,922,925],{"name":917,"slug":918,"type":16},"Camera","camera",{"name":920,"slug":921,"type":16},"Hardware","hardware",{"name":923,"slug":924,"type":16},"iOS","ios",{"name":926,"slug":927,"type":16},"Video","video",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-05-15T06:14:43.555881",{"slug":932,"name":932,"fn":933,"description":934,"org":935,"tags":936,"stars":928,"repoUrl":929,"updatedAt":947},"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},[937,938,941,944],{"name":923,"slug":924,"type":16},{"name":939,"slug":940,"type":16},"Mobile","mobile",{"name":942,"slug":943,"type":16},"SDK","sdk",{"name":945,"slug":946,"type":16},"Swift","swift","2026-05-15T06:14:42.334435",{"slug":28,"name":28,"fn":949,"description":950,"org":951,"tags":952,"stars":928,"repoUrl":929,"updatedAt":956},"debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[953,954,955],{"name":27,"slug":28,"type":16},{"name":858,"slug":859,"type":16},{"name":923,"slug":924,"type":16},"2026-05-15T06:14:38.626606",{"slug":958,"name":958,"fn":959,"description":960,"org":961,"tags":962,"stars":928,"repoUrl":929,"updatedAt":974},"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},[963,966,969,970,973],{"name":964,"slug":965,"type":16},"Design","design",{"name":967,"slug":968,"type":16},"Images","images",{"name":18,"slug":19,"type":16},{"name":971,"slug":972,"type":16},"UI Components","ui-components",{"name":926,"slug":927,"type":16},"2026-05-15T06:14:39.844502",{"slug":976,"name":976,"fn":977,"description":978,"org":979,"tags":980,"stars":928,"repoUrl":929,"updatedAt":987},"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},[981,984,985,986],{"name":982,"slug":983,"type":16},"Configuration","configuration",{"name":923,"slug":924,"type":16},{"name":942,"slug":943,"type":16},{"name":945,"slug":946,"type":16},"2026-05-15T06:14:41.086639",{"slug":989,"name":989,"fn":990,"description":991,"org":992,"tags":993,"stars":928,"repoUrl":929,"updatedAt":1002},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[994,995,996,999],{"name":923,"slug":924,"type":16},{"name":939,"slug":940,"type":16},{"name":997,"slug":998,"type":16},"QA","qa",{"name":1000,"slug":1001,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":1004,"name":1004,"fn":1005,"description":1006,"org":1007,"tags":1008,"stars":928,"repoUrl":929,"updatedAt":1014},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1009,1010,1011],{"name":917,"slug":918,"type":16},{"name":923,"slug":924,"type":16},{"name":1012,"slug":1013,"type":16},"Permissions","permissions","2026-05-15T06:14:46.030253",{"slug":1016,"name":1016,"fn":1017,"description":1018,"org":1019,"tags":1020,"stars":928,"repoUrl":929,"updatedAt":1024},"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},[1021,1022,1023],{"name":917,"slug":918,"type":16},{"name":923,"slug":924,"type":16},{"name":939,"slug":940,"type":16},"2026-05-15T06:14:36.185947",{"slug":1026,"name":1026,"fn":1027,"description":1028,"org":1029,"tags":1030,"stars":928,"repoUrl":929,"updatedAt":1037},"session-lifecycle","monitor device session lifecycle states","Device session states, pause\u002Fresume, availability monitoring",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1031,1032,1033,1036],{"name":923,"slug":924,"type":16},{"name":939,"slug":940,"type":16},{"name":1034,"slug":1035,"type":16},"Monitoring","monitoring",{"name":884,"slug":885,"type":16},"2026-05-15T06:14:44.790925",27,{"items":1040,"total":1130},[1041,1049,1064,1076,1090,1106,1118],{"slug":4,"name":4,"fn":5,"description":6,"org":1042,"tags":1043,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1044,1045,1046,1047,1048],{"name":27,"slug":28,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"slug":1050,"name":1050,"fn":1051,"description":1052,"org":1053,"tags":1054,"stars":29,"repoUrl":30,"updatedAt":1063},"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},[1055,1058,1059,1062],{"name":1056,"slug":1057,"type":16},"AR","ar",{"name":14,"slug":15,"type":16},{"name":1060,"slug":1061,"type":16},"VR","vr",{"name":24,"slug":25,"type":16},"2026-07-21T05:39:07.241041",{"slug":1065,"name":1065,"fn":1066,"description":1067,"org":1068,"tags":1069,"stars":29,"repoUrl":30,"updatedAt":1075},"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},[1070,1071,1072,1073,1074],{"name":1056,"slug":1057,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1060,"slug":1061,"type":16},{"name":24,"slug":25,"type":16},"2026-07-24T05:40:20.809536",{"slug":1077,"name":1077,"fn":1078,"description":1079,"org":1080,"tags":1081,"stars":29,"repoUrl":30,"updatedAt":1089},"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},[1082,1083,1084,1085,1088],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":1086,"slug":1087,"type":16},"Physics","physics",{"name":24,"slug":25,"type":16},"2026-07-24T05:40:22.854101",{"slug":1091,"name":1091,"fn":1092,"description":1093,"org":1094,"tags":1095,"stars":29,"repoUrl":30,"updatedAt":1105},"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},[1096,1099,1100,1101,1104],{"name":1097,"slug":1098,"type":16},"Architecture","architecture",{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":1102,"slug":1103,"type":16},"Strategy","strategy",{"name":24,"slug":25,"type":16},"2026-07-24T05:40:21.856049",{"slug":1107,"name":1107,"fn":1108,"description":1109,"org":1110,"tags":1111,"stars":29,"repoUrl":30,"updatedAt":1117},"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},[1112,1113,1114,1115,1116],{"name":1056,"slug":1057,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1060,"slug":1061,"type":16},{"name":24,"slug":25,"type":16},"2026-07-24T05:40:19.841604",{"slug":1119,"name":1119,"fn":1120,"description":1121,"org":1122,"tags":1123,"stars":29,"repoUrl":30,"updatedAt":1129},"iwsdk-ui","develop IWSDK PanelUI components","Develop and iterate on IWSDK PanelUI components. Use when the user wants to create, modify, debug, or improve UI panels in their IWSDK application. Covers UIKITML editing, full-screen preview with ScreenSpace, and visual verification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1124,1125,1126,1127,1128],{"name":861,"slug":862,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":971,"slug":972,"type":16},{"name":24,"slug":25,"type":16},"2026-04-06T18:11:34.083706",7]