Evidence Store
Durable, per-session QA evidence tray: the flagged items a bug report is built from, plus its typed draft. This is the server-side precedent io.devconsole.timeline.TimelineAnnotations already set for durable, per-subject annotations -- evidence is a second, richer instance of the same idea, not a new pattern.
Implementations enforce the caps a usable bug report needs: a bounded snapshot size (truncated with an explicit marker rather than silently dropped), a bounded item count per session, and bounded text field lengths on the report draft. Callers at the route boundary should validate the same limits up front so a rejection is reported precisely, but the store enforces them unconditionally -- it never trusts a caller to have done so.
Functions
Removes every evidence item and the report draft for sessionId.
Flags item; returns EvidenceWriteResult.AlreadyFlagged if its subject is already flagged.
The report draft for sessionId, or a fresh default one if nothing has been saved yet.
Replaces the report draft for report's session.
Removes one flagged item by its (session, kind, subject) identity. A no-op if it is not flagged.