---
slug: physique-coach
status: approved-for-execution
intent: clear
pending-action: execute .omo/plans/physique-coach.md
approach: Build a fresh, isolated Hermes profile with a dedicated Telegram bot placeholder, immutable check-in storage, coach doctrine, and source-refresh jobs. Do not start public polling until a unique bot token and allowlist are configured.
---

# Draft: physique-coach

## Components (topology ledger)
<!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
<!-- id | outcome (one line) | status: active|deferred | evidence path -->
| P1 | Fresh Hermes profile and isolated runtime paths | active | hermes_cli/profiles.py:331-336,904-970 |
| P2 | Telegram-safe coach identity and coaching doctrine | active | gateway/platforms/telegram.py:2188-2216; choi_coach_knowledge_base.md |
| P3 | Append-only check-in/event storage and rebuildable views | active | supplied D1-D123 records; checkin design review |
| P4 | Daily source refresh with provenance and Instagram verification gate | active | choi_coach_knowledge_base.md; cron/scheduler.py:922-1079 |
| P5 | Activation/QA guardrail | active | risk QA review |

## Open assumptions (announced defaults)
<!-- Record any default you adopt instead of asking, so the user can veto it at the gate. -->
<!-- assumption | adopted default | rationale | reversible? -->
| profile | `physique-coach`, fresh (not cloned) | prevents copying default Telegram/trading state | yes |
| Telegram | new BotFather token in profile-only `.env` | one polling consumer per token; prevents bridge collision | yes |
| check-in time | 08:11 KST | earlier approved default | yes |
| source refresh | hourly wake-up, at most one actual KST collection after 06:00 | survives long gateway downtime better than one fixed run | yes |
| content updates | candidate queue only; weekly human approval changes doctrine | Instagram is blocked/secondary and coach personality must remain stable | yes |

## Findings (cited - path:lines)

- Existing default Telegram prompt is a trading manager at `/home/cube/.hermes/config.yaml:443-470`; it must remain untouched.
- A fresh named Hermes profile creates isolated config, `.env`, SOUL, memory, sessions, skills, cron and logs; `--clone` copies secrets and is unsafe here: `/home/cube/projects/richard/hermes-agent/hermes_cli/profiles.py:55-68,904-970`.
- The existing Telegram bridge calls `getUpdates` itself and stores plaintext raw messages; it cannot share a bot token with the coach: `/home/cube/projects/richard/telegram-bridge/telegram_bridge.py:57-63,119-176`.
- Naver RSS and YouTube Atom are reliable current-source inputs; Instagram has CAPTCHA/login challenges and must not automatically change the coach doctrine: `choi_coach_knowledge_base.md:9-20,86-105`.

## Decisions (with rationale)

- Do not use the existing trading bot/token/bridge for the coach.
- Keep all coach data under the fresh profile home and set `terminal.home_mode: profile`.
- Preserve original D1-D123 Markdown unchanged; import them as read-only source material and record new facts as events.
- Build only local scripts + Hermes skill/cron configuration; no external database or public webhook.

## Scope IN

- Fresh local `physique-coach` profile with no secrets committed.
- Korean coaching SOUL, check-in template, data schema and knowledge base.
- Event-store CLI, source collector, test fixtures, and dedicated Hermes skill.
- Paused/safe cron definitions and exact activation instructions.

## Scope OUT (Must NOT have)

- No change to default Hermes, trading prompts, existing Telegram bridge or its data.
- No Telegram token in repository, plan, logs, or chat.
- No medical/drug/hormone/extreme-cutting prescription.
- No Instagram login automation, CAPTCHA bypass, or automatic SOUL rewrites.

## Open questions

- None blocking implementation. Public gateway activation awaits a new unique Telegram bot token and target chat/user allowlist.

## Approval gate
status: approved-for-execution
<!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
<!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
