What lands in Call History
Every screen, field, tap, friction signal, action and identity the SDK reports ends up on the call record — here is exactly where each one shows up, and what it looks like.
Nothing needs instrumenting beyond what the screens already report. Each thing the SDK sends has one place it lands in Call History, on the session's panel and in the CSV export.
The mapping
| You call | The agent receives | Call History shows |
|---|---|---|
useGraineScreen / useGraineField | app_context — screen, fields, errors | What happened in the app · "opened privacy", "moved to favourites (from privacy)" |
useGraineTap / useGraineTrack | recent_events on the next context frame | What happened in the app · "tapped pay", "toggle_changed" |
| Friction rules (configure) | app_event with the sentence the agent hears | What happened in the app · "stalled on step: agent spoke up" / "rage taps: agent stayed quiet — it had spoken up moments before" |
client.reportEvent(...) | app_event | What happened in the app · a signal row, same shape |
useGraineAction handler results | the tool result the model reads | What the agent did in the app · action, arguments, ✓ / refused / timeout, and your handler's own message |
identify() | prompt variables + app_user | the name on the row and the panel header |
appVersion on the provider | app_version on the context frame | the record, for telling a build apart |
The panel also carries the transcript (both sides — on WebRTC the captions arrive over the control channel), Result (Completed for a web call), Talk Time (the conversation's length; a web call has no carrier duration), and cost.
Why a signal says the agent stayed quiet
A friction signal is a request, not a command. The agent stays quiet while
it is already talking, inside nudge.cooldownSeconds of its last
intervention, and past nudge.maxPerSession. The timeline records which —
it was mid-sentence, it had just spoken up, it had reached its limit —
so a product team can tell "the agent ignored a stuck customer" from "the
agent was already helping".
CSV
Web-call exports carry Contact Name, App Actions (one line per action,
with the app's reply) and App Timeline (one line per entry, oldest first),
beside the columns every call has.
What is not there
Only what the app reported. A screen that never called useGraineScreen
appears by route name only; a tap not wrapped in useGraineTap is not on the
timeline. Calls made before this was stored show a transcript and a status
and nothing of the above.

