I read this as a security/fault investigation into how an initial summary card is generated in hermes-agent and its live profile, testing hypothesis H2 about authority selection during reconciliation. My plan: inspect the codebase structure, find the summary/reconciliation generation code, locate the live profile state, and trace the message/authority chain without modifying anything or calling the network.

<analysis>
**Literal Request**: Determine which generation/message built a "bad card" (initial summary), which authority fields it used, and whether a timing/projection mismatch explains symptoms (`미입력`, bad health warning), returning file:line source chains and hashes. Inspect only durable redacted state.

**Actual Need**: Confirm or refute Hypothesis H2 - that the initial summary card incorrectly mixes stale pre-clarification answers with derived/confirmed baseline values because reconciliation selects the wrong authority. The caller needs the exact code path, data, and call chain to justify a fix.

**Success Looks Like**: A concrete source chain (file:line + hashes) showing where reconciliation picks the authority, which message IDs/generations fed the evaluated card, and the timing/projection data that explains the observed symptoms, OR a clean refutation of H2 with evidence.
</analysis>

Let me start with parallel exploration of the codebase.


The `dualcoachtest` pattern didn't match. Let me locate the dualcoach profile and the reconciliation code.


Let me read the reconciliation code and the card generation code, and check the available live-profile durable state.


This is a large investigation. Let me look at the live profile's durable state and search for prior investigation of the "initial summary" card authority problem.


This is a parallel 3-task investigation (siblings `st_01a00a91` summary-copy-logic and `st_01a00a93` summary-ux-review). My scoped focus is **summary-authority-timing**. Let me trace where authority is selected for the summary and where the summary card is persisted in the live profile.


The initial summary card is built in `telegram_nutrition_onboarding_runtime_publication.py`. Let me read the publication/authority selection logic and explore the durable onboarding state.


Now let me trace the authority selection and reconciliation-answers derivation, plus inspect the durable outbox state in the live profile.


The domain logic (`service.reconciliation_answers`, `record_reconciliation`, `revise_reconciliation_answer`, `current_index`) lives in the live profile's `checkin_cli` package. Let me locate and examine those, and inspect the durable outbox ledger.


The durable outbox shows generations 0-21 collecting, gen 23 (msg 205) entering `customer_attestation` with `clarification_field: activity_category`, and gen 24 (msg 207) the final attestation summary with a different answers_digest. Let me read the domain reconciliation logic and the reconciliation schema.


The path has a nested `checkin_cli/checkin_cli`. Let me verify the structure.


Let me read the session-domain constructor, `submit_answer`, and baseline handling in the live profile's onboarding code to see where answers and baseline get merged.


Let me find the live customer's onboarding session document (the durable `transient/workflow.json`) and the reconciliation record it contains.


The durable reconciliation record and final session (gen 24 / msg 207) confirm the card source. Let me verify the field-schema mismatch by reading the contract, and cross-check where this specific card's digest is referenced in prior evidence.


I have strong confirmation and cross-validation from sibling task `st_01a00a93`. Let me pin exact line numbers in the hermes-agent renderer to complete the source chain.


I have a complete, verified source chain and durable-state cross-validation (sibling task `st_01a00a93` independently reproduced the same renderer defects). Compiling the final findings.

<results>
<files>
- /home/cube/.hermes/profiles/dualcoachtest/data/customers/task26_live_2e_r2_20260815_8527916639/nutrition-onboarding/transient/workflow.json - Durable reconciliation/answers authority that built the card: answers + reconciliation record (advisory, clarifications, current_index=1, resolved), authority_digest 8856ca51...
- /home/cube/.hermes/profiles/dualcoachtest/data/customers/task26_live_2e_r2_20260815_8527916639/nutrition-onboarding/session.json - Durable outbox/session pin: generation 24, message 207, answers_digest ade50836..., body_digest 3230cb1a...
- /home/cube/.hermes/profiles/dualcoachtest/data/onboarding/telegram-publication-outbox-v1/ledger.json - Full publication chain: generations 0-21 collecting, gen 23 msg 205 (activity_category clarification), gen 24 msg 207 (final attestation summary card)
- /home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py - `_publish()` splice point: authority→answers→record reuse→summary_ko override (lines 89-90, 96-110, 116, 127-132)
- /home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_authority.py - `_authority()`/`_current_authority()`: the authority identity source (lines 88, 152)
- /home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_onboarding_reconciliation.py - `render_authoritative_customer_summary()`: the defective renderer that emits `미입력` and the false health warning (lines 59-106; "검토할 입력이 있습니다" at 77, `goal`/`training_details` reads at 90/92-94, health at 105)
- /home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_onboarding_reconciler.py - The advisory LLM reconciler that produced the (now stale) advisory
- /home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py - Domain: `reconciliation_answers`/`record_reconciliation`/`replace_stale_reconciliation`/`revise_reconciliation_answer`/`advance_reconciliation`; where answers and advisory are persisted (lines 414-615), and `revision` reopen path
- /home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_reconciliation.py - Persisted reconciliation schema/digest rules; clarifies why a resolving record keeps the old advisory
- /home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_contract.py - Canonical `QUESTION_FIELDS` (goal_type, conditions, pregnancy_breastfeeding, structured dicts) vs the renderer's expected field names (goal, medical_conditions, pregnancy_lactation, flat strings)
</files>

<answer>
**Bad card identity (durable hashes)**
- The initial/attestation summary card was built and published at **generation 24, message 207**, session `cb_PCczfFXoI4GjvCxLBs1oRA`, customer `task26_live_2e_r2_20260815_8527916639` (dualcoachtest).
- Session record: `answers_digest=ade50836f2d6c4500785cb881fd90038daca3fb9070c4e094e61d1614f27703e`, `body_digest=3230cb1a3c13f8e164c2171148c6e3183cbce0d36289cc647c10634b840d8060` (`session.json`).
- Reconciliation record used to render it: `digest=6c41af10d0c00742f0984f1e56776db1989cc59662b302daf2dc38b5ad74b294`, state `resolved`, `current_index=1`, same `answers_digest`. Authority: `authority_digest=8856ca5146cd74a6e9ed05dcd06747a694cd4f8415ee0575d673d04c9e310f09` (`workflow.json`).
- Preceding events in `ledger.json`: gen 23 / msg 205 entered `customer_attestation` with `clarification_field=activity_category` (answers_digest b41b0054...); gens 0-21 (msgs 161-203) are plain `collecting` questions.

**Authority fields it used (source chain)**
1. `_publish` selects authority: `telegram_nutrition_onboarding_runtime_publication.py:89` `authority = self._current_authority(session)`, `:90` `answers = service.reconciliation_answers(authority=authority)`.
2. Authority identity is derived in `telegram_nutrition_onboarding_runtime_authority.py:88 _authority()` and `:152 _current_authority()`, then validated against the registry. The identity is **correct and consistent** (`authority_digest` matches the session; consent_granted=True, customer_enabled=False). The wrong-authority claim as an identity-selection failure is NOT supported.
3. The advisory is NOT re-run for the final card: `:96-110` reuses the persisted record (digest 6c41af10) because `record["answers_digest"] == answers_digest`, so `reconciliation = reconciliation_from_payload(record["advisory"])`. That advisory is the **pre-clarification** one (only activity_category was clarified at gen 23).
4. The summary is then spliced: `:127-132` — because `current_index` (1) is truthy, `summary_ko = render_authoritative_customer_summary(answers)` using the **post-clarification** `answers`; then `:133-136` drops ambiguities/contradictions/clarifications but keeps `facts_ko` and `safety_observations_ko` from the stale advisory.

**Confirmed: H2 is a real mixing bug, but its exact mechanism is a persistence/timing mismatch, not a wrong authority identity.** The reconciliation record is advanced across the clarification revision by `revise_reconciliation_answer()` → `advance_reconciliation()` (checkin_cli/nutrition_onboarding.py:529; nutrition_onboarding_reconciliation.py `advance_reconciliation`), which updates `answers_digest` + `current_index`/`state` **without regenerating `advisory`**. So at gen 24 the staleness guard compares digest ade50836 == current ade50836 and passes, treating the stale advisory as authoritative. The published card mixes (a) a freshly derived summary from post-clarification answers with (b) stale pre-clarification facts/safety copy describing only "주 3회 근력운동" (no 60-min intensity, no 6000-8000 steps).

**How the two visible symptoms are produced (this is H1 layered on H2):**
- `미입력` and the **bad health warning** come from a field-schema mismatch in `render_authoritative_customer_summary` (`nutrition_onboarding_reconciliation.py:59-106`), NOT from authority selection:
  - It reads `value('goal')` (`:90`), `value('training_details')` (`:92-94`), `value('medical_conditions')`/`pregnancy_lactation` (`:73-77`) — but the live `answers` schema (`nutrition_onboarding_contract.py QUESTION_FIELDS`) uses `goal_type`, no `training_details`, `conditions`, `pregnancy_breastfeeding`, and structured dicts `{"status":"none","items":[]}` for allergies/intolerances/conditions/medications. Result: `goal` missing → `목표: 미입력`; `training_details` missing → `활동: <activity_category> · 미입력`; allergy/restriction block prints the raw dict.
  - Health check (`:76-77`) flags "검토할 입력이 있습니다" because `medications` is a dict (stringified, not in {없음,해당 없음,아니요}) and `eating_disorder_risk` is boolean `False` → `"False"`, a **false-positive review warning**, even though the stored `advisory.safety_observations_ko` correctly says nothing needs review. This is a projection/timing mismatch between the renderer's assumed field/type shape and the real answers shape.

**Net verdict:** H2 confirmed in substance — the initial summary card does fuse stale pre-clarification advisory content with a freshly derived override — but the specific `미입력`/health-warning visual defects are caused by the renderer's field-name/type mismatch against the actual answers schema, which is independent of authority. No authority identity error was found; the fault is (1) advisory not refreshed on clarification resolution and (2) `render_authoritative_customer_summary` mapping non-EXISTENT field names (goal, training_details, medical_conditions, pregnancy_lactation, religious_restrictions) / flat-string assumptions onto the real structured schema (goal_type, conditions, pregnancy_breastfeeding, religious_ethical_exclusions, `{status,items}` dicts, booleans).
</answer>

<next_steps>
The two defects should be treated as separate fixes:
1. **Refresh/authority timing (H2):** in `telegram_nutrition_onboarding_runtime_publication.py` `_publish()` (or `advance_reconciliation` in checkin_cli/nutrition_onboarding_reconciliation.py), either regenerate the advisory once the reconciliation reaches `resolved` with a changed `answers_digest`, or stop overriding `summary_ko`/carrying stale `facts_ko`/`safety_observations_ko` from the pre-revision record. Guard on `(record.answers_digest == current answers_digest)` is insufficient when the digest was advanced by the clarification itself.
2. **Renderer schema (H1):** align `render_authoritative_customer_summary` (hermes-agent `gateway/platforms/nutrition_onboarding_reconciliation.py:59-106`) with the real `QUESTION_FIELDS`/answer shapes (goal_type, training_details/activity_rationale, conditions, pregnancy_breastfeeding, religious_ethical_exclusions, and `{status,items}` structured fields with `미입력` for `status=="none"`), so `미입력` and the false "건강 관련 입력: 검토할 입력이 있습니다" disappear.

Verification done: read-only; confirmed against durable `workflow.json`, `session.json`, `ledger.json`, and both the hermes-agent source and the live profile's `checkin_cli` domain code; cross-validated with sibling task `st_01a00a93` which independently reproduced the same renderer defects. No files modified, no network/service access.
</next_steps>
</results>