Classification · Internal Research Build · Covert Cubicles M29
PENDING
M29 · Phase 6 · Layer 8 (End)

END_Accuse — Four-Component Accusation Mechanism

Two-phase end-of-game accusation: input surface + outcome surface with identity withholding on lose paths.
Module of
31 (Module 29)
Dependencies
SM_Game (insiderAssigned + insiderProfile) · DATA_Peers (incl. archetypeMotive) · DATA_AccusationOptions (sidecar)
Consumed by
Orchestrator (test page now, M31 GM_Game in production)
ADRs recorded
ADR-105 to ADR-114 (ten); supersedes ADR-077; partially supersedes ADR-078, ADR-081
Test strategy
Hybrid per ADR-112: API assertions + forced-outcome preview panels
Generated
5 May 2026 · Build state v1.9 (M26-M28 closed; M29 placeholder content per ADR-114)
PILOT CONTENT IN EFFECT (ADR-114 / AN-031) · prompt prose, win/lose prose, archetypeMotive labels and means/opportunity options are register-appropriate and pilot-adequate · marked for canonical review · cleared for proof-of-concept piloting
Contract banner — orchestrator responsibilities M29 is invoked AFTER the final phase decision dismisses. The orchestrator must: (1) ensure state.session.insiderAssigned + state.session.insiderProfile has been populated (M31 GM_Game responsibility per ADR-113); (2) call M29.render(target, { onCommit }); (3) on commit, capture the accusation record for M21 / M25; (4) write the record to state.session.accusation; (5) call M29.renderOutcome(target, { accusationRecord, onClose }); (6) on close, advance to M30 END_Outcome. The integrated demo below executes this full loop end-to-end.
Identity withholding (ADR-109) On lose paths, M29 deliberately withholds: (a) per-component correctness markers, (b) the assigned-insider identity, (c) the actual motive/means/opportunity. Lose-path participants see only the prose and an echo of their own selections. Assertions D17–D19 verify this behaviour structurally.
§1 · Public API surface
window.CovertCubicles.END_Accuse.render(target, {
    onCommit: function (accusationRecord) { // orchestrator captures and writes record }
});

window.CovertCubicles.END_Accuse.renderOutcome(target, {
    accusationRecord: /* the record produced by onCommit */,
    onClose: function () { // orchestrator advances to M30 }
});

window.CovertCubicles.END_Accuse.getApi();
window.CovertCubicles.END_Accuse._renderOutcomeForTesting(target, record);
// Test-only — bypasses input surface to exercise outcome rendering directly.

// Accusation record shape (ADR-108):
// { submittedAt, identity: { selected, correct }, motive: { selected, correct },
//   means: { selected, correct }, opportunity: { selected, correct },
//   outcome: 'win'|'lose-incorrect'|'lose-abstention',
//   componentsCorrect: 0..4, anyAbstention: boolean }
§2 · Automated assertions
IDAssertionVerdict
Assertions pending execution.
§3 · Integrated demo · Full M29 cycle
Click "Render input surface" to start. Make four selections (substantive or abstention) and click Submit. The orchestrator stub captures the record, writes it to session state, and renders the outcome surface. Click Close to clear. The "Forced outcome" buttons skip the input phase and render outcome surfaces directly via _renderOutcomeForTesting — useful for visually verifying win, lose-incorrect, and lose-abstention prose.
Demo · M29 input + outcome surfaces
§4 · Orchestrator stub event log