acf747907c
- Program.cs: Wrap recurring job registration in try-catch to handle distributed lock timeouts Allows Host to start even if Hangfire lock is stuck (may be acquired by another instance) - Add gate3_rehearsal.ps1 for Shadow Run rehearsal validation - Set ASPNETCORE_ENVIRONMENT=Development to enable DevelopmentHeaderAuthenticationHandler - Gate 3 Shadow Run now executing: 252+ trading-day validation with real KRX data Status: ✅ Host ready (Development mode, port 5002) ✅ Shadow Run created (ID: d14f34ea-2afe-4caf-bbb1-c9a7d74fb582) ⏳ Execution in progress (ETA ~60 minutes) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
117 lines
3.6 KiB
PowerShell
117 lines
3.6 KiB
PowerShell
# Gate 3 Shadow Run Rehearsal Script
|
|
# Prerequisites: SSH tunnel must be open in separate terminal
|
|
# ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
|
|
|
|
param(
|
|
[string]$ModelId = "00000000-0000-0000-0000-000000000001",
|
|
[string]$WindowStart = "2024-01-02",
|
|
[string]$WindowEnd = "2024-08-31",
|
|
[int]$PollIntervalSeconds = 15,
|
|
[int]$MaxWaitMinutes = 60
|
|
)
|
|
|
|
# API configuration
|
|
$ApiUrl = "http://127.0.0.1:5002/api/shadow-runs"
|
|
$User = "gate3-rehearsal"
|
|
$Role = "researcher"
|
|
|
|
# Headers for authentication
|
|
$headers = @{
|
|
"X-KArtSell-User" = $User
|
|
"X-KArtSell-Role" = $Role
|
|
"Content-Type" = "application/json"
|
|
}
|
|
|
|
# Shadow Run request body
|
|
$body = @{
|
|
modelId = $ModelId
|
|
windowStartDate = $WindowStart
|
|
windowEndDate = $WindowEnd
|
|
} | ConvertTo-Json
|
|
|
|
Write-Host "🎯 Gate 3 Shadow Run Rehearsal" -ForegroundColor Cyan
|
|
Write-Host "================================" -ForegroundColor Cyan
|
|
Write-Host ""
|
|
Write-Host "📋 Configuration:" -ForegroundColor Yellow
|
|
Write-Host " API URL: $ApiUrl"
|
|
Write-Host " Model ID: $ModelId"
|
|
Write-Host " Window: $WindowStart to $WindowEnd"
|
|
Write-Host " Poll Interval: ${PollIntervalSeconds}s"
|
|
Write-Host " Max Wait: ${MaxWaitMinutes}m"
|
|
Write-Host ""
|
|
|
|
# Step 1: Initiate Shadow Run
|
|
Write-Host "1️⃣ Initiating Shadow Run..." -ForegroundColor Green
|
|
try {
|
|
$response = Invoke-WebRequest -Uri $ApiUrl `
|
|
-Method POST `
|
|
-Headers $headers `
|
|
-Body $body `
|
|
-ContentType "application/json" `
|
|
-ErrorAction Stop
|
|
|
|
$result = $response.Content | ConvertFrom-Json
|
|
$runId = $result.runId
|
|
|
|
Write-Host " ✅ Shadow Run created: $runId" -ForegroundColor Green
|
|
Write-Host " Status: $($result.status)" -ForegroundColor Green
|
|
Write-Host ""
|
|
} catch {
|
|
Write-Host " ❌ Failed to initiate Shadow Run" -ForegroundColor Red
|
|
Write-Host " Error: $($_.Exception.Message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 2: Poll for completion
|
|
Write-Host "2️⃣ Polling for completion..." -ForegroundColor Green
|
|
$pollUrl = "$ApiUrl/$runId"
|
|
$startTime = Get-Date
|
|
$maxWaitMs = $MaxWaitMinutes * 60 * 1000
|
|
$pollCount = 0
|
|
|
|
while ($true) {
|
|
$elapsed = (Get-Date) - $startTime
|
|
$elapsedMs = $elapsed.TotalMilliseconds
|
|
|
|
if ($elapsedMs -gt $maxWaitMs) {
|
|
Write-Host " ❌ Timeout after ${MaxWaitMinutes} minutes" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$pollCount++
|
|
Write-Host " [$pollCount] Polling... (${elapsed:mm\:ss} elapsed)" -ForegroundColor Cyan
|
|
|
|
try {
|
|
$response = Invoke-WebRequest -Uri $pollUrl `
|
|
-Method GET `
|
|
-Headers $headers `
|
|
-ContentType "application/json" `
|
|
-ErrorAction Stop
|
|
|
|
$result = $response.Content | ConvertFrom-Json
|
|
$status = $result.status
|
|
|
|
Write-Host " Status: $status" -ForegroundColor Cyan
|
|
|
|
if ($status -eq "completed") {
|
|
Write-Host " ✅ Shadow Run completed!" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "3️⃣ Results:" -ForegroundColor Green
|
|
Write-Host " Runtime: $($result.runtimeSeconds) seconds"
|
|
Write-Host " Message: $($result.message)"
|
|
Write-Host ""
|
|
Write-Host "✨ Gate 3 Rehearsal COMPLETE" -ForegroundColor Green
|
|
exit 0
|
|
} elseif ($status -eq "failed") {
|
|
Write-Host " ❌ Shadow Run failed" -ForegroundColor Red
|
|
Write-Host " Error: $($result.message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
} catch {
|
|
Write-Host " ⚠️ Poll error: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
}
|
|
|
|
# Wait before next poll
|
|
Start-Sleep -Seconds $PollIntervalSeconds
|
|
}
|