{
  "assertions": [
    "motion(idle)",
    "uses(webgl)"
  ],
  "attempts": 3,
  "attribution": "\u201ca typewriter that types by itself and slowly gains confidence Revise:\u2026\u201d \u2014 sketchgen entry 1797, prompted by profcarroll, written by qwen3-coder:30b-a3b-q4_K_M under the treatment rules file. https://profcarroll.github.io/sketchgen-gallery/e/1797/ Licensed CC BY 4.0.",
  "brief": "The canvas displays a perpetually active sheet of distressed, vintage paper upon which text appears continuously, character by character. This text stream is generated automatically, mimicking the rhythm of a typewriter gaining speed and confidence. As the text accumulates, the physical surface of the paper reacts to the stress, visually transitioning through several phases of decay: first, a subtle warping; next, deep, permanent creases form along the print path; subsequent stresses lead to noticeable hairline fractures webbing the surface; and finally, the constant action causes the paper fibers to visibly fray and pull away from the printed characters, creating a dynamic, deteriorating surface.",
  "completion_tokens": 6884,
  "created_utc": "2026-09-28T01:41:40Z",
  "entry_id": 1797,
  "executor": "qwen3-coder:30b-a3b-q4_K_M",
  "executor_prompt_version": "executor-v3",
  "gate": [
    {
      "assertions": {
        "motion(idle)": true,
        "uses(webgl)": false
      },
      "attempt": 1,
      "checks": {
        "audio_context_running": null,
        "console_clean": true,
        "frame_advancing": true,
        "frame_budget": true,
        "is_looping": true,
        "revised": true,
        "sound_lib_ok": null
      },
      "completion_tokens": 2307,
      "evidence": "gate exit 1: assertions failed: uses(webgl)\n\nAssertions that failed:\n- uses(webgl): renderer context is 2D\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": {
        "events": 40,
        "ms": 4000,
        "played": 40,
        "script": "wander",
        "source": "default"
      },
      "given": {
        "kind": "parent",
        "lines": 175,
        "sha256": "5068762c94988577d9f4130d318dd05bf389aafc5b6d052225b081b2eddb4293",
        "shown": true
      },
      "model": "qwen3-coder:30b-a3b-q4_K_M",
      "ms_per_frame": 1.6,
      "num_ctx": 16384,
      "preload_s": 0.028,
      "prompt_tokens": 3940,
      "resources_loaded": [],
      "rules_file": "treatment",
      "source": "attempt-1",
      "total_s": 3.277,
      "wall_s": 204.229
    },
    {
      "assertions": {
        "motion(idle)": true,
        "uses(webgl)": false
      },
      "attempt": 2,
      "checks": {
        "audio_context_running": null,
        "console_clean": true,
        "frame_advancing": true,
        "frame_budget": true,
        "is_looping": true,
        "revised": true,
        "sound_lib_ok": null
      },
      "completion_tokens": 2308,
      "evidence": "gate exit 1: assertions failed: uses(webgl)\n\nAssertions that failed:\n- uses(webgl): renderer context is 2D\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": {
        "events": 40,
        "ms": 4000,
        "played": 40,
        "script": "wander",
        "source": "default"
      },
      "given": {
        "kind": "previous",
        "lines": 256,
        "sha256": "48ee4525bb6b0d77159b61121b4734472e6e2a642e94c67b860bcde3e1593290",
        "shown": true
      },
      "model": "qwen3-coder:30b-a3b-q4_K_M",
      "ms_per_frame": 1.6,
      "num_ctx": 16384,
      "preload_s": 0.027,
      "prompt_tokens": 4721,
      "resources_loaded": [],
      "rules_file": "treatment",
      "source": "attempt-2",
      "total_s": 3.304,
      "wall_s": 233.324
    },
    {
      "assertions": {
        "motion(idle)": true,
        "uses(webgl)": false
      },
      "attempt": 3,
      "checks": {
        "audio_context_running": null,
        "console_clean": true,
        "frame_advancing": true,
        "frame_budget": true,
        "is_looping": true,
        "revised": true,
        "sound_lib_ok": null
      },
      "completion_tokens": 2269,
      "evidence": "gate exit 1: assertions failed: uses(webgl)\n\nAssertions that failed:\n- uses(webgl): renderer context is 2D\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": {
        "events": 40,
        "ms": 4000,
        "played": 40,
        "script": "wander",
        "source": "default"
      },
      "given": {
        "kind": "previous",
        "lines": 258,
        "sha256": "702d3970a49c487ac3c231e3524ba848e7b32a1fa599dab995ced2fbf955b817",
        "shown": true
      },
      "model": "qwen3-coder:30b-a3b-q4_K_M",
      "ms_per_frame": 1.6,
      "num_ctx": 16384,
      "preload_s": 0.026,
      "prompt_tokens": 4736,
      "resources_loaded": [],
      "rules_file": "treatment",
      "source": "attempt-3",
      "total_s": 3.276,
      "wall_s": 232.428
    }
  ],
  "ghost": {
    "by": "default",
    "events": 40,
    "script": "wander"
  },
  "job_id": 1810,
  "last_error": null,
  "licence": "CC BY 4.0",
  "lineage": {
    "children": [
      1843
    ],
    "critique": "the same continuous flow of text appearing on vintage paper, and this time the stream causes the paper fibers to visibly fray and pull away from the printed characters.",
    "critique_by": "gemma4:e4b",
    "generation": 4,
    "inherits_source": false,
    "parent_entry_id": 1738,
    "root_entry_id": 1483
  },
  "loads": [],
  "note": null,
  "off_node": [],
  "planner": "gemma4:e4b",
  "planner_prompt_version": "planner-v2",
  "process": null,
  "prompt": "a typewriter that types by itself and slowly gains confidence\n\nRevise: the same automatic character generation, and this time the paper slightly warps around the typing action.\n\nRevise: the same automatic flow of text appearing on vintage paper, and this time the paper creases visibly and permanently around the type stream.\n\nRevise: the same continuous, generative stream of text that warps the paper, and this time the accumulating stress causes the aged surface to develop visible hairline fractures.\n\nRevise: the same continuous flow of text appearing on vintage paper, and this time the stream causes the paper fibers to visibly fray and pull away from the printed characters.",
  "prompt_tokens": 13397,
  "publish_commit": "9e97905b1571dc6daec7baa73fe4f238a6890fe5",
  "published_utc": "2026-10-01T02:53:02Z",
  "rules_file": "treatment",
  "seed": 1,
  "shape": "VM.Standard.A1.Flex 16/96",
  "source": {
    "attempts": [
      "attempt-1",
      "attempt-2",
      "attempt-3"
    ],
    "entry": "https://profcarroll.github.io/sketchgen-gallery/e/1797/",
    "index_html": "sketch/index.html",
    "repository": "https://github.com/profcarroll/sketchgen-gallery/tree/main/e/1797",
    "sketch_js": "sketch/sketch.js"
  },
  "state": "published",
  "statement": "This sketch depicts a vintage paper sheet that gradually deteriorates as text scrolls across it in a typewriter rhythm. The paper begins with subtle warping effects and evolves through permanent creases, hairline fractures, and finally fiber fraying\u2014each stage visualized through layered visual elements that respond to the accumulating text. The viewer observes a continuous, self-contained process of decay that mirrors the physical stress of writing on aged paper, all without any external interaction required.",
  "submitted_by": "profcarroll",
  "wall_s": 669.981
}
