Brand and design · Hi-fi screens · S21 Feedback · Feedback
Data-binding map: S21 Feedback · Feedback
Data-binding map of Feedback · Feedback: every field to its source, and what each required state shows.
Generated by
botgumi-design indexfrom../../screens.json. Edit that file, not this page.
Every field S21 shows and where it comes from.
| Field | Source (endpoint or local state) | Format | Fallback |
|---|---|---|---|
| "You did it ✓" | api GET /attempts/{attempt_id} assessment.achieved_previous_action · assessment.achieved_previous_action = true + previous_action → micro-skill title |
success banner, first element | — |
| "You did it ✓" | api GET /attempts/{attempt_id} assessment.previous_action |
||
| "not yet" line | api GET /attempts/{attempt_id} assessment.achieved_previous_action · achieved_previous_action = false |
neutral row | hidden when null |
| low-confidence | api GET /attempts/{attempt_id} assessment.confidence · assessment.confidence = low + confidence_note (article language) |
warning banner | generic sentence |
| low-confidence | api GET /attempts/{attempt_id} assessment.confidence_note |
||
| score ring | api GET /attempts/{attempt_id} assessment.overall · assessment.overall, band (colour), band_label (Accept-Language) |
104pt ring | — |
| score ring | api GET /attempts/{attempt_id} assessment.band |
||
| score ring | api GET /attempts/{attempt_id} assessment.band_label |
||
| summary | api GET /attempts/{attempt_id} assessment.summary · assessment.summary (article language) |
title3 | — |
| dimension name | api GET /attempts/{attempt_id} assessment.dimensions · dimension.<key> client key (or API label) |
— | — |
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.key_info.note · assessment.dimensions.<key>.note / score / evidence_ids[0] → evidence.start_ms |
mm:ss chip |
insufficient_evidence → dimension.insufficient |
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.key_info.score |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.key_info.evidence_ids[] |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.structure.note |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.structure.score |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.structure.evidence_ids[] |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.efficiency.note |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.efficiency.score |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.efficiency.evidence_ids[] |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.fluency.note |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.fluency.score |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.dimensions.fluency.evidence_ids[] |
||
| dimension note / score / evidence chip | api GET /attempts/{attempt_id} assessment.evidence[].start_ms |
||
| one action | api GET /attempts/{attempt_id} assessment.one_action.title · assessment.one_action.title / instruction / example_sentence / evidence_id (article language) |
ink card | — |
| one action | api GET /attempts/{attempt_id} assessment.one_action.instruction |
||
| one action | api GET /attempts/{attempt_id} assessment.one_action.example_sentence |
||
| one action | api GET /attempts/{attempt_id} assessment.one_action.evidence_id |
||
| evidence list | api GET /attempts/{attempt_id} assessment.evidence[] · assessment.evidence[] sorted by start_ms |
quote + note | — |
| evidence list | api GET /attempts/{attempt_id} assessment.evidence[].start_ms |
||
| playback | api GET /attempts/{id}/audio url · GET /v1/attempts/{id}/audio → url (15-min TTL), local:player.positionMs |
seek start_ms, stop end_ms |
410 → feedback.evidence.expired |
| playback | local player.positionMs |
||
| key points | api GET /attempts/{attempt_id} assessment.key_point_coverage[] · assessment.key_point_coverage[] (article language) |
count derived: |
hide |
| exemplar | api GET /attempts/{attempt_id}/exemplar status · exemplar.status / text / duration_ms / label (label Accept-Language; text + voice in article language) |
pending skeleton / ready player / failed text + retry | unavailable → hide section |
| exemplar | api GET /attempts/{attempt_id}/exemplar text |
||
| exemplar | api GET /attempts/{attempt_id}/exemplar duration_ms |
||
| exemplar | api GET /attempts/{attempt_id}/exemplar label |
||
| meta | api GET /attempts/{attempt_id} assessment.rubric_version · assessment.rubric_version, model_ref, confidence |
caption | — |
| meta | api GET /attempts/{attempt_id} assessment.model_ref |
||
| meta | api GET /attempts/{attempt_id} assessment.confidence |
||
| helpful | call POST /assessments/{id}/feedback · POST /v1/assessments/{id}/feedback {helpful, reason?} |
thumbs; 👎 opens reason sheet | queued offline |
GET /v1/attempts/{id}/audio → url; local:player.positionMs |
call GET /attempts/{id}/audio · From the board's data-bind; no row in data-binding.md yet. |
||
GET /v1/attempts/{id}/exemplar → status |
api GET /attempts/{id}/exemplar status · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.achieved_previous_action + previous_action |
api GET /attempts/{attempt_id} assessment.achieved_previous_action · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.achieved_previous_action + previous_action |
api GET /attempts/{attempt_id} assessment.previous_action |
||
assessment.achieved_previous_action = false |
api GET /attempts/{attempt_id} assessment.achieved_previous_action · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.band_label (Accept-Language) |
api GET /attempts/{attempt_id} assessment.band_label · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.confidence + confidence_note |
api GET /attempts/{attempt_id} assessment.confidence · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.confidence + confidence_note |
api GET /attempts/{attempt_id} assessment.confidence_note |
||
assessment.dimensions.efficiency.note |
api GET /attempts/{attempt_id} assessment.dimensions.efficiency.note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.efficiency.score |
api GET /attempts/{attempt_id} assessment.dimensions.efficiency.score · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.fluency.note |
api GET /attempts/{attempt_id} assessment.dimensions.fluency.note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.fluency.score |
api GET /attempts/{attempt_id} assessment.dimensions.fluency.score · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.key_info.note |
api GET /attempts/{attempt_id} assessment.dimensions.key_info.note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.key_info.score |
api GET /attempts/{attempt_id} assessment.dimensions.key_info.score · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.structure.note |
api GET /attempts/{attempt_id} assessment.dimensions.structure.note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.dimensions.structure.score |
api GET /attempts/{attempt_id} assessment.dimensions.structure.score · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[0].note |
api GET /attempts/{attempt_id} assessment.evidence[].note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[0].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[0].transcript_excerpt |
api GET /attempts/{attempt_id} assessment.evidence[].transcript_excerpt · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[1].note |
api GET /attempts/{attempt_id} assessment.evidence[].note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[1].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[1].transcript_excerpt |
api GET /attempts/{attempt_id} assessment.evidence[].transcript_excerpt · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[2].note |
api GET /attempts/{attempt_id} assessment.evidence[].note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[2].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[2].transcript_excerpt |
api GET /attempts/{attempt_id} assessment.evidence[].transcript_excerpt · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[3].note |
api GET /attempts/{attempt_id} assessment.evidence[].note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[3].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[3].transcript_excerpt |
api GET /attempts/{attempt_id} assessment.evidence[].transcript_excerpt · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[4].note |
api GET /attempts/{attempt_id} assessment.evidence[].note · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[4].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[4].transcript_excerpt |
api GET /attempts/{attempt_id} assessment.evidence[].transcript_excerpt · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[id=ev_1].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[id=ev_2].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[id=ev_3].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[id=ev_5].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.evidence[id=ev_a1].start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.key_point_coverage[0].text |
api GET /attempts/{attempt_id} assessment.key_point_coverage[].text · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.key_point_coverage[1].text |
api GET /attempts/{attempt_id} assessment.key_point_coverage[].text · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.key_point_coverage[2].text |
api GET /attempts/{attempt_id} assessment.key_point_coverage[].text · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.one_action.evidence_id → evidence.start_ms |
api GET /attempts/{attempt_id} assessment.one_action.evidence_id · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.one_action.evidence_id → evidence.start_ms |
api GET /attempts/{attempt_id} assessment.evidence[].start_ms |
||
assessment.one_action.example_sentence |
api GET /attempts/{attempt_id} assessment.one_action.example_sentence · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.one_action.instruction |
api GET /attempts/{attempt_id} assessment.one_action.instruction · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.one_action.micro_skill_id |
api GET /attempts/{attempt_id} assessment.one_action.micro_skill_id · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.rubric_version + model_ref + confidence |
api GET /attempts/{attempt_id} assessment.rubric_version · From the board's data-bind; no row in data-binding.md yet. |
||
assessment.rubric_version + model_ref + confidence |
api GET /attempts/{attempt_id} assessment.model_ref |
||
assessment.rubric_version + model_ref + confidence |
api GET /attempts/{attempt_id} assessment.confidence |
||
assessment.summary (article language) |
api GET /attempts/{attempt_id} assessment.summary · From the board's data-bind; no row in data-binding.md yet. |
||
derived: count(key_point_coverage.covered) |
derived key_points_covered · From the board's data-bind; no row in data-binding.md yet. |
||
exemplar.duration_ms |
api GET /attempts/{attempt_id}/exemplar duration_ms · From the board's data-bind; no row in data-binding.md yet. |
||
exemplar.label |
api GET /attempts/{attempt_id}/exemplar label · From the board's data-bind; no row in data-binding.md yet. |
||
exemplar.status = failed |
api GET /attempts/{attempt_id}/exemplar status · From the board's data-bind; no row in data-binding.md yet. |
||
exemplar.status = pending |
api GET /attempts/{attempt_id}/exemplar status · From the board's data-bind; no row in data-binding.md yet. |
||
exemplar.text |
api GET /attempts/{attempt_id}/exemplar text · From the board's data-bind; no row in data-binding.md yet. |
||
session.stage = round2 |
api GET /sessions/{session_id} stage · 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 |
|---|---|---|
key_points_covered |
api GET /attempts/{attempt_id} assessment.key_point_coverage[].covered |
How many key points the retelling covered. |
Binds on the boards
The data-bind values across every state.
GET /v1/attempts/{id}/audio → url; local:player.positionMsGET /v1/attempts/{id}/exemplar → statusPOST /v1/assessments/{id}/feedbackassessment.achieved_previous_action + previous_actionassessment.achieved_previous_action = falseassessment.band_label (Accept-Language)assessment.confidence + confidence_noteassessment.dimensions.efficiency.noteassessment.dimensions.efficiency.scoreassessment.dimensions.fluency.noteassessment.dimensions.fluency.scoreassessment.dimensions.key_info.noteassessment.dimensions.key_info.scoreassessment.dimensions.structure.noteassessment.dimensions.structure.scoreassessment.evidence[0].noteassessment.evidence[0].start_msassessment.evidence[0].transcript_excerptassessment.evidence[1].noteassessment.evidence[1].start_msassessment.evidence[1].transcript_excerptassessment.evidence[2].noteassessment.evidence[2].start_msassessment.evidence[2].transcript_excerptassessment.evidence[3].noteassessment.evidence[3].start_msassessment.evidence[3].transcript_excerptassessment.evidence[4].noteassessment.evidence[4].start_msassessment.evidence[4].transcript_excerptassessment.evidence[id=ev_1].start_msassessment.evidence[id=ev_2].start_msassessment.evidence[id=ev_3].start_msassessment.evidence[id=ev_5].start_msassessment.evidence[id=ev_a1].start_msassessment.key_point_coverage[0].textassessment.key_point_coverage[1].textassessment.key_point_coverage[2].textassessment.one_action.evidence_id → evidence.start_msassessment.one_action.example_sentenceassessment.one_action.instructionassessment.one_action.micro_skill_idassessment.one_action.titleassessment.overallassessment.rubric_version + model_ref + confidenceassessment.summary (article language)derived: count(key_point_coverage.covered)exemplar.duration_msexemplar.labelexemplar.status = failedexemplar.status = pendingexemplar.textsession.stage = round2session.stage → derived step
States
- Loading: From states.md (Feedback): not reachable before
assessed - Empty: From states.md (Feedback): —
- Error (retryable / not): From states.md (Feedback): exemplar feedback--exemplar-failed; audio URL failure → toast · fatal: —
- Offline: From states.md (Feedback): cached assessment; playback & exemplar disabled with "needs network"