I read this as a test-only RED task - I’ll trace the real Telegram/profile/compiler/publication seams, add only intended failing behavioral tests, and verify focused failures without touching production code.


I’ve traced the current seams and the architecture fixture. I’m adding one isolated contract suite that exercises existing profile persistence plus production/preview publication paths; it will intentionally stop at behavioral RED, including the current first-field revision and three-item persistence defects.


The RED suite is syntactically clean. I’m now running it once as the focused target and will retain only failures caused by the missing compiler/commit-binding policy, removing any test that already passes or fails from harness mistakes.


I read this as completed RED-test delivery - I added only failing behavioral contracts and verified each failure maps to the missing root mechanism.

Added:

- `tests/gateway/test_nutrition_onboarding_clarification_policy.py`

Eight tests, 11 pytest cases due to the four-way sensitive-input parameterization:

1. `test_exact_natural_korean_fixture_compiles_without_issues_or_holds`
2. `test_production_discards_provider_questions_for_valid_fields`
3. `test_preview_cannot_publish_provider_questions_for_valid_fields`
4. `test_ambiguous_height_creates_one_stable_schema_owned_issue`
5. `test_sensitive_disclosure_creates_hold_never_clarification`
6. `test_later_issue_revision_binds_issue_field_and_both_digests`
7. `test_publication_reloads_committed_record_not_transient_provider_object`
8. `test_display_cap_preserves_complete_issue_set_across_recomputation`

Focused command:

```bash
cd /home/cube/projects/richard/hermes-agent
PYTHONPATH=/home/cube/.cache/task26-strict-successor-1786976146/src-p \
  .venv/bin/pytest -q \
  tests/gateway/test_nutrition_onboarding_clarification_policy.py
```

Result: `11 failed in 0.33s`, all intended RED:

- Natural Korean DOB remains raw instead of `1990-01-15`; the fixture also covers all 22 canonical values.
- Production persists all 22 provider-authored questions.
- Preview enters `clarifying` from malicious provider output.
- Reconciliation records have no deterministic `issues` contract.
- All four sensitive disclosures lack deterministic holds.
- Later revision actually binds `date_of_birth` instead of the supplied `schedule_constraints` issue and digests.
- Publication reads the committed record once and continues using the transient provider object.
- Persistence rejects five issues with `at most three clarifications`, proving the display cap currently destroys the complete issue set.

Static verification passed:

```text
ruff: All checks passed
py_compile: passed
git diff --check: passed
```

No production, profile, evidence, service, plan, todo, live-state, or Git metadata files were changed. Existing unrelated workspace changes were preserved. No requested case already passed, so all eight tests were retained.