fix: 6 workflow flaws detected via full system test

1. CRITICAL FIX - Reports 500 Internal Server Error:
   Root cause: {{}} in onclick was Jinja2 template expression
   Fix: Changed to single {} in reports_index.html onclick

2. Score history chart always empty:
   Root cause: score_update only emitted inside wfv.passed block
   Fix: Emit score_update after every hypothesis run with {promoted:false}
   Fix: Baseline run also pushes to chart via run_complete handler

3. IS gate too strict - optimizer produces 0 candidates forever:
   Root cause: min_calmar=0.35 but best EA has calmar=0.165
   Fix: Two-tier IS check - passes if composite_score improves vs baseline
   (absolute thresholds still apply as alternative pass condition)

4. Findings emitted twice (double UI display):
   Root cause: baseline analyzed once after run, then re-analyzed in iter 1
   Fix: Cache baseline findings, reuse in iteration 1 without re-emitting

5. Chart labels improved:
   'Baseline' for first point, 'It1·h1' for hypothesis runs
   Calmar normalized -0.5..2.0 -> 0..1 for chart display

6. Best score header only updates on actual promotion (not per-hypothesis)
This commit is contained in:
LEGSTECH Optimizer
2026-04-13 03:45:14 +00:00
parent cf8613eb49
commit b70a6760ae
4 changed files with 67 additions and 17 deletions
+1 -1
View File
@@ -38,7 +38,7 @@
<h1>📁 Optimization Reports</h1>
<div class="sub">{{ runs|length }} run(s) recorded · Click any card to open the full report</div>
</div>
<a class="back-link" href="/" onclick="if(document.referrer){{history.back();return false;}}"> Back to Dashboard</a>
<a class="back-link" href="/" onclick="if(document.referrer){history.back();return false;}">&#8592; Back to Dashboard</a>
</header>
{% if not runs %}