- Install kubectl and helm in integration-test runner (DinD image lacks them)
- Configure kubectl with in-cluster service account credentials
- Add ClusterRoleBinding for runner SA to create inttest namespaces
- Add runner-rbac.yaml to runmefirst.sh install sequence
_parse_classification_response receives raw model output (with thinking
tags, markdown fences, etc.) but was calling json.loads directly.
Now uses _strip_markdown_fences + _repair_json from the client module
before parsing, matching what _call_ollama does for extractions.
_call_ollama validates against the document extraction schema, which
doesn't match event classification output. The event classifier was
checking 'if attempt.error is None' before trying its own parsing,
so it never got to parse the valid event JSON — 956 consecutive
failures.
Now tries _parse_classification_response whenever raw_output exists,
regardless of the extraction validation error.
Redis uses separate env vars, not a single REDIS_URL. Script now
builds the connection string from REDIS_HOST, REDIS_PORT, REDIS_DB,
and REDIS_PASSWORD — matching how services/shared/config.py does it.
No more hardcoded passwords — pulls POSTGRES_HOST, POSTGRES_USER,
POSTGRES_PASSWORD, POSTGRES_DB, and REDIS_URL from the pod's
environment (injected by k8s secrets).
The repo is now private (BSL license), so pods need valid GHCR
credentials to pull images. runmefirst.sh now:
- Verifies the token can authenticate with GHCR
- Force-recreates the ghcr-credentials secret before Helm deploy
- Warns if the token is expired or missing scopes
- scripts/test_saved_queries.py: tests all 24 saved SQL explorer queries
against the live Trino API (all 24 pass)
- scripts/run_reclassify_and_reaggregate.sh: self-contained script to
re-classify macro events with updated prompts and re-aggregate all
tickers. Scales aggregation to 16 pods, monitors queues, scales back.
Licensed under Business Source License 1.1.
Copyright (c) 2025-2026 Celes Hillyerd. All rights reserved.
Production use requires written approval from the author.
Change Date: 2030-04-17 (converts to GPL v2+ after that).
Migration 028: For each recommendation with no evidence rows, finds
the closest matching trend_window (by ticker + time_horizon + timestamp)
and re-inserts evidence from top_supporting/opposing_evidence arrays.
Filters out non-UUID pattern IDs and verifies documents exist.
This fixes 'No evidence linked' on recommendations created before the
UUID filtering fix in persist_recommendation.
Backend: assemble_trend_with_evidence now deduplicates document IDs
via dict.fromkeys() (the rollup code already did this, but the base
assembly didn't — same doc could appear multiple times from different
intelligence extractions).
Frontend: Trends.tsx deduplicates via Set before rendering as a safety
net for existing data already stored with duplicates.
- EvidenceRef component now fetches document details via useDocument()
hook and displays the title instead of 'doc:43156423…'
- TanStack Query deduplicates and caches lookups for repeated doc IDs
- Pattern IDs still render as before (e.g. 'pattern META other (1d)')
- Override Trade button changed from brand-600 to red-600
The handler for /api/macro/impacts/:ticker was returning the impacts
array directly instead of { exposure_profile, impacts }. The frontend
destructures macroData.impacts which was undefined, falling back to
an empty array — so the Macro tab always showed 'No active macro impacts'
even with mock data present.
- 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)
- Add GET/PUT /api/admin/trading/approval-config endpoints
- Add POST/DELETE /api/admin/trading/lockouts endpoints
- Add useApprovalConfig, useUpdateApprovalConfig, useCreateLockout, useDeleteLockout hooks
- Add Paper Order Approval toggle card with confirmation dialog
- Add lockout creation form and delete button to Active Lockouts card
- Add MSW handlers for all new endpoints
- Add property-based tests for bug condition exploration and preservation
- Pattern IDs (pattern:META:other:1d) shown as 'pattern META other (1d)'
- Document UUIDs shown as clickable 'doc:43156423…' links to document detail
- Unknown formats shown truncated as fallback
API was returning a flat array but frontend expects CompanyMacroImpacts
wrapper with exposure_profile and impacts fields. Also queries the
exposure_profiles table for the company's active profile.
- Trading page: added conservative/moderate/aggressive selector that
updates the trading engine config via PUT /api/trading/config
- Recommendations page: added risk tier dropdown that defaults to the
engine's current tier and filters recs by the tier's min_confidence
- Backend: added min_confidence query param to GET /api/recommendations
- Risk tier thresholds: conservative ≥0.75, moderate ≥0.55, aggressive ≥0.40