- First log call moved to very top of run_session_now() so user always
sees the task started, even if subsequent DB/engine calls fail
- Entire function body wrapped in try/except: errors go to scheduler log
instead of vanishing in asyncio's unhandled-exception machinery
- Endpoint wraps create_task() in a logging shim (_task()) for the same reason
- 'already ran' path now logs a visible warning instead of silent return
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- POST /orb/auto/clear-log: clears in-memory log lines and deletes
the orb_scheduler.log file on disk
- ORBAutoScheduler.clear_log(): implements the wipe
- Log panel header now has an Eraser icon button on the right;
disabled when log is empty
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ORBDailyStateRow.phase defaults to 'idle' even when no DB row exists,
so bool(daily.phase) was True for brand-new sessions, hiding the
'지금 시작' button. Fix: ran_today = phase not in ('idle', '', None).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /orb/sessions now returns ran_today boolean (true if daily_state.phase
is set, meaning engine ran ORB detection for today)
- POST /orb/sessions/{id}/run_today: fires ORB detection in background and
injects remaining today-events (breakout, stop, EOD) into the live schedule
- ORBAutoScheduler.run_session_now(): coroutine that runs detection then
splices session's future events into self._today_schedule
- Session card shows a cyan "지금 시작 (현재 가격 기준)" button when
ran_today === false; hides it once detection has run
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>