What's Changed
- Fix/dashboard filter value control by @lqiu03 in #1883
- fix(detectors): evaluate every trigger field at the trace list's grain by @lqiu03 in #1887
- feat(detectors): whitelist trigger fields and operators at the write path by @lqiu03 in #1885
- feat(detectors): build the filter editor on the shared filter controls by @lqiu03 in #1886
- feat(server): offline-evaluation persistence schema and migration by @dark-sorceror in #1753
- feat(evaluations): reporting contract for the public eval API by @dark-sorceror in #1920
- feat(public-api): dataset authoring and sync endpoints by @dark-sorceror in #1755
- feat(datasets): datasets list and detail with version selection by @dark-sorceror in #1756
- feat(datasets): test-case table and slide-in per-case panel by @dark-sorceror in #1757
- feat(public-api): register-run endpoint with lineage and run URL by @dark-sorceror in #1758
- feat(public-api): upsert-result and complete-run endpoints by @dark-sorceror in #1759
- feat(datasets): save a span as a test case by @dark-sorceror in #1760
- feat(rest): public eval API gateway with API-key auth by @dark-sorceror in #1761
- feat(rest): publish reporting OpenAPI with a parity guard by @dark-sorceror in #1762
- feat(traces): preserve eval span kinds and classify eval traces by @dark-sorceror in #1763
- feat(traces): exclude evaluation traces from lists and detectors by @dark-sorceror in #1764
- feat(evaluations): runs-list read model by @dark-sorceror in #1765
- feat(runs): evaluations run table by @dark-sorceror in #1766
- feat(runs): lineage grouping with aggregate rows by @dark-sorceror in #1767
- feat(evaluations): run-detail read model and comparison assembly by @dark-sorceror in #1768
- feat(evaluations): pure candidate-vs-baseline comparison engine by @dark-sorceror in #1769
- feat(runs): run-detail results table opening the real trace by @dark-sorceror in #1770
- feat(traces): open a result's eval-shaped trace with stepping by @dark-sorceror in #1771
- feat(compare): compare-with on run detail with diff-mode trace by @dark-sorceror in #1772
- feat(compare): shareable candidate-vs-baseline comparison view by @dark-sorceror in #1773
- feat(scorers): derived scorer catalog and detail read model by @dark-sorceror in #1774
- feat(scorers): persist the SDK-reported scorer definition by @dark-sorceror in #1775
- feat(scorers): scorers catalog and read-only detail by @dark-sorceror in #1776
- feat(worker): derive per-result cost from the trace on ingest by @dark-sorceror in #1777
- feat(traces): trace-viewer diff mode and multi-format span I/O by @dark-sorceror in #1778
- feat(evaluations): data-fetching hooks over the read models by @dark-sorceror in #1779
- feat(evaluations): loading, empty, and error states by @dark-sorceror in #1780
- test(evaluations): backend suite — engines, contract parity, lifecycle by @dark-sorceror in #1781
- test(evaluations): view smoke-test suite by @dark-sorceror in #1782
- feat(evaluations): row-selection compare + N-run Run Comparison; simplify run detail by @XinweiHe in #1845
- refactor(traces): remove the now-dead trace input/output diff feature by @XinweiHe in #1846
- feat(evaluations): version-scoped test-case Experiments tab + dataset detail by @XinweiHe in #1847
- feat(eval): SDK-agnostic evaluation identity — semantic scorer key, drop run provenance by @dark-sorceror in #1856
- feat(eval): converge dataset identity — content-address versions + UI name guards by @dark-sorceror in #1857
- refactor(eval): metric-first runs — remove main_score and run-level pass/fail by @dark-sorceror in #1858
- fix(eval): squash the unreleased eval migrations + remove human-review by @dark-sorceror in #1918
- feat(evaluations): offline evaluations — trace-native, metric-first by @dark-sorceror in #1921
Full Changelog: v0.3.9...v0.4.0