chore(deps): update hmmlearn requirement from >=0.3.0 to >=0.3.3#22
Open
dependabot[bot] wants to merge 277 commits into
Open
chore(deps): update hmmlearn requirement from >=0.3.0 to >=0.3.3#22dependabot[bot] wants to merge 277 commits into
dependabot[bot] wants to merge 277 commits into
Conversation
tp1_price now reads result['tp1'] as fallback since Claude returns 'tp1' not 'tp1_price'. Added traceback logging in ChartDraw to surface silent matplotlib failures.
- GUIDE.md: v1.1.0, agent files in architecture tree, sync 5 min, gemini_client/grok_client/agent_orchestrator added - USER_GUIDE.md: v1.1.0, sync 5 min, v1.1.0 changelog with 7-agent pipeline, annotated charts, monitor scheduler, consensus scoring - RATING_CRITERIA.md: file reference updated to agent_trade_prep.py - RESUME_PROMPT.md: commit 6e70a9d, known gotchas section, requirements, chart draw notes, removed completed PDF task from Next Work - plans/specialized-agents: marked FULLY IMPLEMENTED - specs/specialized-agents: marked IMPLEMENTED with commit range Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…heck Adds _retroactive_close_calls() to bitget_sync.py which fetches 1H candles and resolves TP1/TP2/SL outcomes for saved calls older than 2 hours that were never linked to a live position. Wired into run_sync() and summed into calls_closed. Stubs pandas_ta/chart_indicators/chart_sr in conftest.py to allow chart_context import in test env; fixes trade_history.get_recent_trades to build dicts without relying on sqlite3.Row row_factory. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TDD (Tasks 5+6): 3 tests cover empty/partial/target-reached states. Returns recorded count, win rate, remaining calls, and enough_data flag against ACCURACY_TARGET=35 from constants. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… to survive Bitget 400 errors
…ly on API permission errors
… symbol in explorer
… ±10) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…to reversal rubric
…ame for finalists - Add _is_in_kill_zone() and _annotate_kill_zone() helpers (London 07-09 UTC, NY AM 12-14 UTC) - Apply kill zone annotation in _batch_ai_score and _ai_score result paths - Raise R:R cap threshold from 1.5 to 2.0 in scanner stable prefix and scoring hints - Inject DRAW_ON_LIQUIDITY_RULES into _build_scanner_stable() return value - Add 1H timeframe to agent data collector call in _score_finalists_with_agents() - Add 11 passing tests in tests/test_scanner_killzone.py Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nalyze onclick injection
…eful JSON-in-summary display
Adds a '?' button in the chart header that expands an inline legend panel explaining every chart abbreviation with color-coded visual indicators: trade levels (Entry/SL/TP1/TP2), S/R zones, trendlines, Fibonacci, liquidation levels, WaveTrend oscillator signals, and volume bars. Panel uses static HTML (no innerHTML) in a responsive grid layout, matching the existing chart theme. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
blofin_client.get_open_positions() was returning a minimal dict with no direction, margin_usdt, size_usdt, mark_price, unrealized_pct, or exchange fields. The frontend expected the same shape as Bitget positions, causing: - JS crash: "undefined is not an object (evaluating 'p.direction.toLowerCase')" - NaN USDT in Margin in Use KPI card - Portfolio Risk section stuck on Loading... Fix: fully normalise blofin positions to match bitget shape (direction, margin_usdt, size_usdt, mark_price, unrealized_pct, liquidation_price, stop_loss, take_profit, margin_mode, exchange, duration_minutes). Add defensive (p.direction||'long').toLowerCase() guard in 08-live.js v3.4. Also: docs sync (README/GUIDE/USER_GUIDE/architecture/CLAUDE) reflecting all post-v1.6.0 work: Gemini fallback, scanner price guards, chart legend panel, pending orders pop-out. Test count updated 442 → 467. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reflects post-v1.6.0 fixes: Gemini fallback, scanner price guards, chart legend panel, pending orders pop-out, Blofin live positions shape fix. Test count 442→467. Latest commit 54bcca0. JS versions updated. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- agent_trade_prep.run() accepts optional model param (default MODEL/Sonnet) - agent_orchestrator.run_scanner_prep() passes model override through - scripts/compare_opus_sonnet.py: re-scores latest 15 scanner setups with Opus in parallel (max 3 workers), generates docs/opus_sonnet_comparison.md with score table, agreement analysis, and per-setup reasoning diff Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…eld names ReviewerInput requires symbol/direction/setup_type, not collected/sentiment. TradePrepResult uses tp1_price/tp2_price not tp1/tp2. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
agent_market_sentiment.run() requires symbol and direction in input dict. Mirrors the pattern used in agent_orchestrator.run_call_analysis(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ad-safety) SQLite connections cannot be shared across threads. Each worker now opens its own db_conn() context, fixing 'SQLite objects created in a thread' ProgrammingError when ThreadPoolExecutor dispatched rescore_with_opus. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The systemd service uses EnvironmentFile=.env, but direct SSH execution doesn't inherit those env vars. Parse .env at script start so API keys are available when running python3 scripts/compare_opus_sonnet.py directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously sent ANALYST_INSTRUCTIONS + RISK_INSTRUCTIONS as the system param on every call_analyzer / scanner_batch request. The system prompt alone is ~521 tokens — below Anthropic's 1024-token cache minimum, so it was never cached. Combined with the existing stable_prefix (rulebook + calibration + strengths, ~1022 tokens), the merged prefix is now ~1543 tokens — well over the threshold and gets cached on every call. Expected impact: ~60% reduction in call_analyzer / scanner_batch input token cost (currently the biggest single line item at ~$8/wk). Verify next scan run: token_usage.cached_tokens should be non-zero. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Gemini 2.5 Flash / 2.5 Pro are 'thinking' models — by default they spend hidden tokens reasoning before producing output. With low max_tokens, the entire budget is consumed by thinking and the response arrives with no 'parts' array, causing KeyError: 'parts' in the legacy parser. - Add thinkingConfig.thinkingBudget=0 to both _call() and send_text() to disable thinking (the trading journal needs structured output, not a reasoning trace) - Replace direct dict indexing with .get() chain that returns None and logs finishReason when parts is empty - HTTP error path now includes response body (first 200 chars) so 429s with quota details are visible in the logs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each Gemini model has its own per-project free-tier daily + per-minute quota. When one is rate-limited, we now fall through to the next available bucket instead of failing immediately. Cascade order (primary then fallbacks, deduped): 1. $GEMINI_MODEL env var (default: gemini-2.5-flash-lite via constants) 2. gemini-2.5-flash-lite 3. gemini-2.5-flash 4. gemini-2.0-flash-lite 5. gemini-2.0-flash Each model tracks its own cooldown timer (parsed from the Google retryDelay field on 429 responses, default 60s). Subsequent calls skip models that are in active cooldown. When all 4 buckets are exhausted, returns None and logs 'All cascade models exhausted (cooldown)'. Also: cleaned up error handling to keep error logs per-model and distinguish 429 (continue cascade) from other failures (abort early). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ble shape Test was still asserting on the old 'side' field; updated to verify the new normalised shape (direction, margin_usdt, size_usdt, etc.) that get_open_positions() returns post-fix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New shared OpenAI-compatible chat client (openai_compat_client.py), one
thin wrapper per provider:
- cerebras_client.py: Qwen 3 235B, Llama 3.1 8B (free tier)
- groq_client.py: Llama 3.3 70B, Llama 4 Scout (LPU free tier)
- openrouter_client.py: DeepSeek V4 Flash, NVIDIA Nemotron 120B (free)
- grok_client.py: adds send_text() shim for X.AI's chat-completions
ai_client.send() refactored:
- New 'provider' param routes a single call through any backend
- Module-level force_provider() contextmanager (contextvars-based)
forces the entire downstream pipeline through one backend for
cascade-comparison testing
scripts/compare_cascades.py: runs 12 scanner finalists through 8 provider
configs + an Opus 4.7 baseline, emits docs/cascade_comparison.md with
agreement table (vs Opus), structural-soundness checks (entry/SL/TP
ordering, R:R≥1.5), per-setup diff, and final ranking by avg |Δ|.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…oss providers Old behavior: each (setup, provider) combo re-ran agent_data_collector (~15s external API fetch) → 108 fetches total, ~25 min wasted on duplicate calls and risking unfair comparison if market data drifted between runs. New behavior: Phase 1 collects data once per setup (12 fetches). Phase 2 runs all 9 provider configurations against the SAME collected snapshot. All providers now see byte-identical inputs — comparison purely tests AI output quality, not data-fetch timing variance.
…rkers The force_provider() contextmanager uses contextvars to inject a routing override that affects every ai_client.send() call downstream. Bug: Python's ThreadPoolExecutor.submit() does NOT propagate contextvars to worker threads by default — so when agent_trade_prep and agent_orchestrator submitted their parallel Anthropic+Gemini work, the worker threads saw provider=None and defaulted back to Anthropic with the wrong model name. Fix: wrap each submit() with contextvars.copy_context().run(). Adds one import + 2 line changes per file. Resolves 96/96 ERROR rows in the first cascade comparison run. Also adds SKIP_RUNS env var support to compare_cascades.py so the Opus 4.7 baseline (~$5 to re-run) can be skipped and reused from the prior report on subsequent invocations.
…block
Cerebras + Groq both proxy through Cloudflare. Python urllib's default
User-Agent ('Python-urllib/3.x') triggers Cloudflare's ASN-based bot
detection, returning HTTP 403 with code 1010 (autonomous-system ban).
Setting a browser-shaped User-Agent ('Mozilla/5.0 ... trading-journal/1.6')
identifies us as a normal client without lying about our nature.
- New SETUPS_OVERRIDE env var pins which symbols to score, so re-runs hit the same setup list as the cached baseline report (avoids KeyError when the auto-scanner shifts the DB's latest-N window between invocations). - generate_report() now uses .get() instead of direct index access on all_results — missing baseline rows produce 'not run'/'no baseline' markers instead of crashing the whole report write.
Baseline rows look like '| Baseline (Opus 4.7) | 6 | — | 0.0638 | ...' — the em-dash in the Δ column is legitimate (no delta vs itself). My parser filter 'or | — | in line' was treating that as a separator/empty row and skipping it, so prior baseline data never loaded. Restricted the skip to specific safe markers (ERROR, 'not run', explicit header/separator lines) and added an entry/SL all-dashes check for partial-error rows. Also fixed the main() TOP-3 print loop to use .get() like generate_report does, so missing entries return None instead of KeyError.
…ooldown Wires the empirical cascade ranking from docs/cascade_comparison.md into ai_client.send() as the fallback chain when Anthropic raises APIError: 1. Groq Llama 4 Scout 2. Cerebras Qwen 3 235B 3. Cerebras Llama 3.1 8B 4. OpenRouter DeepSeek V4 5. Gemini (internal 4-model cascade) Each step is skipped if openai_compat_client.is_in_cooldown() reports the target (base_url, model) is currently rate-limited. On HTTP 429, the chat_completion wrapper now parses retry-after from the response body and marks cooldown for that duration (defaulting to 60s). Saves wasted roundtrips when one provider's daily quota is exhausted while others have headroom. force_provider() contextmanager continues to bypass the cascade for testing. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ulebook suppression filter Two compounding biases eliminated (audit 2026-05-20: 422 longs, 0 shorts): 1. Stage 1 (scanner_stages.py): The if/elif tagged 'Long' as soon as bullish>=threshold, never reaching the Short check even when bearish signals were materially stronger. 8 of 15 watchlist probes had net-bearish signals mis-tagged Long (e.g. ETHUSDT bull 2.6 / bear 5.7 net -3.1 → Long instead of Short). Replaced with dominant-side selection: max(bull,bear)>=threshold then pick by bull>bear. 2. Rulebook (ai_rulebook.py): The user's auto-generated rule 'Short trades are destroying your account' was injected into every AI prompt, biasing scoring after Stage 1 surfaced candidates. Added RULEBOOK_SUPPRESS_PATTERNS env-driven filter that drops rules whose title or body matches any comma-separated pattern. Lets the user pause specific learnings without losing the regeneration pipeline. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…en't cut confluence_score returns a SIGNED total (positive=bullish, negative=bearish). Stage 2 sorted by -score and capped at top 30, so strongly bearish symbols (large negative score) sank to the bottom and were dropped. Caused the Stage 1 direction-tagging fix to be invisible — even when shorts got tagged correctly, they never reached Stage 3 AI scoring. Fix: sort by -abs(score) — preserves conviction-ranking while treating long/short conviction symmetrically.
Updates the requirements on [hmmlearn](https://github.com/hmmlearn/hmmlearn) to permit the latest version. - [Changelog](https://github.com/hmmlearn/hmmlearn/blob/main/CHANGES.rst) - [Commits](hmmlearn/hmmlearn@0.3.0...0.3.3) --- updated-dependencies: - dependency-name: hmmlearn dependency-version: 0.3.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updates the requirements on hmmlearn to permit the latest version.
Changelog
Sourced from hmmlearn's changelog.
... (truncated)
Commits
67c5a95Release v0.3.3.cd5af66Reacquire GIL before constructing tuples containing numpy arrays.0532247Update CI re: deprecated actions and Python 3.13.8ae8e7fMove to pyproject.toml and src-layout; stop writing _version.py.33b1a91Typo resulting in taking first model instead of best (#555)97c2fc5relax pytest requirement. Run pytest via python -I to ignore ci/cd environmen...ea800bafix the year in CHANGES.rst (#551)eabf0e7Bump after 0.3.2 releasee16f8eaMake the 0.3.2 releaseb2e96d0Fix CI/CI Pipelines. (#550)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)