You are running as an omo senpi-task child.
Task id: st_01a00cfa.
Parent session: 01a00387-aaf8-7f2f-89e3-e24c1af24859.
Root session: 01a00387-aaf8-7f2f-89e3-e24c1af24859.
Depth: 1.

Task:
Goal: reproduce and identify the exact exception thrown when live Telegram customer 8527916639 sent plain text 'checkin' after activation. Evidence: journald at 2026-08-17 08:47 KST shows update_id 629525116 handler_exception and no response. Work read-only against live profile /home/cube/.hermes/profiles/dualcoachtest and source /home/cube/projects/richard/hermes-agent. Form at least three hypotheses. Build a minimal offline driver under a new .omo/evidence/task26 debug root via apply_patch that constructs the real Telegram nutrition coordinator/config and invokes the exact `_handle_text_message` or `_send_nutrition_customer_card` path with a fake message/send surface, using actual registry/customer state but no Telegram/provider/network or live writes. Capture full traceback and method-level state. Do not edit production/source/tests/profile/Git/plan/todo/ledger or restart service. Deliver exact exception type/message/line, confirmed root cause, driver path/hash/output, and suggested minimal seam.

<Category_Context name="deep">
You are operating in DEEP mode. This is the category reserved for goal-oriented autonomous work on hairy problems that reward thorough exploration and comprehensive solutions.

The orchestrator chose this category because the task benefits from depth over speed. You should feel empowered to spend the time needed: five to fifteen minutes of silent exploration before the first edit is normal and correct. Rushing to implementation on a deep task is a failure mode, not a feature.

# How deep mode adjusts the base behavior

**Exploration budget: generous.** Read the files you need, trace dependencies both directions, fire 2-5 explore/librarian sub-agents in parallel for broader questions. Build a complete mental model before the first `apply_patch`. Exploration here is an investment, not overhead.

**Goal, not plan.** You receive a GOAL describing the desired outcome. You figure out HOW to achieve it. The orchestrator deliberately did not hand you a step-by-step plan; producing one and asking for approval is not what was asked. Execute.

**Atomic task treatment.** When the goal contains numbered steps or phases, treat them as sub-steps of ONE task and execute them all in this turn. Splitting them across turns is wrong unless they reveal an architectural blocker that requires the user's input. If the "steps" turn out to be genuinely independent tasks that should have been separate delegations, flag that in your final message and refuse the ones beyond scope.

**Root cause bias.** Prefer root-cause fixes over symptom fixes. A null check around `foo()` is a symptom fix; fixing whatever causes `foo()` to return unexpected values is the root fix. Trace at least two levels up before settling on an answer. In deep mode, you have permission (and the expectation) to do the deeper fix.

**Ambition scaled to context.** For brand-new greenfield work, be ambitious. Choose strong defaults, avoid AI-slop aesthetics, produce something you would be proud to hand to another senior engineer. For changes in an existing codebase, be surgical and respect the existing patterns; depth does not mean invasiveness.

**Completion bar: full delivery.** "Simplified version", "proof of concept", and "you can extend this later" are not acceptable deliveries for a deep task. The orchestrator routed here specifically for a complete solution. If you hit a genuine blocker (missing secret, design decision only the user can make, three materially different attempts all failed), document it and return; otherwise, finish the task.

**Status cadence: sparse.** The user is not on the other side of this conversation; the orchestrator is, and they will synthesize your progress. Send commentary only at meaningful phase transitions (starting exploration, starting implementation, starting verification, hitting a genuine blocker). Do not narrate every tool call; silence during focused work is expected.
</Category_Context>


**Planning routing line and patch application**

I read this as a read-only production-state incident reproduction - I’ll trace the live handler and state, form competing hypotheses, then build and run an isolated offline driver only under `.omo/evidence/task26`.

bash

printf '%s\n' '--- PI env ---'; env | grep '^PI_' | sort; printf '%s\n' '--- source top ---'; find /home/cube/projects/richard/hermes-agent -maxdepth 2 -type f | head -200; printf '%s\n' '--- git status ---'; git -C /home/cube/projects/richard/hermes-agent status --short --branch

printf '%s\n' '--- profile tree ---'; find /home/cube/.hermes/profiles/dualcoachtest -maxdepth 4 -printf '%y %p\n' | head -300; printf '%s\n' '--- likely customer refs ---'; rg -n --hidden --glob '!*.log' '8527916639|629525116|checkin' /home/cube/.hermes/profiles/dualcoachtest 2>/dev/null | head -300

printf '%s\n' '--- telegram methods ---'; rg -n 'def _handle_text_message|def _send_nutrition_customer_card|class .*Nutrition|nutrition coordinator|NutritionCoordinator' /home/cube/projects/richard/hermes-agent --glob '*.py'; printf '%s\n' '--- journal evidence ---'; journalctl --since '2026-08-17 08:46:00' --until '2026-08-17 08:49:00' --no-pager 2>&1 | rg -C 8 '629525116|8527916639|handler_exception|checkin'


--- PI env ---
PI_CODING_AGENT=true
PI_MODEL=gpt-5.6-sol
PI_PROMPT_CACHE_SAFE_WAIT_SECONDS=270
PI_PROVIDER=openai-codex
PI_REASONING_LEVEL=medium
PI_SESSION_FILE=/home/cube/projects/richard/traning coach/.omo/senpi-task/children/st_01a00cfa/sessions/st_01a00cfa/2026-08-16T23-49-10-244Z_01a00cfa-ade4-704f-a2e5-cb89ec3ed3aa.jsonl
PI_SESSION_ID=01a00cfa-ade4-704f-a2e5-cb89ec3ed3aa
--- source top ---
/home/cube/projects/richard/hermes-agent/providers/__init__.py
/home/cube/projects/richard/hermes-agent/providers/base.py
/home/cube/projects/richard/hermes-agent/providers/README.md
/home/cube/projects/richard/hermes-agent/node_modules/.package-lock.json
/home/cube/projects/richard/hermes-agent/.ruff_cache/CACHEDIR.TAG
/home/cube/projects/richard/hermes-agent/.ruff_cache/.gitignore
/home/cube/projects/richard/hermes-agent/.gitattributes
/home/cube/projects/richard/hermes-agent/acp_registry/icon.svg
/home/cube/projects/richard/hermes-agent/acp_registry/agent.json
/home/cube/projects/richard/hermes-agent/tests/test_yuanbao_integration.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_home_profile_warning.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_setup_wizard_tty_probe.py
/home/cube/projects/richard/hermes-agent/tests/test_yuanbao_markdown.py
/home/cube/projects/richard/hermes-agent/tests/test_docker_home_override_scripts.py
/home/cube/projects/richard/hermes-agent/tests/test_reproducible_wheel_build.py
/home/cube/projects/richard/hermes-agent/tests/test_transform_llm_output_hook.py
/home/cube/projects/richard/hermes-agent/tests/test_gateway_streaming_nested_config.py
/home/cube/projects/richard/hermes-agent/tests/test_lazy_session_regressions.py
/home/cube/projects/richard/hermes-agent/tests/test_desktop_electron_pin.py
/home/cube/projects/richard/hermes-agent/tests/test_run_tests_parallel.py
/home/cube/projects/richard/hermes-agent/tests/test_ollama_num_ctx.py
/home/cube/projects/richard/hermes-agent/tests/test_packaging_metadata.py
/home/cube/projects/richard/hermes-agent/tests/test_dockerfile_tini_compat_shim.py
/home/cube/projects/richard/hermes-agent/tests/test_ctx_halving_fix.py
/home/cube/projects/richard/hermes-agent/tests/test_get_tool_definitions_cache_isolation.py
/home/cube/projects/richard/hermes-agent/tests/test_empty_model_fallback.py
/home/cube/projects/richard/hermes-agent/tests/test_bitwarden_secrets.py
/home/cube/projects/richard/hermes-agent/tests/test_output_cap_parsing.py
/home/cube/projects/richard/hermes-agent/tests/test_timezone.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_state_compression_locks.py
/home/cube/projects/richard/hermes-agent/tests/test_tui_gateway_server.py
/home/cube/projects/richard/hermes-agent/tests/test_live_system_guard_self_test.py
/home/cube/projects/richard/hermes-agent/tests/test_install_no_initial_commit.py
/home/cube/projects/richard/hermes-agent/tests/conftest.py
/home/cube/projects/richard/hermes-agent/tests/test_install_unmerged_index.py
/home/cube/projects/richard/hermes-agent/tests/test_atomic_replace_symlinks.py
/home/cube/projects/richard/hermes-agent/tests/test_yuanbao_proto.py
/home/cube/projects/richard/hermes-agent/tests/test_model_tools.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_browser_install.py
/home/cube/projects/richard/hermes-agent/tests/test_sanitize_tool_error.py
/home/cube/projects/richard/hermes-agent/tests/__init__.py
/home/cube/projects/richard/hermes-agent/tests/test_desktop_mac_entitlements.py
/home/cube/projects/richard/hermes-agent/tests/test_minimax_oauth.py
/home/cube/projects/richard/hermes-agent/tests/test_minisweagent_path.py
/home/cube/projects/richard/hermes-agent/tests/test_tui_mcp_late_refresh.py
/home/cube/projects/richard/hermes-agent/tests/test_termux_all_extra_compat.py
/home/cube/projects/richard/hermes-agent/tests/test_model_forces_max_completion_tokens.py
/home/cube/projects/richard/hermes-agent/tests/test_retry_utils.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_logging.py
/home/cube/projects/richard/hermes-agent/tests/test_transform_tool_result_hook.py
/home/cube/projects/richard/hermes-agent/tests/test_mini_swe_runner.py
/home/cube/projects/richard/hermes-agent/tests/test_honcho_startup_fail_open.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_termux_network_prereqs.py
/home/cube/projects/richard/hermes-agent/tests/test_batch_runner_checkpoint.py
/home/cube/projects/richard/hermes-agent/tests/test_cli_file_drop.py
/home/cube/projects/richard/hermes-agent/tests/test_yuanbao_pipeline.py
/home/cube/projects/richard/hermes-agent/tests/test_project_metadata.py
/home/cube/projects/richard/hermes-agent/tests/test_honcho_client_concurrency.py
/home/cube/projects/richard/hermes-agent/tests/test_evidence_store.py
/home/cube/projects/richard/hermes-agent/tests/test_trajectory_compressor.py
/home/cube/projects/richard/hermes-agent/tests/test_docker_webui_install_surface.py
/home/cube/projects/richard/hermes-agent/tests/test_honcho_session_context.py
/home/cube/projects/richard/hermes-agent/tests/test_toolset_distributions.py
/home/cube/projects/richard/hermes-agent/tests/test_honcho_client_config.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_state.py
/home/cube/projects/richard/hermes-agent/tests/test_ipv4_preference.py
/home/cube/projects/richard/hermes-agent/tests/test_package_json_lazy_deps.py
/home/cube/projects/richard/hermes-agent/tests/test_trajectory_compressor_async.py
/home/cube/projects/richard/hermes-agent/tests/test_slash_worker_watchdog.py
/home/cube/projects/richard/hermes-agent/tests/test_web_server.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_pythonpath_sanitization.py
/home/cube/projects/richard/hermes-agent/tests/test_wheel_locales_e2e.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_bootstrap.py
/home/cube/projects/richard/hermes-agent/tests/test_state_db_malformed_repair.py
/home/cube/projects/richard/hermes-agent/tests/test_sql_injection.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_state_wal_fallback.py
/home/cube/projects/richard/hermes-agent/tests/run_interrupt_test.py
/home/cube/projects/richard/hermes-agent/tests/test_yuanbao_shutdown.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_root_fhs_uv_python_path.py
/home/cube/projects/richard/hermes-agent/tests/test_install_ps1_native_stderr_eap.py
/home/cube/projects/richard/hermes-agent/tests/test_account_usage.py
/home/cube/projects/richard/hermes-agent/tests/test_utils_truthy_values.py
/home/cube/projects/richard/hermes-agent/tests/test_install_ps1_uv_powershell_host.py
/home/cube/projects/richard/hermes-agent/tests/test_cli_manual_compress.py
/home/cube/projects/richard/hermes-agent/tests/test_model_picker_scroll.py
/home/cube/projects/richard/hermes-agent/tests/test_base_url_hostname.py
/home/cube/projects/richard/hermes-agent/tests/test_mcp_serve.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_install_method_stamp.py
/home/cube/projects/richard/hermes-agent/tests/test_docker_stage2_browser_discovery.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_node_global_prefix.py
/home/cube/projects/richard/hermes-agent/tests/test_model_tools_async_bridge.py
/home/cube/projects/richard/hermes-agent/tests/test_dispatch_session_id.py
/home/cube/projects/richard/hermes-agent/tests/test_env_loader_secret_sources.py
/home/cube/projects/richard/hermes-agent/tests/test_minimax_model_validation.py
/home/cube/projects/richard/hermes-agent/tests/test_assistant_ui_tap_compat.py
/home/cube/projects/richard/hermes-agent/tests/test_hermes_constants.py
/home/cube/projects/richard/hermes-agent/tests/test_dashboard_sidecar_close_on_disconnect.py
/home/cube/projects/richard/hermes-agent/tests/test_empty_session_hygiene.py
/home/cube/projects/richard/hermes-agent/tests/test_subprocess_home_isolation.py
/home/cube/projects/richard/hermes-agent/tests/test_plugin_utils.py
/home/cube/projects/richard/hermes-agent/tests/test_tui_gateway_ws.py
/home/cube/projects/richard/hermes-agent/tests/test_install_sh_symlink_stomp.py
/home/cube/projects/richard/hermes-agent/tests/test_process_loop_event_loop_warning.py
/home/cube/projects/richard/hermes-agent/tests/test_cli_skin_integration.py
/home/cube/projects/richard/hermes-agent/tests/test_toolsets.py
/home/cube/projects/richard/hermes-agent/tests/test_plugin_skills.py
/home/cube/projects/richard/hermes-agent/tests/test_lint_config.py
/home/cube/projects/richard/hermes-agent/trajectory_compressor.py
/home/cube/projects/richard/hermes-agent/batch_runner.py
/home/cube/projects/richard/hermes-agent/datagen-config-examples/example_browser_tasks.jsonl
/home/cube/projects/richard/hermes-agent/datagen-config-examples/run_browser_tasks.sh
/home/cube/projects/richard/hermes-agent/datagen-config-examples/web_research.yaml
/home/cube/projects/richard/hermes-agent/datagen-config-examples/trajectory_compression.yaml
/home/cube/projects/richard/hermes-agent/optional-skills/DESCRIPTION.md
/home/cube/projects/richard/hermes-agent/__pycache__/utils.cpython-313.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/cli.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_state.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_constants.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_time.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_bootstrap.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/run_agent.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/utils.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_constants.cpython-313.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/model_tools.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/hermes_logging.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/__pycache__/toolsets.cpython-312.pyc
/home/cube/projects/richard/hermes-agent/SECURITY.md
/home/cube/projects/richard/hermes-agent/hermes_cli/pairing.py
/home/cube/projects/richard/hermes-agent/hermes_cli/backup.py
/home/cube/projects/richard/hermes-agent/hermes_cli/main.py
/home/cube/projects/richard/hermes-agent/hermes_cli/build_info.py
/home/cube/projects/richard/hermes-agent/hermes_cli/managed_scope.py
/home/cube/projects/richard/hermes-agent/hermes_cli/profile_describer.py
/home/cube/projects/richard/hermes-agent/hermes_cli/service_manager.py
/home/cube/projects/richard/hermes-agent/hermes_cli/auth_commands.py
/home/cube/projects/richard/hermes-agent/hermes_cli/gui_uninstall.py
/home/cube/projects/richard/hermes-agent/hermes_cli/tips.py
/home/cube/projects/richard/hermes-agent/hermes_cli/nous_account.py
/home/cube/projects/richard/hermes-agent/hermes_cli/env_loader.py
/home/cube/projects/richard/hermes-agent/hermes_cli/macbook_gui_bridge.py
/home/cube/projects/richard/hermes-agent/hermes_cli/mcp_startup.py
/home/cube/projects/richard/hermes-agent/hermes_cli/codex_models.py
/home/cube/projects/richard/hermes-agent/hermes_cli/cli_commands_mixin.py
/home/cube/projects/richard/hermes-agent/hermes_cli/dashboard_register.py
/home/cube/projects/richard/hermes-agent/hermes_cli/pt_input_extras.py
/home/cube/projects/richard/hermes-agent/hermes_cli/portal_cli.py
/home/cube/projects/richard/hermes-agent/hermes_cli/auth.py
/home/cube/projects/richard/hermes-agent/hermes_cli/plugins_cmd.py
/home/cube/projects/richard/hermes-agent/hermes_cli/security_advisories.py
/home/cube/projects/richard/hermes-agent/hermes_cli/prompt_size.py
/home/cube/projects/richard/hermes-agent/hermes_cli/commands.py
/home/cube/projects/richard/hermes-agent/hermes_cli/model_cost_guard.py
/home/cube/projects/richard/hermes-agent/hermes_cli/middleware.py
/home/cube/projects/richard/hermes-agent/hermes_cli/kanban_diagnostics.py
/home/cube/projects/richard/hermes-agent/hermes_cli/setup_whatsapp_cloud.py
/home/cube/projects/richard/hermes-agent/hermes_cli/_parser.py
/home/cube/projects/richard/hermes-agent/hermes_cli/kanban_specify.py
/home/cube/projects/richard/hermes-agent/hermes_cli/copilot_auth.py
/home/cube/projects/richard/hermes-agent/hermes_cli/send_cmd.py
/home/cube/projects/richard/hermes-agent/hermes_cli/voice.py
/home/cube/projects/richard/hermes-agent/hermes_cli/codex_runtime_switch.py
/home/cube/projects/richard/hermes-agent/hermes_cli/gateway_enroll.py
/home/cube/projects/richard/hermes-agent/hermes_cli/kanban_db.py
/home/cube/projects/richard/hermes-agent/hermes_cli/gateway.py
/home/cube/projects/richard/hermes-agent/hermes_cli/__init__.py
/home/cube/projects/richard/hermes-agent/hermes_cli/checkpoints.py
/home/cube/projects/richard/hermes-agent/hermes_cli/mcp_picker.py
/home/cube/projects/richard/hermes-agent/hermes_cli/mcp_catalog.py
/home/cube/projects/richard/hermes-agent/hermes_cli/azure_detect.py
/home/cube/projects/richard/hermes-agent/hermes_cli/skills_config.py
/home/cube/projects/richard/hermes-agent/hermes_cli/telegram_managed_bot.py
/home/cube/projects/richard/hermes-agent/hermes_cli/migrate.py
/home/cube/projects/richard/hermes-agent/hermes_cli/claw.py
/home/cube/projects/richard/hermes-agent/hermes_cli/model_switch.py
/home/cube/projects/richard/hermes-agent/hermes_cli/doctor.py
/home/cube/projects/richard/hermes-agent/hermes_cli/model_normalize.py
/home/cube/projects/richard/hermes-agent/hermes_cli/suggestions_cmd.py
/home/cube/projects/richard/hermes-agent/hermes_cli/timeouts.py
/home/cube/projects/richard/hermes-agent/hermes_cli/profiles.py
/home/cube/projects/richard/hermes-agent/hermes_cli/nous_subscription.py
/home/cube/projects/richard/hermes-agent/hermes_cli/uninstall.py
/home/cube/projects/richard/hermes-agent/hermes_cli/container_boot.py
/home/cube/projects/richard/hermes-agent/hermes_cli/dingtalk_auth.py
/home/cube/projects/richard/hermes-agent/hermes_cli/mcp_config.py
/home/cube/projects/richard/hermes-agent/hermes_cli/kanban_swarm.py
/home/cube/projects/richard/hermes-agent/hermes_cli/model_catalog.py
/home/cube/projects/richard/hermes-agent/hermes_cli/profile_distribution.py
/home/cube/projects/richard/hermes-agent/hermes_cli/skin_engine.py
/home/cube/projects/richard/hermes-agent/hermes_cli/security_audit.py
/home/cube/projects/richard/hermes-agent/hermes_cli/relaunch.py
/home/cube/projects/richard/hermes-agent/hermes_cli/win_pty_bridge.py
/home/cube/projects/richard/hermes-agent/hermes_cli/mcp_security.py
/home/cube/projects/richard/hermes-agent/hermes_cli/tools_config.py
/home/cube/projects/richard/hermes-agent/hermes_cli/partial_compress.py
/home/cube/projects/richard/hermes-agent/hermes_cli/callbacks.py
/home/cube/projects/richard/hermes-agent/hermes_cli/kanban.py
/home/cube/projects/richard/hermes-agent/hermes_cli/skills_hub.py
/home/cube/projects/richard/hermes-agent/hermes_cli/completion.py
/home/cube/projects/richard/hermes-agent/hermes_cli/secret_prompt.py
/home/cube/projects/richard/hermes-agent/hermes_cli/status.py
--- git status ---
## feature/dual-coach-lifecycle...personal/feature/dual-coach-lifecycle
 M agent/auxiliary_client.py
 M agent/codex_runtime.py
 M gateway/channel_directory.py
 M gateway/platforms/bluebubbles.py
 M gateway/platforms/diagnostic_isolation.py
 M gateway/platforms/korean_humanizer.py
 M gateway/platforms/nutrition_coaching.py
 M gateway/platforms/nutrition_coaching_config.py
 M gateway/platforms/physique_checkin.py
 M gateway/platforms/physique_checkin_prompts.py
 M gateway/platforms/telegram.py
 M gateway/run.py
 M gateway/status.py
 M hermes_cli/config.py
 M hermes_cli/gateway.py
 M hermes_cli/gateway_windows.py
 M hermes_cli/profiles.py
 M hermes_cli/tools_config.py
 M plugins/platforms/photon/README.md
 M plugins/platforms/photon/adapter.py
 M plugins/platforms/photon/plugin.yaml
 M plugins/platforms/photon/sidecar/index.mjs
 M plugins/platforms/photon/sidecar/patch-spectrum-mixed-attachments.mjs
 M pyproject.toml
 M tests/agent/test_auxiliary_client.py
 M tests/conftest.py
 M tests/cron/test_cron_script.py
 M tests/gateway/conftest.py
 M tests/gateway/test_adaptive_nutrition.py
 M tests/gateway/test_channel_directory.py
 M tests/gateway/test_diagnostic_isolation.py
 M tests/gateway/test_dm_topics.py
 M tests/gateway/test_gateway_shutdown.py
 M tests/gateway/test_korean_humanizer.py
 M tests/gateway/test_nutrition_coaching.py
 M tests/gateway/test_planned_stop_watcher.py
 M tests/gateway/test_platform_reconnect.py
 M tests/gateway/test_runner_fatal_adapter.py
 M tests/gateway/test_runner_startup_failures.py
 M tests/gateway/test_status.py
 M tests/gateway/test_telegram_conflict.py
 M tests/gateway/test_telegram_documents.py
 M tests/gateway/test_telegram_group_gating.py
 M tests/gateway/test_telegram_physique_checkin.py
 M tests/gateway/test_wecom_callback.py
 M tests/hermes_cli/test_gateway.py
 M tests/hermes_cli/test_gateway_runtime_health.py
 M tests/hermes_cli/test_gateway_service.py
 M tests/hermes_cli/test_gateway_windows.py
 M tests/hermes_cli/test_profiles.py
 M tools/approval.py
 M toolsets.py
?? .gjc/
?? .task26-evidence/
?? .task26-owner-v1-repair-v4/
?? .task26-owner-v1-repair-v5/
?? .task26-owner-v1-repair-v6/
?? .task26-owner-v1-snapshots/
?? build/
?? docs/nutrition-coaching/
?? gateway/platforms/dualcoach_activation_cutover.py
?? gateway/platforms/dualcoach_admin.py
?? gateway/platforms/dualcoach_tasks21_25_controller.py
?? gateway/platforms/nutrition_coaching_copy_integrity.py
?? gateway/platforms/nutrition_coaching_judgment.py
?? gateway/platforms/nutrition_coaching_judgment_adaptive.py
?? gateway/platforms/nutrition_coaching_judgment_request.py
?? gateway/platforms/nutrition_coaching_judgment_types.py
?? gateway/platforms/nutrition_coaching_proposal.py
?? gateway/platforms/nutrition_coaching_proposal_validation.py
?? gateway/platforms/nutrition_coaching_safety.py
?? gateway/platforms/nutrition_onboarding_reconciler.py
?? gateway/platforms/nutrition_onboarding_reconciliation.py
?? gateway/platforms/nutrition_onboarding_reconciliation_copy.py
?? gateway/platforms/nutrition_operator_projection.py
?? gateway/platforms/nutrition_service_state.py
?? gateway/platforms/telegram_activation_notice.py
?? gateway/platforms/telegram_customer_bootstrap.py
?? gateway/platforms/telegram_customer_bootstrap_registration.py
?? gateway/platforms/telegram_nutrition_addresses.py
?? gateway/platforms/telegram_nutrition_onboarding.py
?? gateway/platforms/telegram_nutrition_onboarding_authority.py
?? gateway/platforms/telegram_nutrition_onboarding_copy.py
?? gateway/platforms/telegram_nutrition_onboarding_preview.py
?? gateway/platforms/telegram_nutrition_onboarding_preview_callback.py
?? gateway/platforms/telegram_nutrition_onboarding_preview_completion.py
?? gateway/platforms/telegram_nutrition_onboarding_preview_flow.py
?? gateway/platforms/telegram_nutrition_onboarding_preview_publication.py
?? gateway/platforms/telegram_nutrition_onboarding_preview_types.py
?? gateway/platforms/telegram_nutrition_onboarding_publication_outbox.py
?? gateway/platforms/telegram_nutrition_onboarding_runtime.py
?? gateway/platforms/telegram_nutrition_onboarding_runtime_authority.py
?? gateway/platforms/telegram_nutrition_onboarding_runtime_callback.py
?? gateway/platforms/telegram_nutrition_onboarding_runtime_collection.py
?? gateway/platforms/telegram_nutrition_onboarding_runtime_errors.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
?? gateway/platforms/telegram_nutrition_operator_console.py
?? gateway/platforms/telegram_polling_receipts.py
?? hermes_cli/macbook_gui_bridge.py
?? plugins/platforms/photon/sidecar/package-lock.json.bak.20260623
?? scripts/nutrition-service-state
?? scripts/reproducible-wheel-build
?? tests/gateway/fixtures/
?? tests/gateway/test_dualcoach_activation_cutover.py
?? tests/gateway/test_dualcoach_admin_provider_auth.py
?? tests/gateway/test_dualcoach_tasks21_25_controller.py
?? tests/gateway/test_nutrition_coaching_judgment.py
?? tests/gateway/test_nutrition_onboarding_reconciliation.py
?? tests/gateway/test_task7_generation_hardening.py
?? tests/gateway/test_telegram_activation_notice.py
?? tests/gateway/test_telegram_customer_bootstrap.py
?? tests/gateway/test_telegram_mock_bootstrap.py
?? tests/gateway/test_telegram_nutrition_addresses.py
?? tests/gateway/test_telegram_nutrition_onboarding.py
?? tests/gateway/test_telegram_nutrition_onboarding_callback_observability.py
?? tests/gateway/test_telegram_nutrition_onboarding_copy.py
?? tests/gateway/test_telegram_nutrition_onboarding_direct_entry.py
?? tests/gateway/test_telegram_nutrition_onboarding_preview.py
?? tests/gateway/test_telegram_nutrition_onboarding_preview_runtime.py
?? tests/gateway/test_telegram_nutrition_operator_console.py
?? tests/gateway/test_telegram_polling_receipts.py
?? tests/gateway/test_telegram_polling_receipts_multiprocess.py
?? tests/gateway/test_telegram_room_bootstrap_adversarial.py
?? tests/gateway/test_trainer_free_v1_contract.py
?? tests/test_reproducible_wheel_build.py
?? tests/tools/test_macbook_gui_tool.py
?? tests/tools/test_macbook_remote_tool.py
?? tools/macbook_gui_tool.py
?? tools/macbook_remote_tool.py


/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/operator_console.py:26:from checkin_cli.models import ContractStatus, Event, EventType, validate_event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/operator_console.py:237:    """Own token checking and dispatch for one Richard/operator console."""
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_contract.py:10:from checkin_cli.nutrition_onboarding_models import OnboardingState
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_readiness_io.py:12:from checkin_cli.nutrition_readiness_contract import DIGEST_PATTERN
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:19:from .knowledge_retrieval import retrieve_for_checkin
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:46:    "daily_checkin_v1": ("daily", "1"),
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:71:    "daily": ("daily-checkin",),
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:158:            "daily": "daily_checkin_v1",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:175:        "daily_checkin_v1": ("nutrition_01", "nutrition_03", "choi_06", "nutrition_10"),
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:225:    retrieved = _compat_retrieved(retrieve_for_checkin(profile_root, query))
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/coaching_grounding.py:260:        retrieve_for_checkin(profile_root, {"question": question_text})
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_reconciliation.py:10:from checkin_cli.nutrition_onboarding_contract import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_restriction_kb.py:13:from checkin_cli.nutrition_onboarding_contract import canonical_digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_restriction_kb.py:14:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_store.py:12:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/policies/diagnostic-promotion-policy.json:22:    "checkin_cli/__init__.py",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalize_service.py:7:from checkin_cli.nutrition_onboarding_contract import OnboardingAuthority
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalize_service.py:8:from checkin_cli.nutrition_onboarding_finalization import finalize_onboarding
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalize_service.py:9:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalize_service.py:13:from checkin_cli.nutrition_onboarding_models import OnboardingState
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalize_service.py:14:from checkin_cli.nutrition_onboarding_session import build_status
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_projection.py:14:from checkin_cli.nutrition_onboarding_contract import canonical_digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:21:from checkin_cli.customer_coaching import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:28:from checkin_cli.history_imports import baseline_events, baseline_report, historical_view, legacy_history_events, legacy_manifest, parse_baseline
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:29:from checkin_cli.models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:891:            event_id = f"checkin_{self._digest(request.message_id + request.received_at)[:24]}"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:912:                check_in=self._contract_checkin(values),
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:1214:        self._write_private(self._views / "current.json", CurrentView(eligible_checkins=tuple(eligible), safety_flags=tuple(flags)).model_dump_json(indent=2) + "\n")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/store.py:1238:    def _contract_checkin(values: CheckinValues | None) -> ContractCheckin | None:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:9:from checkin_cli.nutrition_onboarding_authority import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:15:from checkin_cli.nutrition_onboarding_contract import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:22:from checkin_cli.nutrition_onboarding_contract import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:25:from checkin_cli.nutrition_onboarding_finalize_service import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:28:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:33:from checkin_cli.nutrition_onboarding_models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:36:from checkin_cli.nutrition_onboarding_models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:40:from checkin_cli.nutrition_onboarding_reconciliation import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:46:from checkin_cli.nutrition_onboarding_session import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:52:from checkin_cli.nutrition_onboarding_store import NutritionOnboardingStore
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:61:    from checkin_cli.customer_admin import set_customer_ai_consent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding.py:62:    from checkin_cli.customer_coaching import AiProcessingConsent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:2:from checkin_cli.customer_coaching import CustomerRegistry, load_customer_registry
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:3:from checkin_cli.customer_grounding import build_customer_grounded_context
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:4:from checkin_cli.customer_reporting import CustomerPeriodReport, build_customer_period_report
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:5:from checkin_cli.customer_schedule import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:21:from checkin_cli.customer_admin import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:27:from checkin_cli.diagnostic_isolation import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/__init__.py:39:from checkin_cli.diagnostic_evidence import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_authority.py:7:from checkin_cli.customer_coaching import load_customer_registry
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_authority.py:8:from checkin_cli.nutrition_onboarding_contract import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_authority.py:12:from checkin_cli.nutrition_onboarding_models import NutritionOnboardingBaseline
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:20:from checkin_cli.customer_coaching import CustomerRegistry
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:62:    "missing-checkin-v1": "체크인이 확인되지 않았습니다. 오늘 아침 체크인을 제출해 주세요.",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:215:    missing_morning_checkins: Mapping[str, date] | None = None,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:221:    if (missing_morning_checkins is None) != (reminder_evidence is None):
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:223:            "missing-checkin reminders require approved policy and config evidence"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:248:            missing_morning_checkins is not None
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:249:            and missing_morning_checkins.get(spec.customer_key) == local_day
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1520:def reserve_missing_checkin_reminder(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1531:    template_version: str = "missing-checkin-v1",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1580:                raise CustomerScheduleError("missing-checkin reminder is already terminal or reserved")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1642:def abandon_missing_checkin_reminder_for_terminal_morning_response(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1662:    checkin_received_at: datetime | None = None,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1670:        or (checkin_received_at is not None and checkin_received_at.tzinfo is None)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1675:    if checkin_received_at is not None and checkin_received_at <= now:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_schedule.py:1966:    from checkin_cli.diagnostic_evidence import existing_read_lock
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/history_imports.py:13:from checkin_cli.history_baseline import HistoryBaselineParser, SourceInventory
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/history_imports.py:14:from checkin_cli.history_models import Baseline, BaselineEntry
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/history_imports.py:15:from checkin_cli.models import ContractCheckin, ContractStatus, Event, EventType, ImportManifest, Provenance
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:14:from checkin_cli.customer_coaching import CustomerRuntime, RegisteredCustomerBinding
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:15:from checkin_cli.models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:25:from checkin_cli.store import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:30:from checkin_cli.wizard_models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:39:from checkin_cli.wizard_storage import WizardStorage
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:279:            checkin = _value_from(record, "check_in")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:280:            weight = _value_from(checkin, "body_weight_kg", "weight_kg")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:333:    return "customer_checkin"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:394:        if source_flow == "customer_checkin" and field == "calories_kcal":
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:401:        if source_flow == "customer_checkin" and field == "stated_goal" and _has_extreme_goal(text):
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:969:                from checkin_cli.customer_coaching import RegisteredCustomerDualCoachCoordinator
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:1018:            event = self._event(session, event_type, self._checkin(session), None)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:1022:            from checkin_cli.customer_coaching import RegisteredCustomerDualCoachCoordinator
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/wizard.py:1158:    def _checkin(self, session: WizardSession) -> ContractCheckin:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/history_baseline.py:13:from checkin_cli.history_models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:74:    from checkin_cli.adaptive_nutrition import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:137:        from checkin_cli.adaptive_nutrition import AdaptiveEventStore
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:149:        from checkin_cli.store import CanonicalEventTransaction
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:161:        from checkin_cli.adaptive_nutrition import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:188:        from checkin_cli.adaptive_nutrition import feature_config_digest, digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:233:        from checkin_cli.models import Event, EventType
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:286:            from checkin_cli.models import Event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:332:        from checkin_cli.models import Event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:379:            from checkin_cli.models import Event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:391:        from checkin_cli.adaptive_nutrition import load_verified_dual_coach_risk_policy
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:409:        from checkin_cli.models import Event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:436:        from checkin_cli.customer_admin import load_approved_adaptive_registration_inputs
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:477:        from checkin_cli.adaptive_nutrition import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:483:        from checkin_cli.models import Event
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:484:        from checkin_cli.store import terminal_morning_root_kst_day
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:493:        terminal_checkin_digest = self._event_digest(event)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:501:                terminal_checkin_id=event.event_id,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:502:                terminal_checkin_digest=terminal_checkin_digest,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:513:                "terminal_checkin_id": candidate.terminal_checkin_id,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:514:                "terminal_checkin_digest": candidate.terminal_checkin_digest,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:544:            "terminal_checkin_id": event.event_id,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:545:            "terminal_checkin_digest": terminal_checkin_digest,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:569:        from checkin_cli.models import Event, EventType
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:570:        from checkin_cli.adaptive_nutrition import load_verified_dual_coach_risk_policy
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:611:    def reserve_missing_checkin_reminder(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:623:        from checkin_cli.adaptive_nutrition import load_verified_dual_coach_risk_policy
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:624:        from checkin_cli.customer_schedule import reserve_missing_checkin_reminder
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:629:        return reserve_missing_checkin_reminder(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:645:        from checkin_cli.adaptive_nutrition import load_verified_dual_coach_risk_policy
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:646:        from checkin_cli.customer_schedule import non_response_review_candidate
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:653:            "missing_checkin_reminder_review",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_coaching.py:664:            dedupe_key=f"missing-checkin-reminder-review:{candidate.correlation_id}",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:13:from checkin_cli.customer_coaching import CustomerProfile, PlanWeek, TwelveWeekPlan
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:14:from checkin_cli.models import ContractStatus, Event, EventType
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:53:    checkin_dates: tuple[date, ...]
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:54:    checkin_rate_percent: float
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:65:        return self.checkin_rate_percent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:69:        return self.checkin_rate_percent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:72:    def checkin_rate(self) -> float:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:73:        return self.checkin_rate_percent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:123:    from checkin_cli.adaptive_nutrition import CustomerActionOutcome
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:177:    accepted_checkin_dates: tuple[date, ...]
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:178:    checkin_rate_percent: float
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:179:    checkin_pass: bool
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:198:    def checkin_rate(self) -> float:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:199:        return self.checkin_rate_percent
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:425:    checkin_dates = tuple(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:426:        day for day in _accepted_checkin_dates(events, starts_on, ends_on)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:437:    rate = _rate_percent(len(checkin_dates), len(eligible_weekdays))
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:442:    if not checkin_dates and "체크인 누락 줄이기" not in change:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:450:        checkin_dates=checkin_dates,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:451:        checkin_rate_percent=rate,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:499:        day for day in _accepted_checkin_dates(events, starts_on, ends_on)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:502:    checkin_rate = _rate_percent(len(accepted_dates), len(eligible_weekdays))
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:503:    checkin_pass = bool(eligible_weekdays) and len(accepted_dates) * 100 >= len(eligible_weekdays) * 80
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:528:    if not checkin_pass:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:529:        failures.append("checkin_rate")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:544:        accepted_checkin_dates=accepted_dates,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:545:        checkin_rate_percent=checkin_rate,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:546:        checkin_pass=checkin_pass,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:690:    return _as_date(_payload_value(event, "kst_date", "checkin_date", "collection_date", "work_date"))
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:732:def _accepted_checkin_dates(
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:740:        "morning_checkin",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:741:        "nutrition_checkin",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_reporting.py:742:        "customer_checkin",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_migration.py:8:from checkin_cli.nutrition_onboarding_contract import canonical_digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_migration.py:9:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_migration.py:14:from checkin_cli.nutrition_onboarding_projection import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_operator_console.py:12:from checkin_cli.models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_operator_console.py:17:from checkin_cli.operator_console import OperatorConsole, OperatorConsoleError
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_calculations.py:10:from checkin_cli.nutrition_onboarding_models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_history_imports.py:10:from checkin_cli.adaptive_nutrition import project_canonical_events
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_history_imports.py:11:from checkin_cli.history_imports import baseline_events, parse_baseline
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_history_imports.py:12:from checkin_cli.models import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_history_imports.py:23:from checkin_cli.store import EventStore
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_history_imports.py:84:    assert json.loads((home / "views" / "current.json").read_text())["eligible_checkins"] == []
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/cli.py:11:from checkin_cli.store import EventStore, RecordRequest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding.py:10:from checkin_cli.nutrition_onboarding_finalization import validate_clinical_clearance
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding.py:11:from checkin_cli.nutrition_readiness import audit_nutrition_start_readiness
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding.py:12:from checkin_cli.nutrition_readiness_io import canonical_digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding.py:13:from checkin_cli.nutrition_restriction_kb import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding.py:18:MODULE = "checkin_cli.nutrition_onboarding"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:7:from checkin_cli.nutrition_onboarding_artifacts import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:14:from checkin_cli.nutrition_onboarding_calculations import generate_initial_plan
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:15:from checkin_cli.nutrition_onboarding_contract import QUESTION_FIELDS, canonical_digest
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:16:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:19:from checkin_cli.nutrition_onboarding_models import NutritionOnboardingBaseline
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:20:from checkin_cli.nutrition_onboarding_projection import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:23:from checkin_cli.nutrition_readiness import audit_nutrition_start_readiness
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:24:from checkin_cli.nutrition_readiness_contract import DIGEST_PATTERN
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/nutrition_onboarding_finalization.py:25:from checkin_cli.nutrition_restriction_kb import (
/home/cube/.hermes/profiles/dualcoachtest/gateway_state.json:1:{"pid":343199,"kind":"hermes-gateway","argv":["/home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/hermes_cli/main.py","gateway","run"],"start_time":141963015,"boot_id":"f54bfc2b-fb52-42c6-b52d-a1ebb9ad32ae","home":"/home/cube/.hermes/profiles/dualcoachtest","gateway_state":"running","exit_reason":null,"restart_requested":false,"active_agents":0,"platforms":{"telegram":{"state":"fatal","error_code":"telegram_ingress_receipt_failed","error_message":"Telegram update 629525116 is blocked pending a durable ingress receipt.","updated_at":"2026-08-16T23:47:23.434337+00:00"}},"updated_at":"2026-08-16T23:47:23.434331+00:00"}
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_customer_nutrition_wizard.py:6:from checkin_cli.wizard import WizardContext, WizardService, WizardStatus
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_customer_nutrition_wizard.py:36:    assert event["event_type"] == "nutrition_checkin"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:146:    terminal_checkin_id: str
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:147:    terminal_checkin_digest: str
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:160:            self.terminal_checkin_id,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:161:            self.terminal_checkin_digest,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:171:    terminal_checkin_id: str,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:172:    terminal_checkin_digest: str,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:181:        or type(terminal_checkin_id) is not str
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:182:        or not terminal_checkin_id
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:188:    _require_digest(terminal_checkin_digest, "terminal check-in")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:197:        terminal_checkin_id,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:198:        terminal_checkin_digest,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:288:        from checkin_cli import customer_admin as admin
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:1002:            "checkin_recorded", "weight_recorded", "adherence_recorded", "exercise_session_recorded",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:3013:    "morning_checkin": "morning",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:3014:    "nutrition_checkin": "nutrition",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:6393:        if criterion_atom == "checkin_recorded" and check_in:
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/adaptive_nutrition.py:6415:    "missing_checkin_reminder_review",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:15:import checkin_cli.customer_admin as customer_admin_module
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:16:from checkin_cli import adaptive_nutrition as adaptive_module
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:17:from checkin_cli import customer_schedule as schedule_module
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:18:from checkin_cli import diagnostic_evidence as evidence_module
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:19:from checkin_cli.adaptive_nutrition import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:25:from checkin_cli.customer_admin import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:30:from checkin_cli.customer_coaching import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:36:from checkin_cli.customer_schedule import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:41:from checkin_cli.diagnostic_evidence import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:51:from checkin_cli.store import CanonicalEventTransaction
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:52:from checkin_cli.wizard_models import WizardFlow, WizardSession
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:53:from checkin_cli.wizard_storage import WizardStorage
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:172:        "event_type": "morning_checkin",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:630:    (profile / "checkin_cli").mkdir(parents=True)
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:635:    (profile / "checkin_cli" / "__init__.py").write_text("")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1050:    candidate = profile / "checkin_cli" / "diagnostic.py"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1052:    entry = _entry(profile, "profile", "checkin_cli/diagnostic.py")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1071:    link = profile / "checkin_cli" / "linked.py"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1075:            [_entry(profile, "profile", "checkin_cli/linked.py")],
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1082:    candidate = profile / "checkin_cli" / "diagnostic.py"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1084:    bad = _entry(profile, "profile", "checkin_cli/diagnostic.py")
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1089:    config = profile / "checkin_cli" / "runtime.json"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_evidence.py:1093:            [_entry(profile, "profile", "checkin_cli/runtime.json")],
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/policies/__init__.py:36:    "checkin_cli/__init__.py",
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:15:from checkin_cli.policies import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:26:POLICY_PATH = PROJECT_ROOT / "checkin_cli" / "policies" / POLICY_RESOURCE_NAME
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:27:POLICY_MEMBER = f"checkin_cli/policies/{POLICY_RESOURCE_NAME}"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:36:from checkin_cli.policies import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:42:raw = resources.files("checkin_cli.policies").joinpath("diagnostic-promotion-policy.json").read_bytes()
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:52:from checkin_cli.policies import PromotionPolicyError, load_policy
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_diagnostic_policy_package.py:214:    from checkin_cli import policies
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding_calculations.py:13:MODULE = "checkin_cli.nutrition_onboarding_calculations"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding_calculations.py:16:    "checkin_cli.nutrition_onboarding_calculations"
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding_calculations.py:19:from checkin_cli.nutrition_onboarding_calculations import (  # noqa: E402
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/tests/test_nutrition_onboarding_calculations.py:28:from checkin_cli.nutrition_onboarding_models import (  # noqa: E402
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:24:from checkin_cli.activation_token_rotation_policy import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:29:from checkin_cli.customer_coaching import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:42:from checkin_cli.customer_reporting import PilotKPIJudgement, judge_pilot_kpis
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:43:from checkin_cli.customer_schedule import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:51:from checkin_cli.models import OperatorTask, PaymentKind, PaymentMethod, RecordResult
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:52:from checkin_cli.nutrition_readiness import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:57:from checkin_cli.nutrition_onboarding_projection import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:65:from checkin_cli.nutrition_onboarding_fs import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:71:from checkin_cli.store import CanonicalEventTransaction, EventStore
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:72:from checkin_cli.adaptive_nutrition import (
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:487:        "checkin": {
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:488:            "passed": judgement.checkin_pass,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:489:            "rate_percent": judgement.checkin_rate_percent,
/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli/checkin_cli/customer_admin.py:4466:    "morning_checkin": "morning",

[Showing lines 332-575 of 575 (50.0KB limit). Full output: /tmp/pi-bash-4df724ad238750ce.log]


--- telegram methods ---
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_preview_callback.py:17:class TelegramNutritionOnboardingPreviewCallbackMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_publication_transport.py:39:class TelegramNutritionOnboardingRuntimePublicationTransportMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime.py:51:class TelegramNutritionOnboardingRuntime(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching_proposal.py:85:class NutritionTargets:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_errors.py:4:class NutritionOnboardingRuntimeError(ValueError):
/home/cube/projects/richard/hermes-agent/gateway/platforms/matrix.py:2598:    async def _handle_text_message(
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_notice.py:10:class TelegramNutritionOnboardingRuntimeNoticeMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_preview_flow.py:24:class TelegramNutritionOnboardingPreviewFlowMixin(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_onboarding_reconciler.py:26:class NutritionOnboardingReconciler:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching_judgment_types.py:29:class NutritionJudgmentGrounding:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching_judgment_types.py:46:class ValidatedNutritionJudgment:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_callback.py:115:class TelegramNutritionOnboardingRuntimeCallbackMixin(
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_authority.py:36:class TelegramNutritionOnboardingRuntimeAuthorityMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_collection.py:24:class TelegramNutritionOnboardingRuntimeCollectionMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_preview.py:37:class TelegramNutritionOnboardingPreview(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching_config.py:73:class NutritionCoachingConfig:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching_config.py:120:class AdaptiveNutritionConfig:
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py:37:class TelegramNutritionOnboardingRuntimePublicationMixin(
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram.py:189:class _NutritionDraftQuery(Protocol):
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram.py:242:class _NutritionGenerationPins(TypedDict):
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram.py:5781:    async def _send_nutrition_customer_card(
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram.py:13585:    async def _handle_text_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
/home/cube/projects/richard/hermes-agent/tests/gateway/test_telegram_physique_checkin.py:2797:class TestNutritionCopySurfaces:
/home/cube/projects/richard/hermes-agent/tests/gateway/test_telegram_physique_checkin.py:3112:class TestNutritionScheduleDelivery:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:2123:class NutritionCoachingCoordinator:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:2353:    ) -> AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:2370:        return AdaptiveNutritionCoordinator(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:2499:            fields = AdaptiveNutritionCoordinator._feature_config_fields(epoch)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:2501:            expected = AdaptiveNutritionCoordinator._feature_config_digest(epoch)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:12742:class AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:12756:    ) -> "AdaptiveNutritionCoordinator":
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:12759:            cls is not AdaptiveNutritionCoordinator
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:14627:            target = AdaptiveNutritionCoordinator._decode_target(raw.get("target"))
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:14628:            meal_plan = AdaptiveNutritionCoordinator._decode_meal_plan(raw.get("meal_plan"))
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:14629:            weekly_carb_cycle = AdaptiveNutritionCoordinator._decode_weekly_carb_cycle(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:14633:                AdaptiveNutritionCoordinator._decode_weekly_nutrition_plan(
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:14637:            cooldown = AdaptiveNutritionCoordinator._decode_cooldown(raw.get("cooldown"))
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:15014:        return AdaptiveNutritionCoordinator._matching_event(rows, event_type, proposal_digest) is not None
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:15044:        expected_map = AdaptiveNutritionCoordinator._overlay_mapping(expected)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:15045:        actual_map = AdaptiveNutritionCoordinator._overlay_mapping(actual)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:15056:        expected_map = AdaptiveNutritionCoordinator._overlay_mapping(expected)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:15057:        actual_map = AdaptiveNutritionCoordinator._overlay_mapping(actual)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:17619:        expected = AdaptiveNutritionCoordinator._feature_config_digest(payload)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:17684:            AdaptiveNutritionCoordinator._validate_journal_digest(row)
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:20303:class NutritionCoachingIntegrationError(RuntimeError):
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:20589:            raise NutritionCoachingIntegrationError("live nutrition coordinator is required")
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:20696:    def _adaptive_coordinator(self, customer_key: str) -> AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_coaching.py:21017:        raise NutritionCoachingIntegrationError("live nutrition coordinator is required")
/home/cube/projects/richard/hermes-agent/gateway/platforms/telegram_nutrition_onboarding_preview_publication.py:28:class TelegramNutritionOnboardingPreviewPublicationMixin:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_onboarding_reconciliation.py:21:class NutritionOnboardingClarification:
/home/cube/projects/richard/hermes-agent/gateway/platforms/nutrition_onboarding_reconciliation.py:30:class NutritionOnboardingReconciliation:
/home/cube/projects/richard/hermes-agent/tests/gateway/test_telegram_nutrition_onboarding_callback_observability.py:696:class _TextIngressRuntime(TelegramNutritionOnboardingRuntimeCollectionMixin):
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:56:    AdaptiveNutritionCoordinator,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:418:    coordinator = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1226:    reloaded = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1269:    reloaded = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1307:    reloaded = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1379:    epoch["config_digest"] = AdaptiveNutritionCoordinator._feature_config_digest(epoch)
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1416:    epoch["config_digest"] = AdaptiveNutritionCoordinator._feature_config_digest(epoch)
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1626:    return AdaptiveNutritionCoordinator(customer_key="client_001", starts_on=date(2026,7,1), event_path=tmp_path/"events.jsonl")
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1630:        AdaptiveNutritionCoordinator(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1652:        AdaptiveNutritionCoordinator(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:1667:        AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:3797:        AdaptiveNutritionCoordinator._write_feature_epoch,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:3821:        AdaptiveNutritionCoordinator._write_feature_epoch,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:3888:        AdaptiveNutritionCoordinator._write_feature_epoch,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:3935:        AdaptiveNutritionCoordinator._write_feature_epoch,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:3992:        AdaptiveNutritionCoordinator._write_feature_epoch,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:4026:        AdaptiveNutritionCoordinator._append_locked,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:4037:    second = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:4258:        AdaptiveNutritionCoordinator._append_locked,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:4826:        return list(AdaptiveNutritionCoordinator.project_delivery_attempt(rows))
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:5046:        AdaptiveNutritionCoordinator._append_locked,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:5375:        AdaptiveNutritionCoordinator._append_locked,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:5596:        AdaptiveNutritionCoordinator._append_locked,
/home/cube/projects/richard/hermes-agent/tests/gateway/test_adaptive_nutrition.py:5598:    restarted = AdaptiveNutritionCoordinator._for_shadow_test(
/home/cube/projects/richard/hermes-agent/tests/gateway/test_nutrition_coaching.py:7602:    coordinator = object.__new__(module.AdaptiveNutritionCoordinator)
/home/cube/projects/richard/hermes-agent/tests/gateway/test_telegram_group_gating.py:154:class _FakeNutritionSpaces:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_preview_callback.py:17:class TelegramNutritionOnboardingPreviewCallbackMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_publication_transport.py:39:class TelegramNutritionOnboardingRuntimePublicationTransportMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime.py:51:class TelegramNutritionOnboardingRuntime(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching_proposal.py:85:class NutritionTargets:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/matrix.py:2598:    async def _handle_text_message(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_preview_flow.py:24:class TelegramNutritionOnboardingPreviewFlowMixin(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching_judgment_types.py:29:class NutritionJudgmentGrounding:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching_judgment_types.py:46:class ValidatedNutritionJudgment:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram.py:189:class _NutritionDraftQuery(Protocol):
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram.py:242:class _NutritionGenerationPins(TypedDict):
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram.py:5781:    async def _send_nutrition_customer_card(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram.py:13585:    async def _handle_text_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_collection.py:24:class TelegramNutritionOnboardingRuntimeCollectionMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_preview.py:37:class TelegramNutritionOnboardingPreview(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching_config.py:73:class NutritionCoachingConfig:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching_config.py:120:class AdaptiveNutritionConfig:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_preview_publication.py:28:class TelegramNutritionOnboardingPreviewPublicationMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_notice.py:10:class TelegramNutritionOnboardingRuntimeNoticeMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_onboarding_reconciliation.py:21:class NutritionOnboardingClarification:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_onboarding_reconciliation.py:30:class NutritionOnboardingReconciliation:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py:37:class TelegramNutritionOnboardingRuntimePublicationMixin(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_authority.py:36:class TelegramNutritionOnboardingRuntimeAuthorityMixin:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_errors.py:4:class NutritionOnboardingRuntimeError(ValueError):
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_onboarding_reconciler.py:26:class NutritionOnboardingReconciler:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/telegram_nutrition_onboarding_runtime_callback.py:115:class TelegramNutritionOnboardingRuntimeCallbackMixin(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:2123:class NutritionCoachingCoordinator:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:2353:    ) -> AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:2370:        return AdaptiveNutritionCoordinator(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:2499:            fields = AdaptiveNutritionCoordinator._feature_config_fields(epoch)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:2501:            expected = AdaptiveNutritionCoordinator._feature_config_digest(epoch)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:12742:class AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:12756:    ) -> "AdaptiveNutritionCoordinator":
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:12759:            cls is not AdaptiveNutritionCoordinator
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:14627:            target = AdaptiveNutritionCoordinator._decode_target(raw.get("target"))
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:14628:            meal_plan = AdaptiveNutritionCoordinator._decode_meal_plan(raw.get("meal_plan"))
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:14629:            weekly_carb_cycle = AdaptiveNutritionCoordinator._decode_weekly_carb_cycle(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:14633:                AdaptiveNutritionCoordinator._decode_weekly_nutrition_plan(
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:14637:            cooldown = AdaptiveNutritionCoordinator._decode_cooldown(raw.get("cooldown"))
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:15014:        return AdaptiveNutritionCoordinator._matching_event(rows, event_type, proposal_digest) is not None
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:15044:        expected_map = AdaptiveNutritionCoordinator._overlay_mapping(expected)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:15045:        actual_map = AdaptiveNutritionCoordinator._overlay_mapping(actual)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:15056:        expected_map = AdaptiveNutritionCoordinator._overlay_mapping(expected)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:15057:        actual_map = AdaptiveNutritionCoordinator._overlay_mapping(actual)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:17619:        expected = AdaptiveNutritionCoordinator._feature_config_digest(payload)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:17684:            AdaptiveNutritionCoordinator._validate_journal_digest(row)
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:20303:class NutritionCoachingIntegrationError(RuntimeError):
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:20589:            raise NutritionCoachingIntegrationError("live nutrition coordinator is required")
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:20696:    def _adaptive_coordinator(self, customer_key: str) -> AdaptiveNutritionCoordinator:
/home/cube/projects/richard/hermes-agent/build/lib/gateway/platforms/nutrition_coaching.py:21017:        raise NutritionCoachingIntegrationError("live nutrition coordinator is required")
--- journal evidence ---
 8월 17 08:47:11 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[1171034]: channel 1: open failed: connect failed: Connection refused
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE python[2825]: {"key": "mgc_plan_c_v2_shadow:MGC:entry:short:1786922880000", "ok": false, "reason": "operational_health_not_pass", "state": "blocked"}
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd[2585]: Starting mgc-tradingview-tab-keeper.service - Ensure one logged-in MGC TradingView trade-report tab...
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[1171034]: channel 1: open failed: connect failed: Connection refused
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE python[415798]: {"error": "[Errno 104] Connection reset by peer", "ok": false}
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd[2585]: mgc-tradingview-tab-keeper.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd[2585]: mgc-tradingview-tab-keeper.service: Failed with result 'exit-code'.
 8월 17 08:47:21 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd[2585]: Failed to start mgc-tradingview-tab-keeper.service - Ensure one logged-in MGC TradingView trade-report tab.
 8월 17 08:47:23 cube-B850M-AORUS-ELITE-WIFI6E-ICE python[343199]: ERROR gateway.platforms.telegram: telegram_ingress stage=receipt update_id=629525116 reason_code=handler_exception
 8월 17 08:47:26 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[1171034]: channel 1: open failed: connect failed: Connection refused
 8월 17 08:47:31 cube-B850M-AORUS-ELITE-WIFI6E-ICE python[2825]: {"key": "mgc_plan_c_v2_shadow:MGC:entry:short:1786922880000", "ok": false, "reason": "operational_health_not_pass", "state": "blocked"}
 8월 17 08:47:32 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[415915]: Accepted publickey for cube from 100.84.71.27 port 56600 ssh2: ED25519 SHA256:+PJJF0K7Pe/9Lva+kK+zWRqv2mvhwQDjsuNsOUQ7z1A
 8월 17 08:47:32 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[415915]: pam_unix(sshd:session): session opened for user cube(uid=1000) by cube(uid=0)
 8월 17 08:47:32 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd-logind[1900]: New session 38671 of user cube.
 8월 17 08:47:32 cube-B850M-AORUS-ELITE-WIFI6E-ICE systemd[1]: Started session-38671.scope - Session 38671 of User cube.
 8월 17 08:47:33 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[415953]: Received disconnect from 100.84.71.27 port 56600:11: disconnected by user
 8월 17 08:47:33 cube-B850M-AORUS-ELITE-WIFI6E-ICE sshd-session[415953]: Disconnected from user cube 100.84.71.27 port 56600


**Inspecting config constructors and logs**

cd /home/cube/.hermes/profiles/dualcoachtest && printf '%s\n' '--- profile relevant files ---'; find . -type f \( -iname '*customer*' -o -iname '*nutrition*' -o -iname '*telegram*' -o -name 'config.yaml' -o -name '.env' \) -printf '%p\n' | sort | head -400; printf '%s\n' '--- id refs all file types ---'; rg -l -a '8527916639' . 2>/dev/null | sort; printf '%s\n' '--- gateway process cmd/env keys ---'; pid=$(python - <<'PY'
import json
print(json.load(open('gateway_state.json'))['pid'])
PY
); tr '\0' '\n' < /proc/$pid/cmdline; tr '\0' '\n' < /proc/$pid/environ | sed 's/=.*//' | sort | rg 'HERMES|TELEGRAM|NUTRITION|PYTHON'


        try:
            return ReplyKeyboardMarkup(rows, resize_keyboard=True, is_persistent=True)
        except TypeError:
            return ReplyKeyboardMarkup(rows, resize_keyboard=True)

    async def _ensure_customer_checkin_keyboard(self, address: object) -> None:
        chat_id = str(getattr(address, "chat_id", "") or "")
        topic_id = str(getattr(address, "topic_id", "") or "")
        key = (chat_id, topic_id)
        initialized = getattr(self, "_customer_checkin_keyboard_topics", None)
        if not isinstance(initialized, set):
            initialized = set()
            self._customer_checkin_keyboard_topics = initialized
        if not chat_id or not topic_id or key in initialized:
            return
        await self._send_nutrition_topic(
            chat_id=chat_id,
            topic_id=topic_id,
            text="아래 ‘오늘 체크인’ 버튼으로 언제든 체크인을 시작하거나 이어갈 수 있습니다.",
            reply_markup=self._customer_checkin_reply_markup(),
        )
        initialized.add(key)

    @staticmethod
    def _nutrition_program_day_label(
        coordinator: object,
        customer_key: object,
        kst_day: object,
    ) -> str:
        customer_getter = getattr(coordinator, "customer", None)
        customer = customer_getter(str(customer_key or "")) if callable(customer_getter) else None
        starts_on = getattr(getattr(getattr(customer, "spec", None), "plan", None), "starts_on", None)
        try:
            day_number = int((kst_day - starts_on).days) + 1
        except (TypeError, ValueError, AttributeError):
            return ""
        return f"D+{day_number}" if day_number >= 1 else f"D{day_number - 1}"

    @staticmethod
    def _nutrition_customer_card_prompt(
        coordinator: object,
        customer_key: str,
        kst_day: object,
    ) -> WizardPrompt | None:
        callback_builder = getattr(coordinator, "customer_start_callback", None)
        if not callable(callback_builder):
            return None
        try:
            callback_data = callback_builder(customer_key)
            year = int(getattr(kst_day, "year"))
            month = int(getattr(kst_day, "month"))
            day = int(getattr(kst_day, "day"))
        except (TypeError, ValueError, AttributeError):
            return None
        program_day = TelegramAdapter._nutrition_program_day_label(
            coordinator,
            customer_key,
            kst_day,
        )
        day_label = f" · {program_day}" if program_day else ""
        controls_getter = getattr(
            coordinator,
            "customer_service_controls_for_customer",
            None,
        )
        controls = (
            controls_getter(customer_key)
            if callable(controls_getter)
            else None
        )
        control_buttons = tuple(getattr(controls, "buttons", ()) or ())
        button_rows = ((("오늘 체크인 시작", callback_data),),)
        if control_buttons:
            button_rows = (*button_rows, control_buttons)
        return WizardPrompt(
            f"{year}년 {month}월 {day}일{day_label}\n"
            "이 고객 체크인 토픽의 오늘 기록입니다.\n"
            "아래 ‘오늘 체크인 시작’을 누르면 첫 질문이 열립니다.\n"
            "입력을 모두 마친 뒤 ‘체크인 저장’을 누르면 오늘 기록이 제출됩니다.",
            button_rows=button_rows,
        )
    async def _send_nutrition_customer_card(
        self,
        message: object,
        coordinator: object,
        *,
        address: object | None = None,
        kst_day: object | None = None,
    ) -> bool:
        """Send one reusable customer card only to its exact live topic."""
        address = address or self._nutrition_address(message)
        resolver = getattr(coordinator, "resolve", None)
        resolved = resolver(address) if callable(resolver) else None
        if resolved is None:
            return False
        customer = getattr(resolved, "customer", None)
        spec = getattr(customer, "spec", None)
        customer_key = str(getattr(spec, "customer_key", "") or "").strip()
        if not customer_key:
            return False
        transport_allowed = getattr(coordinator, "customer_transport_allowed", None)
        if not callable(transport_allowed):
            return False
        try:
            allowed = transport_allowed(customer_key, address, kst_date=kst_day)
        except TypeError:
            allowed = transport_allowed(customer_key, address)
        if not allowed:
            return False
        if kst_day is None:
            current_date = getattr(coordinator, "current_kst_date", None)
            kst_day = current_date() if callable(current_date) else datetime.now(
                timezone.utc
            ).astimezone(ZoneInfo("Asia/Seoul")).date()
        prompt = self._nutrition_customer_card_prompt(coordinator, customer_key, kst_day)
        if prompt is None:
            return False
        await self._ensure_customer_checkin_keyboard(address)
        try:
            await self._send_nutrition_topic(
                chat_id=address.chat_id,
                topic_id=address.topic_id,
                text=prompt.text,
                reply_markup=self._physique_markup(prompt),
            )
        except Exception as exc:
            logger.warning(
                "[%s] nutrition customer card send failed: %s",
                getattr(self, "name", "telegram"),
                type(exc).__name__,
            )
            return False
        return True

    @staticmethod
    def _nutrition_onboarding_markup(
        card: object,
    ) -> InlineKeyboardMarkup | None:
        buttons = tuple(getattr(card, "buttons", ()) or ())
        if not buttons:
            return None
        from telegram import InlineKeyboardButton, InlineKeyboardMarkup

        return InlineKeyboardMarkup([[
            InlineKeyboardButton(str(label), callback_data=str(callback_data))
            for label, callback_data in buttons
        ]])

    async def _handle_nutrition_customer_consent_callback(
        self,
        query: "CallbackQuery",
        data: str,
        message: object,
    ) -> None:
        coordinator = self._get_nutrition_coaching()
        if coordinator is None:
            await query.answer(text="고객 코칭 기능을 사용할 수 없습니다.")
            return
        address = self._nutrition_address(query, message)
        transport = (
            getattr(self, "_room_bootstrap_transport", None)
            or self._get_room_bootstrap_transport()
        )
        store = getattr(transport, "store", None)
        bootstrap_session = None
        if store is not None:
            from gateway.platforms.telegram_customer_bootstrap import (
                BootstrapState,
                Role,
            )

            for candidate in store.list_sessions():
                customer = candidate.role_claim(Role.CUSTOMER)
                if (
                    candidate.state is BootstrapState.AWAITING_CONSENT
                    and customer is not None
                    and customer.user_id == str(address.user_id)
                    and customer.chat_id == str(address.chat_id)
                    and customer.topic_id == str(address.topic_id)
                ):
                    bootstrap_session = candidate
                    break
        if bootstrap_session is not None and (
            bootstrap_session.consent_card_message_id is None
            or str(getattr(message, "message_id", ""))
            != bootstrap_session.consent_card_message_id
        ):
            await query.answer(
                text="이 동의 카드는 만료됐습니다. ‘고객 체크인’ 토픽의 "
                "가장 최근 동의 카드를 사용해 주세요."
            )
            return
        await _acknowledge_callback_best_effort(
            query,
            gate="nutrition_customer_consent",
        )
        transition = coordinator.handle_customer_consent_callback(address, data)
        if transition.reply.accepted:
            try:
                await query.edit_message_text(text=transition.reply.notice)
            except asyncio.CancelledError:
                raise
            except Exception as exc:
                update_id = current_telegram_update_id()
                logger.warning(
                    "telegram_callback_card_publication_failed "
                    "gate=nutrition_customer_consent update_id=%s error=%s",
                    update_id if update_id is not None else "unknown",
                    type(exc).__name__,
                )
        if not transition.reply.accepted or not str(data).endswith(":g"):
            return
        if store is None or bootstrap_session is None:
            return
        current = store.get(bootstrap_session.session_id)
        if (
            current.state is BootstrapState.AWAITING_CONSENT
            and current.generation == bootstrap_session.generation
            and current.consent_card_message_id
            == bootstrap_session.consent_card_message_id
        ):
            activated = store.reconcile_committed_consent(
                current.session_id,
                expected_generation=current.generation,
                publication_attempt=current.consent_publication_attempt,
                consent_card_message_id=current.consent_card_message_id,
            )
            runtime = self._get_nutrition_onboarding_runtime()
            if runtime is not None:
                await runtime.start_after_consent(

[8766 more lines in file. Use offset=5930 to continue.]