v0.15.0
What's Changed
- feat(studio): paged Compare picker + modal result + PDF export by @omeryasirkucuk in #264
- fix(compare): auto-detect brew Pango/Cairo so PDF export works on macOS by @omeryasirkucuk in #265
- fix(compare): match Studio modal palette in PDF + silence pango stderr by @omeryasirkucuk in #266
- feat(compare): brand the PDF with the AMX logo on every page by @omeryasirkucuk in #267
- feat(compare): wire Compare to Ask AMX (CLI tool + modal hand-off) by @omeryasirkucuk in #268
- feat(compare): academic text-quality metric framework (Tier 0/1/2) by @omeryasirkucuk in #269
- fix(compare): close three quality-framework gaps left by #269 by @omeryasirkucuk in #270
- chore(wording): drop 'paid' from every tracked surface by @omeryasirkucuk in #271
- chore(compare): compact methods footer in CLI + Studio by @omeryasirkucuk in #272
- fix(ask): drop into sticky ask> REPL after a seeded one-shot by @omeryasirkucuk in #273
- fix(studio-ask): auto-submit the seed prompt on Compare hand-off by @omeryasirkucuk in #274
- fix(logging): keep amx.* INFO/DEBUG out of the user's terminal by @omeryasirkucuk in #275
- fix(deps): pin transformers>=4.56 in extras + runtime guard by @omeryasirkucuk in #276
- fix(runs): pick the analyze.run label from scope, not a fixed string by @omeryasirkucuk in #277
- fix(quality): drop the length-appropriateness metric by @omeryasirkucuk in #278
- feat(runs): kind filter chips + drop Ask sessions from compare by @omeryasirkucuk in #279
- feat(studio): bridge LiveDisplay step events into the run-detail SSE by @omeryasirkucuk in #280
- fix(runs): demote successful runs with no applied to ready_for_review by @omeryasirkucuk in #281
- feat(studio): per-run LLM fine-tuning overrides on /runs/new by @omeryasirkucuk in #282
- fix(studio): compact RunNew override disclosure + pre-fill from profile by @omeryasirkucuk in #283
- fix(agents): merge step honours description_verbosity instead of collapsing to one sentence by @omeryasirkucuk in #284
- fix(studio): live progress now shows what the worker is doing + how long by @omeryasirkucuk in #285
- fix(studio): cost-override default chip shows live LiteLLM/OpenRouter price by @omeryasirkucuk in #286
- feat(studio): canonical AMX brand mark in the topbar + run-page polish by @omeryasirkucuk in #287
- fix(agents): alternative descriptions honour description_verbosity preset by @omeryasirkucuk in #288
- fix(studio): pin Footer to the viewport bottom by @omeryasirkucuk in #289
- feat(cli): adapt brand palette to light terminal backgrounds by @omeryasirkucuk in #290
- fix(studio): stop amx.* INFO/DEBUG flooding the launching terminal by @omeryasirkucuk in #291
- fix: bug fixing batch (python-multipart, pricing SSL on Windows) by @omeryasirkucuk in #292
- feat(pricing): browse and pick prices for any LLM model from Studio + CLI by @omeryasirkucuk in #293
- feat(studio): show input/output rates under the active LLM in the sidebar by @omeryasirkucuk in #294
- fix(studio): per-step elapsed timer on the Live progress card by @omeryasirkucuk in #295
- fix(tests): restore propagate on every amx.* logger after Studio mute test by @omeryasirkucuk in #297
- feat(install): single-step install with Studio + DuckDB in core by @omeryasirkucuk in #296
- fix(ssl): consult the OS trust store so corporate-proxy networks work out of the box by @omeryasirkucuk in #298
- fix(pricing): legible toast when OpenRouter is blocked at the network layer by @omeryasirkucuk in #299
- fix(pricing): match catalog keys by bare-model suffix when provider field is wrong by @omeryasirkucuk in #301
- fix(doctor): empty config is FAIL, not OK, and survives --skip-network by @omeryasirkucuk in #302
- fix(studio): expose Databricks TLS fields in the Add-profile form by @omeryasirkucuk in #303
- fix(cli): skip eager embeddings-module import for default-MiniLM users by @omeryasirkucuk in #304
- feat(studio): make collapsed-sidebar icons clickable to re-open the panel by @omeryasirkucuk in #305
- build(deps-dev): bump @types/node from 22.19.17 to 22.19.18 in /frontend in the npm-deps group by @dependabot[bot] in #300
- fix(databricks-tls): neutral wording on Skip-TLS, add Studio info hint by @omeryasirkucuk in #306
- fix(db): correctness sweep across backend adapters by @omeryasirkucuk in #307
- feat(db): TLS controls across all backends + profile schema source of truth by @omeryasirkucuk in #308
- feat(db): approximate distinct counts on metered backends by @omeryasirkucuk in #309
- feat(db): UX polish + DuckDB / BigQuery extras + shared-history banner by @omeryasirkucuk in #310
- docs(readme): rewrite hero, add intro video, restructure sections by @omeryasirkucuk in #311
- docs(readme): hide video filename header, swap ASCII flow for amx-flow.png by @omeryasirkucuk in #312
- docs(readme): add AMX CLI heading, rename Studio header, fix /studio usage by @omeryasirkucuk in #313
- feat(installer): polished spinner UX + Studio progress banner for on-demand extras by @omeryasirkucuk in #314
- feat(db): column-comments cache foundation (CLI + Studio) by @omeryasirkucuk in #315
- feat(db): bulk schema metadata across 10 backends + refresh UX by @omeryasirkucuk in #316
- fix(studio): InstallBanner EventSource churn was crashing the SPA on first paint by @omeryasirkucuk in #317
- fix(cli): honour pinned catalog without re-prompting on every run by @omeryasirkucuk in #318
- feat(db): cache the asset list and per-schema metadata (not just column comments) by @omeryasirkucuk in #319
- fix(studio): stop CLI spinner leak + raise Databricks retry budget by @omeryasirkucuk in #320
- fix(studio): sidebar honours pinned catalog/database from the profile by @omeryasirkucuk in #321
- feat(studio): offline fallback page when the AMX CLI stops by @omeryasirkucuk in #322
- fix(studio): show the AMX Studio logo on the offline page by @omeryasirkucuk in #323
- fix(studio): offline page favicon + Try-reconnecting now actually probes the CLI by @omeryasirkucuk in #324
- fix(studio): DB profile delete + edit reflect everywhere without a page reload by @omeryasirkucuk in #325
- fix(scope): respect the schema-level pin (Databricks/BigQuery) everywhere by @omeryasirkucuk in #326
- feat(runs): show the actual asset on Runs list + Compare picker by @omeryasirkucuk in #327
- fix(llm): flatten list-shaped Message.content directly on the class by @omeryasirkucuk in #328
- fix(runs): cancel reaches the next LLM call + final status reflects reality by @omeryasirkucuk in #329
- feat(style): writing-style reference for descriptions by @omeryasirkucuk in #330
- docs: link README hero video to YouTube by @omeryasirkucuk in #331
- docs: inline README hero video from repo assets by @omeryasirkucuk in #332
- docs: switch README hero to YouTube thumbnail link by @omeryasirkucuk in #333
- docs: add play-button overlay to README video thumbnail by @omeryasirkucuk in #334
- feat(rag): observability + error surfacing (PR A of 4) by @omeryasirkucuk in #335
- feat(rag): storage correctness — embedding provider + idempotency (PR B of 4) by @omeryasirkucuk in #336
- feat(rag): citation chain (PR C of 4) by @omeryasirkucuk in #337
- feat(rag): stability + perf (PR D of 4 — final) by @omeryasirkucuk in #338
- feat(studio): RAG UX polish (PR E of RAG hardening) by @omeryasirkucuk in #339
- feat(code): Studio code surface fix (PR alpha of code-RAG hardening) by @omeryasirkucuk in #340
- feat(code): storage correctness — embedding provider + idempotency + filters (PR beta) by @omeryasirkucuk in #341
- feat(code): citation chain (PR gamma of code-RAG hardening) by @omeryasirkucuk in #342
- feat(code): stability + perf + UI (PR delta of code-RAG hardening — final) by @omeryasirkucuk in #343
- feat(review): filter/search/sort/group + status chips (PR A of bulk-review UX) by @omeryasirkucuk in #344
- feat(review): selection + bulk + pagination + URL state + keynav (PR B of bulk-review UX) by @omeryasirkucuk in #345
- feat(review): column-level compare (PR C of bulk-review UX — final) by @omeryasirkucuk in #346
- fix(studio): pinned-cells drawer reads every bucket by @omeryasirkucuk in #347
- fix(studio): doc upload sends Bearer token by @omeryasirkucuk in #348
- fix: code-analyze resilience for missing tables + SQLite locks + sqlglot noise by @omeryasirkucuk in #349
- feat(docs): show file inventory under doc profile (Studio + CLI) by @omeryasirkucuk in #350
- fix(cli): auto-reload config when disk is newer than in-memory copy by @omeryasirkucuk in #351
- feat(docs): preserve original filename for uploaded docs (Studio + CLI) by @omeryasirkucuk in #352
- fix(studio): restore stdin tty mode after /studio exits by @omeryasirkucuk in #353
- fix(studio): stronger stdin restore — blocking flag + drain by @omeryasirkucuk in #354
- fix(studio): run uvicorn in a subprocess for full isolation by @omeryasirkucuk in #355
- fix(studio): triple-layer defense against Ctrl+C terminal freeze by @omeryasirkucuk in #357
- feat(studio): phone-first responsive shell by @omeryasirkucuk in #356
- fix(studio): fast child shutdown + AMX_CONFIG_DIR env var by @omeryasirkucuk in #358
- fix(studio): silent Ctrl+C path + loop-aware fast shutdown by @omeryasirkucuk in #359
- fix(config): prevent reload_if_stale autosave race that wiped profile dicts by @omeryasirkucuk in #360
- fix(config): rolling backup + /restore-config recovery command by @omeryasirkucuk in #361
- fix(config): refuse to save when in-memory state is inconsistent by @omeryasirkucuk in #362
- fix(studio): replace native confirm() with AlertDialog for profile deletes by @omeryasirkucuk in #363
- fix(config): remove_db_profile / remove_llm_profile resurrection via mid-removal autosave by @omeryasirkucuk in #364
- feat(style): cascading reference-table picker + softer Runs warning by @omeryasirkucuk in #365
- fix(studio): bootstrap history-store singleton in subprocess by @omeryasirkucuk in #366
- fix(studio): drop half-formed RunNew scope when active profile has no pin by @omeryasirkucuk in #367
- feat(docs): fix PDF ingest + per-file delete from doc profile by @omeryasirkucuk in #368
- feat(ask): delete sessions + doc/code profile picker by @omeryasirkucuk in #369
- fix(codebase): IndexError on /code-scan with empty asset list by @omeryasirkucuk in #370
- fix(rag): drop weakly-matching doc chunks before they reach the LLM by @omeryasirkucuk in #371
- fix(ask): surface a useful diagnostic instead of bare "(empty response)" by @omeryasirkucuk in #372
- feat(ask): inline LLM picker next to scope chip, synced with sidebar by @omeryasirkucuk in #373
- fix(code): hybrid rerank for /code-search so literal matches outrank embedding noise by @omeryasirkucuk in #374
- fix(ask): cross-database fanout for find_table_by_name + describe_table on unpinned 2-level profiles by @omeryasirkucuk in #375
- feat(ask): cache-first metadata lookup — catalog → 24h cache → live by @omeryasirkucuk in #376
- feat(scheduler): phase 0 — parallel-run preflight + advisory lock helper by @omeryasirkucuk in #377
- feat(scheduler): land phases 1a-5b on main (stacked merge follow-up) by @omeryasirkucuk in #386
- feat(scheduler): visual polish + picker-based selection in Studio and CLI by @omeryasirkucuk in #387
- feat(scheduler): /analyze schedule tab style + Studio /runs/schedules + responsive + tables picker by @omeryasirkucuk in #388
- feat(scheduler): cascading scope tree (Profile->Database->Schema->Table->Column) by @omeryasirkucuk in #389
- feat(runs): /api/runs accepts column_overrides body field by @omeryasirkucuk in #390
- feat(runs): RunNew adopts ScopeTree component (Stage 2) by @omeryasirkucuk in #391
- fix(scope): ScopeTree reads correct schemas/assets/columns shapes by @omeryasirkucuk in #392
- feat(runs): multi-profile selection on /runs/new (frontend fan-out) by @omeryasirkucuk in #393
- feat(scheduler): real Orchestrator drive for scheduled runs by @omeryasirkucuk in #394
- feat(scheduler): plumb column-scope picks into orchestrator.column_overrides by @omeryasirkucuk in #395
- feat(cli): /analyze run --columns flag (non-interactive Column scope) by @omeryasirkucuk in #396
- fix(studio): PageHeader stacks on mobile; Schedules daemon chip hides on xs by @omeryasirkucuk in #397
- feat(history): show every picked asset in Runs/Detail; persist column_overrides by @omeryasirkucuk in #398
- feat(studio): schedule edit dialog + one-click daemon install/uninstall by @omeryasirkucuk in #399
- fix(studio): add /__alive liveness probe outside the token-gated paths by @omeryasirkucuk in #400
- fix(studio): live missed-banner + Schedule kind chip + past-date guard by @omeryasirkucuk in #401
- fix(scheduler): heartbeat ticker so long scheduled runs don't get false-failed by @omeryasirkucuk in #402
- fix(scheduler): daemon invokes python -m amx.scheduler; SPA polls by @omeryasirkucuk in #403
- fix(scheduler): unbuffered daemon logs + PATH; start-of-tick marker by @omeryasirkucuk in #404
- feat(scheduler): all-OS daemon support + Studio-resident ticker by @omeryasirkucuk in #405
- fix(ui): Dialog now scrolls on small viewports across every size by @omeryasirkucuk in #406
- fix(scheduler): persist database/catalog overlay on scheduled_runs by @omeryasirkucuk in #407
- feat(ask): visible-content streaming + cancel UX + table-name lookup priority by @omeryasirkucuk in #408
- feat(ask): real cancellation + instant state reactions by @omeryasirkucuk in #409
- fix(studio): SPA self-recovers from a stale bearer token after Studio restart by @omeryasirkucuk in #410
- fix(ask): cancelled streams no longer trip the 'Couldn't reach the LLM' banner by @omeryasirkucuk in #411
- feat(ask): cancelled turns show a persistent Cancelled pill by @omeryasirkucuk in #412
- fix(ask): doc and code profile pickers default to None by @omeryasirkucuk in #413
- feat(catalog): post-apply sync + drift probe + FTS5 + freshness pill by @omeryasirkucuk in #414
- fix(catalog): freshness pill updates, dropdown outside-click, sidebar cache-first by @omeryasirkucuk in #415
- feat(catalog): explicit completeness gate + skeleton sync + progress UI + agent honesty by @omeryasirkucuk in #416
- fix(catalog): drop ghost profiles + treat zero-table sync as failure by @omeryasirkucuk in #417
- fix(catalog): scope skeleton sync + cache by (profile, database) by @omeryasirkucuk in #418
- fix(runs): seed New Run selections when scope arrives via URL by @omeryasirkucuk in #419
- feat(db): explicit cache management — /db cache-{show,stats,clear} + Studio page by @omeryasirkucuk in #420
- feat(schedules): ready_for_review demotion + Schedule Detail dialog by @omeryasirkucuk in #421
- feat(confidence): per-alternative confidence scoring — Phase 1 (Signals A + C) by @omeryasirkucuk in #422
- feat(confidence): Signal B — LLM self-declaration per alternative (Phase 2) by @omeryasirkucuk in #423
- feat(confidence): Signal D LLM-as-judge + /history eval-confidence harness (Phases 3 & 4) by @omeryasirkucuk in #424
- fix(confidence): default use_self_decl=True in YAML loader + per-alt badge in RunDetail by @omeryasirkucuk in #425
- feat(storage): dogfood metadata standard on local SQLite history by @omeryasirkucuk in #426
- refactor(confidence): user-selected single signal + carousel regression fix by @omeryasirkucuk in #427
- feat(studio): stability-first error surface + self-hosted fonts by @omeryasirkucuk in #428
- fix(confidence): carry suggestion_scores through merge / generate / rerun paths by @omeryasirkucuk in #429
- fix(studio): pending-entry alternatives accept structured shape (carousel regression) by @omeryasirkucuk in #430
- fix(studio): per-alternative pills survive the click into pending state by @omeryasirkucuk in #432
- fix(history): list_apply_events delegate on DualWriteHistoryStore by @omeryasirkucuk in #431
- fix(studio): clicking the chosen alternative deselects it by @omeryasirkucuk in #433
- fix(studio): web runs beat heartbeat so stale-recovery skips them by @omeryasirkucuk in #434
- fix(studio): audit captures auto-apply events; move Audit out of top navbar by @omeryasirkucuk in #435
- fix(studio): announce worker phases and anchor live progress timer to started_at by @omeryasirkucuk in #436
- fix(history): partial apply rolls run status + applied_count + audit events forward by @omeryasirkucuk in #438
- fix(history): count review/partial-applied runs toward success rate by @omeryasirkucuk in #439
- chore(history): backfill chosen_description on non-interactive apply paths by @omeryasirkucuk in #440
- feat(llm): alternatives_mode — semantic vs lexical diversity by @omeryasirkucuk in #441
- feat(search): data-touching joinable_tables strategies + stale-catalog rescue by @omeryasirkucuk in #442
- feat(studio): show full N-alternatives + mode in Compare runs view by @omeryasirkucuk in #443
- fix(llm): realign alternatives_mode to Definition 1 (NLP standard) by @omeryasirkucuk in #444
- feat(cli): override picker parity — add alternatives_mode + confidence_signal by @omeryasirkucuk in #445
- docs(readme): early-stage notice, AI-assisted disclosure, refreshed Studio screenshot by @omeryasirkucuk in #446
- chore: add GitHub issue templates by @omeryasirkucuk in #447
- Variations + Re-Run modal parity, hard n-alternatives, pending supersede, Compare/Ask descendants by @omeryasirkucuk in #448
- feat(studio): sidebar column-level search and breadcrumb UX by @omeryasirkucuk in #449
- chore: remove cleanup-placeholders sweep from Studio + CLI by @omeryasirkucuk in #450
- fix(studio): pending-review chip counts the whole table by @omeryasirkucuk in #451
- feat(studio): unified Catalog cache page + scheduled refresh schedules by @omeryasirkucuk in #452
- feat(eval): docs RAG gold-set runner + baseline regression gate by @omeryasirkucuk in #453
- feat(rag): collection identity v2 — record embedding_dim + port mismatch to Catalog Search by @omeryasirkucuk in #456
- feat(code-rag): default to jina-embeddings-v2-base-code with MiniLM fallback by @omeryasirkucuk in #457
- feat(docs-rag): format-dispatching chunker — Markdown header awareness (F1.1) by @omeryasirkucuk in #458
- feat(docs-rag): FTS5 sidecar + RRF fusion for hybrid retrieval (F2.1) by @omeryasirkucuk in #459
- feat(rag-agent): edges-first assembly + citation header + model-aware budget (F3.1-F3.3) by @omeryasirkucuk in #460
- feat(docs-rag): MMR diversity reorder after rerank (F2.5) by @omeryasirkucuk in #461
- feat(docs-rag): opt-in cross-encoder rerank (F2.2) by @omeryasirkucuk in #462
Full Changelog: v0.14.0...v0.15.0