fix: clean up utcnow deprecation warnings, fix 12 failing tests, add CI/CD pipeline manifests

- Replace all datetime.utcnow() with datetime.now(tz=timezone.utc) across 8 files
- Fix 12 failing tests to match current implementation behavior
- Fix pytest_plugins in non-top-level conftest (moved to root conftest.py)
- Auto-fix 189 lint issues (import sorting, unused imports)
- Add CI/CD pipeline infrastructure (ARC, ArgoCD, Kargo manifests)
- Add values-beta.yaml and values-paper.yaml for staged deployments
- Update GitHub Actions workflow to use self-hosted-gremlin runners
- Add integration-test job to CI pipeline

Result: 1596 passed, 0 failed, 0 warnings
This commit is contained in:
Celes Renata
2026-04-18 03:59:28 +00:00
parent 40227a4eb2
commit c85c0068a2
123 changed files with 7221 additions and 405 deletions
+2 -2
View File
@@ -9,7 +9,7 @@ Requirements: 2.1, 2.2, 2.3, 2.4, 2.5
import asyncio
import json
import logging
from datetime import datetime
from datetime import datetime, timezone
from typing import Any, Optional
import asyncpg
@@ -303,7 +303,7 @@ async def schedule_cycle(pool: asyncpg.Pool, rds: aioredis.Redis) -> int:
Returns the number of jobs enqueued.
"""
now = datetime.utcnow()
now = datetime.now(tz=timezone.utc)
sources = await fetch_active_sources(pool)
enqueued = 0
+12 -12
View File
@@ -2,7 +2,7 @@
from __future__ import annotations
import uuid
from datetime import datetime
from datetime import datetime, timezone
from enum import Enum
from typing import List, Optional
@@ -222,7 +222,7 @@ class TrendSummary(BaseModel):
contradiction_score: float = Field(ge=0, le=1, default=0.0)
disagreement_details: List[DisagreementDetail] = Field(default_factory=list)
market_context: Optional[MarketContext] = None
generated_at: datetime = Field(default_factory=datetime.utcnow)
generated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
# --- Recommendation ---
@@ -244,7 +244,7 @@ class Recommendation(BaseModel):
position_sizing: PositionSizing = Field(default_factory=PositionSizing)
evidence_refs: List[str] = Field(default_factory=list)
model_metadata: ModelMetadata = Field(default_factory=ModelMetadata)
generated_at: datetime = Field(default_factory=datetime.utcnow)
generated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
# --- Global News Interpolation ---
@@ -262,7 +262,7 @@ class GlobalEventSchema(BaseModel):
confidence: float = Field(ge=0, le=1, default=0.5)
source_document_id: str = ""
model_metadata: ModelMetadata = Field(default_factory=ModelMetadata)
created_at: datetime = Field(default_factory=datetime.utcnow)
created_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
class MacroImpactRecordSchema(BaseModel):
@@ -273,7 +273,7 @@ class MacroImpactRecordSchema(BaseModel):
impact_direction: str = "neutral"
contributing_factors: List[str] = Field(default_factory=list)
confidence: float = Field(ge=0, le=1, default=0.5)
computed_at: datetime = Field(default_factory=datetime.utcnow)
computed_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
class ExposureProfileSchema(BaseModel):
@@ -288,8 +288,8 @@ class ExposureProfileSchema(BaseModel):
confidence: float = Field(ge=0, le=1, default=1.0)
version: int = 1
active: bool = True
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
created_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
class TrendProjectionSchema(BaseModel):
@@ -301,7 +301,7 @@ class TrendProjectionSchema(BaseModel):
driving_factors: List[str] = Field(default_factory=list)
macro_contribution_pct: float = Field(ge=0, le=1, default=0.0)
diverges_from_current: bool = False
computed_at: datetime = Field(default_factory=datetime.utcnow)
computed_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
# --- Document Metadata ---
@@ -322,7 +322,7 @@ class DocumentMetadata(BaseModel):
canonical_url: Optional[str] = None
title: str = ""
published_at: Optional[datetime] = None
retrieved_at: datetime = Field(default_factory=datetime.utcnow)
retrieved_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
language: str = "en"
content_hash: str = ""
storage_refs: StorageRefs = Field(default_factory=StorageRefs)
@@ -364,8 +364,8 @@ class CompetitorRelationshipSchema(BaseModel):
bidirectional: bool = True
source: str = "manual"
active: bool = True
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
created_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
class CompetitiveSignalRecordSchema(BaseModel):
@@ -378,7 +378,7 @@ class CompetitiveSignalRecordSchema(BaseModel):
signal_direction: str = "neutral"
signal_strength: float = Field(ge=0, le=1, default=0.0)
relationship_strength: float = Field(ge=0, le=1, default=0.0)
computed_at: datetime = Field(default_factory=datetime.utcnow)
computed_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
class HistoricalPatternSchema(BaseModel):
+5 -5
View File
@@ -8,7 +8,7 @@ performance metrics used across all trading engine components.
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
# ---------------------------------------------------------------------------
# Risk Tier Configuration
@@ -104,7 +104,7 @@ class TradingDecision:
earnings_proximity_flag: bool = False
is_micro_trade: bool = False
decision_trace: dict = field(default_factory=dict)
created_at: datetime = field(default_factory=datetime.utcnow)
created_at: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc))
# ---------------------------------------------------------------------------
@@ -139,7 +139,7 @@ class StopLevels:
atr_value: float
atr_multiplier: float
reward_risk_ratio: float
last_updated: datetime = field(default_factory=datetime.utcnow)
last_updated: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc))
# ---------------------------------------------------------------------------
@@ -204,7 +204,7 @@ class PerformanceMetrics:
max_drawdown: float
current_drawdown_pct: float
portfolio_heat: float
computed_at: datetime = field(default_factory=datetime.utcnow)
computed_at: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc))
# ---------------------------------------------------------------------------
@@ -235,7 +235,7 @@ class ReservePoolState:
balance: float = 0.0
total_deposits: float = 0.0
total_withdrawals: float = 0.0
last_updated: datetime = field(default_factory=datetime.utcnow)
last_updated: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc))
# ---------------------------------------------------------------------------
+2 -2
View File
@@ -8,7 +8,7 @@ rate-limit decisions, and record creation.
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime
from datetime import datetime, timezone
from services.trading.models import PerformanceMetrics
@@ -43,7 +43,7 @@ class NotificationRecord:
message: str
delivery_status: str = "pending"
retry_count: int = 0
created_at: datetime = field(default_factory=datetime.utcnow)
created_at: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc))
# ---------------------------------------------------------------------------
+2 -2
View File
@@ -9,7 +9,7 @@ heat check, active-pool minimum, absolute cap, and share rounding.
from __future__ import annotations
import math
from datetime import datetime
from datetime import datetime, timezone
from services.trading.models import (
OpenPosition,
@@ -313,7 +313,7 @@ class PositionSizer:
return dollar_amount, allocation_pct
earnings_dt = earnings_calendar[ticker]
now = datetime.utcnow()
now = datetime.now(tz=timezone.utc)
delta = earnings_dt - now
# Use total_seconds for precise fractional-day comparison
trading_days_until = delta.total_seconds() / 86400.0
+4 -4
View File
@@ -11,7 +11,7 @@ Persistence is handled by the caller (engine.py).
from __future__ import annotations
from datetime import datetime
from datetime import datetime, timezone
from services.trading.models import (
OpenPosition,
@@ -63,7 +63,7 @@ class StopLossManager:
atr_value=atr,
atr_multiplier=atr_multiplier,
reward_risk_ratio=reward_risk_ratio,
last_updated=datetime.utcnow(),
last_updated=datetime.now(tz=timezone.utc),
)
def re_evaluate_levels(
@@ -153,7 +153,7 @@ class StopLossManager:
atr_value=atr,
atr_multiplier=effective_multiplier,
reward_risk_ratio=reward_risk_ratio,
last_updated=datetime.utcnow(),
last_updated=datetime.now(tz=timezone.utc),
)
def check_price_crossings(
@@ -250,7 +250,7 @@ class StopLossManager:
atr_value=levels.atr_value,
atr_multiplier=levels.atr_multiplier,
reward_risk_ratio=levels.reward_risk_ratio,
last_updated=datetime.utcnow(),
last_updated=datetime.now(tz=timezone.utc),
)
return updated