# Session Context — July 11, 2026 ## Current State ### Active Namespace: `stonks-beta` - This is the ONLY namespace that should be running - `stonks-oracle` namespace has been scaled to 0 replicas (all deployments) - Dashboard: `https://stonks-beta.celestium.life` - API: `https://stonks-api-beta.celestium.life` ### What Was Done This Session #### 1. Pipeline Health Fixes (spec: `.kiro/specs/pipeline-health-fixes/`) All implemented and deployed: - **Stuck Parsed Docs**: `STALE_PARSED_THRESHOLD_MINUTES` 240→30, `LIMIT` 100→500, `_ENQUEUED_TTL` 14400→3600 (`services/scheduler/app.py`) - **Price Fallback**: Added 24h market_snapshots time-window fallback in `create_prediction_snapshot()` (`services/validation/prediction_snapshot.py`) - **Sentiment Normalization**: Added `normalize_impact_scores()` z-score function (`services/aggregation/scoring.py`) + integrated into `aggregate_company_window()` (`services/aggregation/worker.py`) - **Signal Engine**: Replicas set to 0 in all Helm values files - **Quality Gate**: `max_snapshot_age_hours` 24→48 (`services/trading/model_quality_gate.py`) - **Backfill script**: `scripts/backfill_snapshot_prices.py` (one-time, not yet run on beta) #### 2. Extractor Null-Field Fix - `services/extractor/schemas.py`: `_normalize_extraction_data()` now handles `None` values (not just missing keys) and filters out company entries with empty ticker - Test updated: `tests/test_extractor_schemas.py::test_validate_semantic_missing_ticker_is_error` #### 3. Macro Doc Status Fix - `services/extractor/main.py`: `_process_macro_classification()` now updates document status to 'extracted' on success, 'extraction_failed' on error - Beta DB: manually fixed 1849 stuck macro docs (UPDATE status='extracted' WHERE id IN global_events) #### 4. Dashboard Fix - `frontend/src/pages/OpsPipeline.tsx`: Document Stages now uses time-filtered `/health` data (consistent with other sections), all-time from SSE stream shown as subtitle, time range labels added to all sections #### 5. CI/CD DNS Fix - `.woodpecker/*.yml`: All 5 pipeline files now use `clone.git.settings.remote: http://10.43.73.77:3000/admin/stonks-oracle.git` (Gitea ClusterIP directly, bypasses DNS) - CoreDNS: scaled to 4 replicas, `forward . 192.168.42.1`, `dnsPolicy: None` with `nameservers: [192.168.42.1]` - Woodpecker: `WOODPECKER_BACKEND_K8S_DNS_CONFIG` has `nameservers:[10.43.0.10]` + searches including `git-server.svc.cluster.local` ### Known Issues / TODO 1. **`stonks-oracle` namespace**: Scaled to 0 but still exists with stale data (42K extraction queue in Redis DB 0). Could be cleaned up or deleted entirely. 2. **Thesis Rewriter agent**: Was hammering vLLM from stonks-oracle namespace (5600+ calls/24h). Now stopped since namespace is scaled down. If it was also running in beta, check if recommendation service is calling vLLM for thesis rewrites excessively. 3. **`AxionML/Qwen3.5-9B-NVFP4` requests**: Something external is hitting vLLM with a model that doesn't exist (404s). Not from our pipeline — likely Open WebUI or another tool on the network configured with wrong model name. Source IP: goes through `vllm-metrics` nginx proxy (`10.42.1.155`). 4. **GitHub mirror**: `finalize.yml` mirror-github step fails (SSH key or DNS). Has `failure: ignore` so non-blocking. Needs `github_ssh_key` secret configured in Woodpecker. 5. **OpsPipeline dashboard**: Numbers now show time-filtered data. The "Document Stages" section shows counts from the selected time window (default 24h), with all-time totals as subtle subtitles. Currently beta shows: extracted=5417, low_quality=1659, parsed=15. 6. **Aggregation not generating trends on weekends**: Expected — market hours check prevents weekend trend generation. Will resume Monday. 7. **15 docs still in `parsed` status**: These are likely fresh ingests waiting for the next extraction cycle. Not stuck. ### Agent Performance (beta, last 24h as of session end) - Document Intelligence Extractor: 33 calls, 94% success, avg 11.4s, conf 0.794 - Global Event Classifier: 81 calls, 99% success, avg 4.2s, conf 0.745 - Thesis Rewriter: 5603 calls, 100% success, avg 2.5s (from stonks-oracle before shutdown) - Report Summarizer: 6 calls, 100% success, avg 6.9s ### Infrastructure - k3s cluster: 4 NixOS nodes (gremlin-1 through gremlin-4) - vLLM: `vllm-service` namespace, model `numind/NuExtract3`, 4070 Ti Super 16GB - CoreDNS: 4 replicas, `forward . 192.168.42.1` - Redis: DB 0 = stonks-oracle (stale), DB 1 = stonks-beta (active) - PostgreSQL: shared instance, both namespaces use same DB server (different databases? or same? — needs verification) - Gitea: `git-server` namespace, ClusterIP 10.43.73.77:3000, NodePort 30300 - Woodpecker: `woodpecker` namespace, kubernetes backend, 2 agents ### Key Files Modified ``` services/scheduler/app.py — recovery thresholds + batch limit services/validation/prediction_snapshot.py — 24h price fallback services/aggregation/scoring.py — normalize_impact_scores() services/aggregation/worker.py — normalization integration services/trading/model_quality_gate.py — 48h threshold services/extractor/schemas.py — null field handling services/extractor/main.py — macro doc status update frontend/src/pages/OpsPipeline.tsx — dashboard fix scripts/backfill_snapshot_prices.py — new script tests/test_pbt_pipeline_health_*.py — PBT tests tests/test_extractor_schemas.py — updated test infra/helm/stonks-oracle/values*.yaml — signal-engine replicas .woodpecker/*.yml — ClusterIP clone fix ```