[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GV874R2TYQCN2WP2Y80CVC":3,"skill-same:01M6GV874R2TYQCN2WP2Y80CVC":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6GV874R2TYQCN2WP2Y80CVC","game-execution",null,"Task implementation workflow, test harnesses, screenshot\u002Fvideo capture, visual debugging. Load before implementing game tasks.","dragoscirjan\u002Fopencode-config","dragoscirjan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F950596?v=4","01M6GV509X835Z595VVKDX1HFY","Dragos Cirjan","01M6GV50XSMSSD7W2M2KJXTQN6",1,"MIT","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fgame-execution\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"execution","game","game execution","workflow","test","debugging","tasks","screenshot","Video","capture","implementation workflow","implementation","task","visual","harnesses","load","2026-11-10 10:12:30",false,"---\nname: game-execution\ndescription: Task implementation workflow, test harnesses, screenshot\u002Fvideo capture, visual debugging. Load before implementing game tasks.\n---\n\n# Game Execution — Implementation, Testing & Capture\n\n## Phases\n\n### Risk Tasks (if game plan has any)\n\nImplement each risk feature in isolation before the main build:\n\n1. Set up minimal environment — only the nodes needed to exercise the risk\n2. Run the implementation loop until the risk task's **Verify** criteria pass\n3. Commit\n\n### Main Build\n\nImplement everything in the game plan's **Main Build**:\n\n1. Generate scenes first, then scripts (scenes create nodes that scripts attach to)\n2. Run the implementation loop until verification criteria pass\n3. Run final verification including presentation video\n4. Commit\n\n---\n\n## Implementation Loop\n\n1. **Import assets** — `timeout 60 godot --headless --import` (generates `.import` files — without this, `load()` fails). Re-run after modifying assets.\n2. **Generate scenes** — write scene builder scripts, compile to `.tscn`\n3. **Generate scripts** — write `.gd` files\n4. **Pre-validate** — `timeout 30 godot --headless --check-only -s \u003Cpath>` for each new\u002Fmodified `.gd`\n5. **Validate project** — `timeout 60 godot --headless --quit 2>&1`\n6. **Fix errors** — if validation fails, fix and re-validate\n7. **Capture** — write test harness, run with `--write-movie`, produce screenshots\n8. **Verify** — check captures against verification criteria + `reference.png` consistency. Check stdout for `ASSERT FAIL`.\n9. **Visual QA** — delegate to Heimdall (visual-qa subagent) when applicable\n10. If verification fails → fix and repeat from step 2\n\n> **MCP alternative (when `godot_editor` is enabled — see `mcp-tools-godot` skill):** For step 5, use `run_project` + `get_debug_output` instead of `godot --headless --quit` for interactive validation with richer console output. Use `stop_project` to terminate. For pre-validation (step 4), use `get_diagnostics` from `godot_diagnostics` for LSP-level checks. Steps 1 and 7 have no MCP equivalent — always use bash for asset import and `--write-movie` capture.\n\nAfter each phase: update the game plan spec status, write discoveries to knowledge graph (`memory` tools), git commit.\n\n### Iteration Tracking\n\nThere is no fixed iteration limit — use judgment:\n\n- If there is progress (even small iterative steps) — keep going\n- If you recognize a **fundamental limitation** (wrong architecture, missing engine feature) — stop early, even after 2-5 iterations\n- Stop signal: \"making the same kind of fix repeatedly without convergence\"\n\n---\n\n## Commands\n\n```bash\n# Import new\u002Fmodified assets (MUST run before scene builders):\ntimeout 60 godot --headless --import\n\n# Compile a scene builder (produces .tscn):\ntimeout 60 godot --headless --script \u003Cpath_to_builder.gd>\n\n# Pre-validate a single script:\ntimeout 30 godot --headless --check-only -s \u003Cpath_to_script.gd>\n\n# Validate all project scripts:\ntimeout 60 godot --headless --quit 2>&1\n```\n\n**Common errors:**\n\n- `Parser Error` — syntax error, fix the line indicated\n- `Invalid call` \u002F `method not found` — wrong node type or API, delegate to Mimir for class lookup\n- `Cannot infer type` — `:=` used with `instantiate()` or polymorphic math functions\n- Script hangs — missing `quit()` in scene builder\n\n---\n\n## Test Harnesses\n\nWrite `test\u002Ftest_{task_id}.gd` — a SceneTree script that loads the scene under test and verifies the task's goal. Do NOT call `quit()` — the movie writer handles exit.\n\n### Contract\n\n```gdscript\nextends SceneTree\n\nfunc _initialize() -> void:\n    # Setup: load scene, position camera, configure test\n    var scene: PackedScene = load(\"res:\u002F\u002Fscenes\u002Fmain.tscn\")\n    var root_scene = scene.instantiate()\n    root.add_child(root_scene)\n\n    # Camera must be activated explicitly\n    var cam := Camera3D.new()\n    cam.position = Vector3(0, 5, 10)\n    cam.current = true\n    root.add_child(cam)\n\nfunc _process(delta: float) -> bool:\n    # Return false to keep running\n    return false\n```\n\n### Console Assertions\n\nUse `print(\"ASSERT PASS\u002FFAIL: ...\")` for behavioral properties hard to judge visually (positions, velocities, state changes). After capture, check stdout for `ASSERT FAIL` lines.\n\n### Simulated Input\n\n```gdscript\nvar timer := Timer.new()\ntimer.wait_time = 1.0\ntimer.one_shot = true\ntimer.timeout.connect(func(): Input.action_press(\"move_forward\"))\nroot.add_child(timer)\ntimer.start()\n```\n\n### Sustained Movement (Presentations)\n\nOpen-loop input (timed press\u002Frelease) doesn't work for 30-second videos — per-frame errors compound. Use **closed-loop waypoint steering** based on actual position each frame.\n\n---\n\n## Capture\n\n### Setup (Cross-Platform)\n\nDetects platform, timeout command, GPU availability. Defines `run_godot` wrapper for all platform differences.\n\n```bash\nPLATFORM=$(uname -s)\n\n# Timeout command\nif command -v timeout &>\u002Fdev\u002Fnull; then\n    TIMEOUT_CMD=\"timeout\"\nelif command -v gtimeout &>\u002Fdev\u002Fnull; then\n    TIMEOUT_CMD=\"gtimeout\"\nelse\n    timeout_fallback() { perl -e 'alarm shift; exec @ARGV' \"$@\"; }\n    TIMEOUT_CMD=\"timeout_fallback\"\nfi\n\n# Platform-specific Godot launcher\nGPU_AVAILABLE=false\nif [[ \"$PLATFORM\" == \"Darwin\" ]]; then\n    GPU_AVAILABLE=true\n    run_godot() { godot --rendering-method forward_plus \"$@\" 2>&1; }\nelif [[ \"$PLATFORM\" == \"MINGW\"* ]] || [[ \"$PLATFORM\" == \"MSYS\"* ]] || [[ \"$PLATFORM\" == \"CYGWIN\"* ]]; then\n    # Windows — assume GPU available\n    GPU_AVAILABLE=true\n    run_godot() { godot --rendering-method forward_plus \"$@\" 2>&1; }\nelse\n    # Linux — probe for GPU display\n    for sock in \u002Ftmp\u002F.X11-unix\u002FX*; do\n        d=\":${sock##*\u002FX}\"\n        if DISPLAY=$d $TIMEOUT_CMD 2 glxinfo 2>\u002Fdev\u002Fnull | grep -qi nvidia; then\n            GPU_AVAILABLE=true\n            eval \"run_godot() { DISPLAY=$d godot --rendering-method forward_plus \\\"\\$@\\\" 2>&1; }\"\n            break\n        fi\n    done\n    if ! $GPU_AVAILABLE; then\n        run_godot() { xvfb-run -a -s '-screen 0 1280x720x24' godot --rendering-driver vulkan \"$@\" 2>&1; }\n    fi\nfi\n```\n\nWhen `GPU_AVAILABLE` is true — real shadows, SSR, SSAO, glow, volumetric fog. Without GPU — software rasterizer via lavapipe.\n\n### Screenshot Capture\n\n```bash\nMOVIE=screenshots\u002F{task_folder}\nrm -rf \"$MOVIE\" && mkdir -p \"$MOVIE\"\ntouch screenshots\u002F.gdignore\n$TIMEOUT_CMD 30 run_godot \\\n    --write-movie \"$MOVIE\"\u002Fframe.png \\\n    --fixed-fps 10 --quit-after {N} \\\n    --script test\u002Ftest_task.gd\n```\n\n**Frame rate and duration:**\n\n- **Static scenes** (decoration, terrain, UI): `--fixed-fps 1`. Adjust `--quit-after` for number of views.\n- **Dynamic scenes** (physics, movement): `--fixed-fps 10`. Low FPS breaks physics (delta too large → tunneling). Typical: 3-10s (30-100 frames).\n\n### Video Capture\n\nRequires hardware rendering. Skip if `GPU_AVAILABLE` is false.\n\n```bash\nif $GPU_AVAILABLE; then\n    VIDEO=screenshots\u002Fpresentation\n    rm -rf \"$VIDEO\" && mkdir -p \"$VIDEO\"\n    touch screenshots\u002F.gdignore\n    $TIMEOUT_CMD 60 run_godot \\\n        --write-movie \"$VIDEO\"\u002Foutput.avi \\\n        --fixed-fps 30 --quit-after 900 \\\n        --script test\u002Fpresentation.gd\n    # Convert AVI (MJPEG) to MP4 (H.264)\n    ffmpeg -i \"$VIDEO\"\u002Foutput.avi \\\n        -c:v libx264 -pix_fmt yuv420p -crf 28 -preset slow \\\n        -vf \"scale='min(1280,iw)':-2\" \\\n        -movflags +faststart \\\n        \"$VIDEO\"\u002Fgameplay.mp4 2>&1\nelse\n    echo \"No GPU available — skipping video capture\"\nfi\n```\n\nCRF 28 + `-preset slow` targets ~2-5MB for 30s at 720p. `-movflags +faststart` enables streaming preview.\n\n---\n\n## Visual Debugging\n\n### Isolate and Capture\n\nDo NOT debug in a complex scene — isolate the problem:\n\n1. **Minimal repro scene** — write `test\u002Fdebug_{issue}.gd` with only the relevant nodes. Strip everything else.\n2. **Targeted frames** — for animation\u002Fmotion issues, capture at `--fixed-fps 10` for 3-5 seconds. Single frames cannot show timing bugs.\n3. **Before\u002Fafter** — capture with and without the fix. Ask \"What changed between these two sets?\"\n\n### Animation Failures\n\nAnimations are the #1 source of silent failures — they \"work\" (no errors) but produce wrong results.\n\nCommon issues to probe (always capture multi-frame):\n\n- **Frozen pose** — \"Does the character's pose change between frames?\"\n- **Wrong animation** — \"Describe how limbs\u002Fbody move. Does it look like walking, idling, attacking?\"\n- **No blending** — \"Are there sudden pose jumps between consecutive frames?\"\n- **AnimationPlayer vs AnimationTree conflicts** — both controlling same skeleton\n- **Animation on wrong node** — targeting different skeleton path\n- **Bone\u002Ftrack mismatches** — animation made for different model\n\n### 3D Object Not Visible\n\nRun this checklist in order:\n\n1. **Exists?** — `print(node.name, \" at \", node.global_position)` in `_ready()`. No output = not in tree.\n2. **Debug marker** — emissive sphere (bright color, 0.5m) at object position. Visible = mesh\u002Fmaterial problem. Not visible = camera problem.\n3. **Camera direction** — `print(camera.global_position, camera.global_transform.basis.z)`. Force `camera.look_at(object.global_position)`.\n4. **Occlusion** — hide large geometry (`terrain.visible = false`).\n5. **Scale** — `print(node.scale)`. Too small (0.001) = sub-pixel. Too large = camera inside.\n6. **Material** — transparency alpha=0 = invisible. Set `albedo_color = Color.RED` temporarily.\n\n### Other Debug Scenarios\n\n- **Node visibility** — hidden by z-order, wrong layer, zero alpha, off-camera, wrong viewport\n- **Physics not working** — \"Do any objects move due to gravity or collision?\" (collision shapes likely missing)\n- **UI layout** — \"Are UI elements overlapping, cut off, or outside visible area?\"\n- **Shader\u002Fmaterial** — \"Are any surfaces showing magenta, checkerboard, or default grey?\"\n\n### Debug Scene Pattern\n\nIn `test\u002Fdebug_{issue}.gd`:\n\n1. Load only relevant nodes\n2. Frame the issue with positioned camera\n3. Add visible markers (colored boxes, labels) for position confirmation\n4. Run enough frames to capture behavior\n5. Feed to visual-qa question mode\n\n---\n\n## Project Memory\n\nRead the knowledge graph (`memory` tools) before starting work — it contains discoveries from previous tasks. After completing your task, write back:\n\n- What worked and what failed\n- Technical specifics later tasks will need\n- Workarounds discovered\n","# Game Execution — Implementation, Testing & Capture\n\n## Phases\n\n### Risk Tasks (if game plan has any)\n\nImplement each risk feature in isolation before the main build:\n\n1. Set up minimal environment — only the nodes needed to exercise the risk\n2. Run the implementation loop until the risk task's **Verify** criteria pass\n3. Commit\n\n### Main Build\n\nImplement everything in the game plan's **Main Build**:\n\n1. Generate scenes first, then scripts (scenes create nodes that scripts attach to)\n2. Run the implementation loop until verification criteria pass\n3. Run final verification including presentation video\n4. Commit\n\n---\n\n## Implementation Loop\n\n1. **Import assets** — `timeout 60 godot --headless --import` (generates `.import` files — without this, `load()` fails). Re-run after modifying assets.\n2. **Generate scenes** — write scene builder scripts, compile to `.tscn`\n3. **Generate scripts** — write `.gd` files\n4. **Pre-validate** — `timeout 30 godot --headless --check-only -s \u003Cpath>` for each new\u002Fmodified `.gd`\n5. **Validate project** — `timeout 60 godot --headless --quit 2>&1`\n6. **Fix errors** — if validation fails, fix and re-validate\n7. **Capture** — write test harness, run with `--write-movie`, produce screenshots\n8. **Verify** — check captures against verification criteria + `reference.png` consistency. Check stdout for `ASSERT FAIL`.\n9. **Visual QA** — delegate to Heimdall (visual-qa subagent) when applicable\n10. If verification fails → fix and repeat from step 2\n\n> **MCP alternative (when `godot_editor` is enabled — see `mcp-tools-godot` skill):** For step 5, use `run_project` + `get_debug_output` instead of `godot --headless --quit` for interactive validation with richer console output. Use `stop_project` to terminate. For pre-validation (step 4), use `get_diagnostics` from `godot_diagnostics` for LSP-level checks. Steps 1 and 7 have no MCP equivalent — always use bash for asset import and `--write-movie` capture.\n\nAfter each phase: update the game plan spec status, write discoveries to knowledge graph (`memory` tools), git commit.\n\n### Iteration Tracking\n\nThere is no fixed iteration limit — use judgment:\n\n- If there is progress (even small iterative steps) — keep going\n- If you recognize a **fundamental limitation** (wrong architecture, missing engine feature) — stop early, even after 2-5 iterations\n- Stop signal: \"making the same kind of fix repeatedly without convergence\"\n\n---\n\n## Commands\n\n```bash\n# Import new\u002Fmodified assets (MUST run before scene builders):\ntimeout 60 godot --headless --import\n\n# Compile a scene builder (produces .tscn):\ntimeout 60 godot --headless --script \u003Cpath_to_builder.gd>\n\n# Pre-validate a single script:\ntimeout 30 godot --headless --check-only -s \u003Cpath_to_script.gd>\n\n# Validate all project scripts:\ntimeout 60 godot --headless --quit 2>&1\n```\n\n**Common errors:**\n\n- `Parser Error` — syntax error, fix the line indicated\n- `Invalid call` \u002F `method not found` — wrong node type or API, delegate to Mimir for class lookup\n- `Cannot infer type` — `:=` used with `instantiate()` or polymorphic math functions\n- Script hangs — missing `quit()` in scene builder\n\n---\n\n## Test Harnesses\n\nWrite `test\u002Ftest_{task_id}.gd` — a SceneTree script that loads the scene under test and verifies the task's goal. Do NOT call `quit()` — the movie writer handles exit.\n\n### Contract\n\n```gdscript\nextends SceneTree\n\nfunc _initialize() -> void:\n    # Setup: load scene, position camera, configure test\n    var scene: PackedScene = load(\"res:\u002F\u002Fscenes\u002Fmain.tscn\")\n    var root_scene = scene.instantiate()\n    root.add_child(root_scene)\n\n    # Camera must be activated explicitly\n    var cam := Camera3D.new()\n    cam.position = Vector3(0, 5, 10)\n    cam.current = true\n    root.add_child(cam)\n\nfunc _process(delta: float) -> bool:\n    # Return false to keep running\n    return false\n```\n\n### Console Assertions\n\nUse `print(\"ASSERT PASS\u002FFAIL: ...\")` for behavioral properties hard to judge visually (positions, velocities, state changes). After capture, check stdout for `ASSERT FAIL` lines.\n\n### Simulated Input\n\n```gdscript\nvar timer := Timer.new()\ntimer.wait_time = 1.0\ntimer.one_shot = true\ntimer.timeout.connect(func(): Input.action_press(\"move_forward\"))\nroot.add_child(timer)\ntimer.start()\n```\n\n### Sustained Movement (Presentations)\n\nOpen-loop input (timed press\u002Frelease) doesn't work for 30-second videos — per-frame errors compound. Use **closed-loop waypoint steering** based on actual position each frame.\n\n---\n\n## Capture\n\n### Setup (Cross-Platform)\n\nDetects platform, timeout command, GPU availability. Defines `run_godot` wrapper for all platform differences.\n\n```bash\nPLATFORM=$(uname -s)\n\n# Timeout command\nif command -v timeout &>\u002Fdev\u002Fnull; then\n    TIMEOUT_CMD=\"timeout\"\nelif command -v gtimeout &>\u002Fdev\u002Fnull; then\n    TIMEOUT_CMD=\"gtimeout\"\nelse\n    timeout_fallback() { perl -e 'alarm shift; exec @ARGV' \"$@\"; }\n    TIMEOUT_CMD=\"timeout_fallback\"\nfi\n\n# Platform-specific Godot launcher\nGPU_AVAILABLE=false\nif [[ \"$PLATFORM\" == \"Darwin\" ]]; then\n    GPU_AVAILABLE=true\n    run_godot() { godot --rendering-method forward_plus \"$@\" 2>&1; }\nelif [[ \"$PLATFORM\" == \"MINGW\"* ]] || [[ \"$PLATFORM\" == \"MSYS\"* ]] || [[ \"$PLATFORM\" == \"CYGWIN\"* ]]; then\n    # Windows — assume GPU available\n    GPU_AVAILABLE=true\n    run_godot() { godot --rendering-method forward_plus \"$@\" 2>&1; }\nelse\n    # Linux — probe for GPU display\n    for sock in \u002Ftmp\u002F.X11-unix\u002FX*; do\n        d=\":${sock##*\u002FX}\"\n        if DISPLAY=$d $TIMEOUT_CMD 2 glxinfo 2>\u002Fdev\u002Fnull | grep -qi nvidia; then\n            GPU_AVAILABLE=true\n            eval \"run_godot() { DISPLAY=$d godot --rendering-method forward_plus \\\"\\$@\\\" 2>&1; }\"\n            break\n        fi\n    done\n    if ! $GPU_AVAILABLE; then\n        run_godot() { xvfb-run -a -s '-screen 0 1280x720x24' godot --rendering-driver vulkan \"$@\" 2>&1; }\n    fi\nfi\n```\n\nWhen `GPU_AVAILABLE` is true — real shadows, SSR, SSAO, glow, volumetric fog. Without GPU — software rasterizer via lavapipe.\n\n### Screenshot Capture\n\n```bash\nMOVIE=screenshots\u002F{task_folder}\nrm -rf \"$MOVIE\" && mkdir -p \"$MOVIE\"\ntouch screenshots\u002F.gdignore\n$TIMEOUT_CMD 30 run_godot \\\n    --write-movie \"$MOVIE\"\u002Fframe.png \\\n    --fixed-fps 10 --quit-after {N} \\\n    --script test\u002Ftest_task.gd\n```\n\n**Frame rate and duration:**\n\n- **Static scenes** (decoration, terrain, UI): `--fixed-fps 1`. Adjust `--quit-after` for number of views.\n- **Dynamic scenes** (physics, movement): `--fixed-fps 10`. Low FPS breaks physics (delta too large → tunneling). Typical: 3-10s (30-100 frames).\n\n### Video Capture\n\nRequires hardware rendering. Skip if `GPU_AVAILABLE` is false.\n\n```bash\nif $GPU_AVAILABLE; then\n    VIDEO=screenshots\u002Fpresentation\n    rm -rf \"$VIDEO\" && mkdir -p \"$VIDEO\"\n    touch screenshots\u002F.gdignore\n    $TIMEOUT_CMD 60 run_godot \\\n        --write-movie \"$VIDEO\"\u002Foutput.avi \\\n        --fixed-fps 30 --quit-after 900 \\\n        --script test\u002Fpresentation.gd\n    # Convert AVI (MJPEG) to MP4 (H.264)\n    ffmpeg -i \"$VIDEO\"\u002Foutput.avi \\\n        -c:v libx264 -pix_fmt yuv420p -crf 28 -preset slow \\\n        -vf \"scale='min(1280,iw)':-2\" \\\n        -movflags +faststart \\\n        \"$VIDEO\"\u002Fgameplay.mp4 2>&1\nelse\n    echo \"No GPU available — skipping video capture\"\nfi\n```\n\nCRF 28 + `-preset slow` targets ~2-5MB for 30s at 720p. `-movflags +faststart` enables streaming preview.\n\n---\n\n## Visual Debugging\n\n### Isolate and Capture\n\nDo NOT debug in a complex scene — isolate the problem:\n\n1. **Minimal repro scene** — write `test\u002Fdebug_{issue}.gd` with only the relevant nodes. Strip everything else.\n2. **Targeted frames** — for animation\u002Fmotion issues, capture at `--fixed-fps 10` for 3-5 seconds. Single frames cannot show timing bugs.\n3. **Before\u002Fafter** — capture with and without the fix. Ask \"What changed between these two sets?\"\n\n### Animation Failures\n\nAnimations are the #1 source of silent failures — they \"work\" (no errors) but produce wrong results.\n\nCommon issues to probe (always capture multi-frame):\n\n- **Frozen pose** — \"Does the character's pose change between frames?\"\n- **Wrong animation** — \"Describe how limbs\u002Fbody move. Does it look like walking, idling, attacking?\"\n- **No blending** — \"Are there sudden pose jumps between consecutive frames?\"\n- **AnimationPlayer vs AnimationTree conflicts** — both controlling same skeleton\n- **Animation on wrong node** — targeting different skeleton path\n- **Bone\u002Ftrack mismatches** — animation made for different model\n\n### 3D Object Not Visible\n\nRun this checklist in order:\n\n1. **Exists?** — `print(node.name, \" at \", node.global_position)` in `_ready()`. No output = not in tree.\n2. **Debug marker** — emissive sphere (bright color, 0.5m) at object position. Visible = mesh\u002Fmaterial problem. Not visible = camera problem.\n3. **Camera direction** — `print(camera.global_position, camera.global_transform.basis.z)`. Force `camera.look_at(object.global_position)`.\n4. **Occlusion** — hide large geometry (`terrain.visible = false`).\n5. **Scale** — `print(node.scale)`. Too small (0.001) = sub-pixel. Too large = camera inside.\n6. **Material** — transparency alpha=0 = invisible. Set `albedo_color = Color.RED` temporarily.\n\n### Other Debug Scenarios\n\n- **Node visibility** — hidden by z-order, wrong layer, zero alpha, off-camera, wrong viewport\n- **Physics not working** — \"Do any objects move due to gravity or collision?\" (collision shapes likely missing)\n- **UI layout** — \"Are UI elements overlapping, cut off, or outside visible area?\"\n- **Shader\u002Fmaterial** — \"Are any surfaces showing magenta, checkerboard, or default grey?\"\n\n### Debug Scene Pattern\n\nIn `test\u002Fdebug_{issue}.gd`:\n\n1. Load only relevant nodes\n2. Frame the issue with positioned camera\n3. Add visible markers (colored boxes, labels) for position confirmation\n4. Run enough frames to capture behavior\n5. Feed to visual-qa question mode\n\n---\n\n## Project Memory\n\nRead the knowledge graph (`memory` tools) before starting work — it contains discoveries from previous tasks. After completing your task, write back:\n\n- What worked and what failed\n- Technical specifics later tasks will need\n- Workarounds discovered\n",{"name":5,"description":7},"main","f14d6437b86dcd1257925a71587a253624705809","skills\u002Fgame-execution",0,"https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config","https:\u002F\u002Fgithub.com\u002Fdragoscirjan","http:\u002F\u002Flunaticthinker.me","2026-08-23 18:29:44",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add dragoscirjan\u002Fopencode-config --skill game-execution",{"tool":62,"command":63},"bunx","bunx skills add dragoscirjan\u002Fopencode-config --skill game-execution",{"tool":65,"command":66},"pnpm","pnpm dlx skills add dragoscirjan\u002Fopencode-config --skill game-execution","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fgame-execution\u002FSKILL.md",true,[],[71,85,104,120,138,150],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":43},"01M6GVBX5M8KVG8EZP2QTYZDGB","productivity-clarify","Guidelines for clarifying ambiguous tasks. Load when the immediate user request lacks execution context.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity-clarify\u002FSKILL.md",[],[78,79,80,81,33,42,82,83,84,27],"productivity","productivity clarify","clarify","user","guidelines","user request","context",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":43},"01M6GVBQX6W1C1RAZE43EQ9NEY","productivity-caveman","Ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use when user says \"caveman mode\", \"talk like caveman\", \"use caveman\", \"less tokens\", \"be brief\", or invokes \u002Fcaveman.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity-caveman\u002FSKILL.md",[],[78,92,93,94,81,95,96,97,98,99,100,101,102,103],"caveman","productivity caveman","technical","use","full","token","tokens","usage","mode","ultra","brief","communication",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":113,"publishedAt":43},"01M6GVBHX6SZRBE7440A5RA6X9","mcp-tools","External MCP tools reference. Load at task start.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-tools\u002FSKILL.md",[110],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[114,115,116,117,118,39,42,119],"Tools","mcp tools","MCP","reference","start","at",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":128,"publishedAt":43},"01M6GVBD1AZ6NWNYAAQ9J9E71X","mcp-tools-godot","Godot MCP servers reference — editor, diagnostics, testing, docs, runtime. Load when doing Godot game dev.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-tools-godot\u002FSKILL.md",[126,127],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},[114,129,130,115,116,131,132,133,134,135,136,28,117,137,42],"mcp tools godot","godot","mcp servers","testing","docs","editor","diagnostics","dev","runtime",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":43},"01M6GVBA6DM84KYRDPP1Q83GBJ","lang-zig","Zig development standards and tooling.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Flang-zig\u002FSKILL.md",[],[145,146,147,148,149],"zig","lang zig","development","tooling","standards",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":43},"01M6GVB8PKXRMMJ4B2YPZG1350","lang-yaml","YAML standards and tooling.","https:\u002F\u002Fgithub.com\u002Fdragoscirjan\u002Fopencode-config\u002Fblob\u002Fmain\u002Fskills\u002Flang-yaml\u002FSKILL.md",[],[157,158,148,149],"yaml","lang yaml"]