The simplest Phase 6 aggregator and the final one. Reads the accusation event recorded by M29 END_Accuse (Phase 7) and classifies the outcome as correct / wrong / abstained / no_accusation / malformed. Closes Phase 6 (Research Capture) and brings the build to 25 of 31 modules.
SM.getSession() to return a
session with the desired accusation shape, exercises M25 against it, then restores
the original. This is the same technique used in the smoke test (17/17 PASS) and
is what allowed M25 to be verified in advance of M29's existence.
| # | Assertion | Result | Detail |
|---|
Click a pre-built scenario to drive M25 through one of the five outcome states, or use the manual stub controls to construct an arbitrary accusation field shape. The outcome banner updates immediately. Reset clears the stub and returns M25 to its real (no-accusation) state.
| Field | Type | Description |
|---|---|---|
| Provenance | ||
| outcomeVersion | string | Schema version (1.0) |
| computedAt | ISO 8601 UTC | When the outcome was computed |
| Outcome (the headline classification) | ||
| outcome | enum | One of: correct / wrong / abstained / no_accusation / malformed |
| reason | string | Detail flag explaining how the outcome was reached |
| Surfaced from accusation field | ||
| accusedPeer | string | null | Peer ID accused (null on abstention / no-accusation / malformed-null) |
| insiderAssigned | string | null | Actual insider for this session |
| abstained | boolean | TRUE if explicit abstention recorded |
| confidence | number | null | Optional 0..1 confidence rating |
| accusationTimestamp | ISO 8601 | null | When accusation was recorded |
| hasAccusation | boolean | TRUE iff accusation field is populated (any form) |
| Outcome taxonomy (ADR-078) \u2014 5 mutually exclusive values | ||
| correct | enum value | accusedPeer === insiderAssigned |
| wrong | enum value | accusedPeer set but !== insiderAssigned |
| abstained | enum value | accusation.abstained === true (precedence over accusedPeer) |
| no_accusation | enum value | accusation field absent |
| malformed | enum value | Field present but invalid (wrong shape OR accusedPeer not in peer list) |
| M29 contract (ADR-077) \u2014 future Phase 7 module | ||
| state.session.accusation | object | null | Field path M29 END_Accuse must populate |
| accusation.accusedPeer | string | null | One of arthur/liam/sarah/dave |
| accusation.abstained | boolean | TRUE iff explicit abstention |
| accusation.confidence | number | null | 0..1 optional |
| accusation.timestamp | ISO 8601 UTC | When recorded |