---
title: "S31 bindings"
description: "Data-binding map of Global · Leave recording confirm: every field to its source, and what each required state shows."
source: "design/hifi/S31/bindings.md"
---

> Part of [Brand and design](/design/llms.txt). Every page: [llms.txt](/llms.txt).

# Data-binding map: S31 Global · Leave recording confirm

> Generated by `botgumi-design index` from `../../screens.json`. Edit that file, not this page.

Every field [S31](/design/hifi/s31/index.md) shows and where it comes from.

| Field | Source (endpoint or local state) | Format | Fallback |
|---|---|---|---|
| leave recording | `local recorder.effectiveMs` · `local:recorder.effectiveMs` | — | — |
| `derived: recorder.effectiveMs ≥ session.min_valid_ms` | `derived recording_long_enough` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `local discard (or POST /v1/attempts/{id}/discard if registered)` | `call POST /attempts/{attempt_id}/discard` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `local:recorder.state` | `local recorder.state` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.max_round1_ms` | `api GET /sessions/{session_id} max_round1_ms` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.previous_focus.title` | `api GET /sessions/{session_id} previous_focus.title` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.stage → derived step` | `api GET /sessions/{session_id} stage` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |

## Derived values

Computed on device; each from the sources it names.

| Value | From | How |
|---|---|---|
| `recording_long_enough` | `local recorder.effectiveMs`, `api GET /sessions/{session_id} min_valid_ms` | Stop is enabled once the recording reaches the minimum valid length. |

## Binds on the boards

The `data-bind` values across every state.

- `derived: recorder.effectiveMs ≥ session.min_valid_ms`
- `local discard (or POST /v1/attempts/{id}/discard if registered)`
- `local:recorder.effectiveMs`
- `local:recorder.state`
- `session.max_round1_ms`
- `session.previous_focus.title`
- `session.stage → derived step`

## States

- Loading: From [states.md](/design/states/index.md) (Global sheets): —
- Empty: From [states.md](/design/states/index.md) (Global sheets): —
- Error (retryable / not): From [states.md](/design/states/index.md) (Global sheets): — · fatal: [error--generic](/design/gallery/global/error--generic.html), [force-update--default](/design/gallery/global/force-update--default.html)
- Offline: From [states.md](/design/states/index.md) (Global sheets): [offline--toast](/design/gallery/global/offline--toast.html)
