Chart skeletons during planning: showChartSkeletons() fires at planQuarter start, hideChartSkeletons() lifts on trained_done. Same fade-out behaviour as boot. Also clears on stream failure / model error so skeletons can never get stuck.
Skeleton loaders: enforce 700ms minimum visible window so the shimmer is perceivable even on warm Spaces (boot fetch resolves in <300ms otherwise). Smooth 350ms fade-out before swapping to the rendered charts.
Skeleton loaders on the 3 chart panels (NAV, Carbon, Allocation) during the boot fetch β pulsing 'Loadingβ¦' label + cream shimmer over a dashed panel-3 box. Cleared once /api/baselines + /api/random-news-batch resolve.
Empty-input validation + richer news helper: 'Write the macro news to simulate portfolio allocation, or choose from <sample1> Β· <sample2> Β· generate another news'. Samples are clickable and auto-fill the textarea; 'generate another' refetches a fresh pair. Helper visibility is now content-driven (shown when textarea empty).
Header: replace lightbulb icon with a glowing 'Know more' pill (cream gradient + pulsing box-shadow + dot prefix). Same id/onclick wiring so the intro modal still re-opens.
NAV chart: rename header to 'Portfolio Value as per last 3 years Historical Equal-Weighted Benchmark' + add italic disclaimer below the chart that historical performance is not a guarantee of future performance.
Loader: removed modal popup entirely. Plan Portfolio button now hosts the 3-step checklist itself β clicking flips it from 'PLAN PORTFOLIO' to a dark status board with [GRPO β³] [SFT β―] [base β―] pills that tick to sage β as each stream completes. Reverts to default once base finishes.
UX: hide loader as soon as GRPO is done β dashboard becomes interactive immediately while SFT and base continue streaming silently into the comparison panel. Blur dropped 1px β 0.5px.
Loader: 3-row checklist (GRPO/SFT/base) that ticks as each inference completes; minimal blur + dark overlay (rgba(0,0,0,0.78), 1px blur). Loader stays open until base_done; auto-hides 700ms after final tick.
Replace 5-card strip with first-load intro modal: 4 numbered sections (challenge, long-horizon thinking, training, what you can do here) in big, simple type. Persistent lightbulb button in the header re-opens it. Dismissal cached in localStorage. Loader blur halved (4px β 2px).
Training-progression comparison: 3-way A/B/C across CarbonAlpha-GRPO, CarbonAlpha-SFT, base Qwen 2.5 7B IT β both adapters loaded via PEFT multi-adapter, switchable via set_adapter(). Judge prompt + JSON schema extended to 3 responses with score_a/b/c per criterion. Added 5-card 'How it works' explainer above the news input.
Switch to GRPO Phase-1 adapter (grpo_qwen25_7b_adapter_phase1_100_v1, 100 steps, 5/5 holdout beats baseline, mean regret 0.106). MODEL_SUBFOLDER env var lets us A/B back to the SFT adapter without code change. UI tag + README updated.
Fix DeepSeek model IDs (deepseek-ai/DeepSeek-V4-Pro et al β was wrong namespace before, hence non-JSON via V3.1 fallback). Server-side robust JSON extractor + validator now ships parsed object on judge_done so client never has to guess. Strengthened JSON-only prompt with verbatim example. Added Export β€ button: downloads run JSON of all 12 quarters' news, allocations, both model completions, judge verdicts.
Trustworthy judge: enforce JSON schema (response_format=json_object) with confidence + per-criterion 0-10 scores. Server adds graceful fallback if a provider rejects response_format. Frontend renders structured verdict (winner/confidence/4 criterion cards each with A and B score bars + reason).
Streaming + base-model comparison: SSE /api/plan-stream runs CarbonAlpha then base Qwen 2.5 7B IT (LoRA disabled) on the same prompt; reasoning panel streams word-by-word with sage flash + section-pulse on completion; bottom comparison panel shows side-by-side raw responses; selected quarter dot highlighted on NAV chart.
Sage-highlighted Reasoning panel; brand tagline ('teaching a 7B model to manage a carbon-budgeted portfolio through macro shocks'); model tag updated to SFT + GRPO; news-helper links (generate news / write a case scenario) on inherited or open quarters; raw model response panel at bottom of side rail.
Quarter navigation + per-quarter re-planning. Subtitle rebalanced (returns + carbon co-equal). Each of 12 quarter slots gets a unique random headline; editing + planning a later quarter forwards-projects from there.
Major UI revamp: zen palette, single Plan Quarter button + loader, allocation pie, thermometer below progress, 24-news pool, carbon chart fixed (single legend, 100kg scale, 25kg cap line)