I read this as a test-first source fix for the v6 profile normalization and redundant-clarification defect - I’ll locate the wheel’s authoritative source, reproduce the exact live flow in tests, implement the narrow boundary fix, and run the full requested verification without touching live state or Git metadata.


I’ve confirmed the defect spans the profile wheel package rather than Hermes gateway source. I’m now tracing the preserved wheel back to its non-live source copy and comparing package hashes before writing the RED tests, so the fix does not mutate either live profile workspace.


The source-to-wheel comparison is exact for the affected modules (`src-p` matches the preserved `fb48…` wheel byte-for-byte). I’m starting the test-first change there: one full 22-answer regression for `넵 남성입니다`, plus contract tests for canonical options, safe exact polite forms, redundant clarification suppression, and preservation of unresolved ambiguity/contradiction.


RED reproduced as an import/behavior gap; GREEN focused tests now pass (49). The fix canonicalizes at both collection and clarification-resolution boundaries, rejects non-enum clarification resolutions before persistence, and drops only equation-basis clarifications when the stored answer is already one of the three canonical choices; ambiguous raw answers still retain ambiguity/contradiction workflows. I’m moving through static checks, compileall, and the full profile suite now.


I read this as completing the test-first profile-source fix - the authoritative source is fixed, fully verified, and ready to reseal without deployment.

## Result

**RED**
- Exact flow failed at collection: `canonical_equation_sex_basis` was absent, reproducing the missing boundary normalization.
- Original preserved wheel: `fb48a1931828ee60ab3812faf795550bf4e672a54c56f78cd10dcf674c45560d`.

**GREEN**
- Focused tests: **51 passed**
- Full profile suite: **705 passed**
- Ruff: **75 Python files, all checks passed**
- basedpyright on changed source: **0 errors, 0 warnings**
- compileall: **PASS**
- Added coverage: **22 parameterized cases**

## Changed files

Under `/home/cube/.cache/task26-strict-successor-1786976146/src-p`:

- `checkin_cli/nutrition_onboarding.py`
- `checkin_cli/nutrition_onboarding_models.py`
- `tests/test_nutrition_onboarding.py`
- `tests/test_nutrition_onboarding_models.py`

## Exact normalization contract

Normalization applies NFC, whitespace trim/collapse, and case-folding, followed by an **exact 32-entry lookup**—never substring matching.

Accepted outputs remain exactly:

- `male`
- `female`
- `decline`

Accepted forms include:

- Direct Korean: `남성`, `남성입니다`, `여성`, `여성입니다`, `선택 안 함`, `선택 안 합니다`, `선택하지 않겠습니다`
- Exact Korean affirmatives using `네`, `넵`, or `예`, with optional comma, followed by `남성입니다` or `여성입니다`
- English: canonical values; exact `yes`/`yep` male/female forms with optional comma
- Decline: `prefer not to say`, `I prefer not to say`

Unsupported or compound text is not guessed. It remains available for genuine reconciliation during initial collection, but an equation-sex clarification cannot resolve until its answer maps exactly to one of the three enum values.

Canonical male, female, and decline selections suppress redundant equation-sex clarification. Noncanonical inputs preserve both ambiguity and contradiction clarification behavior.

No live profile, evidence, service, Git, plan, or todo state was changed. Source is ready to reseal; it was not built or deployed.