5 May 2026 · Build state v1.8 (Phase 1-4 corpus installed)
Contract banner — M27 / M31 forward dependency
M26 exposes getDecisionAreaTarget() returning the DOM element M27 UI_Branch will populate at runtime (per ADR-090). The decision-area placeholder is rendered by M26 in test/preview contexts where M27 has not yet been wired in. M31 GM_Game (when built) is responsible for invoking M26.render(target) on each state change; M26 itself does not subscribe to state events (per ADR-088 re-render policy).
Stub session state · ADR-092 hybrid test pattern
The four preview panels below are driven by inline stub implementations of SM_Game, PM_Phase, DATA_Peers, and DATA_Context. Stub prose mirrors mockups/m26_mockup.html verbatim so the rendered output is one-to-one comparable against the canonical mockup. Real-module integration verification is deferred to the next regression sweep against the staged build at /js/data/.
§1 · Public API surface
// M26's public API. All calls are synchronous; render() throws on bad input.window.CovertCubicles.UI_Scene.render(target);
// Full re-render to the given DOM element. Idempotent.// Optional second arg: { forcePhase: 1|2|3|4 } for snapshot testing.window.CovertCubicles.UI_Scene.getDecisionAreaTarget();
// Returns the element M27 should render into. Null before first render.window.CovertCubicles.UI_Scene.getApi();
// Diagnostic surface: { moduleId, moduleName, stylesInjected, lastRender, decisionArea }
§2 · Automated assertions
ID
Assertion
Verdict
Assertions pending execution.
§3 · Phase preview panels
Each panel renders the full scene shell for the indicated phase, driven by the stub session state. Compare side-by-side against mockups/m26_mockup.html. The "Re-render all" button verifies render idempotency by triggering a second render on each panel.