I read this as a read-only runbook synthesis - I’ll trace the current source, plan, and sealed evidence, then return one exact role-separated action sheet with waits and any unverified labels flagged.


The governing plan confirms this is a fresh-lineage strict replacement, not the older Task21-25 rehearsal. I’m now narrowing to the sealed strict candidate’s exact UI keys and lifecycle handoff receipts so the sheet does not inherit superseded labels or the old check-in ordering.


The customer-facing contracts are now pinned: 22 onboarding fields and the 12-answer nutrition check-in. The calorie ambiguity resolves to one nutrition-daily calorie answer; the other occurrence belongs to a different morning-flow schema and must not be inserted into this strict customer flow. I’m finishing the role handoffs and cleanup labels against the sealed v3/runtime controls.


I read this as a read-only rehearsal answer sheet - separate the three roles, preserve strict stop points, and distinguish sealed actions from labels or transitions that are not currently authorized.

# Strict candidate action sheet

**Binding:** successor-v3 candidate
`b6d78bc1e68ead7340d92b534fe3a6d0257c8aa2b02cd3d58e43215fbd8a3443`
Status: `READY_STRICT_REHEARSAL`

## Critical authority limit

The current seal authorizes **one launch and one invite only**, ending at:

`READY_CUSTOMER_CLAIM`

Its explicit first instruction is:

> Customer 8527916639: open the single DualCoach invite in this private DM and tap Start yourself; do not send onboarding answers yet.

Therefore:

- Steps through **Start** are currently executable.
- Onboarding answers below are prepared, but must wait for a new operator handoff.
- Activation, delivery-capability issuance, delivery, screenshot acceptance, and cleanup have no executable permission in successor-v3.
- `cleanup_controller_v6.py execute` is deliberately locked and exits blocked.
- Do not substitute historical Task21-25 or candidate `2e0894ea` commands.

---

# 1. Operator — launch and fresh invite

From the repository root:

```bash
PY='/home/cube/projects/richard/hermes-agent/.venv/bin/python'
C='.omo/evidence/task26/task26-strict-final-candidate-successor-v3-st_01a00f35'
R='/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-strict-launch-controller-v7-successor-st_01a00f35/run-one-use-v7'

"$PY" "$C/launch_controller_v7.py" execute \
  --root "$R" \
  --permission "$C/PERMISSION-v7.json"
```

Require:

- `status: READY_CUSTOMER_CLAIM`
- `invite_count: 1`
- service active/running
- `activation: false`
- `delivery: false`
- `delivery_capability_issued: false`

**STOP / WAIT:** tell the customer only to open the fresh private-DM invite and press **Start**. Do not provide onboarding answers yet.

Sources:

- `...successor-v3.../PERMISSION-v7.json`
  - `status: AUTHORIZED_ONE_USE_V7`
  - `maximum_invites: 1`
  - `authorized_run_root`
- `...successor-v3.../launch_controller_v7.py`
  - `send_once`
  - `first_user_instruction`
  - terminal `READY_CUSTOMER_CLAIM`
- `...successor-v3.../LAUNCH-CONTROLLER-SEAL-v7.json`

---

# 2. Customer — claim and consent

1. Open the single new invite in the private DM.
2. Press Telegram **Start** once. Do not type a bare `/start`.
3. **STOP / WAIT** for the canonical consent card.
4. Press **`내용 확인 후 동의`**.
5. **STOP / WAIT** until the first onboarding question appears and the operator explicitly releases onboarding.

Verified consent label source:

- `gateway/platforms/nutrition_coaching.py`
  - button `내용 확인 후 동의`
  - decline button `동의하지 않기`
  - consent version `privacy-v1`

`Start` is named by the sealed launch handoff, but its visual capitalization is Telegram platform UI rather than an application-defined button label.

---

# 3. Customer — onboarding answers

Send exactly one answer after each corresponding prompt, in this order:

| # | Field | Send |
|---:|---|---|
| 1 | `date_of_birth` | `1990-01-01` |
| 2 | `equation_sex_basis` | `남성` |
| 3 | `height_cm` | `180 cm` |
| 4 | `weight_kg` | `80 kg` |
| 5 | `activity_category` | `보통` |
| 6 | `activity_rationale` | `주 3회 근력 운동` |
| 7 | `goal_type` | `유지` |
| 8 | `target_weight_kg` | `없음` |
| 9 | `target_date` | `없음` |
| 10 | `allergies` | `없음` |
| 11 | `intolerances` | `없음` |
| 12 | `religious_ethical_exclusions` | `없음` |
| 13 | `disliked_foods` | `없음` |
| 14 | `dietary_preferences` | `없음` |
| 15 | `conditions` | `없음` |
| 16 | `medications` | `없음` |
| 17 | `pregnancy_breastfeeding` | `아니오` |
| 18 | `eating_disorder_risk` | `아니오` |
| 19 | `cooking_access` | `기본 조리 가능` |
| 20 | `budget_band` | `보통` |
| 21 | `meal_count` | `3` |
| 22 | `schedule_constraints` | `없음` |

After the summary appears:

1. Check that it reflects these answers.
2. Press **`입력 내용이 맞습니다`** once.
3. **STOP / WAIT** for owner review.

Do not press `수정` unless an answer is actually wrong.

Sources:

- Order: `checkin_cli/nutrition_onboarding_contract.py` → `QUESTION_FIELDS`
- Prompts/parsing: `gateway/platforms/telegram_nutrition_onboarding_copy.py`
  - `PROMPTS`
  - `parse_answer`
- Attestation label:
  `gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py`
  - `("attest", "입력 내용이 맞습니다")`

---

# 4. Owner — onboarding review

On the newest owner-review card:

1. Confirm the answers and absence of a safety hold.
2. Press **`Approve`** once.
3. **STOP / WAIT** for finalization and readiness publication.

Do not press `Revise`, `Reject`, or `Safety Hold` for the synthetic answers above.

Verified labels:

- `Approve`
- `Revise`
- `Reject`
- `Safety Hold`

Source:

- `gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py`
- Transition implementation:
  `gateway/platforms/telegram_nutrition_onboarding_runtime_callback.py`
  - `owner_ok -> approved`
  - approved review invokes finalization

---

# 5. Operator — activation gate

**HARD STOP.**

The product remains disabled after onboarding finalization, and successor-v3 has:

- `activation: false`
- no sealed activation command or permission
- no current handoff authorizing activation

Do not reuse the historical `customer_admin activate` procedure. Wait for a new candidate-bound one-use operator authorization.

---

# 6. Customer — nutrition daily check-in

Proceed only after the operator confirms activation through a newly authorized surface.

1. Press persistent button **`오늘 체크인`**, or card button **`오늘 체크인 시작`**.
2. Answer in this exact nutrition-daily order:

| # | Field | Action/answer |
|---:|---|---|
| 1 | `bodyweight` | `70.2` |
| 2 | `calories` | `2350` |
| 3 | `macros` | `285 150 65` |
| 4 | `meals` | `아침 오트밀, 점심 닭가슴살, 저녁 연어` |
| 5 | `water` | `2.5` |
| 6 | `sleep_duration` | `7.5` |
| 7 | `sleep_quality` | press `4` |
| 8 | `digestion` | press `4 · 매끈하고 부드러움` |
| 9 | `condition` | press `4` |
| 10 | `appetite_stress` | `식욕 3/5, 스트레스 2/5` |
| 11 | `training_summary` | press `운동 내용 입력`, then send `하체 70분, 보통 강도` |
| 12 | `optional_note` | press `없음` |

At the summary, press **`체크인 저장`** once.

**STOP / WAIT:** wait for `✅ 오늘 체크인을 저장했습니다.` and then for generation/review-card publication. Do not start another flow or request generation manually.

Sources:

- Order: `checkin_cli/wizard.py` → nutrition `NUTRITION_STEPS`
- Prompt/button labels:
  `gateway/platforms/physique_checkin_prompts.py`
- Launch labels:
  `gateway/platforms/telegram.py`
- Fixture:
  `verification-tests/tests/test_customer_nutrition_wizard.py`

### Calories resolution

Enter calories **once**, as check-in answer #2: `2350`.

- Onboarding has no calorie question.
- The generated onboarding baseline may display calculated calories; that is output, not another answer.
- The separate morning flow also contains a calorie field, but it is not this nutrition-daily flow.
- Do not launch or interleave the morning flow.

---

# 7. Owner — generated draft

After the newest draft card appears:

1. Review the full 12-item checklist and customer-facing text.
2. Press **`승인`** once.
3. Confirm the card changes to `승인됨 · 고객 전송 대기`.
4. **STOP / WAIT** for operator issuance of the bound one-use delivery capability.

Approval does not send automatically.

Verified source:

- `gateway/platforms/telegram.py`
  - draft buttons `수정`, `재생성`, `승인`, `보류`
  - callback success text: `승인했습니다. 고객 전송은 별도 확인이 필요합니다.`

---

# 8. Operator — delivery capability

**HARD STOP.**

The runtime requires a fixed ten-minute, draft-bound capability, but successor-v3 exposes no sealed issuance command or permission.

Do not mutate the delivery ledger or configuration manually.

Source:

- `gateway/platforms/nutrition_coaching.py`
  - `issue_delivery_capability`
  - state `awaiting_capability`
  - ten-minute expiry

---

# 9. Owner — explicit delivery

Only after the operator confirms successful capability issuance:

1. On the same newest approved card, press **`고객에게 보내기`** once.
2. **STOP / WAIT** for:
   - exactly one customer DM;
   - one delivered record;
   - one audited send;
   - no duplicate.

Do not press the button twice and do not use `전달 기록 복구` unless an authorized incident procedure explicitly directs it.

Verified source:

- `gateway/platforms/telegram.py`
  - approved-card button `고객에게 보내기`
  - success text `승인된 초안을 고객에게 전달했습니다.`

The historical English label `Send to customer` is not the current installed UI label.

---

# 10. Customer — final surface capture

After exactly one delivered coaching DM:

1. Keep the delivered message visible.
2. Capture the required final image.
3. Do not send another customer message.

**Unverifiable:** successor-v3 requires a `<FINAL_IMAGE_REQUIRED>` cleanup binding but does not define the screenshot framing, filename, storage path, or acceptance procedure.

Source:

- `...successor-v3.../cleanup_controller_v6.py`
  - `capture_receipt`
  - `<FINAL_IMAGE_REQUIRED>`

---

# 11. Operator — cleanup

**HARD STOP: cleanup is not currently executable.**

The current controller reports:

- `PASS_DRY_RUN_EXECUTION_LOCKED`
- `execution_permission: false`

Its `execute` mode always exits blocked until all fresh bindings and a new execution permission exist:

- membership pre-seal
- membership final-seal
- lifecycle final seal
- final-image capture receipt
- immutable retention publication

Permitted read-only check:

```bash
PY='/home/cube/projects/richard/hermes-agent/.venv/bin/python'
C='.omo/evidence/task26/task26-strict-final-candidate-successor-v3-st_01a00f35'

"$PY" "$C/cleanup_controller_v6.py" dry-run
```

Do not manually stop/delete/archive profile state as a substitute. Cleanup must wait for a newly sealed execution permission.

Source:

- `...successor-v3.../cleanup_controller_v6.py`
- `...successor-v3.../receipts/cleanup-v6-v3-dry-run.json`