- On a Claude Code session/usage limit ('resets 7:10pm'), _call_claude_cli now
pauses IN PLACE until the stated reset time + CLAUDE_CLI_LIMIT_BUFFER_SECONDS
(default 60s past), then retries — up to CLAUDE_CLI_LIMIT_MAX_WAITS windows.
Parses 12-hour reset times to their next occurrence; falls back to a fixed
wait when no time is present. Makes long unattended runs survive reset windows.
- load_library() reports invalid capability-set JSON as a clean SystemExit
(line number + reason) instead of a traceback; fixed a trailing-comma typo in
data/capability_sets/dx02.json.
- Docs: USAGE.md + .env.example document the claude-cli provider and its knobs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Exa harvester:
- EXA_CATEGORY=news (default) restricts to news articles, excluding evergreen
careers/marketing landing pages that were producing irrelevant signals.
- Event-focused query (acquisition/earnings/launch/leadership), dropped
hiring/career terms that pulled recruiting pages.
- Domain scoping now OFF by default (broad-web news about the account beats
first-party careers pages); add EXA_EXCLUDE_DOMAINS and loop --domain-filter.
LLM layer:
- Remove the mock reasoner entirely (no provider => loop refuses to run).
- On HTTP 429, WAIT (LLM_RATELIMIT_WAIT_SECONDS, default 900s; honors
Retry-After) and retry up to LLM_RATELIMIT_MAX_RETRIES (24) instead of
degrading to mock output.
- If the LLM is ultimately unavailable for an account, skip it and leave its
signals unconsumed (retried next run) — never fabricate briefs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New provider 'openai' calls any OpenAI-compatible /chat/completions endpoint
(OpenAI, OpenRouter, Together, Groq, NVIDIA, vLLM, Ollama, ...), set via
OPENAI_BASE_URL / OPENAI_API_KEY / OPENAI_MODEL. Now the default; auto-detects.
- Robustness for models that degenerate (e.g. Kimi repetition loops): anti-
repetition sampling (temperature + frequency penalty), and a schema-aware
retry — call_json(require_keys=...) retries a fresh sample on degenerate or
unparseable output (LLMRetryable). Relevance requires 'signals', synth 'briefs'.
- response_format=json_object (toggle via OPENAI_JSON_MODE); base URL accepts a
full /chat/completions URL or a /v1 base.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>