{
  "skill_name": "needle-engine",
  "evals": [
    {
      "id": 1,
      "prompt": "I have a ball the player rolls with WASD. When keys are released the ball should stop quickly. Write a BallController component for Needle Engine.",
      "expected_output": "Uses applyImpulse (not applyForce) for movement, uses getVelocity/setVelocity to brake on release (not _body internal access)",
      "files": [],
      "assertions": [
        {"text": "Uses applyImpulse for movement input, not applyForce", "type": "output_check"},
        {"text": "Uses rb.getVelocity() and rb.setVelocity() for braking, not (rb as any)._body", "type": "output_check"},
        {"text": "Uses SphereCollider for the ball, not BoxCollider", "type": "output_check"}
      ]
    },
    {
      "id": 2,
      "prompt": "Add bloom and vignette post-processing to my Needle Engine scene from code, and let me toggle bloom on/off at runtime.",
      "expected_output": "Uses this.context.postprocessing.addEffect(), not Volume component. Uses .enabled to toggle, not .active",
      "files": [],
      "assertions": [
        {"text": "Uses this.context.postprocessing.addEffect() as the primary API", "type": "output_check"},
        {"text": "Does not create a Volume component to add effects", "type": "output_check"},
        {"text": "Uses bloom.enabled = false to toggle, not bloom.active", "type": "output_check"}
      ]
    },
    {
      "id": 3,
      "prompt": "I need physics for a bowling game in Needle Engine — pins are cylinder-shaped, ball is a sphere. Set up the colliders and rigidbodies from code.",
      "expected_output": "Uses SphereCollider for ball, CapsuleCollider for pins, not BoxCollider for everything",
      "files": [],
      "assertions": [
        {"text": "Uses SphereCollider for the bowling ball", "type": "output_check"},
        {"text": "Uses CapsuleCollider for the bowling pins, not BoxCollider", "type": "output_check"},
        {"text": "Adds Rigidbody components to dynamic objects", "type": "output_check"}
      ]
    },
    {
      "id": 4,
      "prompt": "Write a Needle Engine component that makes an object smoothly follow another object's position each frame. The target object is assigned as a field.",
      "expected_output": "Uses worldPosition getter/setter directly or getTempVector, not .clone() or new Vector3() in update loop",
      "files": [],
      "assertions": [
        {"text": "Does not call .clone() in the update loop", "type": "output_check"},
        {"text": "Does not allocate new Vector3() in the update loop", "type": "output_check"},
        {"text": "Uses worldPosition setter or getTempVector for position math", "type": "output_check"}
      ]
    },
    {
      "id": 5,
      "prompt": "Set up a GitHub Actions workflow to deploy my Needle Engine project on every push to main.",
      "expected_output": "Uses needle-tools/deploy-to-needle-cloud-action@v1, not GitHub Pages, not npx needle-cloud deploy in a run step",
      "files": [],
      "assertions": [
        {"text": "Uses needle-tools/deploy-to-needle-cloud-action@v1", "type": "output_check"},
        {"text": "Does not use 'npx needle-cloud deploy' in a run step", "type": "output_check"},
        {"text": "Does not use GitHub Pages deployment", "type": "output_check"},
        {"text": "Includes a name parameter for the project", "type": "output_check"}
      ]
    }
  ]
}
