The record: one event, three reads
c1332026-11-11From the policy's detection to one small event in the plane's audit log, and the three places that read it: the finding, Reports, the operator's inbox.
Source: c133 event-shape.md §1–§8 (the flow, the event, the audit row, the projections, the six questions, Mark's assumptions D22–D27 set 2026-11-11, to validate with Tyler); plan.md D8–D10, D13–D14, D16–D27; review-2.md; c137 bones.md §5 (a message ends when its action completes) and §9 (the audit log keeps message.sent and message.done); R4 (the record is proof, not surveillance).
Its training field names the training (D2). The plane sends the assignment and writes message.sent; that send is the only assignment record.
The person's notice in c137's three sentences; one action, start-training (D8). No acknowledgement, not even seen (bones §5).
Lesson, check, Finish. The person sees what will be written before it is (D14); nothing reaches the plane before that press (D13). Not passed, no record (D3).
One small event in qevents' existing pattern: a tagged enum, type and payload, dotted names (D23). Its own type per assigner, so the audit log reads who asked without opening the message (D27). The proto; the names are Tyler's to adjust.
Wraps the event with the links (record, finding, training, message) and the finding's context: the richer object every read uses (D23). One grouped object per completion, in Mark's words: type training · completed · training { id, name } · proof of understanding true (D25).
One row per event. The finding reads it by finding_id, Reports sum it; a table of its own only if a read needs it (D22). The two message rows are c137's already (bones §9).
| when | event | actor | subject |
|---|---|---|---|
| the send | message.sent | HQ (the policy) | training-assignment to the person on the endpoint |
| completed_at | training.completed.policy | the person | T-MCP-1 v1 · the finding · proof of understanding, 4 of 4 |
| completed_at | message.done | the app | the assignment, ended on training-completed |
Today: one history row, training completed, the status unchanged, the person as actor, the record as the cause (D16, D9). Once Tyler agrees the shape: a Corrections block under History, before Details, as the default; the history row stays as the same event (D19, D20).
c128's Findings report, counts only, as of the data cutoff (D10, D17): assigned, every finding under a policy with a training, from message.sent (D18); completed, from training.completed, with “in this window” beside it; waiting. Per training. No names; a finding counts as answered once (D25).
training-completed in the assignment's thread, quiet (c137). The thread's root ends with message.done; bones §5 says the app ends it on the action's completion, one of the open items.
Their Corrections block shows the training taken after a later one: the remediation is visible where the repeat was.
finding_id, the one link the event carries. Its history row and its Corrections block read the record directly.
What remediation comes next, read from the association, not from the event. Phase 5, with c134.