# NutriCoach customer questionnaire and check-in UX successor

## Result

- Source implementation: PASS
- Disposable customer simulation: PASS
- Live profile writes: 0
- Telegram messages: 0
- Outbound network events: 0
- Production deployment: not performed

## Customer-facing improvements

- Consent action now states that it starts nutrition onboarding.
- The 22-question onboarding explains duration and progress.
- Onboarding exposes Back, Skip, and Continue later controls.
- Common Korean answers and numbered choices are canonicalized.
- Unclear closed choices are rejected immediately at the same question.
- Invalid answers restate the exact field example without saving bad input.
- Daily check-in accepts `kg`, `kcal`, `리터`, `시간`, and labeled macros.
- Daily digestion exposes a normal one-tap answer.
- Daily exercise exposes no-workout and direct-entry actions.
- Duplicate optional-note skip controls were removed.
- Review, safety hold, and saved-state messages explain the next step.

## Simulation evidence

### Post-consent onboarding

- Invalid `남자 같아요`: rejected without cursor movement.
- `1990. 3. 2.` -> `1990-03-02`
- `남자` -> `male`
- activity `3` -> `moderate`
- `살 빼기` -> `loss`
- `없어요` -> structured none
- pregnancy `2` -> false
- `보통 하루 세끼 먹어요` -> 3
- Back, Skip, Defer, restart/resume: PASS
- Validation issues: 0
- Safety holds: 0
- Final customer state: owner review

### Daily check-in

- Invalid macros remained at the macros question with a field-specific example.
- Unit-bearing inputs were accepted and canonicalized.
- Defer and restart/resume returned to the exact field.
- Normal digestion stored as `normal`.
- No-workout one-tap stored an empty training summary.
- Edit and final save produced exactly one nutrition-checkin event.

## Verification

- Focused UX and onboarding: 94 passed
- Full Telegram check-in suite with pytest-asyncio: 90 passed
- Ruff: PASS
- New UX type surface: 0 errors, 0 warnings, 0 notes

## Production boundary

The active r39 runtime is immutable and does not contain these source changes.
Deployment requires a fresh sealed successor package and a new exact one-use
authorization. The existing r39 authority must not be reused.
