/ 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