{
  "model": "deepseek-v4-1-flash",
  "modelName": "DeepSeek V4.1 Flash",
  "date": "2026-09-22",
  "status": "integrated",
  "expectedRuns": 16,
  "completedRuns": 16,
  "method": "One fresh subagent per benchmark, executing on the DeepSeek V4.1 Flash model route (model ID deepseek-flash) through the operator's local model proxy. Each agent received only the original benchmark specification path, this repository's operator rules, and its own target directory. No reference code, sample implementations, other model artifacts, or site source were supplied, and agents were instructed not to open them.",
  "isolation": "Instruction-based separation in a shared filesystem. Agents were instructed not to inspect existing implementations or site source. This is not an access-control sandbox or independent file-access attestation.",
  "feedback": "In-run tool feedback and repairs were allowed. Agents verified in headless Chrome (Chrome 153) driven by puppeteer-core installed under /tmp, against a local python http.server on a port reserved per agent. Two conditions are specific to this suite and are recorded rather than smoothed over. First, 12 of the 16 agents were terminated mid-run when the local model proxy crashed under the load of 16 concurrent agents; each was resumed from the files it had already written, so these are not uninterrupted single episodes, and their artifacts combine pre- and post-interruption work. The other four ran uninterrupted. Second, the city-scroll-journey brief permits connected media-generation and design-reference MCP servers; both were unauthenticated at run time, so that run used the brief's free local fallback and records the substitution in its manifest warnings and validation report, matching what every other model's run of the same prompt did.",
  "evaluation": "Registry validation means an entry file was ingested. It is not a full qualitative pass or an aggregate score. See each run's validation report for the checks that were actually run and the remaining limits. Every run in this suite carries its own recorded limitations.",
  "observations": [
    "Every run is self-contained except three. Thirteen declare externalAssets: [], vendoring Three.js locally or generating assets procedurally; helms-deep (three.js 0.180.0 from jsDelivr), neon-drift (Google Fonts) and yingzao-fashi-assembly (three.js 0.160.0 from unpkg with a jsDelivr fallback) are the exceptions. Some agents noted they chose local copies so the artifact also opens over file://.",
    "ember-glider records a deliberate deviation from brief wording: the brief specifies Three.js via CDN and the run vendors it instead, for offline and file:// operation. It is disclosed in that run's warnings.",
    "Total published size is 7,953,831 bytes across 182 files; the largest contributors are vendored Three.js builds, which account for roughly 600-700 KB in the runs that include them."
  ],
  "runs": [
    {
      "benchmark": "city-scroll-journey",
      "prompt": "benchmarks/prompts/16-city-scroll-journey.md",
      "entry": "/benchmarks/city-scroll-journey/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/city-scroll-journey/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/city-scroll-journey/deepseek-v4-1-flash/VALIDATION.md",
      "files": 22,
      "bytes": 772236,
      "externalAssets": [],
      "warnings": [
        "MEDIA GENERATION FELL BACK TO LOCAL RENDERING. Both connected MCP servers were unauthenticated at the start of this run: the Higgsfield server (mcp.higgsfield.ai) returned an OAuth authorization request when called, and the Mobbin server (api.mobbin.com) did the same. Per the brief's fallback clause (and the operator's confirmation), no OAuth was attempted and no server was retried. Substitution used instead: every scene, poster and card visual is drawn at build time and at runtime by js/city.js, a Canvas 2D miniature-city renderer written for this run \u2014 'code-built canvas scenes, locally rendered frames'. No AI-generated or stock media is present, so there are no Higgsfield generation prompts to record; the equivalent record is the art-direction brief plus the deterministic render parameters kept in js/data.js (per-scene sky/haze/facade/accent palettes, camera keyframes, district layout) and in js/city.js (seed, geometry, lighting). Mobbin was not used for layout reference; the supporting sections use a conventional card-grid + footer structure instead.",
        "The flight is a live-rendered 3D miniature city on one canvas, not a scrubbed video: there is no clip and therefore no 'clip first frame'. Each scene's poster is an exact still from the same renderer at that scene's dwell progress, exported as a JPEG at build time, so the poster-to-flight hand-off is a same-source match rather than a frame-accurate video match.",
        "No webfonts are used (system font stack only) so the page makes zero network requests and stays identical offline. Deliberate, not an omission.",
        "The nav is a fixed bar whose surface switches from transparent to solid at release rather than a position:sticky element; visually and behaviourally it is the sticky bar the brief asks for.",
        "prefers-color-scheme is honoured for the page chrome (background, cards, footer, nav) and for the accent contrast of the supporting sections. The hero itself stays night-time in both schemes because it is a rendered photograph-equivalent of a city at dusk; light scheme does not repaint the flight.",
        "The reduced-motion stacked scenes are built by js/app.js from the same copy nodes as the pinned captions (single source of truth). With JavaScript disabled the reduced-motion fallback shows the first poster only, since the stack is assembled at runtime.",
        "Mobile URL-bar stability relies on 100vh (the large viewport) and on avoiding dvh/svh units anywhere in the CSS; a device that changes the layout viewport does resize the pinned stage, which is unavoidable for a full-viewport pin."
      ]
    },
    {
      "benchmark": "ember-glider",
      "prompt": "benchmarks/prompts/15-ember-glider.md",
      "entry": "/benchmarks/ember-glider/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/ember-glider/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/ember-glider/deepseek-v4-1-flash/VALIDATION.md",
      "files": 8,
      "bytes": 714827,
      "externalAssets": [],
      "warnings": [
        "Three.js r149 (UMD build) is vendored at js/three.min.js instead of being loaded from a CDN, so the page makes no runtime network requests at all and also opens over file://. manifest.externalAssets is therefore empty.",
        "No web font is fetched; the interface uses a system font stack. The brief allowed one CDN font, but none was needed.",
        "God-ray light shafts are a camera-facing additive sun flare, not volumetric shafts.",
        "Clouds are drifting point-sprite puffs, not volumetric or shadow-casting clouds.",
        "All art is generated in code: vertex-coloured low-poly islands and trees, canvas-generated particle sprites, and shader-based sky, water, waterfalls, thermal columns and beacon beam. No external textures, models or audio.",
        "The renderer keeps three.js defaults (no tone mapping, linear output) so the authored colours stay predictable.",
        "A water crash shows an expanding particle splash plus an on-screen notice; the water surface itself is not deformed.",
        "Thermal columns were widened during validation (core = 0.80-0.82 x radius) so that circling anywhere inside the visible column produces lift. Climb rates measured in the browser are recorded in VALIDATION.md.",
        "The glider is a simple low-poly assembly of primitives. Relaunching after a landing lifts the glider about 34 m (treated as a thermal pulse) because there is no ground-roll or tow model.",
        "Route completability was verified leg by leg with scripted flight through the verification hook, not by a human playthrough; see VALIDATION.md for what was and was not confirmed."
      ]
    },
    {
      "benchmark": "helms-deep",
      "prompt": "benchmarks/prompts/06-helms-deep.md",
      "entry": "/benchmarks/helms-deep/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/helms-deep/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/helms-deep/deepseek-v4-1-flash/VALIDATION.md",
      "files": 3,
      "bytes": 141177,
      "externalAssets": [
        "https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js",
        "https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.core.js"
      ],
      "warnings": [
        "The Deeping Wall is modelled straight rather than curved; curving it would require re-deriving the parapet walk, the merlons, the stair, the hoardings, the culvert and every collider anchored to it.",
        "The scene requires an HTTP origin: the brief mandates ES modules via an importmap, and browsers block module fetches from file://.",
        "Merlons and the sill between them both carry colliders, so the crenel embrasures cannot be walked through and the player cannot fall off the wall.",
        "One shadow-casting directional light at 2048x2048; torches and braziers cast no shadows.",
        "Of 60 fires, 19 carry a real PointLight; the rest are additive billboards with a ground light pool, for shader cost.",
        "The gate, the culvert arch and the cave mouth are extruded panels set into flat wall faces rather than openings carved out of the masonry.",
        "No audio and no touch/mobile controls; the brief specified WASD, mouse look and pointer lock.",
        "First load pays for procedural texture generation (~150 ms) and shader compilation of about 20 programs."
      ]
    },
    {
      "benchmark": "hogwarts-broom-flight-simulator",
      "prompt": "benchmarks/prompts/07-hogwarts-broom-flight-simulator.md",
      "entry": "/benchmarks/hogwarts-broom-flight-simulator/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/hogwarts-broom-flight-simulator/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/hogwarts-broom-flight-simulator/deepseek-v4-1-flash/VALIDATION.md",
      "files": 11,
      "bytes": 840029,
      "externalAssets": [],
      "warnings": [
        "No runtime URLs: three.js r180 is vendored locally at js/vendor/three.min.js (minified IIFE bundle produced at authoring time from the official three.module.min.js and three.core.min.js builds), so externalAssets is empty and the page never fetches a third-party resource.",
        "The lake has no true planar reflection; it uses a fresnel/ripple shader with moonlight glints plus drifting water mist, which satisfies the brief's \"castle reflections or shimmering water highlights\".",
        "No post-processing bloom. Window, lamp and spark glows are additive sprites rather than a composer pass.",
        "Collision safety is proven numerically against simplified, deliberately inflated solids (boxes, cylinders, cones, rings and one cylinder per tree) instead of per-triangle mesh intersections; the real meshes sit inside those solids.",
        "Terrain is a 200x200 height field (about 8 m cells), so cliffs, the mesa edge and the ravine read as low-poly planes.",
        "The stadium crowd is instanced blocks rather than figures, banners sway as rigid cloth rather than deforming, and the watching eyes are plain emissive spheres.",
        "The world is generated procedurally at load, so the first frame appears after roughly 0.5 to 2 seconds of building; there is no loading indicator.",
        "Controls are keyboard only (Space, arrow keys, M, F) as the brief specified optional keyboard controls; the HUD route name is also announced through an aria-live region.",
        "prefers-color-scheme light restyles the HUD and lifts the ambient light and exposure; the 3D scene remains a night flight in both schemes.",
        "Validated in Chrome only; Safari and Firefox were not available in the test environment."
      ]
    },
    {
      "benchmark": "jabberwock",
      "prompt": "benchmarks/prompts/04-jabberwock.md",
      "entry": "/benchmarks/jabberwock/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/jabberwock/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/jabberwock/deepseek-v4-1-flash/VALIDATION.md",
      "files": 19,
      "bytes": 919171,
      "externalAssets": [],
      "warnings": [
        "No runtime URLs are fetched. Three.js r147 (MIT) and the two typefaces are vendored into js/vendor/ and fonts/ instead of being pulled from a CDN, so externalAssets is empty and the artifact runs from file:// as well as over HTTP.",
        "Three.js r147's UMD build (build/three.min.js) is used deliberately rather than an ES module, so index.html opens from the filesystem without a server or import map.",
        "Typefaces are Uncial Antiqua (display) and EB Garamond (poem and body copy), self-hosted as latin-subset woff2.",
        "All textures are drawn into canvases at load time. No image file and no external texture is fetched.",
        "All sound is synthesised with WebAudio at the moment it happens. Nothing is downloaded, and no part of the game requires hearing it.",
        "The Bandersnatch cannot be killed: the vorpal blade rings off its hide and only angers it. This is a deliberate reading of \"shun the frumious Bandersnatch\", not an omission.",
        "The Jubjub birds are the only lesser enemy that can be killed (one stroke). Three patrol the tulgey wood.",
        "Touch input pans the camera only. There is no on-screen movement stick or attack button; keyboard and mouse is the supported path. No gamepad support.",
        "The world is a single bounded scene (radius 104 units, clamp at the edge). There is no streaming, LOD, or occlusion culling beyond instancing.",
        "prefers-color-scheme changes the reading panels and HUD chrome (ink on parchment vs parchment on ink). The 3D world itself keeps one palette in both schemes, because the world is a place and not a skin.",
        "prefers-reduced-motion cuts the particle budget to 22%, disables camera shake and flinch, and makes cutscene cameras hold still. Movement, combat and the whole poem remain fully functional.",
        "In the official run the Jabberwock takes four connecting strokes to kill (\"One, two! One, two!\"). A retry after death restores it and the two lesser threats.",
        "manifest.size was written by hand from the finished tree; the operator's finalize pass rewrites it exactly."
      ]
    },
    {
      "benchmark": "low-poly-tower-defense",
      "prompt": "benchmarks/prompts/14-low-poly-tower-defense.md",
      "entry": "/benchmarks/low-poly-tower-defense/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/low-poly-tower-defense/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/low-poly-tower-defense/deepseek-v4-1-flash/VALIDATION.md",
      "files": 8,
      "bytes": 740563,
      "externalAssets": [],
      "warnings": [
        "three.js r149 (MIT) is vendored at js/vendor/three.min.js rather than loaded from a CDN, so externalAssets is empty and the page issues no network requests at all; this is what lets index.html run directly over file:// as well as over http.",
        "No audio is used anywhere. The brief requires no runtime audio fetch, and all combat feedback is visual (projectiles, muzzle glow, splash ring, frost glow on slowed enemies, gold popups).",
        "prefers-reduced-motion is honoured by dropping particle counts (sparks per burst fall to 2 or fewer), pinning the heart crystal and portal gem, stopping tower spin-up, and suppressing HUD animation and popup rise. The particle-count reduction is verified in code only: no external hook exposes effect counts.",
        "The best wave is stored in localStorage per origin, so a run served over http and a run opened from file:// show different bests.",
        "Spark scatter uses Math.random, so combat effects are not frame-for-frame reproducible (the simulation itself is deterministic apart from that).",
        "Wave three is a deliberate difficulty spike: a build that spreads cheap towers without upgrading can lose several lives there, while an upgraded arrow line holds it."
      ]
    },
    {
      "benchmark": "low-poly-world",
      "prompt": "benchmarks/prompts/01-low-poly-world.md",
      "entry": "/benchmarks/low-poly-world/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/low-poly-world/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/low-poly-world/deepseek-v4-1-flash/VALIDATION.md",
      "files": 13,
      "bytes": 723710,
      "externalAssets": [],
      "warnings": [
        "No runtime network requests: three.js r149 is vendored as js/three.min.js inside the folder instead of being loaded from a CDN, so externalAssets is empty by design.",
        "No image or font files ship. Every texture is drawn at load time on a canvas (tileable water ripple normal map, lantern/rune glow sprite, the minimap layer) and the interface uses the system font stack.",
        "Crafting ships four recipes (Camp Lantern, Stone Bench, Rope Fence, Waystone) at one workbench. Harvesting also covers rocks and pond/shore reeds so the recipes have three materials to draw on; the brief specified trees only.",
        "Trees and rocks have no collision volume of their own - only the terrain has collision, which is what the brief asks for. You can walk through a trunk.",
        "Walking stops at roughly waist depth (about 1.05 m below the local water surface) so the player cannot leave the island on foot; free-fly is clamped to a 76 m square and a 1.15-42 m altitude band.",
        "Water is a stylised surface: ripples come from an animated procedural normal map plus a small vertex swell. There are no reflections, refractions or depth-based colour.",
        "The sun in the sky dome is drawn larger than a real 0.5 degree solar disc, which suits the stylised sky.",
        "The shadow map is rendered once and refreshed only when the world changes (a tree is harvested, or an object is placed), because the sun never moves.",
        "Adaptive resolution: if the measured frame rate stays under 30 the renderer drops its pixel ratio in 0.15 steps (floor 0.75) and raises it again above 56 fps. Reported frame timings come from a headless Chrome run on an Apple GPU, not from a 2020 integrated-graphics laptop.",
        "prefers-reduced-motion disables the walking camera bob and cuts the drifting motes from 150 to 39; the water keeps its gentle ripple animation.",
        "The world is deterministic: fixed seeds are used for the heightfield and for prop scattering, so every load produces the same island.",
        "A read-only window.__lowpoly handle (stats, player, terrain, props, crafting) is exposed so the automated checks can drive the page; it adds no interface."
      ]
    },
    {
      "benchmark": "mechanical-watch-simulator",
      "prompt": "benchmarks/prompts/10-mechanical-watch-simulator.md",
      "entry": "/benchmarks/mechanical-watch-simulator/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/mechanical-watch-simulator/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/mechanical-watch-simulator/deepseek-v4-1-flash/VALIDATION.md",
      "files": 10,
      "bytes": 780983,
      "externalAssets": [],
      "warnings": [
        "Vendored three.js r160 UMD build ships inside the run (js/vendor/three.min.js), so externalAssets is empty: nothing is fetched at runtime. The build carries the r150+ deprecation console.warn, which was removed so the file loads without noise.",
        "The movement is presented as an exhibition cutaway: bridges, going train, escapement and the dial-side motion works all face the camera with the hands above them. The rotor and the automatic winding module sit under the mainplate and are only fully visible at low camera angles, in x-ray, or in the exploded view.",
        "Automatic winding is reduced to a single reduction wheel sized to mesh both the rotor pinion and the ratchet wheel. There is no reversing-wheel pair, so a reversing rotor does not reverse the winding direction.",
        "The El Primero uses the coupling clutch the brief asks for rather than the real oscillating-pinion system; a clutch lever and a two-level intermediate pinion are modelled and visibly engage.",
        "The Omega 8900 twin barrels are not modelled (one drum, like the other calibers). Its visible differences are kept: three-level co-axial escape wheel, three-stone pallet fork, no regulator index (free-sprung), different balance cock, 7 beats per second, 60 hour reserve.",
        "The Spring Drive 9R65 has no balance wheel, hairspring or pallet fork, as in the real caliber, so the brief's balance requirement is carried by the three mechanical movements. The glide wheel, its pinion and two brake coils take the escapement position; the glide wheel is modelled at the escape wheel ratio (16 rev/hour of the fourth wheel) so its continuous rotation stays visible instead of blurring.",
        "The escape wheel is drawn at a fixed visible size (2.2 units radius, 15 club teeth) because it works only against the pallets; its pinion is sized from the fourth wheel module so the mesh is exact.",
        "Escapement sub-phases are eased curves (unlock, impulse and drop inside the first 22% of each beat) rather than a rigid-body contact solve. The release is a snap that lands exactly half a tooth per beat.",
        "The dark colour scheme renders a dark drafting surface instead of the light off-white ground, which is kept for the default light theme.",
        "Power reserve drains with simulated time and stops the train when empty; the remaining reserve carries across a caliber switch, as it is the same instant of the same watch.",
        "Part names and functions appear in a fixed bottom-centre panel instead of a pointer-following tooltip, so text never overlaps the movement.",
        "One 1024 shadow map over a 52 unit ortho frustum keeps the frame budget; shadows are soft rather than sharp."
      ]
    },
    {
      "benchmark": "neon-drift",
      "prompt": "benchmarks/prompts/13-neon-drift.md",
      "entry": "/benchmarks/neon-drift/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/neon-drift/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/neon-drift/deepseek-v4-1-flash/VALIDATION.md",
      "files": 14,
      "bytes": 124917,
      "externalAssets": [
        "https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&display=swap"
      ],
      "warnings": [
        "One CDN font is used: Orbitron from Google Fonts (the stylesheet listed in externalAssets). That stylesheet makes the browser fetch woff2 binaries from fonts.gstatic.com, whose exact URLs are chosen by the browser. If the font fails to load the interface falls back to a local sans-serif stack and the game is unaffected: every other pixel is drawn in code.",
        "The optional camera tilt mentioned in the brief is not used. The top-down camera gets its sense of speed from a parallax backdrop grid, trackside pylons and a zoom pull-back with speed instead, which keeps the car's heading readable at a glance.",
        "Off-track surfaces use one runoff material per circuit (sand at Sunset Coast, gravel in Neon Canyon, concrete in Grid City) rather than separate grass/sand/gravel physics. All of them share the same strong slow-down.",
        "The ghost is kept in memory at 30 Hz and thinned to 15 Hz for localStorage, then interpolated on replay. It is a verbatim replay of the player's recorded car state, not a scripted path.",
        "Menus, the ladder and the HUD are DOM overlays above the canvas so that every number is readable by assistive technology and by automated checks; only the circuit, cars and effects are drawn on the canvas.",
        "The game is silent: the brief forbids fetched audio and does not require generated audio, and none was added.",
        "Track shapes were authored as polygons with a fillet radius per corner (see js/data.js) rather than imported geometry, so the three layouts are code, not reskins of one another."
      ]
    },
    {
      "benchmark": "office-life",
      "prompt": "benchmarks/prompts/02-office-life.md",
      "entry": "/benchmarks/office-life/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/office-life/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/office-life/deepseek-v4-1-flash/VALIDATION.md",
      "files": 3,
      "bytes": 102574,
      "externalAssets": [],
      "warnings": [
        "Shipped as one self-contained index.html (the brief requires a single index.html with no build step), so the css/, js/, assets/ and fonts/ directories are unused.",
        "Character art shares one construction (torso, arms, head, hair, prop slot) across all five characters, as the brief requires identical proportions and palette; each character differs by accent colour, hair shade and one held prop rather than fully bespoke body art.",
        "Walking does not consume simulated clock time. The clock advances at a fixed 32 simulated minutes per real second; movement takes real time at 1150 world units/second so the compressed day stays watchable.",
        "Conversations occupy Meeting Room 1 exclusively: a standup, presentation, interview or room prep all take the room, so a second meeting waits with a 'Meeting room is busy' bubble.",
        "The emergency meeting and the 5 PM walk-out are not counted in the tasks-done total; the brief defines that counter as completed work tasks. The lunch break is counted.",
        "Movement is routed around furniture with a segment/rectangle test plus corner detours. One residual overlap remains: a character delivering coffee to a colleague seated at the kitchen table stands about 18 units over the table edge for the hand-off.",
        "The afternoon yawn is applied as an extra class on top of the current animation state for 0.6 seconds rather than as a separate mutually exclusive state, preserving the one-state-per-character rule.",
        "manifest.size is intentionally left for the operator's single finalize pass, so `check` reports a stale-size warning."
      ]
    },
    {
      "benchmark": "petri-dish",
      "prompt": "benchmarks/prompts/05-petri-dish.md",
      "entry": "/benchmarks/petri-dish/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/petri-dish/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/petri-dish/deepseek-v4-1-flash/VALIDATION.md",
      "files": 9,
      "bytes": 76173,
      "externalAssets": [],
      "warnings": [
        "FPS counter and the population chart both belong in the top-right corner of the canvas; the FPS chip sits in the corner itself and the chart panel is directly beneath it.",
        "The dish is always simulated at a fixed 300-unit world radius and drawn scaled to fit, so a small screen shows a zoomed-out view of the same ecology instead of a cramped one where every population dies within a minute. On screens under 900px wide the canvas becomes square and the dish moves into the space below the chart.",
        "Prey are tuned to be faster than predators at every energy level (prey 50-66 px/s, predators 38 px/s), so predators catch prey by cornering them at the rim. An earlier tuning pass let predators outrun hungry prey and every run went extinct within a minute.",
        "Prey do not die of starvation; their energy only gates reproduction, speed and fleeing. Predators die when their energy reaches zero, as specified.",
        "Food particles enter at the rim and drift across the dish rather than straight inward, so the middle of the dish is not left empty.",
        "The agar dish keeps its dark rendering under prefers-color-scheme: light; only the page chrome and the bench around the dish follow the colour scheme. The brief fixes the chart panel as dark with bright lines, which the agent and food colours depend on.",
        "The chart (axis numbers, legend, lines) is drawn on canvas and is not exposed to assistive technology. Agent counts are also real text in the sidebar buttons and the HUD, and the canvas carries a periodically updated aria-label describing the populations.",
        "window.PD_DEBUG is a small read-only inspection hook (stats, history, fastForward) used by the headless validation script; no part of the UI depends on it.",
        "Long runs can still go extinct: in a 15-20 minute run both species sometimes die out after a boom-crash cycle. Prey and predator counts, and the Add Prey / Add Predator / Reset controls, are the recovery path.",
        "Under prefers-reduced-motion the dish runs at half the slider speed and the chart redraws every 500ms; a note in the sidebar says so while that preference is set."
      ]
    },
    {
      "benchmark": "starfall-arena",
      "prompt": "benchmarks/prompts/12-starfall-arena.md",
      "entry": "/benchmarks/starfall-arena/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/starfall-arena/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/starfall-arena/deepseek-v4-1-flash/VALIDATION.md",
      "files": 15,
      "bytes": 128461,
      "externalAssets": [],
      "warnings": [
        "No runtime assets are fetched at all: every sprite, shape, particle and glyph is drawn in code and the UI uses the system font stack, so externalAssets is empty (the favicon is an inline data: URI).",
        "No audio: the brief permits audio files but does not require them, so nothing is played and no media is bundled.",
        "skipToWave(n) also brings the ship up to a wave-appropriate level through the same roll/apply upgrade path the level-up screen uses, and sets the run timer to the nominal elapsed time for that wave; the skipped waves are not replayed.",
        "grantXP(n) starts a run first when it is called before one is active, so the hook is usable standalone.",
        "Particles are capped at 1600 (500 under prefers-reduced-motion) and emissions are dropped rather than queued at the cap, so the largest overlapping explosions can clip slightly.",
        "prefers-color-scheme: light re-themes the whole scene, the arena included, and darkens enemy and projectile colours so they stay legible on the light background.",
        "Best-run storage falls back to an in-memory store if localStorage is unavailable, since some browsers block it on file://.",
        "Enemies do not push each other apart, so dense late waves overlap visually; this keeps the 200+ enemy case cheap to simulate."
      ]
    },
    {
      "benchmark": "stormwind-trebuchet-simulator",
      "prompt": "benchmarks/prompts/11-stormwind-trebuchet-simulator.md",
      "entry": "/benchmarks/stormwind-trebuchet-simulator/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/stormwind-trebuchet-simulator/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/stormwind-trebuchet-simulator/deepseek-v4-1-flash/VALIDATION.md",
      "files": 13,
      "bytes": 830518,
      "externalAssets": [],
      "warnings": [
        "Three.js r160 is bundled locally at js/three.min.js (an IIFE build of the upstream module), so no CDN is contacted at runtime; externalAssets is therefore empty.",
        "Pre-release the sling is modelled as an always-taut rope: a real sling can go slack, so the pouch is dragged about 1.5 m back along the loading trough before it lifts off. The drag is a consequence of the coupled geometry, not an animation.",
        "The trough contact is frictionless; energy losses come from axle friction, sling damping and pre-release aerodynamic drag only.",
        "After release the sling stays tethered to the arm-tip pin and flails; the pouch does not fly away with the stone. Release position, velocity and timing are preserved exactly.",
        "Wall, gatehouse, tower and practice-shield colliders are axis-aligned boxes; damage is a cumulative score plus crack decals, and no structure collapses from an ordinary shot. The projectile stops at impact (no ricochet).",
        "Buildings behind the wall have no colliders, so a shot that clears the wall lands on open terrain behind it.",
        "Terrain is flat at y = 0 for the physics; relief is texture and props only. The shadow cascade is anchored on the engine (+/-72 m), so the city and the far field receive no cast shadows.",
        "The 30 fps requirement is evidenced by frame cost in headless Chrome 153 on macOS (mean 1.38 ms, worst 3.19 ms per frame at 1280x800), not by a run on the reference 2020 laptop.",
        "Below 900 px the energy/mechanism panel is hidden and below 760 px the tuning column becomes a drawer, to keep the centre of the screen clear."
      ]
    },
    {
      "benchmark": "universe-simulator",
      "prompt": "benchmarks/prompts/08-universe-simulator.md",
      "entry": "/benchmarks/universe-simulator/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/universe-simulator/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/universe-simulator/deepseek-v4-1-flash/VALIDATION.md",
      "files": 20,
      "bytes": 798977,
      "externalAssets": [],
      "warnings": [
        "Not to scale. In the Compact spacing mode heliocentric distances are compressed by a radial power law (r -> 90 * r^0.5) and body radii are exaggerated roughly 100-300x so all eight orbits are visible in one frame. Wide mode uses true relative spacing but still exaggerates radii. Orbital timing and the heliocentric direction of every body are unaffected; the drawn shape of an orbit is not a geometrically similar ellipse.",
        "Moon orbital radii are a second stylised compression, expressed as multiples of the primary's drawn radius, because real satellite orbits fall inside the drawn planet. Moon periods, inclinations and retrograde directions are real. Small moons also get a radius floor of 8.5% of the primary so they are not sub-pixel.",
        "Eight moons are modelled (Moon, Io, Europa, Ganymede, Callisto, Titan, Enceladus, Triton). The rest of the satellite catalogue is omitted. The asteroid and Kuiper belts are statistical particle belts whose individual members are not real objects; their particles carry correct Keplerian mean motions for their own semi-major axis.",
        "Orbital elements are the JPL 'Approximate Positions of the Planets' Keplerian set with a linear mean-longitude rate: no secular rates and no mutual perturbations, so accuracy is arcminute-level over roughly 1800-2050 and degrades outside it. Verified against published values for Earth at J2000 only.",
        "All textures and the star field are generated procedurally in the browser at load time (a 1.2 s bake). Planet surfaces, the Milky Way band and the star distribution are plausible in character, not observed data. No image, font or library is fetched at runtime; three.js r147 and OrbitControls are vendored under js/vendor/ instead, which is why externalAssets is empty.",
        "Lighting is not physical: the Sun's point light has no distance falloff, so the outer planets are as brightly lit as the inner ones, and there are no cast shadows, ring shadows or oblateness. Saturn and the other giants are drawn as spheres.",
        "The simulation date is clamped to years 1-9999 because the readout is formatted through Date.",
        "Verified in Chrome 153 only. No WebGL1 fallback path was exercised (a failure message is shown if a context cannot be created), and no screen reader or automated accessibility audit was run.",
        "prefers-reduced-motion stops the decorative layer (twinkle, Sun granulation, corona spin, camera tweens, CSS transitions) and lowers the default rate, but orbital motion continues because it is the content."
      ]
    },
    {
      "benchmark": "vice-city",
      "prompt": "benchmarks/prompts/03-vice-city.md",
      "entry": "/benchmarks/vice-city/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/vice-city/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/vice-city/deepseek-v4-1-flash/VALIDATION.md",
      "files": 11,
      "bytes": 144987,
      "externalAssets": [],
      "warnings": [
        "Rendered with Canvas 2D: an orthographic 2:1 isometric projection with painter's algorithm depth sorting. It is real 3D geometry (extruded boxes, projected faces), not a pre-drawn sprite sheet, but there is no depth buffer.",
        "Sprites are sorted by the front corner of their footprint (the view direction is (1,1,-1)). Buildings never share ground, so this is exact for the normal case, but a very tall block directly behind a much shorter one in the same screen column can be overdrawn at the edges of their silhouettes. A depth buffer or per-face sorting would be needed to remove this completely.",
        "Facades and roofs are baked once per generation into 2048x2048 canvas texture atlases (one page is typical, two are allowed). Day and night are baked as separate atlases and crossfaded over about a second during the day/night transition.",
        "The horizon and its haze are an art-directed screen-space band, not an atmospheric model. The far ground fades into that band; world-space ground detail is clipped at the horizon line.",
        "Building footprints are axis-aligned rectangles. There are no diagonal streets and buildings are never rotated off the grid, which is what keeps the isometric face mapping and the depth sort valid.",
        "Traffic signals run a simple two-phase cycle with a per-street offset. Cars keep their lane, obey the light and keep a gap to the car ahead; they never turn, overtake or change lane.",
        "With prefers-reduced-motion, Toggle Traffic shows stationary vehicles rather than adding moving ones, so the control still has a visible effect without any movement. Earthquake Mode shows the badge and announces that the view is not moving.",
        "The brief asks for a single index.html with no build step. This run is a single entry point with no build step: index.html plus css/ and js/ modules, matching the workspace layout in the operator rules. Everything is a classic script, so it also opens correctly from a file:// URL.",
        "The render scale drops automatically (to 62% at the lowest) if the average frame time exceeds 26 ms, to hold the frame rate up on slower machines."
      ]
    },
    {
      "benchmark": "yingzao-fashi-assembly",
      "prompt": "benchmarks/prompts/09-yingzao-fashi-assembly.md",
      "entry": "/benchmarks/yingzao-fashi-assembly/deepseek-v4-1-flash/index.html",
      "manifest": "/benchmarks/yingzao-fashi-assembly/deepseek-v4-1-flash/manifest.json",
      "validationReport": "/benchmarks/yingzao-fashi-assembly/deepseek-v4-1-flash/VALIDATION.md",
      "files": 3,
      "bytes": 114528,
      "externalAssets": [
        "https://unpkg.com/three@0.160.0/build/three.module.js",
        "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js"
      ],
      "warnings": [
        "Subject: Main Hall of Nanchan Temple (\u5357\u7985\u5bfa\u5927\u6bbf), 782 CE, Wutai County, Shanxi \u2014 three bays, 12 eave columns, no interior columns, hip-and-gable roof.",
        "Stage order is the order the brief requires: columns, fang/tie-beams, beams and purlins, dougong, then rafters and roof. In a real hall the bracket sets go on the column heads before the beams land, so the beams briefly float above the column heads until stage 4 fills the brackets in underneath.",
        "Runtime dependency: three.module.js r160 is loaded from a CDN (unpkg first, jsdelivr as a fallback). Everything else is inline: no fonts, no images, no other requests. If both CDNs are unreachable the page shows an explanation and the controls and component text still work.",
        "The roof is one lofted, ribbed tile sheet per face, not individual barrel and pan tiles. Bracket sets are a generic five-puzuo double-hua set, identical on every column, with compound sets only at the four corners. Mortise-and-tenon markers are simplified to a wrapped octahedron plus a peg rather than the true \u69ab/\u536f geometry.",
        "Walls are plank panels with plank doors and bar windows; the later brick infill, the ceiling and the sheathing are not modelled (the hall has no ceiling either). The platform and \u6708\u53f0 are plain slabs, not a reproduction of the 1974-75 restoration stonework.",
        "The building's enclosure (walls, doors, windows) closes the hall at the end of stage 5, because the brief's five stages do not include it and X-ray mode needs wall panels to exist.",
        "Proportions follow the published record for the bay count, 11.75 m by 10 m plan, 12 columns, roof type and five-puzuo bracket grade; the roof curve, \u6536\u5c71 inset and \u4fa7\u811a lean are plausible Yingzao Fashi proportions rather than measurements of the building.",
        "Verified in headless Chrome only (macOS, Chrome 153, ANGLE/SwiftShader). Touch gestures, screen readers, other browsers and GPU framerate were not exercised. Full check table and remaining limits: VALIDATION.md"
      ]
    }
  ]
}
