# Lightkeeper's Atelier — MiniMax M3.1 Flash validation

- Artifact: `index.html` (45,459 bytes)
- Source: complete document from a fresh MiniMax M3.1 Flash authoring agent on the DeepSeek Harness; packaged without operator code changes
- Runtime: Chrome `155.0.8059.84`, Node `v22.23.3`, offline `file://` CDP loads
- Review date: 2026-10-27

These are post-delivery operator checks, not authoring-agent claims. No score, rank or rubric passage is claimed. The result is a failed run and the artifact is published as failed-run evidence.

| Check | Result | Evidence |
| --- | --- | --- |
| Complete standalone document | Pass | Doctype and closing `</html>` present; one inline script parsed with `new Function`; no external asset reference; no `fetch`, `XMLHttpRequest` or `WebSocket` |
| Offline desktop load | **Fail** | The document throws `ReferenceError: a is not defined` at `index.html:254` inside `coneGeom`, called from the scene construction at line 517 and from the top-level bootstrap at line 843. The script aborts there |
| Scene renders | **Fail** | A WebGL context is created, but the canvas keeps its default 300×150 size and stays blank. The viewport shows the title, the status panel and the legend, and nothing else |
| Offline mobile load | **Fail** | 390×844 produced the same static panel; no canvas content and no horizontal overflow |
| Control panel and HUD | Pass | Nine buttons (key light, sweep, inner light, beauty, neutral, zoom in, zoom out, home camera, reset all), an azimuth range input, the status rows and the explanatory copy are all present and legible at 1280×720 |
| Controls actuate the scene | **Fail** | A sweep of every control, including a mid-travel azimuth change, produced no DOM change and no new error. The script died before the handlers were installed |
| Material separation (L1) | Not observed | No geometry was drawn, so polished brass, rough brass, ceramic and stone could not be compared |
| Dynamic lighting and internal illumination (L2, L3) | Not observed | No shading was drawn; the key marker and the inner lamp could not be evaluated |
| Glass and depth ordering (L4) | Not observed | The lantern, the red inner object and the glass shell were never rendered |
| Shadows and grounding (L5) | Not observed | No shadow map was exercised because the renderer never ran a frame |
| Runtime during interactions | Pass | No external request and no network failure. The single `ReferenceError` above was the only exception, and it fired once during boot |

## Root cause

Source review of the published file locates the fault in the procedural cone builder. The function declares its temporaries but omits two of them:

```
function coneGeom(r,h,seg,flat){
  var g=G(),i,a0,a1,p0,p1,pa,n,ny,nl,c,s;      /* line 243 — no a, no b */
  ...
  for(i=0;i<seg;i++){var q=i*2;a=q+1;b=q+2;var d=q+3;g.i.push(q,b,a,a,b,d);}   /* line 254 */
```

The script body starts with `'use strict'` (line 162), so assigning to the undeclared `a` and `b` raises `ReferenceError` instead of creating globals. The smooth-cone branch is reached while building the lantern's inner reflector, so scene construction throws, the enclosing script aborts before `requestAnimationFrame(frame)` and before the control bindings are attached. The document therefore renders its static panel and nothing else.

## Limits and unchecked items

- No rubric criterion was observed. This is not a working 3D atelier and not a rubric pass; L1–L5 remain not-observed.
- The materials, the shadow map, the glass pass and the sweep logic are present in the source and were read, but source presence is not runtime evidence.
- The screenshots were captured but not visually reviewed beyond confirming that the canvas area is blank.
- The azimuth slider, the keyboard shortcuts and the resize behaviour were not exercised further, because no handler was installed.
