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

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

# Data-binding map: S23 Complete · Complete

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

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

| Field | Source (endpoint or local state) | Format | Fallback |
|---|---|---|---|
| eyebrow | `api GET /sessions/{session_id} kind` · `session.kind`, `settlement.replayed` | — | — |
| eyebrow | `api POST /sessions/{session_id}/complete replayed` |  |  |
| headline / subline | `api POST /sessions/{session_id}/complete headline` · `settlement.headline / subline` (Accept-Language) | — | `complete.headline.<verdict>` |
| headline / subline | `api POST /sessions/{session_id}/complete subline` |  |  |
| icon + rays | `api POST /sessions/{session_id}/complete comparison.verdict` · `settlement.comparison.verdict` | trophy only for `improved` | — |
| before/after | `api POST /sessions/{session_id}/complete round1_overall` · `settlement.round1_overall / round2_overall`, durations (**CCR-9**) | count-up r1→r2 | — |
| before/after | `api POST /sessions/{session_id}/complete round2_overall` |  |  |
| session delta | `api POST /sessions/{session_id}/complete comparison.overall_delta` · `settlement.comparison.overall_delta`, `duration_delta_ms` | `±N`, `secs_delta` | — |
| session delta | `api POST /sessions/{session_id}/complete comparison.duration_delta_ms` |  |  |
| lost points | `api POST /sessions/{session_id}/complete comparison.key_points_lost[]` · `comparison.key_points_lost[]` (article language) | warning banner | hidden when empty |
| XP tile | `api POST /sessions/{session_id}/complete xp.awarded` · `settlement.xp.awarded` | count-up `+N` | — |
| streak tile | `api POST /sessions/{session_id}/complete streak.current` · `settlement.streak.current`, `streak_incremented` | `+1` only when incremented and not replayed | — |
| streak tile | `api POST /sessions/{session_id}/complete streak_incremented` |  |  |
| ability tile | `api POST /sessions/{session_id}/complete ability_after` · `ability_after − ability_before`; `ability_sample_count < 3` → "building baseline n/3" | separate from session delta | — |
| ability tile | `api POST /sessions/{session_id}/complete ability_sample_count` |  |  |
| level card | `api POST /sessions/{session_id}/complete level_after.level` · `level_after.level / title (Accept-Language) / xp_into_level / xp_for_next`; animation from `level_before` | bar fill 900 ms | — |
| level card | `api POST /sessions/{session_id}/complete level_after.title` |  |  |
| level card | `api POST /sessions/{session_id}/complete level_after.xp_into_level` |  |  |
| level card | `api POST /sessions/{session_id}/complete level_after.xp_for_next` |  |  |
| level card | `api POST /sessions/{session_id}/complete level_before.level` |  |  |
| XP lines | `api POST /sessions/{session_id}/complete xp.breakdown[]` · `xp.breakdown[]` (**CCR-10**), missing improve shown struck through | — | — |
| cap / repeat notes | `api POST /sessions/{session_id}/complete xp.daily_cap_hit` · `xp.daily_cap_hit`, `xp.repeat_discount` | `complete.xp.cap_hit` / `.repeat` | — |
| cap / repeat notes | `api POST /sessions/{session_id}/complete xp.repeat_discount` |  |  |
| weekly quests | `api POST /sessions/{session_id}/complete weekly_quests.quests[]` · `settlement.weekly_quests.quests[]` (titles Accept-Language) | bars | — |
| next focus | `api POST /sessions/{session_id}/complete next_suggestion.title` · `settlement.next_suggestion.title / instruction` (Accept-Language) | — | — |
| next focus | `api POST /sessions/{session_id}/complete next_suggestion.instruction` |  |  |
| level-up overlay | `api POST /sessions/{session_id}/complete level_after.level` · `level_after.level > level_before.level` | overlay | — |
| achievement sheet | `api POST /sessions/{session_id}/complete achievements_unlocked[]` · `achievements_unlocked[]` (Accept-Language), `plan_day_completed` | sheet per item, queued | — |
| achievement sheet | `api POST /sessions/{session_id}/complete plan_day_completed` |  |  |
| replayed banner | `api POST /sessions/{session_id}/complete replayed` · `settlement.replayed`, `settled_at` | date + time | — |
| replayed banner | `api POST /sessions/{session_id}/complete settled_at` |  |  |
| `session.attempts[round=1].duration_ms` | `api GET /sessions/{session_id} attempts[].duration_ms` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.attempts[round=2].duration_ms` | `api GET /sessions/{session_id} attempts[].duration_ms` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.ability_after (− ability_before)` | `api POST /sessions/{session_id}/complete ability_after` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.ability_sample_count` | `api POST /sessions/{session_id}/complete ability_sample_count` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.achievements_unlocked[0].description` | `api POST /sessions/{session_id}/complete achievements_unlocked[].description` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.achievements_unlocked[0].title` | `api POST /sessions/{session_id}/complete achievements_unlocked[].title` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.comparison.duration_delta_ms` | `api POST /sessions/{session_id}/complete comparison.duration_delta_ms` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.comparison.key_points_lost[] (article language)` | `api POST /sessions/{session_id}/complete comparison.key_points_lost[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.headline (Accept-Language)` | `api POST /sessions/{session_id}/complete headline` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.level_after.level` | `api POST /sessions/{session_id}/complete level_after.level` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.level_after.level + title` | `api POST /sessions/{session_id}/complete level_after.level` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.level_after.level + title` | `api POST /sessions/{session_id}/complete level_after.title` |  |  |
| `settlement.level_after.xp_into_level / xp_for_next` | `api POST /sessions/{session_id}/complete level_after.xp_into_level` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.level_after.xp_into_level / xp_for_next` | `api POST /sessions/{session_id}/complete level_after.xp_for_next` |  |  |
| `settlement.level_after.xp_total / xp_for_next` | `api POST /sessions/{session_id}/complete level_after.xp_total` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.level_after.xp_total / xp_for_next` | `api POST /sessions/{session_id}/complete level_after.xp_for_next` |  |  |
| `settlement.next_suggestion.instruction` | `api POST /sessions/{session_id}/complete next_suggestion.instruction` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.plan_day_completed` | `api POST /sessions/{session_id}/complete plan_day_completed` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.replayed + settled_at` | `api POST /sessions/{session_id}/complete replayed` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.replayed + settled_at` | `api POST /sessions/{session_id}/complete settled_at` |  |  |
| `settlement.round2_overall` | `api POST /sessions/{session_id}/complete round2_overall` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.streak.current + streak_incremented` | `api POST /sessions/{session_id}/complete streak.current` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.streak.current + streak_incremented` | `api POST /sessions/{session_id}/complete streak_incremented` |  |  |
| `settlement.subline (Accept-Language)` | `api POST /sessions/{session_id}/complete subline` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.weekly_quests.quests[0]` | `api POST /sessions/{session_id}/complete weekly_quests.quests[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.weekly_quests.quests[1]` | `api POST /sessions/{session_id}/complete weekly_quests.quests[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.weekly_quests.quests[2]` | `api POST /sessions/{session_id}/complete weekly_quests.quests[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[0].type` | `api POST /sessions/{session_id}/complete xp.breakdown[].type` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[0].xp` | `api POST /sessions/{session_id}/complete xp.breakdown[].xp` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[1].type` | `api POST /sessions/{session_id}/complete xp.breakdown[].type` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[1].xp` | `api POST /sessions/{session_id}/complete xp.breakdown[].xp` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[2].type` | `api POST /sessions/{session_id}/complete xp.breakdown[].type` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[2].xp` | `api POST /sessions/{session_id}/complete xp.breakdown[].xp` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[3].type` | `api POST /sessions/{session_id}/complete xp.breakdown[].type` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `settlement.xp.breakdown[3].xp` | `api POST /sessions/{session_id}/complete xp.breakdown[].xp` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |

## Binds on the boards

The `data-bind` values across every state.

- `session.attempts[round=1].duration_ms`
- `session.attempts[round=2].duration_ms`
- `session.kind`
- `settlement.ability_after (− ability_before)`
- `settlement.ability_sample_count`
- `settlement.achievements_unlocked[0].description`
- `settlement.achievements_unlocked[0].title`
- `settlement.comparison.duration_delta_ms`
- `settlement.comparison.key_points_lost[] (article language)`
- `settlement.comparison.overall_delta`
- `settlement.headline (Accept-Language)`
- `settlement.level_after.level`
- `settlement.level_after.level + title`
- `settlement.level_after.xp_into_level / xp_for_next`
- `settlement.level_after.xp_total / xp_for_next`
- `settlement.next_suggestion.instruction`
- `settlement.next_suggestion.title`
- `settlement.plan_day_completed`
- `settlement.replayed + settled_at`
- `settlement.round1_overall`
- `settlement.round2_overall`
- `settlement.streak.current + streak_incremented`
- `settlement.subline (Accept-Language)`
- `settlement.weekly_quests.quests[0]`
- `settlement.weekly_quests.quests[1]`
- `settlement.weekly_quests.quests[2]`
- `settlement.xp.awarded`
- `settlement.xp.breakdown[0].type`
- `settlement.xp.breakdown[0].xp`
- `settlement.xp.breakdown[1].type`
- `settlement.xp.breakdown[1].xp`
- `settlement.xp.breakdown[2].type`
- `settlement.xp.breakdown[2].xp`
- `settlement.xp.breakdown[3].type`
- `settlement.xp.breakdown[3].xp`

## States

- Loading: From [states.md](/design/states/index.md) (Complete): skeleton blocks while `/complete` runs (idempotent; safe to retry)
- Empty: From [states.md](/design/states/index.md) (Complete): —
- Error (retryable / not): From [states.md](/design/states/index.md) (Complete): Retry (same Idempotency-Key) · fatal: 409 precondition → back to the feedback of the missing round
- Offline: From [states.md](/design/states/index.md) (Complete): queued; shows "will settle when online"
