/ CHANGELOG.md
CHANGELOG.md
1 # Changelog 2 3 All notable changes to Meridian Studio will be documented here. 4 5 The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). 6 Versioning follows [Semantic Versioning](https://semver.org/). 7 8 --- 9 10 ## [Unreleased] 11 12 --- 13 14 ## [0.33.3] — 2026-04-05 15 16 ### Fixed 17 - **Redirect loop on API scope consent** — `getAuthHeaders` no longer calls `acquireTokenRedirect` on `InteractionRequiredAuthError`. Redirecting from a per-request helper caused a loop because React Query fires multiple queries on mount. Consent is handled by the AuthGuard login flow (sign out and sign back in once to acquire API scope consent). 18 19 --- 20 21 ## [0.33.2] — 2026-04-05 22 23 ### Fixed 24 - **VITE_AZURE_API_SCOPE wired through build pipeline** — added `ARG`/`ENV` to Dockerfile and `--build-arg` to `azure-deploy.yml` so the API scope is baked into the production bundle. Set `VITE_AZURE_API_SCOPE` in GitHub Actions variables to complete the fix. 25 26 --- 27 28 ## [0.33.1] — 2026-04-05 29 30 ### Fixed 31 - **Access token instead of ID token** — `getAuthHeaders` now acquires an access token using `VITE_AZURE_API_SCOPE`. Falls back to ID token for local dev when scope is unset. Resolves 403s on all protected endpoints for personal MSA accounts. 32 33 --- 34 35 ## [0.33.0] — 2026-04-05 36 37 ### Added 38 - **Temporary /auth/debug validation UI** — `AuthDebugCard` on Settings page calls `GET /auth/debug` and renders the JSON response inline; confirms role resolution path after backend auth fix deploy. Marked for removal after production validation. 39 40 --- 41 42 ## [0.32.0] — 2026-03-28 43 44 ### Added 45 - **Sign-in use case section (ADR-0015)** — three compliance problem cards above the sign-in card: Document Intelligence, Multi-Agent Orchestration, AI Operations; section header and "Meridian answers these questions" footer; max-w-2xl outer container to accommodate three-column grid 46 47 ### Changed 48 - **Sign-in "Trusted by" removed** — replaced placeholder company names (Contoso, Northwind, Fabrikam, Tailspin) with "Built for regulated environments. Healthcare. Federal. Financial services. Legal." 49 50 --- 51 52 ## [0.31.1] — 2026-03-28 53 54 ### Changed 55 - **Document Preview** — Document Intelligence repurposed as pipeline debugging tool; moved from AI Lab to core nav (between Ingest and Evaluation); description updated 56 - **Ingestion Pipeline Extract stage** — added Extract step between Upload and Chunk; stage timers adjusted 57 - **Cognitive AI Services** — reduced to 3 services (Language, Vision, Speech); Document Intelligence removed from AI Lab and Settings list 58 59 --- 60 61 ## [0.31.0] — 2026-03-28 62 63 ### Added 64 - **Query Telemetry Log expandable rows** — click any row to expand and see the full question, AI answer, and cited source chunks inline; REFUSED rows show the governed refusal reason with confidence score; rows collapse on second click; only one row expanded at a time 65 - **`answer_text` and `citations` in `EvaluationQueryEntry`** — type extended with optional `answer_text?: string | null` and `citations?: string | null` fields returned by backend since migration 003 66 - **`QueryCitation` type** — new interface for parsed citation objects (`{ id: string | null; [key: string]: unknown }`) 67 - **Evaluation fixture updated** — `evaluation-queries.json` includes realistic `answer_text` and `citations` payloads 68 - **Document Preview** — Document Intelligence repurposed as a pipeline debugging tool; moved from AI Lab to core nav (next to Ingest); description updated to reflect its role in previewing extraction output 69 - **Ingestion Pipeline Extract stage** — added Extract step between Upload and Chunk; visualizes OCR/text extraction in the pipeline stage indicator; stage timers adjusted to reflect realistic timing 70 71 ### Tests 72 - 4 new tests: expand OK row shows answer + citations, expand REFUSED row shows governed refusal, collapse on second click, only one row expanded at a time (10 total in EvaluationQueries suite) 73 74 --- 75 76 ## [0.30.6] — 2026-03-27 77 78 ### Fixed 79 - **getAuthHeaders** — correct comment: `VITE_AZURE_TENANT_ID` is `common` (not tenant-specific); personal account (`#EXT#` external user) tokens always carry `iss = .../9188040d.../v2.0` regardless of sign-in authority 80 - **Backend `AUTH_TENANT_ID`** — changed to `9188040d-6c67-4c5b-b112-36a304b66dad` (MSA consumer tenant) via Azure Container App env var; previous value `fa0a1e39...` is the org tenant but personal account `idToken.iss` is always the MSA home tenant, causing `InvalidIssuerError` on every request 81 - **`VITE_AZURE_TENANT_ID`** — reverted to `common` (was incorrectly changed to `fa0a1e39...` in v0.30.5); `common` and org-specific authority produce the same `iss` for personal accounts, and `common` is correct for multi-audience apps 82 83 --- 84 85 ## [0.30.5] — 2026-03-27 86 87 ### Fixed 88 - **getAuthHeaders** — revert to OIDC scopes + `idToken`; API scope (`api://CLIENT_ID/.default`) fails with `InteractionRequiredAuthError` because the app registration has no exposed API scopes, so no token is ever sent 89 - **getAuthHeaders** — `idToken.aud` = plain client UUID which matches `AUTH_CLIENT_ID` on the backend; access tokens have `api://`-prefixed audience which the backend rejects 90 - **VITE_AZURE_TENANT_ID** — changed GitHub variable from `common` to `fa0a1e39...`; with `common`, personal accounts receive `iss = .../9188040d.../v2.0` (MSA tenant) which the backend rejects; specific tenant forces `iss = .../fa0a1e39.../v2.0` matching `AUTH_TENANT_ID` 91 92 --- 93 94 ## [0.30.4] — 2026-03-27 95 96 ### Fixed 97 - **getAuthHeaders** — acquire token with `VITE_AZURE_API_SCOPE` (`api://CLIENT_ID/.default`) instead of OIDC-only scopes; OIDC scopes target Microsoft Graph so the returned token has the wrong audience/signing key for the Meridian API, causing 401 on all `/admin/*` endpoints 98 - **getAuthHeaders** — send `accessToken` (not `idToken`) so the token audience matches what the Meridian API validates 99 - **AdminGuard test** — increase `waitFor` timeout to 6000ms to cover 2 retries × 1500ms `retryDelay` before "Session not ready" appears 100 101 --- 102 103 ## [0.30.3] — 2026-03-23 104 105 ### Fixed 106 - **AuthProvider** — call `msalInstance.setActiveAccount()` after `handleRedirectPromise()` returns; previously the redirect result was discarded so `getActiveAccount()` always returned null, causing `getAuthHeaders` to send requests without a Bearer token 107 - **AuthProvider** — on non-redirect page loads (refresh / direct navigation), restore active account from MSAL cache so `getActiveAccount()` returns a value on the first render 108 - **getAuthHeaders** — use `getActiveAccount()` with fallback to `getAllAccounts()[0]`; previously relying solely on `getAllAccounts()[0]` caused race where account was not yet set as active, resulting in missing Bearer token on first API call 109 110 --- 111 112 ## [0.30.2] — 2026-03-23 113 114 ### Fixed 115 - **msalConfig loginRequest scopes** — always include `openid profile email` alongside API scope so `idToken` is present in `acquireTokenSilent` responses; without `openid`, MSAL omits `idToken` and Studio sent `Bearer null` causing 401 on all endpoints 116 - **getAuthHeaders** — send `idToken` instead of `accessToken` for personal Microsoft accounts; `accessToken` with custom API scope fails backend issuer check (`sts.windows.net` vs `login.microsoftonline.com`) — `idToken` issuer matches exactly 117 118 --- 119 120 ## [0.30.1] — 2026-03-23 121 122 ### Changed 123 - **AdminGuard** — replaced `VITE_ADMIN_EMAILS` client-side allowlist with server-side `GET /admin/roles/whoami` check; no admin identities in the JS bundle 124 - **Runtime pages** — replaced automatic polling with manual Refresh button; zero background DB calls from provisioning UI 125 - **Runtimes list description** — humanized to plain language 126 - **getAuthHeaders** — reverted to `accessToken` now that `VITE_AZURE_API_SCOPE=api://011a079b-a2d8-4958-be7b-fde8fd362704/access` is configured; accessToken has correct audience for backend JWT validation and auto-refreshes silently via MSAL 127 128 ### Added 129 - 5 new AdminGuard tests (whoami success, failure, 403, loading, auth-disabled bypass) 130 131 ### Fixed 132 - Token expiry causing silent 401s after 1 hour — idToken has fixed 1-hour lifetime with no refresh; accessToken with proper API scope refreshes automatically 133 134 ### Security 135 - Removed `VITE_ADMIN_EMAILS` environment variable — admin email allowlist was exposed in client-side bundle (information disclosure) 136 137 --- 138 139 ## [0.30.0] — 2026-03-21 140 141 ### Added 142 - **Runtime Provisioning UI (ADR-0014)** — governed runtime environment management for platform admins 143 - **Runtime Environments list page** (`/admin/runtimes`) — table with KPI cards (Total, Provisioning, Ready), cloud/region labels, provisioning badge with pulse animation 144 - **Provision Runtime page** (`/admin/provision`) — create form with environment name, cloud provider, region, cluster name, node type, node count; redirects to detail on success 145 - **Runtime Detail page** (`/admin/runtimes/:id`) — status badge, provisioning progress timeline (6-phase horizontal), configuration summary, metadata, progress log with step entries, cancel with confirmation dialog 146 - **ProvisioningTimeline** — 6-phase horizontal progress visualization: Queued, Provisioning Cluster, Installing Controllers, Installing Runtime, Deploying Meridian, Ready 147 - **ProvisioningBadge** — color-coded status badge with pulse animation for active phases 148 - **AdminGuard** — role-based access guard (operator/admin/platform-admin roles required when auth enabled) 149 - Active runtimes poll every 3 seconds; polling stops at terminal states (READY, FAILED, CANCELLED) 150 - Sidebar: "Platform Admin" collapsible section with Runtimes and Provision links 151 - Governance footer on all admin pages: "Studio never calls AWS directly — all infrastructure work is backend-managed" 152 - 13 new tests across 2 test files (146 total passing) 153 154 --- 155 156 ## [0.29.0] — 2026-03-21 157 158 ### Added 159 - **Ops Copilot Investigations UI (ADR-0013)** — full governed workflow visibility for Jira-triggered investigations 160 - **Investigations list page** (`/investigations`) — table with KPI cards (Active, Awaiting Approval, Completed, Rejected/Expired), search by Jira key or trace ID, filter tabs (All/Active/Pending/Closed), governance footer 161 - **Investigation detail page** (`/investigations/:traceId`) — header with Jira link + status badge + trace ID copy, collapsible agent output sections (Investigation Plan, Evidence, Analysis, Policy Decision, Execution Result), metadata card 162 - **WorkflowTimeline** — horizontal 12-state workflow visualization with approval gate divider, completed/current/future state indicators, responsive mobile vertical layout 163 - **ApprovalPanel** — approve/reject actions for AWAITING_APPROVAL investigations: plan summary, blast radius, bounded steps with rollback commands, confirmation dialogs, governance warning banner 164 - **AuditTrace** — chronological step timeline: agent role badges, state transitions, tool usage with input/output hashes, elapsed times, approval boundary marker, trace integrity footer 165 - **InvestigationBadge** — color-coded status badge with pulse animation for pending approvals 166 - **PendingBadge** — sidebar count of awaiting-approval investigations (30s polling) 167 - Sidebar navigation: "Investigations" item with ClipboardList icon between Ops Agent and Ingest 168 - **Investigation API client** (`src/api/investigation.ts`) — TypeScript types mirroring backend `ops_copilot/state.py`, API methods for list/get/pendingTraceIds/approve/reject 169 - **Investigation state data** (`src/data/investigationStates.ts`) — status metadata (labels, colors, groups), timeline states, agent role display config 170 - **Test fixtures** — investigation-list.json (3 investigations) and investigation-detail.json (OPS-1234 payments ETL scenario with 11 audit steps) 171 172 ### Changed 173 - **Temperature UX improved** — Settings slider label changed from "Precise" to "Deterministic"; description rewritten to explain token selection probability; added interactive 3-column range guide (Low/Medium/High) that highlights based on current slider value 174 - **Dashboard temperature description** — changed from "LLM response randomness" to "How deterministic or creative the model responds" 175 176 ### Tests 177 - 64 new investigation tests across 8 test files: InvestigationBadge (7), WorkflowTimeline (6), ApprovalPanel (11), AuditTrace (10), PendingBadge (3), investigationStates data (6), investigation API contract (9), list page (5), detail page (7) — 134 total 178 179 --- 180 181 ## [0.28.0] — 2026-03-20 182 183 ### Added 184 - **Sign-in intent probe (ADR-0012)** — lightweight 2-question guided setup on sign-in screen: captures usage intent (evaluate, build, test-local, explore) and deployment topology (cloud, hybrid, on-prem); displays contextual 2-3 line response about system behavior; fully skippable, shown once per browser profile, stored in localStorage 185 186 ### Tests 187 - 6 IntentProbe component tests: step flow, skip, contextual response rendering (72 total) 188 189 --- 190 191 ## [0.27.0] — 2026-03-19 192 193 ### Added 194 - **Idle session timeout** — `useIdleTimer` hook tracks user activity across the window; after 15 minutes of inactivity, authenticated sessions are redirected to the new Standby page 195 - **`IdleGuard` component** — wraps all authenticated routes; fires on idle, passes the current path as `returnTo` state so the session can resume exactly where the user left off 196 - **Standby page (`/standby`)** — zero-API parking page shown on idle: rotating operational principles (7 VPL philosophy lines), a 5-minute countdown progress bar, and a "Resume session" button; any user activity (mouse, keyboard, touch) resumes immediately; countdown reaching zero triggers `logoutRedirect()` 197 198 --- 199 200 ## [0.26.2] — 2026-03-19 201 202 ### Changed 203 - **Dashboard telemetry section simplified** — removed 4 metric cards (`/evaluation/metrics` polling) to eliminate unnecessary Azure SQL DB calls; replaced with a static "Query Telemetry" label + "View full telemetry" link card 204 205 ### Tests 206 - Updated Dashboard test suite to match simplified telemetry section (no longer tests metric card values) 207 208 --- 209 210 ## [0.26.1] — 2026-03-18 211 212 ### Fixed 213 - **Evaluation page false empty state on DB auto-pause** — distinguish between API error (shows "Unable to load telemetry data" with auto-pause explanation) and genuinely empty results ("No telemetry data recorded yet"). Previously, a failed API call after retries rendered the empty state, misleading operators into thinking no data existed. 214 215 ### Tests 216 - 2 new Evaluation error-state tests: queries endpoint failure shows error message, metrics endpoint failure shows skeleton cards (66 total) 217 218 --- 219 220 ## [0.26.0] — 2026-03-18 221 222 ### Added 223 - **Dashboard telemetry cards** — Total Queries, Avg Confidence, Refusal Rate, Latency P50/P95 with "View full telemetry" link to Evaluation page; hidden when database is not configured 224 - **Agent KB step confidence display** — ConfidencePill shown inline on `query_knowledge_base` steps in the Agent reasoning timeline, using the same Raw -> Calibrated format as Ask Meridian (#4) 225 226 ### Refactored 227 - **ConfidencePill** extracted to shared component (`src/components/ui/ConfidencePill.tsx`) — reused by Query and Agent pages 228 - **MetricCard** extracted to shared component (`src/components/ui/MetricCard.tsx`) — reused by Evaluation and Dashboard pages 229 230 ### Tests 231 - 6 new ConfidencePill unit tests, 3 Agent page tests (KB confidence display), 2 Dashboard telemetry tests (64 total) 232 233 --- 234 235 ## [0.25.1] — 2026-03-18 236 237 ### Fixed 238 - **Evaluation page flashing "no data" during refetches** — added `placeholderData: keepPreviousData` to both evaluation queries so stale data stays visible while background refetches complete, preventing the empty state from appearing mid-session 239 240 ### Tests 241 - 4 new Evaluation page contract tests: metric card rendering, query log rows, unconfigured state, data persistence during failed refetch (53 total) 242 243 --- 244 245 ## [0.25.0] — 2026-03-18 246 247 ### Added 248 - **"How Ask Meridian works" guide** — collapsible explainer on Query page covering retrieval, governance gate, grounded generation, and multi-turn context 249 - **"How the Ops Agent works" guide** — collapsible explainer on Agent page covering ReAct reasoning, available tools, multi-step reasoning, and step budget 250 - **ADR-0011** — graph pipeline UX support, aligning with backend ADR-0023 (deferred until backend v1.2) 251 252 ### Documentation 253 - **Architecture validation report** — internal doc validating all public claims against the actual codebase (gitignored) 254 255 --- 256 257 ## [0.24.1] — 2026-03-17 258 259 ### Fixed 260 - **Application Insights not collecting in production** — added `VITE_APPINSIGHTS_CONNECTION_STRING` as a Docker build arg in Dockerfile and azure-deploy.yml so the connection string is inlined by Vite at build time 261 - **Azure Deploy failing** — quoted all `--build-arg` values in azure-deploy.yml to prevent shell interpretation of semicolons in the App Insights connection string 262 - **Evaluation page duplicate API calls** — disabled `refetchOnWindowFocus` globally and added `staleTime` to evaluation queries/metrics so each endpoint fires once per polling interval instead of 3-5 times per page load 263 264 --- 265 266 ## [0.24.0] — 2026-03-17 267 268 ### Changed 269 - **REFUSED UX improvements** — context-aware refusal header ("Outside the knowledge base" vs "Not enough evidence to answer"), confidence pill shows threshold (`52.1% / 60% threshold`), actionable link to Ingestion page, suggestion chips left-aligned directly under refusal card 270 271 --- 272 273 ## [0.23.0] — 2026-03-17 274 275 ### Changed 276 - **Settings provider dropdowns** — disable Local (Ollama) and Local (Chroma) options when API points to a hosted endpoint; options remain visible with "unavailable in hosted mode" label 277 278 --- 279 280 ## [0.22.1] — 2026-03-17 281 282 ### Fixed 283 - **Evaluation query log intermittent empty state** — add exponential backoff retry (1s -> 2s -> 4s, max 3 attempts) to handle Azure SQL serverless cold start timeouts 284 285 --- 286 287 ## [0.22.0] — 2026-03-16 288 289 ### Added 290 - **Azure Application Insights** — visitor telemetry with auto page view tracking, session duration, geography, and browser metrics; initialized from `VITE_APPINSIGHTS_CONNECTION_STRING` env var 291 292 --- 293 294 ## [0.21.0] — 2026-03-16 295 296 ### Added 297 - **Collapsible AI Lab section** — sidebar "AI Lab Preview" header is now a toggle button with rotating chevron; collapsed state persisted in localStorage 298 299 ### Changed 300 - **VPL logo update** — replaced `logo.png` with `vpllogo.jfif` across sign-in screen, sidebar, landing page, favicon, and web manifest 301 - **Web manifest** — renamed app from "VPL Solutions — AI Products" to "Meridian Studio" 302 303 --- 304 305 ## [0.20.0] — 2026-03-16 306 307 ### Added 308 - **Cognitive AI Services links on Settings** — each service is now a clickable link with description and hover chevron; added missing Document Intelligence entry 309 310 --- 311 312 ## [0.19.0] — 2026-03-16 313 314 ### Changed 315 - **Ask Meridian** — subtitle now explains governance threshold and refusal behavior 316 - **Dashboard** — added getting-started hint card when knowledge base has 0 documents, linking to Ingestion Pipeline 317 - **Ingestion Pipeline** — subtitle describes the four-stage pipeline (extraction, chunking, embedding, indexing) 318 - **AI Operations Agent** — empty state title changed to "Your AI operations analyst" with ReAct reasoning explanation 319 - **Evaluation** — renamed "Query Log" to "Query Telemetry Log" with descriptive empty state explaining what gets recorded 320 - **Cognitive AI Services** — all 4 pages (Language, Vision, Speech, Document Intelligence) now describe the service in plain language and note independence from the RAG engine 321 322 --- 323 324 ## [0.18.2] — 2026-03-15 325 326 ### Changed 327 - **Sidebar footer** — merged version, GitHub icon, and repo links into a single compact link with inline GitHub icon 328 - **MSAL login** — switched from popup to redirect flow (popup loaded full SPA in second window) 329 330 ### Fixed 331 - **Cursor pointer on logout buttons** — added `cursor-pointer` to both expanded and collapsed logout buttons 332 333 --- 334 335 ## [0.18.1] — 2026-03-15 336 337 ### Fixed 338 - **MSAL auth build args** — pass all 6 VITE_* env vars to Docker build so auth is enabled in production 339 - **MSAL redirect flow** — use `loginRedirect`/`logoutRedirect` instead of popup to avoid second-window rendering issues 340 - **Logout cursor** — add `cursor-pointer` to sign-out buttons in sidebar 341 - **Sidebar cleanup** — remove author name and LinkedIn link from sidebar footer 342 343 --- 344 345 ## [0.18.0] — 2026-03-14 346 347 ### Added 348 - **Config snippet icons** — MessageSquare icon for Claude Desktop Configuration, inline SVG diamond icon for Semantic Kernel Plugin in Connection Details card 349 350 --- 351 352 ## [0.17.0] — 2026-03-14 353 354 ### Added 355 - **MIT license headers** — added `// Copyright (c) 2026 VPL Solutions. All rights reserved.` header to all 39 source files (`.ts` and `.tsx`) for IP attribution 356 - **Hand-drawn architecture sketch on sign-in screen** — chalk-on-dark SVG overlay showing Meridian data flow (Documents -> RAG Engine -> Knowledge Base, MCP Server, AI Agents, Governance Gate) with wobbly hand-drawn paths, positioned bottom-right at 14% opacity 357 358 --- 359 360 ## [0.16.0] — 2026-03-14 361 362 ### Added 363 - **Connection Details card on Settings page** — displays API and MCP endpoint URLs with copy-to-clipboard buttons, MCP reachability status indicator (green/red dot with 30s polling), copy-ready Claude Desktop `claude_desktop_config.json` snippet, and copy-ready Semantic Kernel plugin configuration snippet 364 - **MCP health check** — lightweight reachability probe (`GET /health` on MCP server) with 5s timeout, used by Connection Details status indicator 365 366 --- 367 368 ## [0.15.0] — 2026-03-13 369 370 ### Added 371 - **Temperature Lock on Settings page** — slider control (0.0–2.0) for LLM response randomness, integrated with backend `POST /settings` operator-only endpoint; Zod-validated form field with real-time display, three-point scale labels (Precise / Balanced / Creative) 372 - **Temperature card on Dashboard** — 5th stat card showing current LLM temperature from `/settings`, rose-themed with Thermometer icon, 30s auto-refresh 373 374 --- 375 376 ## [0.14.0] — 2026-03-13 377 378 ### Added 379 - **SSE streaming responses (ADR-0010)** — Ask Meridian now streams tokens in real-time via Server-Sent Events; confidence metadata and Citations panel appear before the answer completes; blinking cursor during generation; automatic fallback to non-streaming if SSE fails 380 - **ADR-0010: Streaming Responses** — documents SSE streaming architecture, event types (metadata/token/done/error), parsing strategy, and non-streaming fallback 381 - **ADR-0009: Release Lineage & Security Gates** — four-artifact release record (code, dependencies, auth config, bundle), security controls per pipeline stage (npm audit, secret scanning, container image scan, bundle size guard), phased rollout plan, aligned with backend ADR-0017 382 383 --- 384 385 ## [0.13.0] — 2026-03-12 386 387 ### Changed 388 - **Logo links to vplsolutions.com** — clicking logo on sign-in screen, sidebar, or landing page opens vplsolutions.com in a new tab; Layout and Landing now use logo.png (was vpllogo.jfif) 389 390 ### Added 391 - **Post-deployment verification skill** (`.claude/skills/post-deploy-verify.md`) — monitors CI pipeline and runs smoke tests against Studio, API, and MCP endpoints after each deployment 392 393 --- 394 395 ## [0.12.0] — 2026-03-12 396 397 ### Changed 398 - **Sign-in screen redesign** — replaced neural network animation with geometric art (Delaunay triangular mesh, bezier curves, concentric rings), multi-agent orchestration hub (7 specialist agents in heptagon layout with animated hub-spoke pulses and cross-agent collaboration links), 18 floating capability icons (Agents, Ingestion, Cognitive AI Services), "Trusted by" customer logos row, and logo updated from vpllogo.jfif to logo.png 399 400 --- 401 402 ## [0.11.0] — 2026-03-12 403 404 ### Added 405 - **MSAL.js authentication** (ADR-0008) — Azure AD/Entra ID integration behind `VITE_AUTH_ENABLED` feature flag; popup-first login with redirect fallback for Firefox; silent-first token acquisition with interactive fallback; `getAuthHeaders()` utility injects Bearer tokens into all API calls; `AuthGuard` protects routes with branded sign-in screen (aurora background, neural network animation, floating keyword pills); `UserProfile` component in sidebar with initials, display name, and logout; 401 auto-redirect for expired tokens; zero behavioral change when flag is off (default) 406 - **Build chunk splitting** — `manualChunks` in Vite config splits vendor dependencies into separate chunks (react, msal, query, markdown, forms, icons); main bundle reduced from 835 KB to 331 KB 407 - **Dynamic version display** — sidebar version now imported from `package.json` instead of hardcoded; CLAUDE.md convention added to prevent stale versions 408 409 --- 410 411 ## [0.10.0] — 2026-03-11 412 413 ### Added 414 - **Evaluation human-in-the-loop feedback** — Rating column (thumbs up/down) on every query log row; analysts rate answer correctness or refusal appropriateness; persisted to `query_log.feedback` via `POST /evaluation/queries/{trace_id}/feedback`; localStorage used as optimistic cache 415 - **"Helpful?" label** on Ask Meridian feedback buttons — concise inline label sets user expectation before thumbs up/down icons 416 417 ### Fixed 418 - **Citations panel width** — panel now constrained to `max-w-3xl pl-11`, matching the message bubble width; bars no longer stretch full viewport width 419 - **Confidential documents** — `WHITEPAPER.md` and `PRODUCT_BRIEF.md` added to `.gitignore`; never enter git history 420 421 --- 422 423 ## [0.9.1] — 2026-03-11 424 425 ### Fixed 426 - **Dark mode select dropdowns** — Evaluation page filter and page size dropdowns now use `dark:bg-gray-800` instead of near-transparent `dark:bg-white/5`, fixing invisible option text on dark backgrounds 427 - **Feedback button visibility** — thumbs up/down icons now use `text-gray-400` / `dark:text-gray-500` (was `text-gray-300` / `dark:text-gray-600`), making them visible on both light and dark backgrounds 428 429 --- 430 431 ## [0.9.0] — 2026-03-11 432 433 ### Added 434 - **Feedback buttons** — thumbs up/down on Ask Meridian and AI Operations Agent responses, persisted in localStorage per trace ID 435 - **Page size selector** on Evaluation query log — choose 25, 50, or 100 rows per page (replaces fixed 20-row pages) 436 437 ### Changed 438 - **REFUSED auto-expand** — Citations panel automatically opens when a query is refused, so users immediately see per-chunk retrieval scores and why confidence fell below threshold 439 440 --- 441 442 ## [0.8.0] — 2026-03-11 443 444 ### Changed 445 - **Settings page reads from `GET /settings`** — form now loads current runtime configuration from the dedicated settings endpoint instead of deriving values from `/health`; works correctly even when health is degraded 446 - **Settings save invalidates both `settings` and `health` query caches** — ensures Dashboard and Settings stay in sync after runtime config changes 447 - **Settings page loading state** — spinner shown while fetching current config from backend 448 - **Settings page persistence note** — inline description explaining that changes are in-memory and reset on server restart 449 450 ### Added 451 - `getSettings()` API method (`GET /settings`) with `SettingsResponse` type 452 - `updateSettings()` now returns `SettingsResponse` (was `void`) 453 - 3 contract tests for Settings API (GET returns config, field mapping, POST sends payload and returns updated config) 454 455 --- 456 457 ## [0.7.0] — 2026-03-11 458 459 ### Added 460 - **PRODUCT_BRIEF.md** — investor/sales-facing product document covering executive summary, capabilities, competitive comparison, deployment options, security, target personas, and roadmap 461 - **Landing page: AI Operations Agent card** — ReAct reasoning agent capability card added to Core Capabilities section 462 - **Landing page: Evaluation Dashboard card** — metrics and analytics capability card added to Core Capabilities section 463 464 ### Changed 465 - Landing page Core Capabilities grid updated from 4 columns to 3 (2 rows of 3 for 6 capabilities) 466 467 ### Fixed 468 - `package.json` version synced to `0.6.1` (was `0.5.0`) 469 470 --- 471 472 ## [0.6.1] — 2026-03-10 473 474 ### Changed 475 - **Mandatory post-commit tagging** — added convention to CLAUDE.md requiring a semantic version tag after every commit, enforced by `postToolUse` hook 476 477 --- 478 479 ## [0.6.0] — 2026-03-10 480 481 ### Added 482 - **AI Operations Agent** page (`/agent`) — ReAct reasoning UI that calls `POST /agent/query`, displays step-by-step tool execution timeline (tool name, input, output preview, elapsed time), and renders the final answer with markdown 483 - **Agent API contract tests** — 3 tests covering successful query with step mapping, response field validation, and 500 error handling 484 - **Dark mode toggle** — sun/moon button in sidebar, persisted in localStorage; dark: variants applied across every page and shared component 485 - **ServiceNow connector** (ADR-0006) — new "ServiceNow" source tab on the Ingestion Pipeline page with server-side credentials, Check Status button, optional filters (KB name, category, article limit), Sync Articles action, and result/error display 486 - **AI/GenAI suggested questions** — updated example questions to include generative AI policy, Azure OpenAI access, approved AI tools, and data classification topics 487 - **ServiceNow API contract tests** — 6 tests covering status (configured/unconfigured), ingest (filters, empty payload), and error cases (502 unreachable, 400 missing credentials) 488 - **Calibrated confidence support** — `raw_confidence` field from ADR-0016; ConfidencePill shows "Raw → Calibrated" when scores differ, REFUSED explanation includes both values 489 - Contract test for calibrated scoring (`query-ok-calibrated.json` fixture) 490 - **Evaluation Queries** page (`/evaluation`) — aggregate metrics dashboard (total queries, avg confidence, refusal rate, latency P50/P95) and paginated query log table with raw/calibrated confidence, chunks, latency, and source columns 491 - Evaluation API methods (`evaluationQueries`, `evaluationMetrics`) with TypeScript types 492 - 8 contract tests for evaluation endpoints (queries pagination, field mapping, raw_confidence, metrics aggregates, latency percentiles, status/source breakdowns, unconfigured state) 493 494 ### Changed 495 - **Evaluation page enhancements** — sortable columns (Time, Status, Confidence, Latency, Source), filter dropdowns (status, source) with clear button, metric card descriptions, column header tooltips, collapsible "Understanding these metrics" guide explaining all 4 metrics and 7 query log columns 496 - **Ask Meridian input bar consistency** — header layout, New Chat button style, and Ctrl+K behavior aligned with Ops Agent page 497 - **Ops Agent UX improvements** — answer rendered above reasoning timeline (faster time-to-value), timeline collapsed by default, follow-up prompt chips ("Keep investigating"), New Query button with Ctrl+K shortcut 498 - **Centered input bar** on empty state for both Ask Meridian and Ops Agent — input moves to bottom-pinned position once conversation starts 499 - **Polished input bar** on both chat pages — elevated card with shadow, keyboard hint badge, circular send icon button, contextual placeholder ("Ask a follow-up..." during conversation) 500 - Rename "Retrieval Details" to **Citations** in collapsible panel header 501 - Move "Keep the conversation going" follow-up prompts below confidence pill and Citations panel 502 - Widen Citations panel and follow-up prompts to span full chat width (no longer constrained by message bubble width) 503 504 ### Fixed 505 - ServiceNow connector: use `GET /ingest/servicenow/status` (actual backend endpoint) instead of non-existent `POST /ingest/servicenow/test` 506 - Follow-up prompts and Citations panel no longer leave empty whitespace on right side 507 508 --- 509 510 ## [0.5.0] — 2026-03-09 511 512 ### Added 513 - **Retrieval Details panel** — collapsible panel under each response with per-chunk confidence trackbars, threshold markers, shield pass/fail icons, best/avg stats, and trace ID 514 - `retrieval_scores` field in `QueryResponse` type 515 516 ### Changed 517 - Rebrand Cognitive AI Services sidebar section to **AI Lab — Preview** with violet badge 518 - Add "AI Lab — Preview" pill next to page headings on Language, Vision, Speech, and Document Intelligence pages 519 - Move Document Intelligence from Core to AI Lab section in sidebar 520 - Enable Diagnostics & Governance panel on Document Intelligence page 521 - Rename Document Intelligence page heading from "Document Preview" to "Document Intelligence" 522 - Landing page: split capabilities into Core (4 cards) and AI Lab — Preview (3 dashed-border cards) 523 - Shorten sidebar AI nav labels to "Language", "Vision", "Speech", "Document" 524 - Update AI disclaimer to co-pilot framing 525 526 --- 527 528 ## [0.4.0] — 2026-03-09 529 530 ### Added 531 - **Pin/Unpin sidebar** — collapsible sidebar with icon-only mode; expands on hover when unpinned; state persisted in localStorage 532 - **REFUSED response UX** — confidence explanation ("Confidence was X% — minimum threshold is Y%"), suggestion chips ("Try one of these instead") on refused queries 533 - **Follow-up prompts** — "Keep the conversation going" chips (Tell me more, Give an example, Key takeaways, Compare to alternatives) after successful OK responses 534 - **Landing page** at `/welcome` — dark hero section with iridescent gradient, 7 capability cards, "Get Started" and "View Source" CTAs 535 - **Markdown rendering** in assistant responses via `react-markdown` 536 - **Copy answer button** on each assistant response (clipboard API) 537 - **Offline/disconnect banner** when API health check fails 538 - **Chat history persistence** — messages survive page refresh via localStorage 539 - **New Chat button** to clear conversation and localStorage 540 - **Keyboard shortcuts** — Ctrl+K focuses chat input, Escape clears input 541 - **Auto-resize chat area** — textarea grows with input, chat area uses full viewport height 542 - **AI disclaimer** — footer note under chat input: "it turns out the human, not the AI, made a mistake" 543 - **Query page component tests** — 7 tests covering empty state, OK response follow-ups, REFUSED suggestion chips, and chip interactions 544 545 ### Changed 546 - Rename "Query Console" to "Ask Meridian" in sidebar nav and page heading 547 548 --- 549 550 ## [0.3.0] — 2026-03-09 551 552 ### Added 553 - **Multi-turn chat** in Query Console — conversation history is sent with each query so follow-up questions ("What is so great about #1?") work naturally (ADR-0005) 554 - **Dynamic example questions** — Query Console loads suggested questions from backend `/health` endpoint, falls back to `public/example-questions.json`, then hardcoded defaults 555 - **Query Console** redesigned as a chat interface — persistent message history, user/assistant bubbles, typing indicator, example question chips, auto-scroll, Enter to send, confidence pill and trace ID shown inline per response 556 - **Ingestion Pipeline** page replacing Document Upload — pipeline stage visualization (Upload → Extract → Chunk → Embed → Index), multi-file support, 120s timeout for large documents 557 - Collapsible "What should I ingest?" guidance on Ingestion Pipeline page 558 - Icons and inline descriptions for all Settings fields (LLM Provider, Retrieval Provider, Retrieval Threshold) 559 - Icons for all Cognitive AI Services entries on Settings page 560 - `meridianApi.ingest` API function with `IngestResponse` type 561 - Vitest + MSW + Testing Library test framework (ADR-0003) 562 - API contract tests for `meridianApi.query` (payload shape, REFUSED/OK response mapping) 563 - API contract test for `meridianApi.health` 564 - MCP response fixtures from real backend responses 565 - `npm test` and `npm run test:watch` scripts 566 567 ### Changed 568 - Deploy workflow: switch from Azure Static Web Apps to Azure Container Apps (Docker/ACR) 569 - Remove PR-trigger and close-staging job (Container Apps doesn't support SWA preview environments) 570 - Settings: rename "Azure AI Services" to "Cognitive AI Services", mark all 4 services as active 571 - Settings: updated page subtitle with descriptive text 572 - Document Intelligence icon unified to `FileSearch` across sidebar nav and Settings page 573 - Document Intelligence page repurposed as "Document Preview" — pipeline extraction debugging tool 574 - Document Preview moved from Cognitive AI Services to core nav (next to Ingest) 575 - Cognitive AI Services reduced to 3 services: Language, Vision, Speech 576 - Settings: removed Document Intelligence from Cognitive AI Services list 577 - Ingestion Pipeline: added Extract stage between Upload and Chunk 578 579 ### Fixed 580 - Query: handle HTTP 422 (REFUSED) as valid QueryResponse instead of throwing — governance refusals now display correctly 581 - Query: switch from MCP `/tools/call` to direct `/query` endpoint on Meridian API 582 - Ingest: fix missing `FileSearch` import (pre-existing bug) 583 - Sidebar: increase inactive nav link opacity (white/40 → white/65) for legibility on MacBook displays 584 - Settings: Retrieval Threshold description moved below label row (was incorrectly inside flex justify-between) 585 - Query page MCP integration: send correct `query_knowledge_base` tool call payload and map response fields (`confidence` -> `confidence_score`, `reason` -> `refusal_reason`) 586 - ESLint `no-unused-vars` error: remove unused `SpeechSynthesisResult` import 587 - ESLint `react-refresh/only-export-components` error: split diagnostics into separate context, provider, and hook files 588 - TypeScript build errors: update `useTrackedMutation` to TanStack Query v5 4-arg callback signatures 589 - TypeScript build errors: fix unsafe type cast in Speech Services transcript display 590 591 --- 592 593 ## [0.2.1] — 2026-03-05 594 595 ### Added 596 - **Diagnostics & Governance** right sidebar panel on all Cognitive AI Services pages 597 - `DiagnosticsProvider` React Context for session-level API call tracking 598 - `useTrackedMutation` hook — wraps React Query's `useMutation` to auto-record service calls 599 - `DiagnosticsPanel` component with collapsible Diagnostics and Governance sections 600 - Azure AI pricing estimates (per-service, clearly labeled as approximate) 601 - ADR-0002: Diagnostics & Governance Panel architecture decision 602 - Auto-reset diagnostics on AI service page navigation 603 604 ### Fixed 605 - Document Intelligence crash when accessing `data.data.model_id` on flat API response 606 - Speech TTS "not valid JSON" error — switched to `postForBlob` for binary WAV audio 607 - Null safety for undefined nested response fields across AI service pages 608 609 --- 610 611 ## [0.2.0] — 2026-03-04 612 613 ### Added 614 - **Language Intelligence** page — sentiment analysis, entity recognition, key phrase extraction, and language detection powered by Azure AI Language 615 - **Vision Intelligence** page — image analysis (caption, tags, objects) and OCR text extraction powered by Azure AI Vision 616 - **Speech Services** page — speech-to-text transcription with word-level timings, and text-to-speech synthesis with voice selection powered by Azure AI Speech 617 - **Document Intelligence** page — structured data extraction from documents (invoices, receipts, IDs, layouts) powered by Azure AI Document Intelligence 618 - "Cognitive AI Services" nav section in sidebar grouping the four new Azure AI feature pages 619 - `SpeechTranscriptResult`, `SpeechSynthesisResult`, `DocumentAnalysisResult`, `OcrResult` types in `api/types.ts` 620 - `transcribe`, `textToSpeech`, `analyzeDocument` methods in `azureAiApi`; `ocr` return type strengthened to `OcrResult` 621 - Iridescent animated gradient on "Meridian Studio" title and sidebar footer links 622 - Animated gradient on nav links (hover/focus only — natural white at rest) 623 - Icon micro-animations on Dashboard stat cards (hover) 624 - Concise page descriptions and provider config hints on Dashboard, Query, and Upload 625 - Trademark disclaimer footer on all pages 626 - Dashboard: live provider config hint with link to Settings 627 628 ### Changed 629 - Sidebar nav refactored into reusable `NavItem` component with scrollable `overflow-y-auto` region 630 - Sidebar background reverted to solid black 631 - Dashboard title updated to `h1` with descriptive subtitle 632 633 --- 634 635 ## [0.1.0] — 2025-01-01 636 637 ### Added 638 - Initial scaffold: Vite + React 19 + TypeScript 5.9 + Tailwind CSS v4 639 - Dashboard page with health/status cards (Status, Documents, LLM Provider, Threshold) 640 - Query Console with confidence gauge and answer display 641 - Upload page with drag-and-drop document ingestion 642 - Settings page with LLM and retrieval provider switching (React Hook Form + Zod) 643 - React Query v5 integration for API state management 644 - Settings form seeded from React Query cache (no flash on remount) 645 - StatusBadge component with luminescent glow dots 646 - Sidebar layout with iridescent top accent strip 647 - VPL logo in sidebar header 648 - GitHub and LinkedIn social links in sidebar footer 649 650 [Unreleased]: https://github.com/tvprasad/meridian-studio/compare/v0.33.3...HEAD 651 [0.33.3]: https://github.com/tvprasad/meridian-studio/compare/v0.33.2...v0.33.3 652 [0.33.2]: https://github.com/tvprasad/meridian-studio/compare/v0.33.1...v0.33.2 653 [0.33.1]: https://github.com/tvprasad/meridian-studio/compare/v0.33.0...v0.33.1 654 [0.33.0]: https://github.com/tvprasad/meridian-studio/compare/v0.32.0...v0.33.0 655 [0.30.6]: https://github.com/tvprasad/meridian-studio/compare/v0.30.5...v0.30.6 656 [0.30.5]: https://github.com/tvprasad/meridian-studio/compare/v0.30.4...v0.30.5 657 [0.30.4]: https://github.com/tvprasad/meridian-studio/compare/v0.30.3...v0.30.4 658 [0.30.3]: https://github.com/tvprasad/meridian-studio/compare/v0.30.2...v0.30.3 659 [0.30.2]: https://github.com/tvprasad/meridian-studio/compare/v0.30.1...v0.30.2 660 [0.30.1]: https://github.com/tvprasad/meridian-studio/compare/v0.30.0...v0.30.1 661 [0.30.0]: https://github.com/tvprasad/meridian-studio/compare/v0.29.0...v0.30.0 662 [0.29.0]: https://github.com/tvprasad/meridian-studio/compare/v0.28.0...v0.29.0 663 [0.28.0]: https://github.com/tvprasad/meridian-studio/compare/v0.27.0...v0.28.0 664 [0.27.0]: https://github.com/tvprasad/meridian-studio/compare/v0.26.2...v0.27.0 665 [0.26.2]: https://github.com/tvprasad/meridian-studio/compare/v0.26.1...v0.26.2 666 [0.26.1]: https://github.com/tvprasad/meridian-studio/compare/v0.26.0...v0.26.1 667 [0.26.0]: https://github.com/tvprasad/meridian-studio/compare/v0.25.1...v0.26.0 668 [0.25.1]: https://github.com/tvprasad/meridian-studio/compare/v0.25.0...v0.25.1 669 [0.25.0]: https://github.com/tvprasad/meridian-studio/compare/v0.24.1...v0.25.0 670 [0.24.1]: https://github.com/tvprasad/meridian-studio/compare/v0.24.0...v0.24.1 671 [0.24.0]: https://github.com/tvprasad/meridian-studio/compare/v0.23.0...v0.24.0 672 [0.23.0]: https://github.com/tvprasad/meridian-studio/compare/v0.22.1...v0.23.0 673 [0.22.1]: https://github.com/tvprasad/meridian-studio/compare/v0.22.0...v0.22.1 674 [0.22.0]: https://github.com/tvprasad/meridian-studio/compare/v0.21.0...v0.22.0 675 [0.21.0]: https://github.com/tvprasad/meridian-studio/compare/v0.20.0...v0.21.0 676 [0.20.0]: https://github.com/tvprasad/meridian-studio/compare/v0.19.0...v0.20.0 677 [0.19.0]: https://github.com/tvprasad/meridian-studio/compare/v0.18.2...v0.19.0 678 [0.18.2]: https://github.com/tvprasad/meridian-studio/compare/v0.18.1...v0.18.2 679 [0.18.1]: https://github.com/tvprasad/meridian-studio/compare/v0.18.0...v0.18.1 680 [0.18.0]: https://github.com/tvprasad/meridian-studio/compare/v0.17.0...v0.18.0 681 [0.17.0]: https://github.com/tvprasad/meridian-studio/compare/v0.16.0...v0.17.0 682 [0.16.0]: https://github.com/tvprasad/meridian-studio/compare/v0.15.0...v0.16.0 683 [0.15.0]: https://github.com/tvprasad/meridian-studio/compare/v0.14.0...v0.15.0 684 [0.14.0]: https://github.com/tvprasad/meridian-studio/compare/v0.13.0...v0.14.0 685 [0.13.0]: https://github.com/tvprasad/meridian-studio/compare/v0.12.0...v0.13.0 686 [0.12.0]: https://github.com/tvprasad/meridian-studio/compare/v0.11.0...v0.12.0 687 [0.11.0]: https://github.com/tvprasad/meridian-studio/compare/v0.10.0...v0.11.0 688 [0.10.0]: https://github.com/tvprasad/meridian-studio/compare/v0.9.1...v0.10.0 689 [0.9.1]: https://github.com/tvprasad/meridian-studio/compare/v0.9.0...v0.9.1 690 [0.9.0]: https://github.com/tvprasad/meridian-studio/compare/v0.8.0...v0.9.0 691 [0.8.0]: https://github.com/tvprasad/meridian-studio/compare/v0.7.0...v0.8.0 692 [0.7.0]: https://github.com/tvprasad/meridian-studio/compare/v0.6.1...v0.7.0 693 [0.6.1]: https://github.com/tvprasad/meridian-studio/compare/v0.6.0...v0.6.1 694 [0.6.0]: https://github.com/tvprasad/meridian-studio/compare/v0.5.0...v0.6.0 695 [0.5.0]: https://github.com/tvprasad/meridian-studio/compare/v0.4.0...v0.5.0 696 [0.4.0]: https://github.com/tvprasad/meridian-studio/compare/v0.3.0...v0.4.0 697 [0.3.0]: https://github.com/tvprasad/meridian-studio/compare/v0.2.1...v0.3.0 698 [0.2.1]: https://github.com/tvprasad/meridian-studio/compare/v0.2.0...v0.2.1 699 [0.2.0]: https://github.com/tvprasad/meridian-studio/compare/v0.1.0...v0.2.0 700 [0.1.0]: https://github.com/tvprasad/meridian-studio/releases/tag/v0.1.0