Qwen3.5 in thinking mode emits <think>...</think> chain-of-thought
before the actual response. The thesis rewriter was returning the raw
output including the entire reasoning block. Now strips thinking tags
from both Ollama and vLLM response paths.
Workers (ingestion, parser, extractor, aggregation, recommendation,
broker, lake-publisher) now check the pipeline:enabled Redis flag on
each loop iteration and sleep when disabled.
The toggle endpoint flushes all pipeline queues on disable so queued
jobs don't resume when workers eventually check. Broker/trading queues
are excluded from flush to avoid dropping in-flight orders.
- thesis_llm.py: add _call_vllm_thesis() using /v1/chat/completions
- thesis_llm.py: check resolved model_provider and route accordingly
- values.yaml: set OLLAMA_BASE_URL to http://10.1.1.12:2701
- recommendation worker: filter out non-UUID document IDs (synthetic
pattern:* IDs from competitive signals) before inserting into
recommendation_evidence table — the uuid cast was failing and
silently dropping all evidence rows
- wrap executemany in try/except so partial failures don't lose all evidence
- SqlExplorer: wrap Lucide icons in <span title=...> instead of passing
title prop directly (not supported by lucide-react, broke CI build)
- Recommendation worker now resolves thesis-rewriter config from DB
and passes ollama_config to generate_recommendation. Thesis rewriting
is now active when the thesis-rewriter agent exists in ai_agents.
Refreshes config every 50 jobs.
- Event classifier now resolves its own config separately from the
document extractor via 'event-classifier' slug. Uses a separate
OllamaClient when the model differs from the extractor. Refreshes
alongside the extractor every 100 jobs.
- Document extractor was already wired (existing code).
- Added 8 unit tests for AgentConfigResolver covering: DB resolution,
variant override, not-found, DB errors, TTL caching, cache refresh,
and invalidation.
- Add dedup check in recommendation worker: skip generation when latest
rec for same ticker+window has identical action/mode/confidence
- Widen position sizing range (1-10% portfolio, 0.3-2% max loss) and
factor in trend strength + evidence count for differentiated sizing
- API returns only latest recommendation per ticker by default (DISTINCT ON)
to eliminate duplicate rows in the frontend list view