message: 403: {"code":"ENTITLEMENT_ERROR","message":"Error 403: the user is not subscribed to required model plan"}

stop_reason: error


error_message: 403: {"code":"ENTITLEMENT_ERROR","message":"Error 403: the user is not subscribed to required model plan"}


I read this as a codebase map request for the r71b zero-send recovery - here’s the dependency map, seams, tests, and immutable roots to keep untouched.

<results>
<files>
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_ledger.py - Topic59 ledger claim/reserve/state machine (`claim`, `record`, `_reserve`, `_terminal`)
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations.py - Topic59 publisher entrypoint (`Topic59DayCardProjector.publish`)
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher.py - weekly publisher/dispatcher orchestration and Topic59 dispatch seam
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher_transport.py - revalidating Topic59 transport and weekly model seam
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/telegram_weekly_host_dispatch.py - Telegram host shim into weekly dispatcher/reminder flow
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/telegram_weekly_reminder.py - `send_weekly_operations_task` boundary for reminder/cutoff work
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/physique_inline_card.py - `LaunchResult` and scheduled inline-card launch bridge
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/scheduler.py - `run_one_job` inline-card branch and `mark_job_run` call site
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/jobs.py - `mark_job_run`, `claim_job_for_fire`, `advance_next_run`
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_config.py - weekly config digest + review route binding
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_models.py - Topic59 projection hashes (`route_digest`, `payload_digest`, `logical_key`)
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_authority.py - weekly authority receipt/runtime context and auth gate
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_identifiers.py - opaque digests, whitelist, safe payload rules
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_registry_identity.py - registry identity binding digest / pinned registry
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/prepare_nutricoach_v150_v15_preseal.py - r71 preseal builder, package/target binding, wheel inventory
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_detached_bootstrap.py - preseal closure + network-isolation bootstrap
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/execute_nutricoach_v150_sealed_live.py - sandbox/bwrap launcher into detached bootstrap
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_controller.py - sealed controller state application + rollback
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_concrete_host.py - live host implementation of install/apply/switch/rollback seams
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_live_transaction.py - one-use live transaction guard/ledger/snapshot flow
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_live_authority.py - approval ledger + snapshot authority + atomic write helpers
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_authority.py - reusable durable snapshot/ledger primitives
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/verify_nutricoach_v150_candidate_inputs.py - successor overlay source-set contract
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/seal_nutricoach_v150_candidate.py - candidate source set and overlay assembly
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/verify_nutricoach_v150_preseal_v15.py - immutable preseal verification gate
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_observer_runtime.py - observer runtime append-only store
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_observer_final.py - final observer verification/report
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_seven_day_observer.py - observer contract/state evaluation
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59.py - happy-path Topic59 publication coverage
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_failures.py - Topic59 terminal/incident coverage
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_r2.py - Topic59 replay/edit/validation regression
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_r2_slots.py - slot-concurrency/restart regression
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_telegram.py - strict Telegram adapter path
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_reminder_runtime.py - weekly reminder provider/runtime contract
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_reminder_boundaries.py - schedule-policy gate coverage
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_reminder_bootstrap_r6.py - bootstrap launcher coverage for weekly reminder
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_dispatcher_epoch2.py - dispatcher adversarial/auth-drift coverage
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_sealed_controller.py - sealed controller stage/rollback regression
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v14_safety.py - live transaction rollback/recovery safety
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v15_safety.py - v15 live authority recovery safety
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v15_authority_adversarial.py - committed/replay/rollback authority adversarial cases
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_live_binding.py - sealed target binding + immutable root checks
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v15_closure.py - r71 preseal closure + overlay immutability
- /home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_seven_day_observer.py - observer runtime/finalization contract
</files>

<answer>
Key call graph:
- Topic59: `Topic59DayCardProjector.publish()` -> `Topic59PublicationLedger.claim()` -> `_deliver()` -> `Topic59Transport.send/edit()` -> `Topic59PublicationLedger.record()`.
- Ledger state machine lives in `Topic59PublicationLedger`: `PREPARED -> SENDING -> DELIVERED -> SENT_AUDITED`, plus `AUTHORITY_MISMATCH/FAILED/UNKNOWN`.
- Weekly dispatcher: `dispatch_weekly_operations_tick()` -> `_dispatch_customer()` -> `send_weekly_operations_task()` for reminder/cutoff -> `Topic59DayCardProjector.publish()` for Topic59 -> `RevalidatingTopic59Transport` / `RevalidatingWeeklyModel` gate late drift.
- Cron bridge: `cron/scheduler.py::run_one_job()` detects inline-card jobs, calls `launch_scheduled_card()`, then immediately `mark_job_run(...)`.
- `LaunchResult` is produced in `cron/physique_inline_card.py`; `launch_morning_card()` is the only path that consumes the daily claim, `launch_source_review_card()` and `launch_scheduled_card(..., NUTRITION_TICK_CARD)` do not.

Current signatures worth anchoring:
- `Topic59PublicationLedger.claim(self, projection: Topic59Projection) -> Topic59LedgerAction`
- `Topic59PublicationLedger.record(self, action: Topic59LedgerAction, outcome: Topic59ProviderOutcome) -> Topic59LedgerState`
- `Topic59DayCardProjector.publish(self, request: Topic59PublicationRequest, transport: Topic59Transport) -> Topic59PublicationResult`
- `launch_scheduled_card(home, adapter, loop, now, card=MORNING_CARD) -> LaunchResult`
- `dispatch_weekly_operations_tick(host, coordinator, tasks, *, local_now) -> tuple[str, ...]`
- `send_weekly_operations_task(host, coordinator, task, *, local_now) -> str | None`
- `execute_authorized(approval: str) -> str`
- `execute_disposable(approval: str, root: Path, host: ConcreteLiveHost, *, expected_approval: str = APPROVAL_PHRASE) -> str`
- `recover_pending(host: ConcreteLiveHost) -> None`
- `rollback_committed(host: ConcreteLiveHost, reason: str) -> None`

Authority/config/route digest chain:
- `WeeklyOperationsConfig.digest` binds `enabled/reminder_time/cutoff/weekday/review_route/feature_epoch/registry_identity_binding_digest`.
- `WeeklyOperationsAuthorityReceipt.integrity_digest` is unkeyed provenance only.
- `Topic59Projection` hashes `route_digest`, `payload_digest`, and `logical_key` from `project_topic59_day_card()`.
- `Topic59LedgerHistory.append()` chains `entry_digest` by hashing the full row minus `entry_digest`.

Wheel/package/overlay requirements:
- `scripts/prepare_nutricoach_v150_v15_preseal.py` requires exactly two wheels, validates record SHA, copies dependency snapshot members (`croniter`, `python_telegram_bot-22.6.dist-info`, `telegram`), and writes `sealed-target.json` + `package.json`.
- `scripts/verify_nutricoach_v150_preseal_v15.py` requires the immutable package manifest, closure manifest, target binding, dependency snapshot digest, and authority baseline.
- `scripts/verify_nutricoach_v150_candidate_inputs.py::SUCCESSOR_OVERLAY_PATHS` is the successor overlay allowlist; it includes `cron/physique_inline_card.py`, `cron/scheduler.py`, the profile onboarding modules, `gateway/platforms/nutrition_weekly_dispatcher.py`, `gateway/platforms/nutrition_weekly_dispatcher_transport.py`, `gateway/platforms/telegram*.py`, `scripts/nutricoach_v150_runtime_ops.py`, and others.
- `scripts/seal_nutricoach_v150_candidate.py::candidate_source_paths()` is the source-set union: base manifest source inventory + patch tree + fixed required source/test files.
- `scripts/nutricoach_v150_detached_bootstrap.py::verify_network_isolation()` enforces loopback-only namespace; `verified_pythonpath()` places wheels before source root.
- `scripts/execute_nutricoach_v150_sealed_live.py::sandbox_command()` hard-binds the exact migration/profile/authority/credentials roots into the bwrap launcher.

Sealed/live state application + rollback ordering:
- `ConcreteLiveHost` stage order is:
  `stop -> post_stop_snapshot -> stopped_probe -> install_exact_wheels -> off_smoke_channel_inbox_off -> capacity_dry_run -> weekly_and_capacity_apply -> weekly_startup_smoke -> switch_unit_dropin -> reload -> start -> post_fence`.
- `RollbackGuard`/`TransactionGuard` rollback order is the inverse trust path: stop service, restore authority/snapshot, remove created paths, reload, restart, then post-check protected state.
- `ApprovalLedger` and `GlobalLedger` are one-use authorities with `reserve()/consume()` guarded by `O_EXCL` and fsync.

Reusable typed authenticated artifact/state patterns:
- `scripts/nutricoach_v150_sealed_authority.py` (`Snapshot`, `SnapshotEntry`, `GlobalLedger`, `atomic_write`) is the canonical pattern.
- `scripts/nutricoach_v150_live_authority.py` (`ApprovalLedger`, `SnapshotAuthority`) is the live variant.
- `gateway/platforms/nutrition_weekly_operations_registry_identity.py` (`WeeklyOperationsRegistryIdentity`, `binding_digest`) is the pinned-identity variant.
- `gateway/platforms/nutrition_weekly_operations_authority.py` (`WeeklyOperationsAuthorityReceipt`, `WeeklyOperationsRuntimeContext`) is the typed auth gate.
- `gateway/platforms/nutrition_weekly_operations_ledger_history.py` is the append-only, hash-chained Topic59 store.
- `scripts/nutricoach_v150_observer_runtime.py` is the append-only observation receipt store, with `observer.lock` + `observations.jsonl`.

Immutable roots to leave untouched:
- `/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/.omo/evidence/nutricoach-v150-combined/task-v15r71-candidate-r3`
- `/home/cube/.hermes/migrations/nutricoach-v1.5.0-combined/live-transaction-preseal-v15-runtime-authority-r71`
Current tests already enforce those roots as immutable/no-drift.

Tests needing RED/GREEN attention:
- Topic59 core/failure/replay/concurrency: `test_nutrition_weekly_operations_topic59.py`, `..._failures.py`, `..._r2.py`, `..._r2_slots.py`, `..._telegram.py`
- weekly reminder/dispatcher: `test_nutrition_weekly_reminder_runtime.py`, `..._boundaries.py`, `..._bootstrap_r6.py`, `..._dispatcher_epoch2.py`
- sealed/live recovery: `test_nutricoach_v150_sealed_controller.py`, `..._v14_safety.py`, `..._v15_safety.py`, `..._v15_authority_adversarial.py`, `..._live_binding.py`
- preseal closure/overlay: `test_nutricoach_v150_v15_closure.py`
- observer runtime: `test_nutricoach_v150_seven_day_observer.py`

Hashes already baked into the current codebase:
- `CANDIDATE_DIGEST = 066a794d44861d2cd0fe8c1ea14c0050e00219b38a2d2026b389772783056dad`
- `MANIFEST_SHA256 = 78b2d1790b67cf0d9730cd9a4b0d2d0d3de5bf5f5836e31a70f5be3a62dd7786`
- `PACKAGE_DIGEST = a362d994b41a5d05ed2fcdafc76482e72d18ff69334cd8249eec061bff733acb`
- `HERMES_WHEEL_SHA256 = 5829f799160a7341f5509043c17cecbe5d10cfe25c44eb3f8fde44bbf9720d91`
- `PROFILE_WHEEL_SHA256 = bdfe94b31d9c98c233301dc2cc552e5e2d672853901bac2bdf73df7e23c709b6`
- observer contract candidate: `81a7a06ec2e7a1595784c92ab61df0df7e138d13a2620d9a917e94999e7f7a04`

Dependency ordering:
1. candidate overlay/source-set assembly
2. preseal package + wheel inventory generation
3. detached bootstrap closure/network isolation
4. sealed controller execution/recovery
5. weekly Topic59 publication/dispatch
6. cron inline-card bridge to `mark_job_run`
7. observer runtime append/finalize
</answer>

<next_steps>
Ready to serialize this into the requested evidence JSON; no implementation or file mutation needed.
</next_steps>
</results>


I read this as “serialize the codemap artifact from verified current sources” - I’ll inspect the current Task8-10 receipt files and then produce the JSON payload with stale historical literals separated from the active r71 bindings.


I can’t write the file from this read-only session. The artifact body is below as valid JSON; save it to the requested path. Evidence SHA is not available without materializing the file bytes.

```json
{
  "schema": "nutricoach-telegram-checkin-stepper-task-10-r71b-maintenance-codemap-v1",
  "worktree": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
  "output_path": "/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-telegram-checkin-stepper/task-10-r71b-maintenance-codemap.json",
  "selected_r71": {
    "candidate_root": "/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-v150-combined/task-v15r71-candidate-r3",
    "candidate_digest": "a41c97c8a467b0308b9f50ac072cc3adae1c2d47ca515b76f123e7c1debee9be",
    "candidate_manifest_sha256": "a019f0b9a0bf1a393d2d307d0e755251a140e3449058077632209e2101090766",
    "preseal_root": "/home/cube/.hermes/migrations/nutricoach-v1.5.0-combined/live-transaction-preseal-v15-runtime-authority-r71",
    "preseal_tree_sha256": "a76a0961829d8222814c1c88fac8e68f90ad7faf822e6d5ea3efb655545b7ee8",
    "preseal_manifest_sha256": "66ede3f1995d644b9ce423c8e8846b50d823c57f76d892cef66694d7e1d3a793",
    "preseal_package_sha256": "21c8f3d3b2e95b37a1af2123fe196309a01eb6fb768bc38a15efa0973cfa666a",
    "approval_phrase": "AUTHORIZE NUTRICOACH V1.5 LIVE UPGRADE 4b032722f236dacc7f7e413cc37b31232000ce4f5d839bf0360fa8ac008ea6b1",
    "authority_id": "nutricoach-v150-v15-runtime-authority-r71"
  },
  "historical_literals_to_not_confuse": {
    "observer_r70": "/home/cube/.hermes/migrations/nutricoach-v1.5.0-combined/observer-r70",
    "legacy_observer_candidate": "81a7a06ec2e7a1595784c92ab61df0df7e138d13a2620d9a917e94999e7f7a04",
    "r1_candidate_digest": "aa377308a8967fb8e2557f5283b1c67e5fec0ad2410ce2bee3b4835888cae14f",
    "r2_candidate_digest": "54550d75a31055f40a293d444a17fdd463ace784ca16e0cb0137cd695f7ab37e",
    "r1_r2_are_immutable_predecessors": true
  },
  "current_verified_hashes": {
    "task8_source_freeze": {
      "scripts/execute_nutricoach_v150_sealed_live.py": "2fd6b4d08e1e075ef014b8f26537f84f80b96e04d9a651f6aec18111910e9322",
      "scripts/nutricoach_v150_detached_bootstrap.py": "2b3b233e7f4336bc86063230baebd3d544dd04e2a32f8d29081e9bae50f736b9",
      "scripts/nutricoach_v150_sealed_controller.py": "91f282ebe2bfcd6d4986001f0f4fffea09cbc08ee8c8fa50eace936baf46e58e",
      "scripts/prepare_nutricoach_v150_v15_preseal.py": "dad7863ed21a312371634ed397c6638b2308002a384e752d481f324948d4c9e7",
      "scripts/rehearse_nutricoach_v150_v15.py": "6df2fa9fc7a5337d8cac3a6c1812afebb3e81828c7ea79c2340043f685eb209a",
      "scripts/seal_nutricoach_v150_candidate.py": "5f7fa6df076c6533c30453069d78c9afb83453e73a5c81b7333d69727830b970",
      "scripts/verify_nutricoach_v150_candidate.py": "baf05e574dfbcc462afc5d12f564c473fe1093a6680c2c799272c15d92baf21b",
      "scripts/verify_nutricoach_v150_candidate_inputs.py": "668839b6ddd3e791d17b9ea4110808c173f8af5059a7cc8cece0912a6c900343",
      "scripts/verify_nutricoach_v150_preseal_v15.py": "5c116ea13f8e03dbfb891bf9e0d09e33c0ce2adfe09dd3e1cbaed60f8163e48d",
      "tests/test_nutricoach_v150_v15_closure.py": "fd68ddff333e0de98860346cb3c0d61f1dcb5a61373b3b9d379e603f5d12a1a5"
    },
    "task9_preseal_rehearsal": {
      "rehearsal_report_sha256": "8cd67e82effc9540da722a5942691ba184a85cb65ce8a1aa3044035e5ff3fd7e",
      "r3_source_tree_sha256": "6310a71806d393f66e104f6de32d311e32c203d3a6d70947099bdd079c01dce9",
      "r3_source_manifest_sha256": "a019f0b9a0bf1a393d2d307d0e755251a140e3449058077632209e2101090766",
      "r3_candidate_digest": "a41c97c8a467b0308b9f50ac072cc3adae1c2d47ca515b76f123e7c1debee9be",
      "permission_package_sha256": "21c8f3d3b2e95b37a1af2123fe196309a01eb6fb768bc38a15efa0973cfa666a"
    },
    "task10_production": {
      "observer_r70_observations_sha256": "0ec164bc4577691f7267c04c8362e236d61bec3972d84ea37c5c35628e099f14",
      "observer_r70_latest_row_digest": "09f1a3bce0ad593963a9d1c689aa7f275ba062e57c74166eae68d89824091bfa",
      "launcher_sha256": "2fd6b4d08e1e075ef014b8f26537f84f80b96e04d9a651f6aec18111910e9322",
      "r70_authorization_candidate_digest": "81a7a06ec2e7a1595784c92ab61df0df7e138d13a2620d9a917e94999e7f7a04"
    }
  },
  "symbols": [
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_ledger.py",
      "symbol": "Topic59PublicationLedger.claim",
      "signature": "def claim(self, projection: Topic59Projection) -> Topic59LedgerAction"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations_ledger.py",
      "symbol": "Topic59PublicationLedger.record",
      "signature": "def record(self, action: Topic59LedgerAction, outcome: Topic59ProviderOutcome) -> Topic59LedgerState"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_operations.py",
      "symbol": "Topic59DayCardProjector.publish",
      "signature": "async def publish(self, request: Topic59PublicationRequest, transport: Topic59Transport) -> Topic59PublicationResult"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher.py",
      "symbol": "dispatch_weekly_operations_tick",
      "signature": "async def dispatch_weekly_operations_tick(host, coordinator, tasks, *, local_now: datetime) -> tuple[str, ...]"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher.py",
      "symbol": "_dispatch_customer",
      "signature": "async def _dispatch_customer(host, coordinator, owner, snapshot, tasks, now: datetime) -> None"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher_transport.py",
      "symbol": "RevalidatingTopic59Transport.send/edit",
      "signature": "async def send(...) -> Topic59ProviderOutcome; async def edit(...) -> Topic59ProviderOutcome"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/nutrition_weekly_dispatcher_transport.py",
      "symbol": "RevalidatingWeeklyModel.generate",
      "signature": "def generate(self, request: Mapping[str, JsonValue]) -> Mapping[str, JsonValue]"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/gateway/platforms/telegram_weekly_reminder.py",
      "symbol": "send_weekly_operations_task",
      "signature": "async def send_weekly_operations_task(host, coordinator, task, *, local_now: datetime) -> str | None"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/physique_inline_card.py",
      "symbol": "LaunchResult",
      "signature": "@dataclass(frozen=True, slots=True) class LaunchResult(claimed=False, sent=False, duplicate=False, disabled=False, error=None)"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/physique_inline_card.py",
      "symbol": "launch_scheduled_card",
      "signature": "def launch_scheduled_card(home, adapter, loop, now, card=MORNING_CARD) -> LaunchResult"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/scheduler.py",
      "symbol": "run_one_job",
      "signature": "def run_one_job(job: dict, *, adapters=None, loop=None, verbose: bool = False) -> bool"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/cron/jobs.py",
      "symbol": "mark_job_run",
      "signature": "def mark_job_run(job_id: str, success: bool, error: Optional[str] = None, delivery_error: Optional[str] = None)"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_controller.py",
      "symbol": "execute_authorized",
      "signature": "def execute_authorized(approval: str) -> str"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_controller.py",
      "symbol": "execute_disposable",
      "signature": "def execute_disposable(approval: str, root: Path, host: ConcreteLiveHost, *, expected_approval: str = APPROVAL_PHRASE) -> str"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_controller.py",
      "symbol": "recover_pending",
      "signature": "def recover_pending(host: ConcreteLiveHost) -> None"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_controller.py",
      "symbol": "rollback_committed",
      "signature": "def rollback_committed(host: ConcreteLiveHost, reason: str) -> None"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_concrete_host.py",
      "symbol": "ConcreteLiveHost.capture_preflight/install/migration_apply/switch_systemd/post_fence/remove_created",
      "signature": "instance methods; see file"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_live_transaction.py",
      "symbol": "TransactionGuard.execute",
      "signature": "def execute(operation: LiveOperation, host: LiveHost) -> str"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_live_authority.py",
      "symbol": "ApprovalLedger.reserve/consume",
      "signature": "reserve() -> None; consume(outcome: Literal['FAILED','SUCCEEDED']) -> None"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_sealed_authority.py",
      "symbol": "GlobalLedger.reserve/consume/attempt",
      "signature": "reserve() -> None; consume(outcome) -> None; attempt() -> Attempt"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/scripts/nutricoach_v150_observer_runtime.py",
      "symbol": "append",
      "signature": "def append(observation: Observation, snapshot: RuntimeSnapshot, now: datetime) -> None"
    }
  ],
  "call_graph": [
    "cron/scheduler.py:run_one_job -> cron/physique_inline_card.py:launch_scheduled_card -> LaunchResult -> mark_job_run",
    "gateway/platforms/nutrition_weekly_dispatcher.py:dispatch_weekly_operations_tick -> _dispatch_customer -> telegram_weekly_reminder.send_weekly_operations_task -> Topic59DayCardProjector.publish -> Topic59PublicationLedger.claim/record",
    "Topic59DayCardProjector.publish -> RevalidatingTopic59Transport.send/edit -> host transport",
    "scripts/nutricoach_v150_sealed_controller.py:execute_authorized -> recover_pending -> _execute -> ConcreteLiveHost methods -> GlobalLedger.attempt",
    "scripts/nutricoach_v150_sealed_controller.py:RollbackGuard.rollback -> restore_runtime_authority -> restore(snapshot) -> remove_created -> service.reload/start",
    "scripts/nutricoach_v150_live_transaction.py:execute -> ApprovalLedger.reserve -> TransactionGuard.__exit__ rollback path -> consume(FAILED/SUCCEEDED)",
    "scripts/nutricoach_v150_concrete_host.py:capture_preflight -> protected_paths + runtime authority capture",
    "scripts/nutricoach_v150_observer_runtime.py:collect -> append -> scripts/nutricoach_v150_observer_final.py:finalize"
  ],
  "test_seams": [
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59.py",
      "seam": "happy-path send/edit/noop replay and whitelist payloads"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_failures.py",
      "seam": "incident states, corrupt ledger, unresolved reservation, provider terminal outcomes"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_r2_slots.py",
      "seam": "concurrent slot claims and cross-thread restart behavior"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_operations_topic59_telegram.py",
      "seam": "real Telegram adapter send/edit path, strict-topic receipt matching"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/gateway/test_nutrition_weekly_reminder_runtime.py",
      "seam": "provider replay, authority drift, two-tick reminder behavior"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_sealed_controller.py",
      "seam": "stage order, rollback, old approval rejection, cleanup"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v15_safety.py",
      "seam": "committed successor restoration, external authority transition"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_live_binding.py",
      "seam": "bound sealed target approval and immutable roots"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_v15_closure.py",
      "seam": "r71 preseal launcher/closure immutability and overlay membership"
    },
    {
      "file": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined/tests/test_nutricoach_v150_seven_day_observer.py",
      "seam": "observer runtime path selection and final verdict"
    }
  ],
  "overlay_requirements": {
    "candidate_source_selection": {
      "source_root": "/home/cube/projects/richard/.worktrees/nutricoach-v150-combined",
      "fixture_root": "/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-v150-combined/task-v15r71-candidate-r3",
      "source_inventory_plus_patch_tree": true
    },
    "successor_overlay_path_count": 47,
    "successor_overlay_members": [
      "cron/physique_inline_card.py",
      "cron/scheduler.py",
      "dualcoach/profile/checkin_cli/customer_admin.py",
      "dualcoach/profile/checkin_cli/customer_coaching.py",
      "dualcoach/profile/checkin_cli/multi_customer_admission_migration.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_authority.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_clarification_policy.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_clarification_rules.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_contract.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_finalize_service.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_finalization.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_input_help.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_models.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_projection.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_reconciliation.py",
      "dualcoach/profile/checkin_cli/nutrition_onboarding_session.py",
      "dualcoach/profile/checkin_cli/nutrition_readiness_contract.py",
      "dualcoach/profile/checkin_cli/nutrition_readiness_validators.py",
      "dualcoach/profile/checkin_cli/weekly_operations_store.py",
      "dualcoach/profile/checkin_cli/wizard.py",
      "dualcoach/profile/checkin_cli/wizard_models.py",
      "dualcoach/profile/checkin_cli/wizard_storage.py",
      "dualcoach/profile/tests/test_multi_customer_migration.py",
      "tests/gateway/test_nutrition_coaching.py",
      "gateway/platforms/dualcoach_activation_cutover.py",
      "gateway/platforms/dualcoach_admin.py",
      "gateway/platforms/dualcoach_customer_invite.py",
      "gateway/platforms/nutrition_coaching.py",
      "gateway/platforms/nutrition_onboarding_reconciliation.py",
      "gateway/platforms/nutrition_onboarding_reconciliation_copy.py",
      "gateway/platforms/nutrition_weekly_dispatcher.py",
      "gateway/platforms/physique_checkin.py",
      "gateway/platforms/physique_checkin_bindings.py",
      "gateway/platforms/telegram.py",
      "gateway/platforms/telegram_checkin_stepper_transport.py",
      "gateway/platforms/telegram_physique_checkin_stepper.py",
      "gateway/platforms/telegram_customer_bootstrap.py",
      "gateway/platforms/telegram_nutrition_onboarding_copy.py",
      "gateway/platforms/telegram_nutrition_onboarding_customer_v2.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime_callback.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime_collection.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime_notice.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py",
      "gateway/platforms/telegram_nutrition_onboarding_runtime_publication_transport.py",
      "scripts/nutricoach_v150_runtime_ops.py"
    ],
    "hermes_wheel_members": 23,
    "profile_wheel_members": 21
  },
  "immutable_roots": [
    "/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-v150-combined/task-v15r71-candidate-r3",
    "/home/cube/.hermes/migrations/nutricoach-v1.5.0-combined/live-transaction-preseal-v15-runtime-authority-r71",
    "/home/cube/.hermes/migrations/nutricoach-v1.5.0-combined/preflight-v15-runtime-authority-r71"
  ],
  "dependency_order": [
    "candidate overlay/source-set assembly",
    "preseal package + wheel inventory generation",
    "detached bootstrap closure/network isolation",
    "sealed controller execution/recovery",
    "weekly Topic59 publication/dispatch",
    "cron inline-card bridge to mark_job_run",
    "observer runtime append/finalize"
  ],
  "wheel_and_package_bindings": {
    "hermes_wheel_sha256": "17d5db319f9355a427c5b46cc4ea9a896d348c585793df085c170921e1ee2829",
    "hermes_record_sha256": "225516500a1ab18aabca6af8b05181db7dc82ebf3324b5b91ce132bde2d02977",
    "profile_wheel_sha256": "2f1cae9ff6262f5c823dd41c68bc999dca71c56000bef6dc0a0268ab07c19c4f",
    "profile_record_sha256": "8b823301c800c28959f8ed7d3d46ae6a66dcaf7128991823913a910030fb9b83",
    "preseal_verified_package_digest": "4b032722f236dacc7f7e413cc37b31232000ce4f5d839bf0360fa8ac008ea6b1",
    "preseal_verified_package_sha256": "21c8f3d3b2e95b37a1af2123fe196309a01eb6fb768bc38a15efa0973cfa666a"
  },
  "notes": [
    "Current r71 bindings are digest-selected; the candidate directory name is only a fixture handle.",
    "observer-r70 and r70 runtime roots are historical operational state, not replacement targets for the r71 preseal.",
    "task-8/9/10 receipts were re-read; no implementation edits or live mutation were performed.",
    "evidence_sha": null
  ]
}
```