{
  "assertions": [
    "uses(webgl)",
    "motion(idle)"
  ],
  "attempts": 2,
  "attribution": "\u201cgrant theft auto ported to p5.js. arrow keys control character or car\u2026\u201d \u2014 sketchgen entry 285, prompted by profcarroll, written by qwen3-coder:30b-a3b-q4_K_M under the control rules file. https://profcarroll.github.io/sketchgen-gallery/e/285/ Licensed CC BY 4.0.",
  "brief": "The canvas depicts a sprawling, simulated open-world cityscape. The viewer can navigate this detailed urban environment by controlling a character or a vehicle using directional controls, allowing for exploration across the sprawling streets and past massive buildings. An attacking action, triggered by a designated keypress, causes the controlled entity to strike an immediate, visible impact on the surrounding pavement.",
  "completion_tokens": 1936,
  "created_utc": "2026-09-15T16:46:20Z",
  "entry_id": 285,
  "executor": "qwen3-coder:30b-a3b-q4_K_M",
  "executor_prompt_version": "executor-v2",
  "gate": [
    {
      "assertions": {
        "motion(idle)": true,
        "uses(webgl)": true
      },
      "attempt": 1,
      "checks": {
        "audio_context_running": null,
        "console_clean": true,
        "frame_advancing": true,
        "frame_budget": false,
        "is_looping": true,
        "sound_lib_ok": null
      },
      "completion_tokens": 1147,
      "evidence": "Names this sketch shadows (checked before the gate ran):\npreflight: `box()` is called inside a loop inside `draw()`, so this sketch builds one lit mesh per item per frame; draw the items as one `beginShape(POINTS)` or build the mesh once in `setup()` with `buildGeometry()` (sketch.js line 78)\npreflight: `point()` inside a loop inside `draw()` is immediate mode in WEBGL \u2014 every call builds and uploads its own vertex buffer; batch them into one `beginShape(POINTS)` with `vertex()` per point (sketch.js line 86)\n\ngate exit 1: checks failed: frame_budget\n\nFixed checks that failed:\n- frame_budget = false\n    frame_budget: 132.3 ms per frame over the 120-frame idle window, budget 100 ms \u2014 batch points and lines into one shape, no sphere() per particle, no all-pairs loop\n\nRuntime state the gate read:\n- frame_advancing compares frameCount at frame 84 of the 120-frame idle window (86) with the end of it (122); at load it was 0\n",
      "exit": 1,
      "ghost": null,
      "given": null,
      "model": "qwen3-coder:30b-a3b-q4_K_M",
      "ms_per_frame": 132.3,
      "num_ctx": null,
      "preload_s": null,
      "prompt_tokens": 1519,
      "resources_loaded": [],
      "rules_file": "control",
      "source": "attempt-1",
      "total_s": 27.886,
      "wall_s": 101.177
    },
    {
      "assertions": {
        "motion(idle)": true,
        "uses(webgl)": true
      },
      "attempt": 2,
      "checks": {
        "audio_context_running": null,
        "console_clean": true,
        "frame_advancing": true,
        "frame_budget": true,
        "is_looping": true,
        "sound_lib_ok": null
      },
      "completion_tokens": 789,
      "evidence": null,
      "exit": 0,
      "ghost": null,
      "given": null,
      "model": "qwen3-coder:30b-a3b-q4_K_M",
      "ms_per_frame": 45.9,
      "num_ctx": null,
      "preload_s": null,
      "prompt_tokens": 1777,
      "resources_loaded": [],
      "rules_file": "control",
      "source": "attempt-2",
      "total_s": 9.436,
      "wall_s": 49.359
    }
  ],
  "ghost": {
    "by": "default",
    "events": 40,
    "script": "wander"
  },
  "job_id": 286,
  "last_error": null,
  "licence": "CC BY 4.0",
  "lineage": {
    "children": [
      324,
      524
    ],
    "critique": "start over and go back to the original prompt, too much prompt drift",
    "critique_by": "profcarroll",
    "generation": 3,
    "inherits_source": false,
    "parent_entry_id": 280,
    "root_entry_id": 183
  },
  "loads": [],
  "note": null,
  "off_node": [],
  "planner": "gemma4:e4b",
  "planner_prompt_version": "planner-v1",
  "process": null,
  "prompt": "grant theft auto ported to p5.js. arrow keys control character or car. spacebar to attack.\n\nRevise: the same open-world cityscape, and this time the attack leaves behind scorch marks on the pavement\n\nRevise: the same open-world cityscape, and this time the buildings dynamically cast shadows based on the simulated time of day\n\nRevise: start over and go back to the original prompt, too much prompt drift",
  "prompt_tokens": 3296,
  "publish_commit": "a6e69bd23095911a8e7c2b3ad75c54fd0668c350",
  "published_utc": "2026-09-15T17:28:30Z",
  "rules_file": "control",
  "seed": 1,
  "shape": "VM.Standard.A1.Flex 16/94",
  "source": {
    "attempts": [
      "attempt-1",
      "attempt-2"
    ],
    "entry": "https://profcarroll.github.io/sketchgen-gallery/e/285/",
    "index_html": "sketch/index.html",
    "repository": "https://github.com/profcarroll/sketchgen-gallery/tree/main/e/285",
    "sketch_js": "sketch/sketch.js"
  },
  "state": "published",
  "statement": "This sketch creates a navigable open-world cityscape using p5.js's WEBGL renderer, where players can explore a sprawling urban environment. The scene features a grid-based city layout with buildings, roads, and interactive elements. A character can be moved through the environment using keyboard controls, and when the spacebar is pressed, the character performs an attack action that visually impacts the surrounding pavement. The implementation avoids performance bottlenecks by batching geometry calls and using efficient rendering techniques suitable for the frame budget constraints.",
  "submitted_by": "profcarroll",
  "wall_s": 150.536
}
