Detectia de rate limit functiona, dar `_local_fallback_reply` putea
intoarce None din patru locuri fara nicio linie de log — userul primea
`Claude CLI error (exit 1): You've hit your session limit` pe Discord in
loc de raspuns, si nu se putea afla ulterior din log care branch a picat.
- daca runda de unelte iese goala, turnul se reface fara unelte in loc
sa fie abandonat
- fiecare return None ramas e logat
- daca nici modelul local nu raspunde, mesajul e „Claude e la limita…"
plus ora de reset, nu eroarea bruta a CLI-ului
- cron: job-urile heartbeat* tac la limita (last_status: rate_limited);
celelalte trimit o singura linie scurta, ca sa se vada rularea sarita
- is_rate_limit_error / rate_limit_detail mutate in claude_session.py,
folosite si de scheduler (care nu poate importa router-ul)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DzZAMzbyQbzFdsrVoXijBg
Adds four new test groups to tests/test_scheduler.py:
- TestTimezone: asserts AsyncIOScheduler is constructed with Europe/Bucharest.
- TestShellKind: 16 cases covering add_shell_job validation (duplicate name
across claude/shell, invalid cron, empty/non-list/non-string command,
bad report_on, bad timeout bounds/type, empty channel, custom report_on
and timeout pass-through).
- TestShellExecute: 14 cases covering the report_on contract:
- exit 0 + marker N>0 → forwards stdout
- exit 0 + marker N==0 → silent
- exit 0 + no marker → silent + warning
- report_on=always and =never variants
- non-zero exit reports stderr even when report_on='never'
- TimeoutExpired and launch exceptions report '[cron:X] Error: ...'
- per-job timeout passed to subprocess.run; default 300 when None
- subprocess.run receives the job's command list verbatim
- stdout trimmed to 1500 ch; stderr trimmed to 500 ch
- TestBackwardCompat: a jobs.json entry without a 'kind' field dispatches
to _execute_claude_job (never to _execute_shell_job); the existing Claude
add_job/run_job round-trip still works with the old CLI invocation.
- TestMarkerRegex: parametrised positive/negative cases for _MARKER_RE.