Classification · Internal Research Build · Covert Cubicles M27
PENDING
M27 · Phase 6 · Layer 7 (UI & Presentation)

UI_Branch — Decision Presentation Renderer

Active interactive surface: from-line, prompt prose, choice buttons.
Module of
31 (Module 27)
Dependencies
None — fully decoupled, decision record passed in via render() opts
Consumed by
Orchestrator (test page now, M31 GM_Game in production)
ADRs recorded
ADR-093 to ADR-098 (six)
Test strategy
Hybrid per ADR-092: API assertions + integrated M26+M27 demo
Generated
5 May 2026 · Build state v1.8 (M26 closed; M28 next)
Contract banner — orchestrator responsibilities M27 fires onChoice(decisionId, choiceId) when the participant clicks. The orchestrator is responsible for: (1) calling LOGIC_Decision.submitDecision(), (2) capturing instrumentation telemetry for M21 DATA_Recorder, (3) advancing or holding scene state, (4) invoking M28 UI_Modal with the resolved consequence, (5) re-rendering M27 with the next decision (or decision: null). The test page implements an inline orchestrator stub fulfilling these duties as a reference for M31's eventual implementation.
Synthetic decision records The decisions exercised below are constructed inline in the test page rather than fetched from M3 DATA_Decisions. This isolates the test from the staged build while exercising M27's full validation, render, and commit path. Real-module integration is verified at the next regression sweep.
§1 · Public API surface
// M27 is presentation-only. No data dependencies, no logic dependencies.

window.CovertCubicles.UI_Branch.render(target, {
    decision: { id, peerId, phase, prompt: { opener, request }, choices: [...] },
    onChoice: function (decisionId, choiceId) { /* orchestrator handles */ },
    peerName: 'Liam'     // optional from-line override
});

window.CovertCubicles.UI_Branch.render(target, { decision: null });
// Empty-state path: clears target, returns. ADR-094.

window.CovertCubicles.UI_Branch.getApi();
// Diagnostic: { moduleId, moduleName, stylesInjected, lastRender }
§2 · Automated assertions
IDAssertionVerdict
Assertions pending execution.
§3 · Integrated demo · M26 + M27 + orchestrator stub
The frame below renders the full M26 scene shell with M27 occupying the decision area. Use the controls to step through the four-phase synthetic decision sequence; click a choice to commit. The orchestrator log below traces every event the orchestrator stub handles — this is the reference behaviour M31 GM_Game will replicate in production.
Demo · M26 scene + M27 decision
§4 · Orchestrator stub event log