No Separate Interview Event Log
Why the app does not keep a separate interview-event log table
Amended 2026-07-31 — the revisit clause fired
The third revisit condition below ("a compliance or audit requirement needs
structured, non-transcript interview events") has fired. Agenda-driven
interview turns move grounding out of tool calls, so the audit moves with
it into an append-only interviewTurnEvents table — modelled on
authEvents, exactly as the closing paragraph of this record prescribed.
See The Turn Audit Log Is a First-Party
Table for the superseding
record. What survives here is the analytics reasoning: this record's
rejection of a defer/decline and branch-decision event stream stands
unchanged, and interviewTurnEvents is not that stream.
Decision
The app will not add a structured interview-event log table (e.g. interviewEvents recording interview.ask, interview.answer, interview.defer, interview.branch).
Both app and local workflows persist current extracted state; the app also relies on the Agent transcript for conversation history.
Context
The local skill is filesystem-based. It has no database and should stay easy to inspect and edit by hand, so current state lives in document_input/: module values, status, edited_at, and optional status_reason.
The app gets the same coverage from two existing surfaces:
- Live
moduleVersionsrows (convex/schema.ts) — the live head stores extracteddata,interviewStatus, optionalstatusReason,editedAt, andcreatedBy. This records the current outcome and when it last changed. - Convex Agent
messages(Messages Schema) — the full conversational transcript per thread reconstructs what was said around each change.
Why not add the log anyway
A structured event log would mostly duplicate what current module state and the transcript already capture. Specifically:
- Current outcome ("what changed most recently") — covered by
moduleVersions.editedAtandcreatedBy. - Resume ("where was the user up to") — covered by saved
data,interviewStatus,statusReason, and the Agent thread. - Replay of the conversation — covered by Agent
messages.
The only product questions a dedicated event log would answer better than the existing surfaces are:
- Defer/decline analytics across users ("which fields get deferred most?"). The Agent thread holds conversational context, not a structured analytics surface.
- Branch decisions that leave no data trace (e.g. "no backup executor" — the field is simply absent in
moduleVersions, recoverable from the transcript but not queryable).
Until one of those questions is load-bearing for the product, the cost of a third write path on every interview turn is not justified.
Revisit when
- A product surface needs queryable defer/decline analytics that the Agent thread cannot answer.
- A compliance or audit requirement needs structured (non-transcript) interview events.
- Branch-decision history becomes a first-class product concept rather than a reconstruction.
If any of those land, model the new table on authEvents — append-only, typed eventType, metadata blob, indexed by the relevant scope keys.
The second condition landed on 2026-07-31 and took this prescription literally — see The Turn Audit Log Is a First-Party Table. The first and third remain open.
The Folio Tiers Share Parts, Not a Recipe
Why there is no shared folio card composer — a shared behaviour is promoted into the Stack molecule as a slot default the tier mounts and wires, never a shell the tier configures with flags
One Chrome and Kind Accents
Three chrome shades named by depth, one blue spine ramp for every card, and — since 2026-09-22 — one blue for every kind mark, because colour says chrome, not kind