Changelog

All notable changes to this project will be documented in this file.

[2026.06.18]

Added

  • Data Import - Drag and Drop on the Launcher: Files can be opened by dragging and dropping them onto the launcher screen; previously dropping a file caused the browser to download it
  • Agent API - datasets.traceRowLineage(): For selected rows of an aggregated derived dataset, datasets.traceRowLineage() identifies the contributing rows in its parent dataset, tracing GROUP BY aggregations, joins, subqueries, CTEs, and filters; shapes that cannot be traced (e.g., window functions, set operations) are returned with a reason
  • Agent API - ANOVA Element IDs in reports.addModelSummary(): reports.addModelSummary() returns the ANOVA Group Statistics and Tukey HSD tables in dedicated fields (groupStatisticsElementId, tukeyHSDElementId) instead of reusing the linear regression ANOVA fields
  • Agent API - ARIMA Residual Diagnostics from describe(): models.describe() returns the ARIMA residual ACF/PACF values and the fit-failure message, matching models.run()

Changed

  • GLM / GLMM - Variable Labels: The GLM and GLMM forms label the variables as Response Variable (Y) and Predictor Variables (X)

Fixed

  • GLM - Out-of-Range Fitted Means Produced an Internally Inconsistent Model: When a GLM's fitted means fell outside the family's valid range, the means were clamped (e.g., to 0.001/0.999) and the fit continued, so the coefficients reflected the pre-clamp linear predictor while the deviance, AIC, residuals, standard errors, and confidence intervals were computed from the clamped means; the fit is now reported as failed instead
  • GLM - Progress Dialog Stayed Open When Running on an Unloaded Dataset: Running a GLM on a dataset whose data was not loaded left the progress dialog open and blocking, which also hid the error message
  • Linear Models - Condition Number Was Underestimated, Missing Ill-Conditioned Designs: The condition number reported for GLM, ANOVA, and DoE could underestimate the true value by several orders of magnitude when the ill-conditioned direction was spread across columns, so the high-condition-number warning did not appear for some ill-conditioned designs
  • Linear Regression - Condition Number Warning Was Not Displayed: Linear Regression computed the high-condition-number warning but did not render it in the results, unlike GLM, ANOVA, and DoE
  • Linear Regression - Diagnostics Opened From Model Detail or Agent API Showed GLM Output: Opening the diagnostics for a linear regression (OLS) model from the Model Detail tab or via the Agent API displayed GLM-style output instead of OLS
  • GLMM - Degenerate Inputs Returned NaN or Infinity Instead of an Error: For degenerate inputs (e.g., a near-constant response or a single group), the standard errors, ICC, and BLUP standard errors could return NaN or Infinity while the fit was reported as converged; these cases now report a fitting error
  • DoE - Constant Response Returned Incorrect R² and Effect Sizes: When the response variable was constant, DoE returned incorrect values for R², adjusted R², and partial η²/ω² (e.g., R² near 1) instead of treating them as undefined; they are now null with a warning
  • Random Forest - Degenerate Inputs Caused Infinite Recursion, NaN Importances, or Diverging R²: A decision tree split that left one child empty could recurse without bound or yield NaN variable importances, and R² could diverge to ±Infinity when the out-of-bag response was nearly constant, contaminating the permutation importances
  • Cox Regression - Saved Projects Drew 0.95% Confidence Intervals Labeled 95%: Confidence intervals for Cox regression in some saved projects were drawn as 0.95% confidence intervals (an extremely narrow interval) while labeled 95%, because the stored confidence level remained a proportion (0.95) instead of a percentage (95); a migration corrects it on load
  • Data Management - Deleted Models Left Dangling References in Saved Projects: Some saved projects retained derived datasets and report references pointing to models that had already been deleted; a migration removes these orphaned references
  • Correlation - Heatmap Showed r=0 Cells in a Negative Color: In the correlation heatmap, cells with r=0 were drawn in a negative-correlation color instead of the transparent midpoint of the legend gradient
  • Descriptive Statistics - Mode Depended on Row Order When Values Tied: When several values tied for the highest frequency, the reported mode depended on the order of the rows (e.g., [1,1,2,2] gave 1 but [2,2,1,1] gave 2); the smallest tied value, or the first alphabetically for text, is now returned consistently
  • Crosstab - Field Values Containing ":col:" Broke Percentages and Cell Filters: Field values containing the text :col: broke the crosstab; all percentages became undefined and cell filters could not be built
  • Crosstab - Multiple Value Fields Produced Doubled Columns With Mismatched Values: Saving a crosstab with multiple value fields expanded the columns a second time and misaligned the values (e.g., a Sales column showing Qty values); crosstabs saved in the broken form are repaired on reload
  • Crosstab - Aggregating the Same Column Two Ways Duplicated Its Values: Aggregating one column with two different functions (e.g., SUM and AVG) collided, so the SUM was doubled
  • Custom Graph - Ribbon Bands Were Drawn Incorrectly With Missing Confidence Limits: Points missing a confidence-interval bound (ymin/ymax) were dropped to Y=0 instead of breaking the band, and points with an invalid (NaN) x were not excluded, so ribbon bands (e.g., in Kaplan-Meier plots where some intervals are missing) could be drawn incorrectly
  • Graph Builder - Extreme Bin Boundary or Center Produced NaN Bins or Froze the Graph: Setting a bin boundary or center far outside the data range produced NaN bin centers, and a value an extreme multiple of the bin width away could freeze the graph until it crashed; bin assignment within the data range is unchanged
  • Data Management - Integer-Like Column Names Reordered Columns: Datasets with integer-like column names (e.g., 0, 1) had their columns reordered into ascending numeric order during an internal conversion, so SELECT * returned them in the wrong order; this could occur after pivoting to wide form, saving a crosstab with numeric column fields, or importing a CSV with numeric headers
  • Data Management - Reshape Wide-to-Long Lost Columns and Mismatched Value Types: Wide-to-long reshape overwrote a column when the source already contained a column whose ID was variable or value, and it stored values that did not match the column's promoted (e.g., string) type
  • Data Management - Reshape Long-to-Wide Mishandled Null Keys and Colliding Names: Long-to-wide reshape collapsed null key values to empty strings, so rows with a null key and rows with an empty-string key were wrongly flagged as duplicates; it could also generate colliding column IDs or names (e.g., from wide_ prefixes, or null versus the string "NULL")
  • Data Management - Filter With Certain LIKE Patterns Froze the UI: A filter using a LIKE pattern such as %aa%aa%…%z could block the main thread for tens of seconds because of catastrophic regular-expression backtracking
  • Data Management - Filter Date/Time Comparisons Were Inconsistent Across Equivalent Timestamps: Filter comparisons (=, !=, >, <, BETWEEN) on date/time values compared them as strings, so the same instant written with different time-zone offsets could compare as unequal or out of order; values such as 2024/06/01 were also parsed in the local time zone rather than as a fixed point in time
  • Data Management - Filter LIKE Could Not Match Literal % or _ and Mishandled Surrogate Pairs: LIKE did not support escaping %, _, or \, so those characters could not be matched literally, and _ matched a single UTF-16 code unit instead of a full code point (e.g., for emoji)
  • Data Management - Normalize Variants Miscalculated Distance for Very Long Values: The edit distance used to cluster variant spellings silently wrapped around for values longer than 65,535 characters, so unrelated long values could be merged into the same cluster
  • UI - Lineage Graph Did Not Update Node Labels on Dataset Changes: Renaming a dataset or changing its record count did not update the corresponding node's label, type, or metadata text in the lineage graph
  • Agent API - Coefficient Labels Were Misattributed When Predictor Order Differed: models.run({ type: 'glm' | 'linear_regression' }) sorted the predictor columns internally but kept the coefficient labels, ANOVA source names, and saved model in the order the user specified, so when the two orders differed the coefficients were attributed to the wrong variables
  • Agent API - Adding an ANOVA Model Summary to a Report Twice Corrupted the Elements: Adding the same ANOVA model summary to a report a second time corrupted the Group Statistics and Tukey HSD table elements because their IDs were not updated from the dataset-creation result
  • Agent API - Referencing an Ephemeral Dataset by ID Returned "Dataset Not Found": Passing the ID of an ephemeral dataset to an Agent API method returned DATASET_NOT_FOUND, which was inaccurate since the dataset exists; it now returns INVALID_INPUT explaining that ephemeral datasets cannot be used there

[2026.06.14]

Added

  • About - Third-Party Licenses: The About dialog links to a Third-Party Licenses page listing the licenses of the bundled production dependencies

Fixed

  • GLM - Standard Errors and Diagnostics Used Pre-Convergence Weights for Non-Canonical Links: For GLMs with non-canonical link functions (e.g., probit, log), standard errors, confidence intervals, leverage values, and Cook's distances were computed from working weights that did not match the converged fit, making them inaccurate
  • GLM - Residuals vs Leverage Help Text Showed an Incorrect Cook's Distance Formula: The Residuals vs Leverage diagnostic help text gave the Cook's distance denominator as (1−h)² instead of (1−h) and defined p in the 2p/n leverage threshold as the number of predictors rather than the number of parameters including the intercept; the computed diagnostics themselves were unaffected
  • Linear Models - Extreme-Magnitude Designs Could Return NaN Coefficients Without an Error: When a predictor's values were large enough to overflow during the fit, OLS, ANOVA, DoE, and GLM could return NaN results that were not flagged as a rank-deficient design
  • OLS - Variance Inflation Factor Reported Infinity for Essentially Uncorrelated Predictors: The variance inflation factor reported Infinity (indicating perfect collinearity) when a predictor contained extremely small values, even though the predictors were essentially uncorrelated and the value should have been near 1
  • Correlation - Matrix Showed 0 for Variable Pairs That Could Not Be Computed: Variable pairs whose correlation could not be computed (e.g., no overlapping non-missing values) displayed 0 instead of an empty value, implying zero correlation
  • Custom Graph - Axis Order Disagreed With the Legend for Nominal Categorical Columns: Assigning a nominal (unordered) enum column to an axis in Graph Builder ordered the axis ticks by the column's stored category order while the legend used alphabetical order, so the two disagreed; nominal columns now order alphabetically to match the legend
  • Kaplan-Meier - Enum Columns Could Not Be Selected as the Group Variable: The group variable selector excluded enum columns because it filtered by column data type; nominal and ordinal columns (including enum) can now be selected for grouping, while continuous integer columns (e.g., counts) no longer appear as candidates
  • Data Management - Dataset Deletion Warning Missed Indirect Dependents: The confirmation warning shown before deleting a dataset listed only its direct child datasets, omitting grandchild derived datasets, prediction-result datasets that would be cascade-deleted through models, and tabs referencing any of them
  • Reports - Printed Output Split Graphs, Table Rows, and Headings Across Page Boundaries: Printing a report could split a graph across two pages, break a data table row, divide a statistics card, or separate a markdown heading from the text below it; page breaks now keep these together while long tables and statistics summaries still flow across pages with the table header repeated on each
  • Embed Mode - Multi-Page Data Table Header Overlapped Following Graphs When Printed: Printing in embed mode caused the sticky header of a data table spanning multiple pages to overlap onto subsequent graphs as a horizontal band
  • Agent API - tabs Methods Did Not Accept Dataset Names: tabs.open(), tabs.setDataset(), and tabs.configureGraph() required a dataset ID and returned "Dataset not found" when given a dataset name, even though datasets.* and models.run() accept an ID or name (case-insensitive)
  • Agent API - tabs.open() and tabs.setDataset() Did Not Bind the Dataset to a Graph Builder Tab: For a Graph Builder tab, tabs.open() and tabs.setDataset() returned success but did not attach the specified dataset, so the tab's dataset selection and the tabs.getGraphBuilder() result were left unchanged

[2026.06.12]

Fixed

  • Custom Graph - Graph Interaction Toolbar Appeared in Printed Output: Printing a graph (in embed mode, in a report, or from the graph tab) included the interaction toolbar shown at the top-right of each panel (Pan & Zoom indicator, mode toggle, clear selection) in the printed result
  • Data Management - Data Export Filename Differed From the Preview Shown in the Dialog: Entering a file name such as iris in the Data Table export dialog produced a name like _iris.csv_2026-...Z.csv with a leading underscore, a doubled extension, and a timestamp; exporting with the default name appended the timestamp twice
  • Data Management - Filter Expression Parser Rejected Negative Number Literals: Filter expressions containing negative numbers (e.g., temperature > -5, delta BETWEEN -10 AND -5, offset IN (-1, 0, 1)) failed with "Unexpected character: -"

[2026.06.08]

Added

  • GLMM - Random Effects (BLUP) Table: GLMM model detail displays a Random Effects (BLUP) table showing per-group random intercept estimates; the table is also included when the model summary is added to a report
  • Agent API - reports.addModelSummary() Returns blupElementId for GLMM: reports.addModelSummary() returns blupElementId in its result when the model is a GLMM with random effects

Fixed

  • Embed Mode - Printed Output Truncated to First Page: Printing in embed mode only produced the first page of content, and graphs, tables, and cross-tabulations wider than the paper were clipped at the paper edge
  • UI - Lineage SQL Display Errored on DuckDB Cast Syntax: Clicking a derived dataset in Project Lineage produced a parse error when the SQL contained DuckDB-specific cast syntax (e.g., ::DOUBLE)

[2026.06.07]

Added

  • Data Table - Number Display Format: Number columns can be formatted with a display format string (e.g., ,.2f for thousands separators with 2 decimal places, .2% for percentages); set the global default in Settings > Display and override per column via the column header context menu
  • Data Management - Normalize Variants: Normalize Variants detects and merges variant spellings in text columns using key collision or nearest neighbor matching; canonical values can be edited before applying the normalization
  • Agent API - datasets.buildMapping() and datasets.normalize(): datasets.buildMapping() builds a variant normalization mapping for a column, and datasets.normalize() applies the mapping to produce a cleaned column

Fixed

  • Data Management - Derived Datasets Inherited Enum Type for Columns With Out-of-Definition Values: When a parent dataset column contained values outside its enum definition, derived datasets inherited the original enum type instead of string, which could cause type mismatch errors in downstream operations
  • Data Management - No Warning When Shift-JIS or EUC-JP Could Not Represent All Characters: Exporting data in Shift-JIS or EUC-JP encoding did not warn when the data contained characters not representable in the target encoding; a warning dialog now identifies the affected characters and offers export as UTF-8
  • GLMM - Poisson and Binomial GLMM Produced Results When Observations Did Not Exceed Predictors: Poisson and binomial GLMM returned estimates without error when the number of observations was less than or equal to the number of predictors, even though the model is not identifiable in that case
  • ANOVA - Two-Way Cell Labels Ambiguous When Factor Levels Contained Commas: ANOVA Group Statistics and DoE results displayed two-way cell labels with a comma separator between factor levels (e.g., "Yes, definitely, Low"), making level boundaries ambiguous when levels themselves contained commas; the separator is now ×
  • DoE - Deleted Factors Remained in Selected Interactions: Removing a factor from the design did not remove interactions that included the deleted factor from the selected interaction list
  • DoE - No Warning for Unbalanced Factorial Design: DoE analysis showed no warning when cell sizes were unequal, which can affect the interpretation of cell means and standard errors
  • Custom Graph - Sort Stat Overrode User-Specified Axis Limits Order: When both axis limits and a sort statistic were configured, the sorted category order replaced the limits order specified by the user
  • Custom Graph - Fixed Alpha and Size Values Had No Effect: Setting alpha (opacity) or size as fixed constant values in graph aesthetics was accepted but ignored during rendering
  • Cox Regression - Covariate Means Displayed at Full Floating-Point Precision: Covariate mean values in the baseline hazard section showed full floating-point precision (e.g., 5.843333333333334 instead of 5.8433)
  • UI - Derived Dataset Row Count Missing in Project Overview: Project Overview showed no row count for derived datasets
  • Documentation - Tables Clipped on Narrow Viewports: Tables in the documentation site were cut off on narrow browser windows instead of scrolling horizontally
  • Agent API - ANOVA Group Statistics Labels Showed Internal Keys: models.run({ type: 'anova' }) returned internal cell key strings in groupStatistics[].label instead of human-readable labels
  • Agent API - Geom Type Change Did Not Reset Incompatible Position: updateGraphLayer() kept the previous position setting when changing the geom type, even if the new geom did not support that position (e.g., keeping stack when changing from bar to point); position and scales can now be explicitly reset by passing null
  • Agent API - Multi-Panel Mode Rejected Valid Configurations: Layers with incomplete settings in the top-level layer list caused false validation errors in multi-panel mode, because validation checked that list even though it is not rendered in that mode

[2026.06.04]

Added

  • Agent API - configureGraph() Column Assignment for Built-in Graph Types: configureGraph() can set column assignments for built-in graph types (histogram, scatter, timeseries, bar, pairplot, datetime_histogram)

Changed

  • Custom Graph - Default Sequential Palette: The default sequential color palette is Blues instead of Viridis

Fixed

  • Data Import - Integer Strings Exceeding 2^53 Lost Precision: Numeric strings larger than the safe integer limit were inferred as integers and silently lost precision; they are now inferred as strings
  • Data Management - Exported Projects in Sandbox Mode Could Not Be Saved After Re-import: MDS files exported while in sandbox mode contained an internal flag that persisted after import, leaving the re-opened project permanently in read-only mode
  • UI - Unsaved Changes Lost Without Warning When Closing or Switching Projects: Closing a project or switching to another discarded unsaved changes without a confirmation prompt
  • GLMM - Uninformative Error When Model Fitting Failed: GLMM fitting showed a generic numerical error regardless of the cause, without indicating whether the failure was due to the data structure or model specification
  • Random Forest - Variable Importance Chart Not Displayed When All Values Were Negative: The Variable Importance bar chart was hidden when all importance values were negative, instead of showing the negative bars
  • Custom Graph - Graph Flickered or Froze on Certain X Axis Configurations: Graphs with rotated X axis labels could enter an infinite layout recalculation cycle, causing the graph to flicker continuously or become unresponsive
  • Custom Graph - Clicking Data Elements on Date/Datetime Graphs Caused an Error: Clicking a data point or bar on a graph with a date or datetime X axis produced a type mismatch error instead of showing tooltip or selection information
  • Custom Graph - LOESS Smoothing Not Drawn for Date/Datetime X Axis: LOESS smoothing curves were not displayed when the X axis column was of date or datetime type
  • Custom Graph - Secondary Y Axis Showed Decimal Ticks for Integer Data: The secondary Y axis did not respect integer formatting, showing decimal tick labels when the Y2 data was integer-valued
  • Graph Builder - Developer Error Displayed When No Columns Were Selected: Opening Graph Builder before selecting any columns showed a technical error message intended for developers instead of an empty-state prompt
  • Data Management - SQL Editor Showed Misleading Error for Non-SELECT Queries: Running INSERT, UPDATE, DELETE, or other non-SELECT queries produced an inaccurate error message instead of indicating that only SELECT queries are supported
  • Data Management - SQL Editor Autocomplete Stayed Open After Query Execution: Pressing Mod-Enter to execute a query did not close the autocomplete popup, which obstructed the result view
  • Data Management - Reshape Long→Wide Error Message Showed Trailing Comma With No ID Column: The duplicate-value error in Reshape Long→Wide ended with a dangling comma when no ID column was specified
  • Data Management - Negative Interval Values Displayed Incorrectly: Negative interval values with months were decomposed incorrectly (e.g., -14 months showed as -2 years -2 months instead of -1 year -2 months), and negative sub-second fractions were dropped
  • UI - Internal Row Number Column Visible in Multiple Locations: The internal Row # column appeared in SQL Editor preview, Project Lineage schema, and other places that should only show user-defined columns
  • UI - Column Count Included Internal System Column: The column count displayed in dataset information was overstated by one because it included an internal system column not visible to users
  • UI - Help Button Misaligned in Some Layouts: Context help buttons dropped to a new line instead of appearing inline with adjacent elements when the parent container layout varied

[2026.06.03]

Added

  • ANOVA - Add to Report: Group Statistics, ANOVA Table, Tukey HSD, and Diagnostics sections can each be added to a report via the Add to Report button

Changed

  • Embed Mode - URL Hash No Longer Modified: Embedded mode no longer writes to the browser URL hash when opening files or URLs
  • CSP - Third-Party CDN Removed: DuckDB WASM files are loaded from the application origin instead of an external CDN; connect-src no longer includes a third-party domain

Fixed

  • Custom Graph - Angled Labels Clipped at Horizontal Edges: Long labels placed at a diagonal offset were clipped at the left or right edge of the plot area
  • Custom Graph - Graph Disappeared When Statistical Transform Produced No Valid Output: When a statistical transform (e.g., density on identical values) produced only invalid output, the entire graph vanished without explanation; a diagnostic banner now describes the cause
  • Custom Graph - Jitter Had No Effect When All Values Were Identical: Jitter position produced zero displacement when all values in a column were the same

[2026.05.28]

Added

  • Data Import - CSV Row Mismatch Editor: When importing a CSV file with rows that have inconsistent column counts, an inline editor highlights problem rows for correction or exclusion instead of rejecting the entire file
  • DoE - Add to Report: Main Effects, Interaction, and Diagnostics plots in the DoE Analysis tab can be added to reports via the Add to Report button
  • GLM - Ill-Conditioned Design Matrix Warning: GLM displays a warning when the design matrix condition number is high, indicating that coefficient estimates may be numerically unstable
  • Agent API - models.run() for Linear Regression and ANOVA: models.run() supports type: 'linear_regression' (returns R², adjusted R², RMSE) and type: 'anova' (returns ANOVA table with effect sizes, group statistics, pairwise comparisons)
  • Agent API - models.run() for ARIMA: models.run() supports type: 'arima' with manual order specification or automatic order selection; fitted models can be saved, described, and added to reports
  • Agent API - tabs.open() with modelId: tabs.open() accepts a modelId parameter to open saved model tabs (Model Detail, GLM Diagnostics, GLM Prediction)
  • Agent API - reports.addDataTable(): reports.addDataTable() adds a data table element to a report in one call; reports.getContent() includes renderStatus for all element types

Fixed

  • Cox Regression - False Convergence When Iterative Solver Failed: Cox regression reported successful convergence and produced unreliable estimates when the iterative solver failed to find an improved estimate at every attempt; no warning was shown
  • GLM - Poisson and Gamma with Identity Link Accepted Non-Positive Fitted Values: Poisson and Gamma GLM with identity link produced incorrect estimates because the iterative solver accepted non-positive fitted values, which are outside the valid range for these distributions
  • ARIMA - Incorrect Stationarity and Invertibility Checks for Some AR(2+) Models: Stationarity and invertibility checks misclassified some AR(2+) models, causing valid models to be flagged as non-stationary or non-invertible
  • ARIMA - No Diagnostic Message on Fitting Failure: ARIMA model fitting failures showed no indication of what went wrong in the UI
  • Custom Graph - Redundant Legend When Facet Variable Matched Fill or Color Variable: Faceted graphs displayed a legend even when the facet variable was the same as the fill or color variable, making the legend redundant since each panel title already identified the group
  • Custom Graph - Y Axis Showed No Intermediate Ticks for Small Domains: Y axis displayed no intermediate ticks when the data range was small (e.g., [0, 1]) because the axis incorrectly used integer-only ticks for proportions and other continuous statistics
  • Custom Graph - X Axis Tick Labels Clipped at Plot Boundary: Tick labels at both ends of the X axis were cut off by the plot area clip rectangle
  • Custom Graph - Threshold Color and Fill Scale Ignored by Several Geometries: Text, label, errorbar, reference line, and ribbon geometries did not apply the threshold color or fill scale, rendering elements in black or the default color
  • Custom Graph - Threshold Scale Ignored Palette Selection: Specifying a palette with a threshold scale had no effect; the scale always used default colors
  • Report - Aspect Ratio Did Not Apply to Graph Content: Setting an aspect ratio on a report graph element constrained the element size but not the graph itself, causing axis labels to be clipped (e.g., X axis on Q-Q plots)
  • DoE - Interaction Plot Legend Mixed All Factor Levels in Reports: Adding a DoE Interaction Plot to a report combined all factor pairs into a single graph, causing the legend to show level values from all factors instead of only the relevant pair
  • Data Management - Deletion Warning Did Not Include Tabs Showing Cascaded Resources: Deleting a dataset did not warn about open tabs displaying derived datasets or models that would also be deleted
  • UI - Lineage Graph Colors Did Not Update on Theme Switch: Lineage graph link lines and node colors did not update when switching between light and dark themes
  • Agent API - models.run() Rejected Derived Datasets: models.run() returned "Dataset not found" for derived datasets (e.g., datasets created by SQL or column operations)
  • Agent API - tabs.open() and tabs.setDataset() Did Not Update Analysis Tab UI: tabs.open() with datasetId and tabs.setDataset() did not update the dataset dropdown in any of the 12 analysis tab types
  • Agent API - renderStatus Reported "ok" When Unsupported Aesthetics Were Dropped: reports.addGraph() and reports.updateElement() returned renderStatus: "ok" when aesthetic properties not supported by the geometry were silently ignored; now returns "partial"
  • Agent API - Categorical Scale Fields Silently Ignored Without Explicit Type: Specifying limits, breaks, or labels for an axis scale without type: 'categorical' had no effect and no error was returned
  • Agent API - configureGraph() Reset Unspecified Properties: configureGraph() rebuilt the entire graph configuration from scratch instead of merging with existing values, resetting properties not included in the update call
  • Agent API - help() Documentation URL Did Not Return Structured Content: help() linked to a rendered page instead of a machine-readable document, making it harder for AI agents to parse the documentation

[2026.05.24]

Added

  • Data Management - Reload URL Datasets: "Reload All URL Datasets" in the Data menu re-fetches all datasets originally imported from URLs
  • Agent API - datasets.reloadFromURL(): datasets.reloadFromURL() reloads URL-sourced datasets; specify a dataset ID to reload one, or omit to reload all
  • Agent API - reports.getContent() Render Status: reports.getContent() includes a renderStatus field for each graph element, indicating whether the graph rendered successfully, produced no data points, or encountered an error
  • Agent API - help() Documentation URL: help() returns a documentation field linking to the documentation site
  • Agent API - Dataset Name Resolution in Report Methods: reports.addGraph() and reports.updateElement() accept dataset names (case-insensitive) in addition to IDs; reports.setContent() returns warnings when body text references elements not registered in the report

Changed

  • DoE - Pareto Chart Removed: The Pareto chart sub-tab is removed; the coefficient table with confidence intervals serves as the primary tool for assessing effect sizes

Fixed

  • Custom Graph - Multi-Panel Mode Did Not Validate Layer Configuration: Layer validation (required aesthetics, column existence, column type, palette) was applied only to non-panel layers; layers inside panels were not checked
  • Custom Graph - Tile Geom Ignored Threshold Fill Scale: Tile geom did not apply the threshold fill scale, rendering all tiles as black when a threshold color scale was configured
  • Custom Graph - Sort Stat Category Order Not Applied to Bar Chart: Sorting categories by a statistic (e.g., count descending) computed the correct order but did not apply it to the bar chart axis
  • Custom Graph - Y2 Axis Used Primary Y Column Type for Formatting: The secondary Y axis used the primary Y column type to determine formatting, producing incorrect axis labels when the two axes had different column types (e.g., integer ticks on a continuous Y2 axis)
  • ANOVA - Two-Way Cell Labels Collided When Factor Levels Contained Commas: Factor levels containing commas (e.g., "Yes, definitely") produced ambiguous cell keys in two-way ANOVA, causing distinct cells to be merged
  • DoE - R-squared Was Zero for Perfect-Fit Designs: R-squared and adjusted R-squared showed 0 when all response values were identical and the model fit perfectly, instead of 1
  • Data Import - Column Type Conversion Preview Could Show Stale Data: Changing column type conversions in quick succession could briefly display preview data from a previous conversion; the old async query was not cancelled on re-entry
  • Data Import - DuckDB HUGEINT Values Appeared as Garbled Strings: DuckDB window functions returning HUGEINT produced values like "7,0,0,0" instead of the correct number, leaving computed columns and graphs blank
  • UI - String Truncation Split Emoji and CJK Characters: Truncating long strings in tooltips, modal titles, and lineage labels could split surrogate pairs, producing replacement characters
  • Report - Backslash Before Element Reference Was Always Consumed as Escape: Writing \ immediately before {{type:id}} always escaped the reference into literal text; there was no way to produce a literal \ followed by a rendered element
  • Agent API - Invalid paletteId Crashed the Application: Passing an unrecognized palette ID to a graph API method triggered an assertion failure that crashed the React component tree
  • Agent API - Bar Geom Position Defaulted to Identity Instead of Stack: addGraph() and configureGraph() created bar layers with overlapping bars when position was not specified; the UI default is stacked
  • Agent API - models.run() Accepted Ephemeral Datasets: models.run() did not reject ephemeral (internal) datasets, which are not valid inputs for model fitting

[2026.05.23]

Added

  • Agent API - project.openFile() and project.openUrl(): openFile() opens a project from MDS binary data and openUrl() fetches and opens a project from a URL in sandbox mode; both work from the launcher screen

Fixed

  • Custom Graph - Continuous Color Scale Produced NaN When All Values Were Identical: Mapping a numeric column with a single unique value to a continuous color aesthetic (e.g., heatmap fill) produced NaN, leaving elements uncolored
  • Custom Graph - Stacked Bar Fill Colors Did Not Match Legend: Fill colors in stacked bar charts depended on the appearance order of x-axis groups rather than a consistent order, causing colors to differ between bars and legend swatches
  • Custom Graph - Duplicate Legend Entries When Multiple Layers Shared a Color Mapping: Layers sharing the same color or fill column mapping each generated a separate legend entry
  • Custom Graph - Graph Re-mounted on Panel Resize: Resizing the graph builder panel caused the graph to fully re-mount, resetting zoom state and producing a visible flicker
  • Report - Table Headers Followed Data Column Alignment Instead of Centering: Table headers in reports inherited the column alignment specified in Markdown (e.g., right-aligned for numeric columns) instead of being centered
  • GLMM - Uninformative Error on Rank-Deficient or Near-Singular Data: Fitting a GLMM with fewer observations than predictors, or with highly collinear predictors, produced a numerical error instead of a diagnostic message
  • Data Table - BETWEEN Filter Silently Excluded All Rows on Type Mismatch: A BETWEEN filter expression with mismatched numeric types silently returned no matching rows instead of reporting an error
  • Column Schema - Change Failed When Derived Column Contained Values Outside Enum Definition: Changing the column type of a column derived from SQL expressions (e.g., COALESCE, CASE) failed with a conversion error when the result contained values not in the original enum definition
  • SQL Editor - Query Structure Arrows Broke with Multiple Diagrams: When multiple query structure diagrams were displayed, arrow markers rendered incorrectly

[2026.05.21]

Added

  • ARIMA - Time Series Model: ARIMA(p,d,q) model; Manual mode specifies the order directly and Auto mode selects the best order by AIC or BIC; residual diagnostic plots (time series, Q-Q, ACF, PACF) are shown after fitting; saved models appear in Model Detail
  • Custom Graph - Label Geom: "label" geometry places text annotations driven by data values, with leader lines and automatic collision avoidance
  • Custom Graph - Per-Layer Data Filter: Each layer can filter its input data with an expression, limiting which rows are rendered
  • Report - Correlation Matrix and Model Detail: Correlation matrices (shown when 5+ columns are selected, replacing pair plots) can be added to reports via context menu; Model Detail tabs (Linear Regression, GLM, GLMM, Random Forest) have an Add to Report button
  • Report - Categorical x Numeric Bar Chart: Bar charts in the Relationships section (categorical x numeric column pair) can be added to reports via context menu
  • GLMM - Random Effects Scale Explanation: Random Effects table shows context help explaining that the group variance is on the link scale while the residual variance is on the response scale, and the two are not directly comparable
  • Random Forest - Feature Importances Interpretation Help: Feature Importances table shows context help describing the interpretation differences between MDI and Permutation Importance (e.g., high-cardinality bias of MDI, underestimation of correlated features by permutation importance)
  • Agent API - datasets.profile(): Returns per-column summary statistics in one call: null count, unique count, and type-specific measures (min, max, mean, median, sd for numeric; top 5 values for string/enum)
  • Agent API - Facet Configuration: reports.addGraph(), reports.updateElement(), and tabs.configureGraph() accept a facets parameter for Facet Wrap and Facet Grid; facets: null in configureGraph clears an existing facet
  • Agent API - Scale Configuration: Graph-level scales sets axis scale types (x, y, y2); layer-level scales sets color and fill scale types; configureGraph merges per axis, preserving axes not included in the update

Changed

  • Agent API - Dataset Methods Accept Names: datasets.describe(), datasets.addColumns(), datasets.addOrthogonalPolynomials(), datasets.setColumnSchema(), and datasets.remove() accept dataset names (case-insensitive) in addition to IDs

Fixed

  • Custom Graph - Jitter Position Created Invalid Categories with Categorical X: Jitter position on a categorical X axis appended NaN to category labels (e.g., "Iris-setosaNaN"), creating spurious axis entries; occurred when color grouping was also applied
  • Custom Graph - Labels Were Clipped at Plot Boundary: Label geom text and leader lines were cut off by the plot area clip path
  • Custom Graph - Tile Geom Used Categorical Palette for Numeric Fill: Mapping a numeric column to the fill aesthetic of a tile geom applied a categorical color palette instead of a continuous gradient
  • Custom Graph - Ribbon and Errorbar Listed y as Required Instead of ymin/ymax: Ribbon and errorbar geoms reported "y" as the required aesthetic when the actual requirements were ymin and ymax; ribbon could not be drawn with only ymin and ymax without y
  • GLMM - Gaussian Estimates Distorted by Positive-Value Clamp: Gaussian GLMM produced incorrect estimates because a clamp preventing negative fitted values was applied to all families; Gaussian fitted values can be negative under the identity link, where this had the most impact
  • GLMM - No Warning for Boundary Variance Estimates: GLMM did not warn when random effect variance estimates fell on the boundary of the parameter space (singular fit)
  • ANOVA - Incorrect Effect Size with Rank-Deficient Predictors: When the design matrix was rank-deficient, partial residual sum of squares returned an incorrect value instead of null; effect sizes (η², ω²) derived from that value were also wrong
  • Statistics - Bar Chart and Pair Plot Did Not Reflect Data Table Filters: Bar charts and pair plots in the Relationships section showed all rows regardless of active filters in the Data Table
  • Report - Previous Graph Appeared as Ghost When Scrolling: Scrolling through report graphs could show remnants of a previously rendered graph overlaid on the current one
  • ARIMA - Coefficient Table Failed After Project Reload: The ARIMA coefficient table showed an error after reopening a saved project because the derived dataset required the full model result, which is not persisted
  • Model Fitting - Variance Error Did Not List Model-Specific Causes: The error message for non-positive-definite variance listed a generic cause regardless of model type; Cox regression and binomial models now show causes relevant to their fitting context
  • Cox Regression - Nondeterministic Ordering of Tied Observations: Events and censored observations at the same time could be ordered differently depending on input order, shifting tied-group boundaries
  • CSV Import - Size Limit Not Enforced Without Content-Length Header: URL-based CSV import skipped the file size check when the server did not send a Content-Length header; the limit is now checked during streaming, and a confirmation dialog appears when the limit is exceeded during reload
  • Agent API - coordinates: 'flipped' Was Ignored: reports.addGraph() and tabs.configureGraph() silently discarded the coordinates: 'flipped' option
  • Agent API - Removing a Resource Did Not Close Its Tabs: datasets.remove(), models.remove(), and reports.remove() deleted the resource but left tabs referencing it open, causing errors when the tab tried to render

[2026.05.18]

Added

  • ANOVA - Per-Group Residual Q-Q Plot: One-way ANOVA shows a separate residual Q-Q plot for each group, for checking the normality assumption within individual groups
  • DoE - Residual Q-Q Plot: The Design of Experiments tab shows a residual Q-Q plot for checking the normality assumption of the model residuals
  • Report - Escape Syntax for Template References: \{{ in report body text renders as a literal {{, allowing template-like text to appear without being interpreted as an element reference
  • Project - Duplicate Project ID Dialog: Opening a project file whose internal ID matches an already-open project shows a dialog with three choices: Replace (overwrite the existing project), Open as Copy (assign a new ID), or Cancel
  • Agent API - reports.updateElement() and reports.removeElement(): updateElement replaces the graph configuration of an existing report element; removeElement deletes an element and removes its body text references

Changed

  • Agent API - datasets.query() Is Read-Only: datasets.query() returns row data without creating or modifying datasets; dataset creation is handled by the new datasets.derive() method

Fixed

  • Agent API - Ephemeral Datasets Were Visible and Modifiable: Internal ephemeral datasets appeared in datasets.list() and could be described, fetched, or removed through the Agent API
  • Custom Graph - Legend Margin Reserved When No Legend Was Visible: Charts without a visible legend still reserved space for the legend area, leaving an empty gap at the chart edge
  • Agent API - Overwriting a Derived Dataset Reassigned Column IDs: datasets.derive() with overwrite generated new column IDs instead of preserving the existing ones, breaking graph and report references to those columns
  • Report - Derived Dataset Elements Failed After Project Reload: Report elements backed by derived datasets showed an error after reloading the project because the parent dataset had not finished evaluating when the element tried to render

Security

  • CSP - CDN Bot-Protection Script Was Blocked: The browser's security policy blocked an attack-detection script provided by the CDN, preventing it from running; the policy configuration has been corrected so the script executes normally

[2026.05.17]

Added

  • Kaplan-Meier - Median Survival Time Confidence Intervals: Summary Statistics table shows confidence intervals for the median survival time, derived from the survival function CI band; a confidence level input controls the interval width
  • GLMM - AIC and BIC: AIC and BIC are computed and displayed for GLMM; labels in the UI indicate which estimation method was used
  • SQL Editor - Query Structure Visualization: The Project Lineage detail panel for SQL-derived datasets renders the query structure as a node-and-arrow diagram; subqueries and UNION/INTERSECT/EXCEPT operations appear as separate nodes with logical processing steps inside each node
  • SQL Editor - Syntax Highlighting: SQL keywords, identifiers, and literals in the editor are color-coded using the same palette as the query structure diagram
  • Graph Builder - Per-Layer Click and Hover Control: Each layer can enable or disable click and hover interactions (selection, tooltip); smooth and density layers default to disabled so you can interact with the layers beneath them
  • Project Overview - Operation Type Badges: Derived datasets show a badge for their operation type (SQL, Filter, Crosstab, Computed Column, Dummy Coding, etc.) instead of only SQL
  • Agent API - datasets.fetch(): Retrieves dataset row data without creating a new dataset; supports ID or name lookup and retrieving a subset of rows by specifying a starting position and row count
  • Agent API - datasets.remove / models.remove / reports.remove: Deletes a dataset, model, or report by ID; also removes any items that depend on it (e.g., derived datasets, linked models)
  • Agent API - models.run() for GLMM and Random Forest: models.run() accepts type: 'glmm' and type: 'random_forest'; the full run/save/describe round-trip works for all model types
  • Agent API - Console Announcement on Startup: Opening a project prints a console.info message indicating the window.midas API is available with a pointer to help()

Changed

  • Random Forest - OOB Metric Label by Task Type: The OOB metric in Model Detail and reports is labeled "OOB Accuracy" for classification and "OOB R²" for regression instead of the generic "OOB Score"
  • Agent API - Import Duplicate Name Check Is Case-Insensitive: datasets.importFromURL and datasets.importFromBuffer with overwrite: false now detect name collisions regardless of letter case, and exclude ephemeral datasets from the check
  • Coefficient Tables - Test Statistics Removed: t/z values and p-values are removed from coefficient tables in OLS, GLM, GLMM, and Cox; tables retain estimates, standard errors, and confidence intervals
  • ANOVA - F Statistic and P-Values Removed: F statistic, p-value, and q statistic columns are removed from one-way ANOVA, multi-factor ANOVA, OLS Type I/III ANOVA, DoE ANOVA, and Tukey HSD tables; effect sizes and mean-difference confidence intervals remain
  • Linear Regression - Overall F Test Removed: The model-level F statistic and p-value are no longer shown in the OLS summary
  • Kaplan-Meier - Log-Rank Test Replaced by RMST: The Log-rank test (chi-squared, df, p-value, O/E table) is replaced by Restricted Mean Survival Time; RMST shows mean survival up to a configurable restriction point (tau) with SE and CI, and pairwise RMST differences for multiple groups
  • Cox Regression - Omnibus Tests Replaced by Concordance Index: Likelihood ratio, Wald, and Score tests are replaced by Concordance index (Harrell's C) with SE, AIC, and log partial likelihood
  • Cox Diagnostics - Schoenfeld Test P-Values Removed: Chi-squared, df, p-value columns and the GLOBAL row are removed from the proportional hazards diagnostic table; rho correlation values are retained
  • GLM Diagnostics - Deviance Goodness-of-Fit P-Value Removed: The chi-squared p-value and density chart are removed; Deviance/df ratio is shown as a descriptive fit measure
  • GLMM - Degrees of Freedom Removed: Fixed-effect degrees of freedom are no longer shown in the diagnostic summary; there is no single correct definition for mixed models, and confidence intervals remain available for inference
  • GLMM - ICC Restricted to Supported Distributions: ICC is shown only for gaussian+identity, binomial+logit, and binomial+probit; other combinations where ICC does not have a clear interpretation show "ICC not defined"

Fixed

  • Report - Custom Graph Overflowed Its Container: Custom Graphs embedded in reports could overflow their container boundaries, making parts of the graph invisible
  • Report - Editor Autocomplete Did Not Trigger on {{: Typing {{ in the report editor did not open the element-reference autocomplete dropdown
  • Report - Diagnostic Plots Showed Column Reference Error When Embedded: Embedding diagnostic plots (Residuals vs Fitted, Q-Q, Scale-Location) in a report produced a "column not found" error because the underlying derived dataset was not evaluated before rendering
  • LMM - REML Log-Likelihood Was Missing a Constant Term: REML log-likelihood omitted -(n-p)/2*log(2pi), producing values that did not match the standard definition
  • Data Table - Filter Error Gave No Feedback About Active Expression: When a filter expression failed validation, the status bar did not show which expression was still in effect or that an error had occurred; it now shows the active expression and an error indicator
  • Data Table - Filter Type Mismatch Showed Internal Assert Text: Comparing a string column with a numeric value (e.g., species > 1) displayed an internal assertion message instead of a user-facing explanation with the column name and suggested fix
  • SQL Editor - Error Messages Were Triple-Wrapped with Prefixes: SQL syntax errors appeared as "SQL execution failed: Invalid SQL query: Parser Error: ..." instead of showing the parser error directly
  • Linear Regression - Effect Size Columns Shown for Type I Sum of Squares: Partial eta-squared and partial omega-squared were displayed alongside Type I SS; these partial effect sizes are not meaningful for Type I (sequential) sums of squares and are now shown only for Type III
  • Agent API - models.run() Accepted Out-of-Range Confidence Level: Passing a confidenceLevel outside the valid range (50–99.99) to models.run() did not return an error; it now returns INVALID_INPUT

[2026.05.08]

Added

  • Random Forest - OOB Permutation Importance: Feature Importances table shows Permutation Importance alongside the existing MDI column; classification uses accuracy drop and regression uses R² drop, averaged across all trees
  • GLM - Separation Detection for Binomial Models: Binomial GLM warns when separation or quasi-separation is detected after fitting, indicating that coefficient estimates and standard errors may be unreliable
  • Documentation - Raw Markdown Endpoint: Documentation pages serve a raw Markdown version at the .md URL with a text/markdown content type, and HTML pages include a <link rel="alternate"> pointing to it

Changed

  • GLMM - ICC Hidden for Gaussian with Non-Identity Link: ICC is no longer shown for Gaussian GLMM with log or inverse link, because the random-effect variance (on the link scale) and the residual variance (on the response scale) are not comparable
  • Random Forest - Formatted Model Detail View: Model Detail shows a formatted summary (task type, number of predictors, number of trees, OOB score, feature importances) instead of raw JSON
  • Agent API - Case-Insensitive Dataset Name Matching: Derived dataset overwrite checks, existence checks, and self-reference detection now ignore case, consistent with dataset lookup by table name
  • Telemetry - Country/Region and User-Agent Collected: Anonymous telemetry now includes the country/region (from the CDN edge) and User-Agent string; the privacy policy has been updated accordingly
  • ANOVA - Group Confidence Intervals Use Pooled Variance: One-way ANOVA group confidence intervals use the pooled mean square error instead of per-group variance, consistent with the equal-variance assumption of the ANOVA model

Fixed

  • Confidence Level Input - Keyboard Entry Did Not Work: Typing a confidence level value (e.g., 90) with the keyboard had no effect; the browser's native number input validation rejected intermediate values during typing
  • CSV Import - Column Name Deduplication Caused Secondary Collisions: When a CSV had duplicate column names, the generated suffix (e.g., _2) could collide with an existing column name (e.g., importing columns A, A, A_2 produced two columns named A_2)
  • ANOVA - F Statistic Was 0 Instead of Undefined When All Groups Were Identical: When both between-group and within-group mean squares were zero, the F statistic was reported as 0; 0/0 is indeterminate and should be left undefined
  • Custom Graph - Nominal Enum Axis Used Enum Definition Order: Nominal enum columns displayed axis categories in enum definition order instead of data order; definition order now applies only to ordinal columns
  • Custom Graph - Some Aesthetic Channels Did Not Create Groups: Mapping stroke, shape, linetype, or group channels did not split data into separate groups, so overlaid layers (e.g., smooth curves) were fitted to the combined data instead of per-group
  • GLMM - ICC Help Text Did Not Reflect Family/Link Residual Scale: The contextual help for ICC described the residual variance without distinguishing between families and link functions that use different scales

Security

  • Crash Telemetry - Error Names Were Sent Without Filtering: Crash telemetry forwarded unfiltered error name strings to the analytics backend; an allowlist now limits sent values to a fixed set of known error types
  • API Endpoint - No Origin Restriction on Telemetry POST: The telemetry endpoint accepted POST requests from any origin; requests are now restricted to the application origin
  • Workers Observability - Request Metadata Was Logged Despite Privacy Policy: Server-side request logging was recording IP addresses, geolocation, HTTP headers, and full URLs for every request, contradicting the privacy policy; logging has been disabled

[2026.05.06]

Added

  • ANOVA - Effect Size (η² / ω²): One-way ANOVA shows η² and ω²; multi-factor ANOVA, Linear Regression, and DoE show partial η² and partial ω²
  • Agent API - Confidence Level Parameter: models.run() accepts an optional confidenceLevel parameter for GLM and GLMM
  • GLM / GLMM - Confidence Level Saved with Model: The confidence level chosen during analysis is persisted when the model is saved; Model Detail shows the saved level and provides a numeric input to recalculate intervals without re-fitting
  • GLM / GLMM - Odds Ratio and Rate Ratio: Logit-link models show Odds Ratio (OR) and log-link models show Incidence Rate Ratio (IRR) as exp(β) with confidence intervals directly in the coefficient table; the previous separate Odds Ratios table is removed
  • GLMM - Gaussian Family with Non-Identity Link: Gaussian GLMM with a non-identity link (e.g., log) can now be fitted; previously only the identity link was available
  • Random Forest - View Model Details Button: A "View Model Details" button appears after saving a Random Forest model, consistent with GLM and GLMM
  • Report - Category Distribution and Pair Plot: Category distribution charts and pair plots in the Statistics tab can be added to reports via the context menu
  • Settings - Automatic Backup: Projects are automatically backed up to a user-selected local folder on every save; opening a project shows a dialog when the backup contains a newer version (Chromium browsers only)
  • Telemetry - Privacy-Preserving Usage Telemetry: MIDAS sends three anonymous event types (app open, project close, crash) with no personally identifiable information

Changed

  • Model Estimation - Automatic Re-Estimation on Parent Data Update: Models automatically re-estimate when their parent dataset changes (e.g., after updating an SQL query), replacing the previous stale-model badge
  • GLMM - AIC, BIC, and Conditional Deviance Removed: AIC, BIC, and Conditional Deviance are no longer shown for GLMM. Their definition depends on whether random effects are treated as fixed or marginalized, and the previous output did not make this choice explicit

Fixed

  • Column Statistics - Ordinal Numeric Quantiles Used Interpolation: Ordinal numeric columns computed quantiles with linear interpolation, inconsistent with ordinal enum columns which use no interpolation; range was also shown despite distance being undefined on an ordinal scale
  • Custom Graph - Diverging Color Scale Center Shifted on Asymmetric Domains: Diverging palettes (e.g., RdBu) shifted the center color when min and max were not equidistant from zero, misrepresenting the data-to-color mapping
  • Enum Columns - Unnecessary Reorder Confirmation for Nominal Columns: Reordering enum values showed a confirmation dialog even when only nominal-scale columns referenced the enum; the dialog is only relevant when ordinal or higher-scale columns are affected
  • GLM / GLMM - Model Fit Error Messages Lacked Context: Model fit errors for non-positive-definite variance showed a generic message without identifying the problematic variable or suggesting a cause; messages now name the variable and provide condition-specific guidance (centering for intercept issues, separation for Binomial, exact collinearity for zero variance)
  • GLM / GLMM - Report Coefficient Table Ignored Saved Confidence Level: Saved reports showed 95% confidence intervals regardless of the level chosen when the model was saved
  • GLMM - Gaussian Pearson Residuals Were Standardized Instead of Raw: Gaussian GLMM Pearson residuals were divided by the residual standard deviation instead of using the standard GLM definition, making them inconsistent with other GLMM families
  • GLMM - Log-Likelihood Was Inaccurate for Non-Gaussian Families: GLMM log-likelihood for Poisson, Binomial, Gamma, and Gaussian non-identity families was missing normalizing constants, so the displayed log-likelihood values could not be compared across models or used as absolute likelihoods
  • Menu - Context Menu Inaccessible by Keyboard: Context menus (⋮) could only be operated with a mouse; arrow keys and Escape had no effect
  • Open From URL - CSV Auto-Import Skipped Size Check: Loading a CSV via the URL parameter bypassed the size confirmation dialog and loaded unconditionally, regardless of the configured threshold

Performance

  • Open From URL - Header Toggle Re-Fetched the File: Toggling "First row is header" in the URL import dialog re-fetched the remote file every time, causing redundant network requests on each toggle

Security

  • URL Parameters Were Sent to the Server: Project IDs, MDS/CSV URLs, and embed parameters appeared in URL paths and query strings, sending them to the server in HTTP requests where they could be recorded in access logs. These parameters have been moved to URL fragments (#), which are not transmitted to servers

[2026.04.30]

Added

  • Cox Regression - Baseline Survival Curve: Breslow estimator for cumulative baseline hazard and survival function S₀(t), with an interactive covariate-adjusted survival curve plot
  • Custom Graph - Smooth Interval Band on Line Geometry: Line geometry with Smooth stat automatically draws a confidence or prediction interval band; a warning appears in the layer card when the interval cannot be computed
  • Custom Graph - Smooth Per-Group Regression: Smooth stat fits separate regression curves for each color, fill, shape, or linetype group; confidence interval warnings identify which groups have insufficient data
  • GLM / GLMM / OLS / Cox - Custom Confidence Level: Confidence level across all model tabs is now a free-entry field (50–99.99%); changing the level updates confidence intervals instantly without re-fitting
  • GLM / GLMM / OLS / Cox - Model Fit Rejection: Models that cannot produce reliable standard errors (rank-deficient design, insufficient degrees of freedom, singular covariance, perfect fit) are rejected with a specific error message instead of returning partial results
  • GLM - Nullable AIC/BIC with Structured Warnings: AIC and BIC show "N/A" when not computable (non-integer grouped Binomial, saturated models); data preparation warnings appear in the Diagnostics tab
  • Linear Regression - Coefficient Dataset df Column: Saved coefficient datasets include a degrees-of-freedom (df) column
  • Open From URL - Configurable Size Threshold: The fixed 10 MB size limit is replaced with a confirmation dialog; the threshold is configurable in Settings > Import (10 MB / 50 MB / 100 MB / No limit)
  • UI - Disabled Button Tooltips: Disabled Run, Save as Dataset, and report action buttons show a tooltip explaining why they are disabled (e.g., variable selection incomplete, model not yet saved)

Fixed

  • Agent API - Dataset Not Found Error Code: Dataset-not-found errors now consistently return DATASET_NOT_FOUND across all endpoints; addOrthogonalPolynomials supports case-insensitive column matching
  • Column Statistics - Ordinal Range Hidden: Ordinal numeric columns no longer show Range, since distance is undefined on an ordinal scale
  • Custom Graph - Color Scale Palette Consistency: Switching the scale type (e.g., diverging to categorical) resets the palette when the current selection is incompatible; applying a sequential palette to a nominal column shows a warning
  • Dependency Tracking - Multi-Step Model Chains: Deleting a dataset or model now correctly cascades through chains that pass through multiple models (e.g., Dataset → Model A → Predictions → Model B → Coefficients)
  • Enum Columns - Value Limit on Manual Creation: Manual enum creation and editing now enforce the 50-value limit; the Add Value button disables at the limit
  • GLM - Gaussian and Gamma AIC/BIC Dispersion Counting: AIC and BIC for Gaussian and Gamma families now correctly count the dispersion parameter, matching R output
  • GLMM - Gamma Dispersion Parameter: Gamma family dispersion uses the unbiased Pearson χ²/(n−p) estimator instead of deviance-based MLE, producing more accurate standard errors and ICC
  • GLMM - Log-Likelihood Label by Family: Log-Likelihood, AIC, and BIC labels now distinguish between REML (Gaussian + identity) and Laplace approximation (other families) in the analysis tab and saved reports
  • GLMM - Unavailable Negative Binomial Removed: Removed unimplemented Negative Binomial from the GLMM family dropdown; existing projects with Negative Binomial selected are migrated to Gaussian
  • Lineage View - Model-to-Report Connections: Reports containing model statistics are now connected to their source models in the lineage view; previously such reports appeared disconnected
  • SQL Editor - Subquery Alias Column Completion: Column-name completion now works for subquery aliases (e.g., columns of t in FROM (SELECT ...) t)

[2026.04.24]

Added

  • Column Statistics - Ordinal Enum Quantiles: Enum columns set to ordinal measurement scale now display min, max, median, Q1, Q3, and IQR in Column Statistics, computed from the enum definition order. Values not in the enum definition are excluded from quantile calculation and reported as Outside Enum definition
  • Column Statistics - Mode for String and Enum Columns: String and enum columns now show Mode (the single most frequent value) instead of the previous Most Common format, matching the label used for numeric columns
  • Data Table - Filter Clear Button: The filter expression input in the Data Table tab shows a clear button when text is present; clicking it clears the filter and returns focus to the input
  • Agent API - Cross-Type Overwrite Rejection: overwrite: true on datasets.query(), datasets.addColumns(), datasets.addOrthogonalPolynomials(), and datasets.setColumnSchema() now returns OPERATION_TYPE_MISMATCH when the existing dataset was created by a different operation type (e.g., overwriting an addColumns result with query())

Fixed

  • GLM / GLMM / Linear Regression - Coefficient Table Up-to-Date on Reload: Reopening a project could show stale coefficient and covariance tables that did not reflect the last model fit. These tables are now rebuilt from the trained model on reload
  • Custom Graph - Point Layer Offered Fill Mapping with No Effect: Point geometry offered a fill aesthetic mapping in the layer settings, but fill had no visible effect on points. The mapping is removed; existing projects with fill on Point layers are migrated automatically
  • GLM - Grouped Binomial Save as Dataset Did Nothing: Clicking Save as Dataset on a Grouped Binomial GLM (successes/trials response) silently did nothing. The coefficient table is now exported correctly
  • Model Deletion - Orphaned Report Elements: Deleting a model left Graph Builder, Crosstab, Cross-Dataset Comparison, and Statistics Summary report elements as orphans showing "Dataset not found". Deletion now removes the associated report elements as well
  • Linear Regression - ANOVA Type I and Type III Overwrote Each Other: Saving both ANOVA Type I and Type III tables caused the second to silently replace the first. Both tables now coexist correctly
  • Open From URL - Cancel Blocked Retry: Cancelling a URL fetch disabled the Open button, preventing retry with the same URL without reopening the dialog
  • Open From URL - Concurrent Fetch on Close: Navigating away while a URL fetch was in progress could leave stale state. The fetch is now cancelled when the dialog is closed, and reopening the dialog no longer starts a duplicate request
  • Agent API - Transitive Circular Dependency Detection: addColumns(), addOrthogonalPolynomials(), setColumnSchema(), and query() with overwrite: true only checked direct parents for self-references, so a chain A → B → C could overwrite A without error. Circular dependency detection now covers transitive ancestors
  • Agent API - Self-Referencing Overwrite Rejection: Dataset operations allowed overwrites that would make a dataset depend on itself, breaking the dependency chain. These overwrites now return SELF_REFERENCE. This check applies to SQL queries referencing multiple tables
  • Security - MDS Signature Header Boundary Validation: A crafted MDS file with a malformed metadata-length field could bypass the file size limit and potentially cause an out-of-bounds read. The field is now validated with explicit bounds checking

[2026.04.19]

Added

  • MDS Signature - Always-Visible Signature Badge: MenuBar now shows a color-coded signature badge (official / trusted / unknown) for the currently open project. Clicking the badge opens a popover with the full signer fingerprint and a one-step "Trust this signer and open" flow. By default, opening an unknown-signed MDS file no longer triggers a confirmation dialog; Settings > Security > Require confirmation for unknown signers restores the previous strict behavior
  • Enum Columns - Data Integrity Enforcement: Enum values can no longer be deleted while data in the column still references them; the Enum editor and enums.update() reject the change with ENUM_VALUE_MISMATCH. Adding or reordering values remains allowed. setColumnSchema() rejects conversion to an enum when the column contains out-of-definition values, and the error message directs users to clean the column with Convert Column Types first. Loading an older project with enum columns whose data violates the definition downgrades the column to string and shows a notification. Ordinal legend values that fall outside the definition no longer disappear from graphs
  • Agent API - Model Summary Across All Model Types: reports.addModelSummary() now supports Linear Regression (coefficient table with standardized coefficients and VIF, ANOVA Type I and Type III, prediction intervals, and OLS fit statistics: R², Adjusted R², F statistic, F p-value, RMSE, AIC, BIC) and Random Forest (Feature Importance, Model Configuration, OOB Score), matching the existing GLM and GLMM coverage. Model Fit (AIC, BIC, Deviance, convergence) and GLMM Random Effects (ICC, variance components) stay live in saved reports: re-training a model with the same id refreshes the numbers in previously saved reports automatically. AddModelSummaryResult gains an optional statsElementId. Existing Gaussian + identity-link GLM models are migrated to Linear Regression automatically
  • Model Detail - Linear Regression Formatted View: Linear Regression models now render with a formatted view (coefficients, ANOVA tables, prediction intervals, fit statistics) instead of a raw JSON view. models.describe() returns OLS-specific fit statistics for Linear Regression models

Fixed

  • Security - External I/O via Unknown-signed MDS Files: Opening an unknown-signed MDS file no longer allows the saved SQL or computed-column expressions to reach external URLs through DuckDB's read_csv('https://...'), read_parquet, read_json, csv_scan, sniff_csv, parquet_*, read_blob, read_text, set_setting, or any read_* function. DuckDB extension auto-install and auto-load are disabled at initialization. SQL Editor and Computed Column both reject these functions with an explicit blocked-function error; column names that happen to start with read_ are unaffected
  • Security - External Connections from DuckDB Worker: As a second layer of defense, the DuckDB Worker asset is served with a Content-Security-Policy header that limits outgoing connections to the DuckDB CDN and its extension repository. Even if an HTTP extension were loaded, the browser blocks connections to arbitrary external URLs
  • Import Data - Silent Data Loss from Malformed CSVs: Importing a CSV with an empty header row, an empty first data row, or mismatched column counts now fails with an explicit error instead of silently producing an empty dataset, truncating columns, or null-padding rows. Error messages reference the "First row is header" checkbox and report row numbers that skip empty lines
  • GLM - Deviance Precision Near Convergence: Poisson, Binomial, and Negative Binomial deviance calculations suffered from catastrophic cancellation when y was close to the fitted mean, occasionally producing spurious non-zero per-observation deviance contributions at convergence. Reported deviance, AIC, BIC, and convergence checks are now numerically stable
  • GLM - Negative Binomial θ Estimation Label Lost on Save: Saved Negative Binomial GLM models lost the distinction between estimated and manually specified θ. Model Detail and saved reports now show Shape Parameter (θ) (estimated) or Shape Parameter (θ) (manual). Existing projects are migrated automatically
  • Open From URL - No Timeout on Unresponsive Server: Opening a project or dataset from a URL now aborts after 30 seconds on an unresponsive server and shows Request timeout after 30 seconds, instead of staying stuck indefinitely
  • DuckDB - Stale Cache on Same-Row-Count Overwrite: Overwriting a derived dataset with different data but the same row count (e.g., changing a filter condition) could leave query results showing the previous data. Table caching now compares data identity, not just row count, so overwrites, renames, and schema changes always invalidate the cache
  • Agent API - Add to Report Coefficient Collisions: Calling reports.addModelSummary() twice for the same model no longer fails with a duplicate-name error; the existing coefficient dataset is reused. GLM and GLMM coefficient datasets include family/link in the default name so models with the same formula but different families no longer collide. Changing the confidence level on a Linear Regression model correctly recomputes the coefficient table instead of reusing the stale one. Existing projects are migrated automatically
  • Open From URL - Memory Leak After Dataset Deletion: Deleting a dataset now fully releases its backing resources, preventing memory growth during long sessions that repeatedly add and remove datasets

[2026.04.15]

Added

  • Agent API - Model Summary Confidence Intervals: reports.addModelSummary() coefficient tables now include 95% Wald confidence intervals (Lower 95%, Upper 95%) and the reference distribution's degrees of freedom (DF). GLM and GLMM share a 9-column structure (Variable, Estimate, Std. Error, Test Statistic, Distribution, DF, P-value, Lower 95%, Upper 95%). Model Detail and the report share the same underlying dataset
  • SQL Editor - Autocomplete Scope and Column Names: Dataset name suggestions are limited to positions immediately after FROM or JOIN, and column-name completion is added. alias. / "dataset". / dataset. completes only that table's columns. Explicit completion is triggered by Ctrl + Space on all platforms
  • Hypothesis Testing - Rank-biserial r Help: Added a help button next to the Rank-biserial r label in Wilcoxon / Mann-Whitney result panels, covering the definition, the -1 to +1 range, and the uncomputable case
  • Custom Graph - Sequential Palettes for Discrete Variables: Sequential palettes (Viridis, Plasma, Inferno, Magma) can be applied to discrete categorical color / fill mappings, sampled at N evenly spaced positions so lightness varies monotonically with category order. Previous *-discrete variants are removed and existing projects are migrated
  • Launcher - Documentation Link: Welcome screen and About dialog link to the documentation site, auto-routing to Japanese or English by browser language
  • Custom Graph - Smooth Interval Band: Smooth stat computes ymin / ymax as an interval band. Interval type is Prediction (individual observation, default) or Confidence (mean response). Linear uses the t-distribution interval; LOESS uses a hat-matrix approximation. Combine with Ribbon to render the band

Changed

  • Agent API - Model Summary Element Reference: reports.addModelSummary() adds GLM / GLMM coefficient tables as DataTableElement entries with a {{data_table:elementId}} reference instead of baking inline Markdown. result.data gains an optional elementId. Random Forest still emits inline Markdown
  • Two-Sample Test - Cohen's d Removed: Two-sample and paired t-test result panels no longer display Cohen's d. Effect magnitude is read from the mean difference and its 95% confidence interval. Removes label confusion between independent-samples d and paired d_z, and avoids presenting a standalone effect-size value without interpretation guidance
  • Graph Builder - Embedded Graph Selection Toggle: Ctrl+click (Cmd+click on macOS) on an element in a report-embedded graph toggles the selection state, matching the Graph Builder tab

Fixed

  • Custom Graph - Numeric Categorical Order: Categorical axes and color / fill / shape / linetype legends share ordering rules: int64 / float64 by numeric value, ordinal enum by the enum definition, otherwise locale-aware string order. scales.x.limits / scales.y.limits and sort stat output still take precedence
  • Custom Graph - Log/Square Root Scale Out-of-Domain Values: Log scale clamped the domain to 0.0001 and Square Root scale silently dropped negative values, drawing points at positions that did not match the original data. Out-of-domain values now suppress the plot and report the affected axis, column, and violation count; Multi-Panel per-panel scale overrides are covered
  • Custom Graph - LOESS Performance and Stability: LOESS neighbor selection rewritten so cost grows linearly with sample size. Symmetric inputs no longer depend on input order, near-singular local fits no longer diverge, and extreme-magnitude x values no longer produce NaN
  • Custom Graph - Reference Line on Categorical Axis: geom_hline / geom_vline with a numeric intercept is suppressed and a warning logged when the corresponding physical axis (after coord_flip) is categorical
  • SQL Editor - DuckDB Keywords Misclassified as Alias: ASOF, POSITIONAL, SEMI, ANTI, QUALIFY, SAMPLE after a table reference are now recognized as clause terminators instead of aliases, restoring column-name completion
  • Hypothesis Testing - Rank-biserial r Returned Zero When Uncomputable: Wilcoxon signed-rank test shows - and returns null from the Agent API when all paired differences are zero, instead of 0
  • Import Data - Slash-Separated Date Off-By-One: Dates like 2025/01/15 are parsed as the date the user wrote regardless of timezone; unpadded dates (2025/1/15) are also accepted
  • Import Data - Leading Zeros Stripped from ID Columns: Columns with leading zeros (e.g., postal codes 0060001) are kept as text by auto-inference instead of inferred as int64. Explicit type conversion is unchanged
  • GLM - Diagnostics Warnings Lost on Re-fit: Data preparation warnings (e.g., grouped Binomial non-integer trials / successes counts) are persisted on the model and shown in the GLM Diagnostics tab across re-fits
  • GLM - Gamma Log-Likelihood Shape Parameter: Gamma family log-likelihood (used for AIC / BIC) now uses shape α=1/ϕ^\alpha = 1/\hat\phi from the estimated dispersion instead of assuming α=1\alpha = 1, so within-family rankings are stable across models with different dispersion estimates
  • Linear Regression - Coefficient Dataset Stable Column Names: Saved OLS coefficient datasets use Test Statistic / P-value / Distribution, matching the GLM coefficient dataset schema. The Linear Regression analysis tab still displays t value / Pr(>|t|). Existing projects are migrated automatically

[2026.04.13]

Added

  • Agent API - Model Inference Distribution: models.run() and models.describe() now return an inference field alongside coefficients. inference.distribution is 't' or 'normal' and inference.df is the t-distribution degrees of freedom (null when distribution is normal), identifying the reference distribution used for testStatistic, p, ciLower, and ciUpper. GLMM fixed effects always report { distribution: 'normal', df: null }. Agents can now determine whether each test statistic is a z value or a t value without inferring it from family/link
  • Agent API - Import From Buffer: New midas.datasets.importFromBuffer() loads CSV/TSV data from an ArrayBuffer or TypedArray (Uint8Array, Node.js Buffer). Playwright tests and automation scripts can now load local CSV files without spinning up an HTTP server. Supports delimiter auto-detection and encoding auto-detection (UTF-8 / Shift_JIS / EUC-JP)
  • Graph Builder - Stat/Geom Mismatch Warning: When a geometry (ribbon, errorbar) requires position mappings that the current stat does not produce, a warning banner now appears in the layer settings with guidance on how to resolve the mismatch
  • Enum - Value Reorder Controls: Enum definition editor now has up/down arrow buttons for reordering values directly, replacing the previous workflow where reordering required deleting and re-adding values

Fixed

  • Agent API - Import Duplicate Name Bypass: datasets.importFromURL() and datasets.importFromBuffer() bypassed the dataset name-duplication guard by writing directly to the project state, allowing two datasets with the same name to coexist and breaking SQL table-name resolution. Both methods now route through the store's addDataset action and reject duplicate names with DATASET_ALREADY_EXISTS by default. A new overwrite: true option deletes the existing dataset before importing
  • Agent API - Import Error Code Granularity: datasets.importFromURL() and datasets.importFromBuffer() mapped all exceptions to EXECUTION_ERROR, making CSV parse failures (empty data, invalid URL, wrong content type) indistinguishable from network or runtime errors. User-input errors now return INVALID_INPUT, allowing agents to skip unnecessary retries
  • Agent API - Describe Column Identifiers: models.describe() previously returned column IDs for coefficients[].variable (GLM), fixedEffects[].variable and randomEffects.groupColumn (GLMM), featureImportances[].feature (Random Forest), and metadata.features / metadata.target (all model types), making the response inconsistent with models.run(). These fields now return column names resolved from the training dataset, falling back to the column ID when the training dataset has been deleted
  • Model Detail - GLMM Formatted View: Model Detail tab fell back to raw JSON display for GLMM models; it now shows a formatted view with family / link / group variable, random effects (variance and standard deviation for group and residual), ICC, fixed effects coefficient table (intercept row, estimate, standard error, z value, Pr(>|z|), 95% CI), and model fit statistics (conditional deviance, log-likelihood, AIC, BIC, convergence, observations, groups)
  • GLMM - Fit Statistic Labels by Family: The GLMM tab and Model Detail view previously labeled the log-likelihood, AIC, and BIC as REML-based regardless of family, even though non-Gaussian families use the Laplace-approximated marginal log-likelihood. Labels now adapt: REML Log-Likelihood / AIC (REML) / BIC (REML) for Gaussian with the identity link, and Log-Likelihood (Laplace) / AIC / BIC for non-Gaussian families
  • GLMM - Deviance Label Clarity: The model fit deviance was labeled simply Deviance, which did not distinguish between conditional and marginal deviance. It is now labeled Conditional Deviance in both the GLMM tab and Model Detail view to match the definition in the GLMM documentation
  • GLMM - ICC Label for Non-Gaussian Families: For non-Gaussian families the ICC is computed on the latent linear predictor scale (e.g., using π²/3 for logit), but the label did not convey this. Non-Gaussian GLMM now labels ICC as ICC (Intraclass Correlation, latent scale) in the GLMM tab and ICC (latent scale) in Model Detail
  • GLM - Coefficient Dataset Stable Column Names: Saved GLM coefficient datasets previously used t_value or z_value as the test statistic column and Pr(>|t|) or Pr(>|z|) as the p-value column name depending on the reference distribution, making downstream SQL, Graph Builder, and user scripts unstable when comparing models with different family/link combinations. Both columns are now fixed to Test Statistic and P-value, and a new Distribution column (t or normal) records the reference distribution. The GLM tab coefficient table in the UI still shows t value / z value and Pr(>|t|) / Pr(>|z|) for familiarity with statistical practice; only the saved dataset column names are fixed. Existing projects are migrated automatically
  • Agent API - Dataset Overwrite Stability: overwrite: true on datasets.query(), datasets.addColumns(), datasets.addOrthogonalPolynomials(), and datasets.setColumnSchema() previously deleted the existing dataset and created a new one, breaking any open tabs referencing the original dataset. Overwrite now updates the dataset in place, so open tabs and downstream references remain valid
  • GLM - Diagnostics on Stale Derived Dataset: Editing the source query of a derived dataset triggered diagnostics re-evaluation on the now-stale model. The diagnostics tab now detects the stale state, shows a warning, and hides diagnostics plots until the model is re-fitted
  • GLM - Help Text Reference Distribution Precision: GLM coefficient help text stated the reference distribution as if it were exact for all families. Only Gaussian with identity link produces an exact t(n-p) distribution; help text now distinguishes exact from approximate (t for other dispersion-estimating families) and asymptotic (standard normal for Poisson, Binomial, Negative Binomial with estimated theta) cases
  • GLM - Help Text NB Theta State: GLM coefficient help did not indicate whether the current Negative Binomial model uses estimated or manually specified theta. A dynamic note now shows the theta estimation method and explains which reference distribution applies to the current model
  • Crosstab - Enum Sort on Legacy Projects: Crosstab reports saved before v2026.04.06 with enum columns sorted values alphabetically instead of in the defined order. A migration now restores the enum reference so existing reports sort correctly

Changed

  • GLMM - Fixed Effects Table Significance Stars: The fixed effects coefficient table in the GLMM tab no longer appends significance stars (*, **, ***) to p-values. MIDAS emphasizes effect estimation over hypothesis testing and avoids presentations that reinforce a significant / non-significant dichotomy

[2026.04.11]

Added

  • Agent API - Enum Definitions: New midas.enums namespace with create, list, update, and remove methods for managing enum definitions; datasets.describe() now reports the enum name for enum columns
  • Agent API - Set Column Schema: New midas.datasets.setColumnSchema() for converting column types and changing enum bindings; accepts an outputName parameter for the resulting derived dataset and overwrites an existing dataset with the same name instead of accumulating duplicates
  • Agent API - Coefficient Confidence Intervals: ModelCoefficientInfo now includes ciLower and ciUpper, the 95% Wald confidence interval for each coefficient. Returned by models.run() and models.describe() for both GLM coefficients and GLMM fixed effects, using the same reference distribution (t or normal) as the coefficient's testStatistic

Changed

  • Agent API - Coefficient Test Statistic Field: Renamed ModelCoefficientInfo.z to testStatistic to reflect that GLM families with dispersion estimation (Gaussian, Gamma, Negative Binomial with fixed θ) now store t statistics rather than z statistics. Existing Agent scripts reading info.z must be updated. Saved models are migrated automatically

Fixed

  • Statistics - Geometric Mean Overflow: Geometric mean overflowed on large datasets; now computed as the exponential of the mean of logs
  • Statistics - Geometric Mean with Zero or Negative Values: Geometric mean silently dropped zero, negative, and non-finite values, computing it on a different subset than the coefficient of variation; now omitted entirely when any value is not a finite positive number
  • Import Data - Header Detection on Numeric Column Names: Header autodetection misclassified columns whose names contained digits (e.g., x1); autodetection has been replaced with an explicit "First row is header" toggle in the import preview, persisted with the dataset
  • Export - CSV/TSV Missing Values: Missing values were exported as the literal string null; now exported as empty fields so R, pandas, and Excel recognize them as missing by default
  • GLM - Gamma Dispersion Parameter: Gamma family used deviance/df for the dispersion parameter, producing standard errors, confidence intervals, and p-values that systematically diverged from R; now uses Pearson χ²/(n-p) consistent with McCullagh & Nelder (1989) and other major statistical packages
  • GLM - Gamma Deviance Precision Near the Fitted Mean: Per-observation Gamma deviance suffered catastrophic cancellation when the response was very close to the fitted mean, occasionally producing negative deviance contributions; now computed in a numerically stable form
  • GLM - Coefficient Table Reference Distribution for Dispersion-Estimating Families: Coefficient table p-values and confidence intervals for families that estimate dispersion (Gaussian on all links, Gamma, Negative Binomial with fixed θ) used standard normal quantiles instead of t(n-p); column headers now switch between "t value / Pr(>|t|)" and "z value / Pr(>|z|)" accordingly, and saved models are migrated
  • Model Detail - Intercept Row Missing from Coefficient Table: Model Detail tab showed the intercept estimate outside the coefficient table; the intercept is now displayed as an (Intercept) row inside the table with all columns (estimate, standard error, test statistic, p-value, confidence interval)
  • ANOVA - Large-Offset Numerical Stability: One-way and two-way ANOVA could lose precision for data with very large constant offsets (e.g., values around 10^15); group statistics now use compensated summation, and the two-way solver shifts the response before factoring so F statistics, sums of squares, and p-values are translation-invariant
  • Agent API - Enum Deletion of Referenced Definitions: enums.remove() deleted an enum definition while columns still referenced it, leaving orphaned references; the deletion is now rejected with an ENUM_IN_USE error until the references are removed

[2026.04.06]

Added

  • Chi-Square Test - Adjusted Standardized Residuals: Adjusted standardized residuals are now always displayed in the contingency table; color highlighting is a separate toggle
  • ANOVA - Ordinal Group Ordering: Groups in the ANOVA results follow the category order defined in the column settings instead of alphabetical sort
  • Project Lineage - Tab Node Details: Clicking a tab node in Project Lineage shows its type, workspace, and referenced datasets/reports/models in the detail panel
  • Accessibility - Disabled Button Reasons: Disabled buttons now display a tooltip explaining why they are disabled

Fixed

  • GLM - Prediction Intervals for Non-Gaussian Families: Prediction intervals were computed using a Gaussian approximation regardless of family; Poisson, Binomial, Gamma, and Negative Binomial now use each family's own distribution
  • GLM - Prediction Standard Errors Missing Dispersion: Prediction standard errors did not include the dispersion parameter, producing too-narrow confidence intervals for Gaussian and Gamma models
  • GLM - Small-Sample Confidence and Prediction Intervals: Gaussian + identity link confidence and prediction intervals used normal quantiles instead of t-distribution quantiles, underestimating interval width in small samples
  • GLM / GLMM - Coefficient Standard Errors Masking Numerical Issues: When the model had numerical issues, coefficient standard errors, z-values, p-values, and confidence intervals showed misleading values instead of "N/A"
  • Reshape - Wide to Long Type Promotion: Combining integer and decimal columns produced a text column instead of decimal; date and datetime columns now promote to datetime
  • Graph Builder - Facet Sort with Null Values: Null values in facet panels were not sorted consistently; now always placed last
  • Export - File Name Ignored in Dialog: File name entered in the Export dialog was ignored; file names with special characters were also sanitized inconsistently
  • Filtered Data - Save as Dataset Without Filter: Save as Dataset button was clickable when the filtered view was created by manual row selection, which has no reusable filter condition; the button is now disabled with an explanation

[2026.03.31]

Added

  • ANOVA - Welch's Test: Welch's ANOVA as a dedicated tab with Games-Howell post-hoc test for pairwise comparisons without assuming equal variances
  • Graph Builder - Free Scales: facet_wrap and facet_grid support free, free_x, free_y scale options for independent axis ranges per facet panel
  • Graph Builder - Title Field: Title input field for setting graph titles directly in Graph Builder
  • Graph Builder - Facet Panel Limit: Warning and rendering block when facet panel count exceeds a configurable maximum (default: 50); adjustable in Settings
  • DoE - Replications: Replication count setting in the design wizard; each row in the orthogonal array is repeated the specified number of times
  • GLM / GLMM / Cox - Iteration Count: Convergence summary always shows the number of iterations performed
  • Help - Documentation Links: All analysis help panels link to the corresponding documentation page
  • Agent API - Graph Builder Columns: getGraphBuilder() returns available column names, types, and scales; ambiguous column name references return a specific error message

Changed

  • Graph Builder - Facet Rendering Performance: Row selection changes no longer trigger full facet panel recalculation
  • Two-Sample Test - Effect Size Labels: Removed "small", "medium", "large" interpretation labels from Cohen's d and other effect size measures
  • Two-Sample Test - APA Format Copy: Removed APA format copy option from t-test results

Fixed

  • GLM - Confidence Intervals at Non-Standard Levels: Confidence intervals at non-standard levels (e.g., 92%) used the 95% z-value instead of the correct quantile for the specified level
  • GLM - Diagnostics on Derived Datasets: Diagnostics failed when the model was trained on a derived dataset (e.g., created by SQL query)
  • GLM - Diagnostics Ignored Prior Weights and Offset: Re-running diagnostics dropped prior weights (grouped binomial) and offset terms, producing incorrect diagnostic statistics
  • GLM - Saturated Model Statistics: Gaussian and Gamma models with zero residual degrees of freedom showed incorrect standard errors, t-values, and ANOVA F-statistics instead of "N/A"
  • Two-Sample Test - Cohen's d for Welch's t-test: Cohen's d used pooled standard deviation, which assumes equal variances; now uses average standard deviation consistent with the Welch t-test
  • Two-Sample Test - One-Sided Non-Rejection Text: Non-rejection conclusion for one-sided tests displayed "different from" instead of the correct direction ("greater than" or "less than")
  • Paired Test - Diagnostics: Showed individual group normality plots instead of the paired-difference normality diagnostic
  • Data Table - Descending Sort with Nulls: Null values appeared at the top instead of the bottom when sorting in descending order
  • Data Table - Column Type Conversion: Converting a column type (e.g., string to number) was overridden by schema inheritance, leaving the column unchanged
  • Data Table - Enum Sort Order: Sorting enum columns ignored the defined category order and fell back to alphabetical
  • Data Table - Sort with Mixed Types: Comparing values of incompatible types could produce unpredictable row ordering
  • Graph Builder - Facet Sort Order: Facet panels did not respect the column's scale type (e.g., ordinal categories appeared alphabetically instead of in defined order)
  • Graph Builder - hline/vline with coord_flip: Horizontal and vertical reference lines did not swap axes when coordinates were flipped
  • Pair Plot - Too Many Columns: Selecting many columns could freeze the browser; now limited to 10 columns
  • Graph Builder - Filter Failure: When a filter expression failed, data displayed unfiltered without notice; now shows a warning banner with the error message

[2026.03.27]

Added

  • Analysis - Design of Experiments (DoE): Design wizard for two-level orthogonal arrays (L4/L8/L16); ANOVA table, main effects plot with confidence intervals, interaction plot, and Pareto chart for analyzing factor effects
  • Graph Builder - Text Geom: Text labels and annotations on scatter plots and other graphs; supports size, color, and position offset aesthetics
  • Graph Builder - Categorical X for Lines: Line geom now accepts categorical X variables, enabling main effect plots and category-axis line charts
  • Graph Builder - SVG Metadata: Exported SVG files include Dublin Core metadata recording MIDAS as the creator tool and the graph title when set
  • Pair Plot - Always-On Selection: Brush selection is always active; zoom and pan disabled for unobstructed correlation overview
  • Agent API - Graph Height in Reports: reports.addGraph() accepts a height parameter to control graph dimensions
  • Agent API - Graph Title: configureGraph() accepts a title parameter for setting graph titles programmatically

Fixed

  • GLM - Coefficient Statistics When Covariance Unavailable: Standard errors, z-values, p-values, confidence intervals, leverage, and Cook's distance displayed as zero instead of "N/A" when the covariance matrix could not be computed; diagnostic plots now show a placeholder instead of misleading charts
  • GLM - Saturated Model Warning: No warning when observation count equaled parameter count (residual degrees of freedom = 0); now displays a model-appropriate warning explaining the impact on diagnostics
  • GLM - Grouped Binomial Non-Integer Input: Non-integer trials or successes were silently accepted; now warns that coefficient estimates remain valid as quasi-likelihood estimates but log-likelihood, AIC, and BIC are not valid for model comparison
  • GLM - Negative Binomial Theta Estimation: Initial theta estimation ignored the intercept setting; theta and dependent statistics could be inaccurate for intercept-free models
  • GLM - Negative Binomial Dispersion When Covariance Unavailable: When standard errors showed "N/A", Negative Binomial models computed dispersion from deviance instead of Pearson chi-square, and theta could be reported as undefined
  • GLM / Cox Regression - Standard Errors at Extreme Scales: Data with very large or very small values (e.g., 10^8 or 10^-11) could cause standard errors to show "N/A" even when the model was well-determined
  • Two-Sample Test - Small Sample Diagnostics: Skewness and kurtosis showed 0 instead of "N/A" when group sample size was less than 3
  • Statistics - Group Selector Scrolling: "Show stats by" dropdown scrolled out of view when the statistics table was long; now pinned to the top of the panel
  • Statistics - Empty Group Values: Groups with zero observations showed 0 for mean, variance, and other statistics; now shows "N/A"
  • CSV Import - Cancel vs Timeout: URL-based CSV import showed a timeout error message when the user manually cancelled the request
  • Agent API - Graph Layer Validation: Invalid geom, stat, or position type names passed to addGraphLayer(), updateGraphLayer(), or reports.addGraph() could crash instead of returning an error
  • Agent API - Random Forest Description: models.describe() for Random Forest could return incorrect values instead of reporting an error when data was inconsistent

[2026.03.24]

Added

  • ANOVA - Assumption Diagnostics: Levene's test (Brown-Forsythe variant) for equal variances, Shapiro-Wilk test and Q-Q plot for residual normality; significance level selector (0.10/0.05/0.01) applied to the ANOVA table and Tukey HSD; null hypothesis and rejection decision displayed in plain text
  • Survival Analysis - Proportional Hazards Diagnostics: Grambsch-Therneau test for each covariate, Schoenfeld residual plots with LOESS smooth and coefficient reference line, and log(-log(S(t))) plots for assessing the proportional hazards assumption in Cox regression
  • Report - DataTable Links: DataTable elements in reports display clickable links when the source table has link columns configured
  • Data - Persistent Storage: On first project save, requests the browser to store data permanently to prevent saved projects from being automatically deleted when storage is low

Changed

  • PCA: No longer requires downloading the Python runtime; analysis starts immediately
  • Random Forest: No longer requires downloading the Python runtime; analysis starts immediately
  • ANOVA - Condition Number Warning: A warning is now displayed when the design matrix is near-singular; solver switched to QR decomposition for improved numerical accuracy

Fixed

  • ANOVA - Two-Way Null Hypothesis Text: Type I SS hypothesis text now reflects sequential testing (e.g., Factor B is adjusted for Factor A)
  • ANOVA - Two-Way Residuals: No-interaction models computed residuals from cell means instead of the additive model fit
  • GLM - Inverse Link with Offset: Models with inverse link function and offset crashed with an internal error when the linear predictor became non-positive (e.g., Gamma + inverse link with a large negative offset); now shows a descriptive error message
  • GLM - Null Deviance without Intercept: Null deviance was incorrect for intercept-free models across all distribution families
  • GLM - Minimum Row Validation: Minimum observation check did not account for intercept-free models, rejecting valid datasets that met the actual requirement
  • Data Table - Derived Dataset Links: Link display in derived datasets only checked the immediate parent; datasets derived through multiple steps (e.g., Source -> Filtered -> Recoded) now correctly trace ancestry to the original trusted source
  • Agent API - Error Codes: All model fitting errors returned the same error code regardless of cause (e.g., missing column and numerical failure both returned INSUFFICIENT_DATA); now returns distinct codes for each error category
  • Agent API - Graph Builder: Changing graph type could crash when the previous configuration was incompatible with the new type
  • Agent API - Report Tab: Opening a report tab without specifying which report now returns an error instead of crashing

[2026.03.23]

Added

  • GLM - Offset Term: Offset variable selector for rate modeling; linear predictor becomes η = Xβ + offset with exposure variables (e.g., log(person-years) in Poisson regression)
  • Data Table - Link Display: Column context menu option to set a URL template; cell values render as clickable links with {columnName} interpolation from other columns; links enabled only for projects loaded from trusted sources
  • Data - Orthogonal Polynomials: Generate orthogonal polynomial basis from a numeric column via Data menu; using orthogonal basis improves GLM coefficient precision from 6 to 10+ digits on high-degree polynomials
  • Project Lineage - Workspace Name: Tab nodes in the lineage graph display their workspace name (e.g., "data-table · Main")
  • Analysis - Hypothesis Tests Submenu: Two-Sample Test, Paired Test, Chi-Square Test, and ANOVA grouped under a Hypothesis Tests submenu in the Analysis menu

Changed

  • Crosstab - Rendering Performance: Reduced redundant calculations when rendering large crosstabs

Fixed

  • ANOVA - Negative Sum of Squares: Floating-point rounding in sequential Type I SS could produce tiny negative values that propagated to F-statistics and p-values

[2026.03.21]

Added

  • Analysis - ANOVA: One-way and two-way analysis of variance with Tukey HSD post-hoc test; group descriptive statistics and confidence intervals
  • Crosstab - Adjusted Standardized Residuals: Adjusted standardized residuals displayed in chi-square test of independence results
  • Dummy Coding - Reference Category: Reference category selectable from dropdown; defaults to alphabetically first category
  • Data Table - Filtered Row Count: "Showing X of Y rows (filtered)" indicator when a filter is active
  • Security - Strict Connection Mode: "Block connections to untrusted domains" in Settings restricts CSP connect-src to trusted URLs only
  • Agent API - datasets.importCSV(): Import CSV files programmatically via the agent API

Changed

  • Analysis - Significance Codes: Significance stars (***, **, *, .) removed from GLM, Linear Regression, and ANOVA coefficient tables
  • Basic Statistics: Variance, standard deviation, skewness, and kurtosis now use sample-based estimators
  • GLM - QR Decomposition Solver: Solver switched from Cholesky normal equations to Householder QR decomposition, avoiding condition number squaring
  • GLM - Covariance Matrix: Computed directly from QR R factor instead of Fisher information matrix inversion

Fixed

  • GLM / Linear Regression - NaN Classification: NaN values in predictor or response columns were reported as "infinite" instead of "invalid" in incomplete observation diagnostics

[2026.03.20]

Added

  • Hypothesis Test - Nonparametric Tests: Mann-Whitney U test for independent two-sample comparisons and Wilcoxon signed-rank test for paired comparisons; Hypothesis Test tab split into Two-Sample Test and Paired Test
  • GLM - Deviance Goodness-of-Fit Chart: Chi-squared density curve with observed Deviance marker and p-value for Binomial and Poisson models; replaces threshold-based overdispersion warning
  • GLM - Variance-Covariance Matrix Export: Save as Dataset now includes the variance-covariance matrix as a separate dataset in long format
  • Survival Analysis - Censoring Marks: Kaplan-Meier curves display "+" marks at censoring times, including per-group marks for stratified analyses
  • Linear Regression - Confidence Level and Interval Export: Confidence level selector (90%, 95%, 99%) with t-distribution-based confidence intervals for coefficients; Prediction and Confidence Intervals exportable as a dataset
  • CSV Import/Export - Character Encoding: Auto-detection of file encoding on import with manual override; Shift-JIS and EUC-JP encoding options for export

Fixed

  • Coefficient Tables - p-value Color Coding: p < 0.05 color highlighting removed from regression and survival analysis coefficient tables; significance stars retained as conventional notation
  • Hypothesis Test - Significance Badges: Green/gray Significant/Not Significant badges replaced with neutral gray p < alpha / p >= alpha display
  • Pair Plot - Correlation Coefficient Readability: Semi-transparent background box added behind correlation overlay to prevent overlap with data points; dark mode support via theme variables
  • Survival Analysis - Missing Value Notification: Rows excluded due to missing values now shown in a note box for both Kaplan-Meier and Cox regression
  • GLMM - Iteration Label: "EM Iterations" labels corrected to "Iterations" to match actual algorithm
  • PWA - Offline Readiness: DuckDB and Pyodide WASM modules precached on PWA install with non-blocking progress banner
  • File Import - File Chooser Dialog: File input element attached to DOM before triggering click, fixing file chooser not opening on some browsers
  • Agent API - help() Documentation: tabs.open() help entry now documents the reportId parameter

Security

  • App - Analytics Removal: Removed Cloudflare Web Analytics from app.midas-app.org; CSP script-src restricted to 'self' only

[2026.03.18]

Added

  • Crosstab - Chi-Square Test of Independence: Pearson's chi-square test with test statistic, degrees of freedom, p-value, and Cramer's V; warns when expected frequencies are below 5

Fixed

  • Documentation Site - "Open in MIDAS" Links: CORS headers added in the previous release were bypassed when CDN served static files directly; now applied via Cloudflare _headers file
  • URL Validation - IPv6 Private Addresses: IPv6 loopback, link-local, unique-local, and IPv4-mapped addresses were not detected as private IP ranges

Security

  • EmbedView - Fetch Hardening: Added redirect blocking, cache bypass, 30-second timeout, and abort-on-unmount to external URL fetch in EmbedView

[2026.03.17]

Added

  • Graph Builder - Multi-Y Panel: Stack multiple panels vertically with a shared X axis; zoom and pan synchronize across all panels
  • Graph Builder - Scatter Plot Axis Scale: Linear / Log / Square Root scale options for scatter plot X and Y axes
  • Hypothesis Test - Paired t-test Difference Diagnostics: Shapiro-Wilk normality test, Q-Q plot, histogram, and descriptive statistics for paired differences
  • Shapiro-Wilk Test - Royston Polynomial Correction: C1/C2 polynomial corrections from Royston (1992) / AS R94 applied to a-coefficients for improved accuracy
  • GLM - Odds Ratios Section: Odds ratios with 95% confidence intervals displayed in a dedicated section below the coefficient table for Binomial + Logit models
  • Report - Markdown Content Auto-sync: Adding, removing, or duplicating report elements automatically updates {{type:id}} references in Markdown content
  • Report - Graph Element Titles: Graph elements added to reports auto-generate titles from axis column names
  • Report - Individual Diagnostic Plots: Each GLM diagnostic plot can be added to a report individually, in addition to "Add All Plots"
  • Agent API - Report Management: reports.create(), reports.getContent()/setContent() for programmatic report control; tabs.open() accepts reportId to open a specific report
  • Agent API - Model Summary in Reports: reports.addModelSummary() generates Markdown for GLMM (fixed/random effects, ICC) and Random Forest (hyperparameters, feature importances)
  • Agent API - Model Operations: models.run() returns GLM fit results directly without opening a tab; models.save() persists run results to the project; models.describe() expanded to GLMM and Random Forest
  • Agent API - Tab Configuration: tabs.configureGraph() for Graph Builder bulk setup, tabs.configureGlm() for GLM, tabs.setDataset() for switching datasets; column name resolution for all configuration APIs
  • Agent API - Project and Data: project.save(), project.exportMds(), project.downloadMds(); datasets.addColumns() for creating derived datasets via API
  • Agent API - CSV URL Loading: ?csv=URL query parameter loads a CSV file directly from a URL on app launch
  • Documentation Site - Full-text Search: Pagefind-based client-side search with language-separated indexes for Japanese and English
  • Documentation Site - Language Switcher: Dropdown menu in breadcrumb area for switching between Japanese and English documentation pages

Fixed

  • Shapiro-Wilk Test: Large samples (n > ~20) always returned p=1 due to incorrect polynomial coefficients in the Royston (1992) normal approximation
  • GLM - Duplicate Model Detection: findDuplicateModel() always treated family/link as matching because it read from the wrong property path, allowing duplicate models to be created
  • GLM - Diagnostic Plot Sizing: Diagnostic plots used fixed pixel dimensions instead of following container width
  • Report - Model Summary Column Names: Coefficient table in model summary displayed internal column UUIDs instead of human-readable column names
  • Report - GFM Table Rendering: Pipe characters in table cells (e.g., Pr(>|z|)) broke Markdown table rendering
  • Report - GLM Diagnostics Export: "Add All Plots to Report" only added a subset of diagnostic plots
  • Agent API - tabs.closeOthers(): Did not close tabs in the other split pane because it referenced a stale layout snapshot instead of re-reading store state per iteration
  • Agent API - Ambiguous Dataset Name: datasets.query() silently picked an arbitrary match when multiple datasets matched a table name case-insensitively; now returns AMBIGUOUS_TABLE_NAME error
  • Documentation Site - "Open in MIDAS" Links: Cross-origin fetch from app.midas-app.org failed due to missing CORS headers on documentation file responses

[2026.03.15]

Added

  • Data Management - Add Columns: Create a derived dataset with new columns defined by SQL expressions (e.g., ratio of two columns, arithmetic on existing values); accessible from Data > Add Columns menu

Fixed

  • Agent API - Dataset Query: datasets.query() with overwrite: false allowed duplicate datasets with the same name instead of returning an error

[2026.03.13]

Added

  • GLM - Grouped Binomial: General Binomial (n>1) support for Binomial GLM; select successes and trials columns instead of binary-only response
  • GLM - Cook's Distance Residual Switching: Cook's Distance, Q-Q Plot, Scale-Location, and Residuals vs Leverage now switch between Deviance and Pearson residuals based on the diagnostic plot residual type toggle
  • SQL Query - In-place Dataset Update: "Replace" on duplicate dataset names now updates the existing derived dataset in-place, preserving downstream dependencies
  • Documentation Site - Heading Anchors: Heading elements on documentation pages now have clickable anchor links (#) for direct linking to specific sections
  • MDS File - Version Warning: Opening a project file created by a newer version of MIDAS now shows a warning dialog instead of silently loading

Fixed

  • OLS / GLM - Variable Reset on Dataset Change: Switching datasets did not reset selected variables, leaving stale column references from the previous dataset
  • Data Table - Boolean Cell Editing: Boolean columns in Edit Mode used a free-text input, requiring exact string entry; now uses a dropdown (true / false / null)
  • Documentation Site - Content Layout: Unnecessary gap appeared between content area and right sidebar on wide screens

[2026.03.06]

Added

  • Graph Builder - Step Geometry Tooltip: Tooltip support for Step Geometry; hovering over a line displays group tooltip data
  • Graph Builder - Line/Step Selection: Click to select groups and double-click to open Filtered Data on Line and Step geometries; unselected groups fade to reduced opacity
  • Agent API - Error Handling: Unknown aes properties now return warnings instead of being silently ignored; COLUMN_NOT_FOUND errors include suggestions; window.midas API is now always available on all screens

Fixed

  • Dummy Coding - Missing Values: Dummy variable columns used NaN for missing values instead of null, inconsistent with MIDAS missing value convention

[2026.03.03]

Fixed

  • Graph Builder - Threshold Scale Clipping: Threshold scale clip paths (colorThreshold/fillThreshold) did not follow zoom/pan on Line, Area, and Step geometries; threshold regions now update correctly during interaction
  • Hypothesis Test - Variable Selection: Group and Outcome variable filtering was based on data type instead of measurement scale, incorrectly excluding numeric group variables
  • Filtered Data - Equality Comparison: Equality operators (=/!=) in filter expressions did not dispatch by value type, causing incorrect results (e.g., boolean column true did not match string value "true")

Performance

  • Graph Builder - Threshold Rendering: Threshold clip path rendering replaced full DOM removal and recreation with D3 JOIN pattern, reducing unnecessary DOM operations during zoom/pan

[2026.02.27]

Added

  • Analysis Tabs - Boolean Variable Support: Boolean columns now available as numeric variables (true→1, false→0) in OLS, GLM, GLMM, Random Forest, PCA, and Cox Regression
  • GLM - Coefficient Details: Coefficient table now shows Std. Error, z-value, p-value, and 95% confidence intervals
  • Linear Regression - Report Integration: Add regression results to reports via right-click context menu
  • Linear Regression / GLM - Save Coefficients as Dataset: "Save as Dataset" button on coefficient tables; saved data reusable in Data Table and Graph Builder
  • Filtered Data - Type-safe Filter Comparison: Filter comparisons now dispatch by value type (numeric, temporal, string), fixing incorrect results for date/datetime columns with mixed formats

Fixed

  • Data Management - Cascade Deletion: Deleting a dataset from Project Overview left dependent models and derived datasets as dangling references, causing "Training dataset not found" errors on retrain; cascade deletion now works consistently from both Project Overview and Lineage views
  • Graph Builder - Time Bin Selection Performance: Selecting time bins on datetime histograms was slow (~500ms per selection) due to Date.parse overhead; now uses ISO string comparison
  • Graph Builder - Flipped Coordinates Secondary Y Axis: Secondary Y axis section silently disappeared when flipped coordinates were enabled; now shows as grayed-out with explanation text

[2026.02.19]

Added

  • Analysis Tabs - Categorical Variable Visibility: Categorical variables are now shown as grayed-out with tooltip explanation instead of being silently hidden from variable selectors in OLS, GLM, GLMM, Random Forest, PCA, and Cox Regression tabs
  • Graph Builder - Toolbar Layout: Pan/select/clear selection buttons moved from overlay on graph area to a toolbar above the graph, preventing overlap with data points

Fixed

  • Data Management - Selection State Leak: Selection state entries for deleted datasets accumulated in memory; now cleaned up on dataset removal
  • Graph Builder - Datetime Histogram Brush Selection: Brush selection on Datetime Histogram did not select any rows
  • Graph Builder - Datetime Histogram Context Menu: "Open as Filtered Data" context menu did not appear after brush selection on Datetime Histogram

[2026.02.16]

Added

  • Linear Regression (OLS): Linear Regression (OLS) tab added to Analysis menu; includes R², Adjusted R², F-statistic, RMSE, standardized coefficients, VIF, t-distribution-based p-values, and residual diagnostics
  • Linear Regression (OLS) - Prediction Intervals & ANOVA: 95% confidence/prediction intervals for fitted values; ANOVA decomposition with Type I (sequential) / Type III toggle; corrected R² calculation for no-intercept models

Fixed

  • Report - Error Notification: Adding elements to a report or creating a new report failed silently; now shows an alert dialog on failure
  • Report - Action Type Handling: Some report action types silently did nothing instead of reporting an error; all types now handled with compile-time exhaustiveness checking
  • Agent API - Tab Validation: tabs.open() returned success for invalid tab types; now returns INVALID_TAB_TYPE error with available type list

Security

  • CSP - Script Safety: Removed unsafe-eval and unsafe-inline from Content Security Policy script-src, reducing XSS attack surface

[2026.02.08]

Added

  • GLMM - Numerical Stability: Internal scaling of fixed effects design matrix improves convergence for datasets with widely different scales (e.g., 1 vs 100,000)

[2026.02.07]

Added

  • GLMM - Gamma Distribution: Gamma distribution family added to GLMM distribution selection

Fixed

  • GLMM - Gamma Estimation Accuracy: Gamma GLMM estimated random effect variance orders of magnitude too large and BLUPs were astronomically inflated (e.g., hundreds of millions)
  • Graph Builder - Y Axis Label Clipping: Y axis tick labels overflowed beyond graph boundary during pan/zoom; labels now clipped at graph edge
  • Graph Builder - Non-negative Y Axis Constraint: Y axis minimum was not constrained to 0 for non-negative aggregate values (e.g., count, density); Y axis now respects output range declared by each stat
  • MDS File - Signature Warning Dialog: Signer name was displayed too prominently in signature warning dialog; fingerprint is now the primary identifier with signer name shown as self-reported information

Security

  • Dependencies: Fixed prototype pollution (lodash), CSRF/XSS (react-router), and decompression bomb (undici) vulnerabilities by updating affected packages

[2026.02.03]

Added

  • Custom Graph - Filtered Data from Selection: Open Filtered Data tab from right-click menu after selecting data points in graphs (Histogram, Scatter Plot, etc.)

Fixed

  • Filtered Data - Sorting: Sorting did not work in Filtered Data tab
  • Histogram - Selection Highlight: Wrong bin was highlighted when selecting histogram bars
  • Histogram - Single Value Display: Histogram did not display anything when all values in the column were identical
  • Statistics - Create New Report: Creating a new report from Statistics panel did not work

[2026.01.31]

Added

  • Scatter Plot - Correlation Coefficient: Display Pearson correlation coefficient (r = X.XX) in scatter plot top-right corner; enabled for Pair Plot (Statistics/Relationships)
  • Pair Plot - Rectangle Selection: Pan/Select mode toggle for Pair Plot; rectangle selection (brush) for data selection; double-click point opens Filtered Data tab

Fixed

  • Statistics - Relationships Scroll: Vertical scrolling did not work in Statistics/Relationships tab
  • Statistics - Category Distribution Y Axis: Y axis labels were cut off on the left edge

Security

  • Iframe Embedding: Restrict embedding from external sites via X-Frame-Options and frame-ancestors directive

[2026.01.26]

Added

  • Custom Graph - QQ Plot Reference Line: Q1-Q3 reference line added to QQ plots; toggle via showReferenceLine option (default: true)
  • Agent API - Models/Reports: Model details retrieval (models.describe) and report operations (reports.list, reports.addContent, reports.addModelSummary)

Fixed

  • DuckDB - ICU Extension: date() function on timestamp columns failed with "Unimplemented type for cast" error; ICU extension now loaded explicitly to ensure timezone-aware casts work

[2026.01.25-1]

Fixed

  • Data Table - Horizontal Scroll: Horizontal mouse wheel scrolling did not work; wheel handler only processed vertical (deltaY) and ignored horizontal (deltaX) input

[2026.01.25]

Added

  • Report - LaTeX Math Support: Inline (......) and block (......) LaTeX math expressions in Markdown reports
  • Settings - Error History: Persistent error logging with export and clear functionality in Settings > Logs

Improved

  • Report Editor - Element Preview: Hover tooltip preview for {{type:id}} patterns instead of inline blocks; reduced keystroke overhead

Fixed

  • Report - Statistics/DataTable Height: Statistics summary and data table elements were cut off at fixed height; now displays full content
  • Report - Graph Wheel Scroll: Mouse wheel scrolling did not work over embedded graphs in reports
  • Report - Auto-Select Correction: Selected report ID now auto-corrects when pointing to deleted or non-existent report
  • Report - Duplicate Confirmation: Delete confirmation dialog now only appears when element is referenced by multiple reports

[2026.01.23]

Improved

  • Filter Expression - Memory Performance: Reduced memory allocation and GC pressure when evaluating filter expressions on large datasets (e.g., 1M rows)

Fixed

  • Report Editor - Chrome Scroll: Mouse wheel scrolling did not work within Report editor on Chrome; wheel events were consumed by CodeMirror's overflow container
  • Report Editor - Cursor Navigation: Arrow key navigation near embedded graph widgets caused RangeError; line numbers were misaligned with content
  • Data Table - Chrome Scroll: Mouse wheel scrolling did not work over table cells on Chrome due to absolute positioning in virtual scroll implementation
  • Custom Graph - X Axis Label Overflow: X axis tick labels overflowed beyond graph boundary when zoomed; labels now clipped at graph edge

[2026.01.21]

Added

  • Histogram - Integer Alignment: Small-range integer columns (range < 30) automatically apply binwidth=1 and center=0, aligning tick labels with bar positions for discrete integer data (e.g., day of week 0-6, month 1-12, rating 1-5)

Fixed

  • Graph Builder - Layout Shift: Flicker during initial render eliminated; container hidden until ResizeObserver reports actual dimensions
  • Histogram - Bar Width: Bar width calculated correctly for histograms with few bins; now uses bin width (xmin/xmax) instead of data point distance
  • Histogram - Bin Boundary Precision: Floating-point errors in bin boundaries (e.g., 0.30000000000000004) caused incorrect row selection; boundaries now rounded based on bin width precision
  • Data Table - Filtered Data: "Dataset not found" error in Statistics/SelectedRows tabs after opening Filtered Data tab; dataset registration added to 4 missing locations
  • Data Table - Filtered Data Cleanup: Closing tabs with ephemeral datasets now properly removes the dataset regardless of tab type (previously only worked for filtered-data tabs)
  • Project Overview - Source URL: Datasets loaded from URL now display the source URL in Project Overview and Lineage tabs instead of showing blank

[2026.01.20]

Added

  • Custom Graph - Integer Count Axis Ticks: Count/bin/timebin statistics display integer-only tick marks on Y axis (e.g., 0, 1, 2, 3 instead of 0, 0.5, 1, 1.5); also applies to X axis with flip coordinate system
  • Custom Graph - Categorical Axis Zoom/Pan: When X axis is categorical and Y axis is continuous, Y axis zoom/pan is enabled; vice versa for continuous X with categorical Y; pan constrained to user-defined domain min/max
  • Custom Graph - Point Dodge Position: Point geometry with categorical X axis spreads points horizontally within each category when using Dodge position with color/fill grouping
  • Custom Graph - Errorbar Dodge Position: Errorbar geometry with categorical X axis aligns error bars with dodged bar/point positions
  • Custom Graph - Duplicate X Value Warning: Line/Area/Step geometry with identity stat shows warning banner when multiple data points exist for the same X value within a group, which causes ambiguous line paths

Fixed

  • Custom Graph - X Axis Label Margin: Datetime X axis labels had excessive bottom margin (~102px) due to estimated label height; margin reduced to ~37px by measuring actual rendered label dimensions
  • **Custom Graph - Tooltip labelVariable:Customtooltiptemplatelabel Variable**: Custom tooltip template `labelreturned undefined; switch statement lackedlabel` case; replaced with mapping object that includes all tooltip variables
  • Custom Graph - Geometry Position Validation: Line/Step geometry allowed Stack/Fill position selection which produced broken rendering; these options are hidden for Line/Step; Jitter option added for Errorbar
  • Custom Graph - Bar Fixed Color Selection: When fill aesthetic was set to fixed color (e.g., "#ff0000"), selection highlight bars used default color instead of the fixed color; fill value lookup unified across all bar types
  • Custom Graph - Negative Bar Selection Position: Selection highlight for negative value bars rendered upward from the bar bottom instead of downward from zero baseline; calculation changed to mirror positive bar behavior
  • Custom Graph - Bin Boundary Selection: Clicking a histogram bin selected rows from adjacent bins at boundary values due to BETWEEN (inclusive both ends); changed to >= min AND < max (left-closed right-open interval)
  • Custom Graph - Secondary Y Axis Auto-Enable: Changing Y axis zoom setting caused secondary Y axis to enable automatically due to shared zoom state; Y2 axis zoom state removed and derived from Y axis setting at render time
  • Custom Graph - Area Stack/Fill Position: Area geometry ignored stack/fill position and rendered all areas from y=0; changed to read y0/y1 from stackBase/stackTop computed by position adjustment
  • Data Table - Filter NULL Comparison: column > NULL returned true for non-null values; changed to return false for all comparison operators per SQL standard; use IS NULL / IS NOT NULL for null checks
  • Graph Builder - JavaScript API Tab State: window.midas.tabs.open('graph-builder') without options caused undefined tabViewState; default graph type ('histogram') applied when initialGraphType not specified

[2026.01.18]

Added

  • Custom Graph - Errorbar Geometry: Error bar geometry for displaying confidence intervals and standard errors
  • Custom Graph - Area Click Selection: Click selection support for Area geometry
  • Custom Graph - Datetime Scale Auto: Automatic scaleTime application for datetime/date columns
  • Graph Builder - Size Settings: Width and height configuration for graphs
  • Summary Stat - Error Bar Functions: Aggregation functions for error bars (se, ci_lower, ci_upper, sd)
  • Statistics Output - ymin/ymax: ymin/ymax output destinations for Statistics transformations
  • Histogram - Brush Selection: Brush selection with X-axis direction constraint for Histogram/DatetimeHistogram
  • Edit Mode - Datetime Validation: Validation and parsing for date/datetime types in cell editing
  • Agent API - Status: activeDatasetId and activeTabId added to status()
  • Agent API - Models/Reports: Model details retrieval and report operations added to window.midas API

Fixed

  • Custom Graph - Legend Alpha: Legend colors did not match bar colors when alpha was set (e.g., Overlay mode histograms); legend now applies layer's alpha value
  • Custom Graph - Tooltip Label: Y-axis label showed original column name instead of stat type (Count/Density) when using Y + stat bin
  • Histogram - X Axis Domain: Edge bins were clipped when bin width was large (e.g., 10 bins with 10% width each)
  • Histogram - Horizontal Stacked: Stacked bars rendered incorrectly and zoom operated on wrong axis in Horizontal orientation
  • Histogram - Faceted Scroll: Could not scroll to see all facets when facet count exceeded visible area
  • Datetime Histogram - Tooltip Count: Tooltip always showed count as 1 instead of actual bin count
  • Q-Q Plot - Brush Selection: Brush selection did not select any rows when dragging on the plot
  • Report - Edit Mode Scroll: Tab content could not scroll in edit mode
  • Agent API - models.run(): Column names (e.g., sepal_length) were treated as column IDs, causing "column not found" errors; now accepts column names
  • DuckDB - Timezone: timezone() function converted timestamps in the wrong direction (e.g., UTC 21:00 became 12:00 instead of 06:00 JST)

[2026.01.16]

Added

  • PWA - File Handling: Open .mds files directly from OS file manager when MIDAS is installed as PWA (Chrome/Edge 102+, desktop only)
  • Agent API - SQL: Extended window.midas API with SQL query capabilities
    • tabs.open() supports initialQuery/initialOutputName for sql-editor tabs
    • datasets.query() with required name parameter and overwrite option (default: true)
  • Agent API - Graph Builder: Extended window.midas API with Graph Builder configuration
  • Custom Graph - 1D Brush Selection: Horizontal brush selection for histograms and charts
  • Custom Graph - Fixed Color/Fill: Support fixed color values for Color/Fill aesthetics
  • Custom Graph - Q-Q Plot: Rewritten Q-Q Plot using Custom Graph engine
  • Crosstab - Value Field Selection: Improved value field selection with multiple aggregations on same column
  • View Menu - New Dataset/Report: Added "New Dataset" and "New Report" options to View menu submenus

Fixed

  • Data Table - Filter Expression: Comparison operators (>, <, >=, <=) failed on datetime columns; now correctly parses datetime strings
  • Custom Graph - Position Dodge: Bars were not rendered and selection expression was incorrect when using categorical X axis with Position Dodge
  • Custom Graph - hline/vline Validation: "X aesthetic is required" error incorrectly shown when selecting hline geometry
  • Histogram - X Axis Ticks: Tick labels were positioned at bin edges instead of bin centers
  • Histogram - Boundary: Data was placed in wrong bins when boundary parameter exceeded minimum data value, causing incorrect row selection on click
  • Histogram - Legend Color: Bar colors did not match legend colors due to inconsistent category ordering
  • Datetime Histogram - Selection: Clicking or double-clicking bars did not select rows due to datetime string comparison failure
  • Crosstab - Single Click Selection: Single-clicking cells did not highlight corresponding rows in other graphs
  • GLM Diagnostics - Selected Points: Table showed column IDs instead of names, and displayed "N/A" instead of actual data values
  • Reload Dataset Dialog: Loading spinner continued indefinitely when file selection dialog was cancelled

[2026.01.14]

Added

  • Custom Graph - Transform Statistics: Linear transformation statistics (offset, scale) for data normalization
  • Custom Graph - ECDF Statistics: Empirical Cumulative Distribution Function for distribution analysis
  • Custom Graph - Axis Label Rotation: Unified label rotation support for all axis types
  • Statistics - Default Tooltip: Default tooltips for all graphs in Statistics tab
  • Statistics - Filter Support: Statistics tab now reflects Data Table filter results
  • Statistics - Datetime Histogram: Improved with time interval selection, X-axis ticks, and trend display
  • Graph Builder - TimeBin Statistics: Time series binning for temporal data aggregation
  • Graph Builder - Multiple Stats Chain: UI for chaining multiple statistical transformations
  • Graph Builder - Sort Statistics: Unified xSort into sort stat for flexible sorting configuration

Fixed

  • Custom Graph - Threshold Scale Grouping: Fixed grouping being ignored when using Threshold Scale with Line/Step/Area geometries
  • Custom Graph - Scale Type Default: Changed default Scale Type to Categorical for better initial behavior
  • Custom Graph - Line/Step Aesthetics: Fixed Size/Linetype aesthetic mapping not working in Line/Step geometries
  • Custom Graph - Datetime Tooltip: Display datetime values in human-readable format instead of Unix timestamps
  • Custom Graph - Numeric Category Domain: Support for numeric category domain settings
  • Graph Builder - Filtered Data Statistics: Fixed Statistics not working in Filtered Data tab opened from Graph Builder
  • Graph Builder - Layout Overflow: Fixed buttons overflowing in Flexbox layout
  • Selected Rows - Menu Position: Fixed kebab menu position in Selected Rows tab
  • Open from URL - HTTP Error: Display clear error message when using HTTP URLs (HTTPS required)

[2026.01.12]

Added

  • Selected Rows - Ephemeral Dataset Support: Selected Rows tab now works with ephemeral datasets (SQL query results, filtered data)
  • Selected Rows - Dataset Name Display: Display target dataset name in the Selected Rows tab header
  • Custom Graph - Legend Control: Show/hide legend per layer with showLegend property
  • Custom Graph - Threshold Scale Without Variable: Threshold Scale can now be used without variable mapping for fixed conditional coloring

Fixed

  • Custom Graph - Bin Selection Color: Fixed bin selection color appearing blue instead of the configured highlight color when using Threshold Scale

[2026.01.11]

Added

  • GLMM (Generalized Linear Mixed Model): Mixed effects model implementation with Nelder-Mead optimization for variance component estimation
  • PCA (Principal Component Analysis): Dimensionality reduction with scree plot, loadings table, and score export to dataset
  • Statistics - Categorical Bar Chart: Frequency bar chart display for categorical columns
  • Statistics - Drilldown Analysis: Drill down into subsets by double-clicking graph elements (histogram bins, bar chart bars)
  • Selected Rows - Selection Display: Show selection conditions and "Open as Filtered Data" button
  • Custom Graph - Conditional Color Mapping: Apply different colors based on conditions (e.g., above/below threshold)
  • Report - Double-click Support: Double-clicking graph elements in Report View opens Filtered Data tab
  • Agent API: Exposed window.midas API for AI agent integration with Playwright MCP

Fixed

  • Custom Graph - vline/hline Color: Color aesthetic mapping in vline/hline geometries was ignored; now correctly applies color scale when using data-driven reference lines

[2026.01.07]

Added

  • Graph Builder - Double-click to Open Filtered Data: Double-clicking histogram bars, bar chart bars, scatter plot points, or other graph elements opens a Filtered Data tab showing only the selected rows
  • Statistics Tab - Double-click Support: Double-clicking histogram bins, category values, or time series points in Statistics Tab opens Filtered Data tab
  • Hypothesis Test - Double-click Support: Double-clicking diagnostic histogram bins in t-test panel opens Filtered Data tab
  • Custom Graph - Tooltip: Configurable tooltips for graph elements with Auto, Encoding, and Custom modes. Auto mode displays mapped aesthetics, Encoding mode allows variable selection, and Custom mode supports template syntax with x,x, y, color,color, fill, and stat output variables
  • Logs Tab: View application logs in Settings with IndexedDB persistence, log level filtering, and export functionality
  • Workspace - Tab Reordering: Drag and drop tabs to reorder them within a workspace
  • SQL Query - Edit: Edit existing SQL Query datasets from the context menu
  • Import Data - URL: Import CSV files directly from URLs in the Import Data modal

Fixed

  • SQL Query Result - DATE Format: DATE type columns now display as date-only (YYYY-MM-DD) instead of datetime format with time component

[2026.01.05]

Added

  • Graph Builder - ymean Stat: Mean line statistical transformation for control chart applications
  • Graph Builder - vline/hline UI: Vertical and horizontal reference line configuration in layer settings
  • Graph Builder - Axis Title Spacing: Configurable spacing between axis title and axis labels
  • Graph Builder - Graph Type Combobox: Searchable Combobox for Graph Type selection
  • Graph Builder - Low Cardinality Numeric: Low cardinality numeric columns available for Color/Shape/Fill aesthetics
  • Graph Builder - Auto Y-Axis Titles: Automatic Y-axis title generation for Survival and Cumsum statistics
  • Statistics - Datetime Histogram: Datetime/date column visualization changed from Rug Plot to temporal histogram with zoom controls
  • Model Retraining: GLM and Random Forest models can be retrained when training dataset is reloaded, eliminating Python pickle dependency
  • Settings - Delayed Rendering Threshold: User-configurable threshold for delayed rendering of large graphs
  • Analysis Tabs - Default Dataset: Analysis tabs now default to the active dataset when opened

Fixed

  • Custom Graph - ymean Without X: ymean stat produced no data points when X-axis was not specified; now correctly generates mean line for hline geometry
  • Custom Graph - Axis Title: Axis titles did not appear when added after initial render, and old titles persisted after removal; setup/render lifecycle now properly separated
  • Custom Graph - Multi-layer Validation: Only the first layer was validated; subsequent layers with missing X/Y aesthetics caused runtime errors instead of validation errors
  • Custom Graph - Legend Margin: 100px right margin was reserved even when no color/fill/stroke aesthetics were set; margin now automatically removed when legend is not needed
  • DerivedDataSet - Enum in Worker: Enum definitions were not passed to DuckDB worker during topological evaluation, causing enum columns to fail after project reload in certain scenarios

Changed

  • Graph Builder - Global Aesthetics: Simplified Global Aesthetics to X/Y only; other aesthetics moved to layer-specific settings
  • Public Key Export: Removed self-declared metadata from public key files

[2026.01.01]

Added

  • Graph Builder - Cumsum: Cumulative sum statistical transformation for trend analysis
    • Support for categorical X-axis in Summary/Cumsum statistics
  • Graph Builder - X Sort: X-axis sorting option in layer configuration
  • Statistics - Histogram Priority: Histogram now displayed first in single-column statistics
  • Statistics - Comparison Quantiles: Detailed percentiles (P1, P5, P10, P25, P50, P75, P90, P95, P99) in Comparison Table
  • Data Table - Column Width Persistence: Column widths saved and restored across sessions
  • Enum - Auto-Generate from Column: Generate enum definitions from dataset column values
  • Workspace - Submenu Selection: Changed New Workspace from dialog to submenu format
  • Analysis Tabs - Variable Selection UI: Improved variable selection interface for GLM, Random Forest, Kaplan-Meier, Cox Regression

Fixed

  • Custom Graph - Margin Calculation: Extra whitespace (~19px) appeared near Y-axis label due to inconsistency between margin calculation and drawing position
  • Custom Graph - Legend Margin: 100px right margin was reserved even when legend was not displayed, wasting graph space
  • Custom Graph - Datetime X-Axis: Datetime X-axis was not rendering correctly; datetime format now applied to Identity stat as well
  • Custom Graph - Categorical Bar: Bar geometry now correctly supports categorical X-axis columns
  • Custom Graph - Bar xSort Limit: Extra bars were drawn when xSort.limit was applied
  • Histogram - Show Density Error: Enabling "Show density" checkbox in Column Statistics caused Error Boundary to catch exception; layer groups are now dynamically managed
  • Histogram - Sizing: Fixed infinite resize loop in Graph Builder (flexbox min-height issue), missing px unit in width/height, and narrow drawing width in Pair Plot
  • DerivedDataSet - Scale Reset: User-defined scale changes were reset when reloading source dataset; now preserves scales marked as inferredAutomatically: false
  • Enum - Type Conversion: Silent fallback to VARCHAR when enumName was not specified; now shows proper UI feedback and falls back to string type when enum definitions are invalid
  • Enum - Statistics Display: Enum columns now display statistics correctly, matching string type behavior
  • Statistics - Quantiles Format: Quantiles display in Comparison Table now uses consistent numeric notation instead of mixed formats
  • Project Lineage - Theme Colors: Hardcoded color values replaced with theme variables for consistent theming
  • Sorting - Null Values: Null values now always placed last when sorting, regardless of sort direction

[2025.12.30]

Added

  • Random Forest: Machine learning prediction using Pyodide (scikit-learn)
    • Training with configurable parameters (n_estimators, max_depth, etc.)
    • OOB (Out-of-Bag) score for model evaluation
    • Prediction on new datasets with result visualization
    • Confusion matrix and classification metrics for evaluation
  • Graph Builder - Scatter Plot Integration: Scatter Plot now uses Custom Graph renderer
    • Brush selection for selecting data points by dragging
    • 2D density visualization with configurable color scales
    • Delayed rendering for large datasets
  • Custom Graph - Statistics: Added xmean and xmedian statistical transformations for vertical reference lines
  • Workspace Template: Save and restore workspace layouts as templates
  • Project Lineage - Schema: Display column schema information in the detail panel
  • PWA - CDN Caching: DuckDB and Pyodide CDN resources are now cached for offline use
  • Empty Pane Delete: Added delete button to empty panes for easier workspace management
  • DerivedDataSet Reload: Reload parent PrimaryDataSet from DerivedDataSet context menu
  • Enum Dependency Check: Warning dialog when editing enum definitions that are used by columns
  • Help Menu - English Docs: Enabled Documentation > English menu item

Fixed

  • DerivedDataSet - Enum Inheritance: Enum type and enumName were not inherited from parent schema, causing enum columns to appear as string type
  • DerivedDataSet - Ordinal Sort: Ordinal scale columns were sorted alphabetically instead of enum definition order
  • Custom Graph - Ribbon Geom: ymin/ymax aesthetics were ignored; Ribbon geometry now renders confidence bands correctly
  • GLM - isRunning State: isRunning flag was not reset when data validation failed, leaving the UI in loading state
  • GLM - Prediction: Fixed pWithIntercept and getZQuantile calculation errors
  • GLM - Performance: Factorial calculation optimized from O(n) to O(1) using lgamma function
  • Type Conversion - Enum: After converting column to enum type, DataTable showed string type because Arrow format returns enum as UTF8
  • SplitPane: Keyboard resize used fixed 10%/90% limits while mouse used dynamic limits; both now use same dynamic constraint calculation
  • Survival Analysis Tab: View > New Tab showed "Survival Analysis" option which didn't match TabRegistry entries; split into "Kaplan-Meier" and "Cox Regression"
  • Statistics Tab: Content had no right-side padding, causing asymmetric layout; added 12px right padding

[2025.12.24]

Added

  • Kaplan-Meier Tab: Dedicated tab for Kaplan-Meier survival analysis with survival curves and Log-rank tests
  • Cox Regression Tab: Dedicated tab for Cox proportional hazards regression results
  • Graph Builder - Kaplan-Meier Curve: Stat transformation for Kaplan-Meier survival curves with confidence intervals
  • Statistics - Context Help: Inline help explaining statistical measures
  • Dataset Reload: Reload PrimaryDataSet from Project Overview and Project Lineage

Fixed

  • Tab Content Scroll: Prevent scroll chaining when scrolling within tab content
  • Invalid Project URL: Show error message when accessing non-existent project ID via URL
  • Active Panel Indicator: Changed indicator style to border-top for better visibility
  • Context Menu z-index: Fixed context menu appearing behind other elements
  • DerivedDataSet Scale Inheritance: Columns now inherit scale from parent dataset
  • Edit Mode Cache: DuckDB cache now updates correctly after Edit Mode changes
  • Settings Dialog Size: Dialog size now stays fixed when switching tabs
  • Project Lineage Scroll: Fixed scroll target in detail panel

[2025.12.21]

Added

  • Graph Builder - Step Geometry: Step geometry for staircase-style line connections
  • Statistics - Detailed Quantiles: Enhanced quantiles display (P1, P5, P10, P25, P50, P75, P90, P95, P99)
  • MDS Signature Warning: Warning dialog when opening MDS files with unknown signatures

Fixed

  • About Dialog: Updated About dialog image to new blue-based design
  • View Menu - Fullscreen: Toggle Fullscreen menu item now reflects actual fullscreen state
  • Project Lineage - Context Menu: Context menu now closes when clicking outside

Security

  • Key Export: Changed key pair export to password-encrypted format

[2025.12.19]

Added

  • MDS Signature: Sign and verify MDS project files with Ed25519 keys
    • Generate and manage signing keys in Settings
    • Sign projects to ensure integrity and authenticity
    • Verify signatures when opening MDS files

Fixed

  • Data Table/Filtered Data: Preserve filter state when splitting or merging panes
  • Crosstab: Show error message when required fields are not set
  • URL Dataset: Fix cache being used when reloading datasets from URL

Breaking Changes

  • MDS Format: Signature metadata added to MDS file structure. Older versions of MIDAS cannot open signed MDS files.

[2025.12.17]

Added

  • Reshape (Wide/Long): Transform data between wide and long formats
    • Wide to Long: Unpivot multiple columns into key-value pairs
    • Long to Wide: Pivot key-value pairs into separate columns
    • Preview before saving, with row count display
  • Hypothesis Testing: Statistical hypothesis tests with diagnostic visualizations
    • Independent samples t-test with Welch's correction
    • One-sample t-test
    • Shapiro-Wilk normality test
    • Q-Q plot and histogram diagnostics
    • APA format result copy
  • Project Lineage: Redesigned lineage view with improved node layout and visual clarity
  • View Menu: Added Dataset and Report submenus for quick navigation

Fixed

  • Bin Statistics: Now supports datetime and date type columns
  • Type Conversion: Removed unnecessary checkbox from settings dialog

[2025.12.15]

Added

  • ZIP Import: Import multiple CSV files from a single ZIP archive with preview modal
  • Statistics - Relationships Section: Display relationships between multiple selected columns
    • Correlation matrix with heatmap visualization
    • Pair Plot for numeric columns (2-4 columns)
    • Categorical × Numeric bar charts showing group means
    • Categorical × Categorical cross-tabulation tables
  • Statistics - Skewness/Kurtosis: Added skewness and excess kurtosis to Moments section

Changed

  • Statistics - Compact Display: Redesigned statistics display for better readability
    • Basic info in single line (type, scale, n, missing)
    • Moments and Quantiles in horizontal groups
  • Statistics - Column Type Classification: Changed from data type to measurement scale for determining numeric vs categorical

[2025.12.10-1]

Added

  • Open from URL: Support for opening MDS project files from URL

Fixed

  • Embed Mode: Prevent editing report graph titles in embed mode

[2025.12.09]

Added

  • Landing Page: Added a new landing page at the root URL (/)
    • Hero section with app screenshot
    • Feature highlights and privacy information
    • OGP meta tags for social media sharing
  • English Documentation: Added English translation of all user documentation (12 pages)
    • Getting Started, Data Table, Statistics, Graph Builder, Custom Graph, SQL Editor, Crosstab, Reports, etc.
    • Static HTML generation for English docs
  • Create Dataset: Create new empty datasets from the File menu
  • Selected Rows to Dataset: Create a derived dataset from selected rows in the Selected Rows tab
  • Sandbox Mode: Added sandbox mode for embedding MIDAS in documentation with interactive demos
  • Bin Statistics - Boundary/Center: Added boundary and center parameters for histogram bin alignment

Changed

  • URL Change: The application URL has changed from / to /app.

Fixed

  • Statistics Tab - Kebab Menu: Added kebab menu to all graphs (histogram, scatter plot, time series, date distribution) with "Add to Report" and "Open in Graph Builder" options
  • NULL Display: Improved NULL value display with distinct styling
  • Tab Creation Modal: Fixed infinite loop error in TabCreationComboBox
  • Primary Dataset Edit: Invalidate dependent element caches when editing primary datasets
  • Stale Model Blocking: Block predictions and diagnostics for stale models instead of deleting them

[2025.12.05]

Added

  • Data Table - Edit Mode: Added editing capabilities for primary datasets
    • Inline cell editing with double-click
    • Add new rows
    • Delete rows
  • Project Diff: Compare current project state with saved MDS files
    • Detect changes in datasets, models, and reports
    • Visual diff UI with detailed change information
    • Clickable dataset ID links to open corresponding tabs
  • Report - Markdown Editor: Migrated report editor to CodeMirror with syntax highlighting, autocomplete for element references, and collapsible element preview section
  • Report - Aspect Ratio: Added aspect ratio setting for report elements
  • Report - Element Menu: Added menu button in inline preview with Duplicate and Open Source Dataset options
  • Report - Multi-Reference Warning: Show warning when modifying elements that are referenced multiple times
  • Data Table - Cell Tooltip: Show tooltip with full cell content on hover (500ms delay)
  • Graph Builder - Facet Category Limit: Added Max Facet Categories setting in Settings > Graph tab to prevent browser freezing when selecting columns with too many categories
  • AI Agent Command Interface: Added x: command system for AI agent integration
    • x:tab - Create and configure analysis tabs (SQL Editor, Statistics, GLM, Graph Builder, etc.)
    • x:dataset - Create derived datasets via SQL queries
    • x:report - Add graphs and text to reports
    • x:model - Execute GLM models
    • x:status, x:list, x:describe - Query project state
  • Console Mode: Added console mode UI for AI agents to execute commands and view results
  • Console Mode: Display only the latest command result in UI (full history available in browser console)
  • AI Agent Command - Dataset: Auto-resolve targetDatasetId from SQL query for sql_query type operations
  • Crosstab - Multi-Value Fields: Crosstab now supports multiple value fields with aggregation
  • Custom Graph - Facet Column Types: Facet now accepts all column types (Int64, Float64, datetime, etc.), not just categorical columns

Fixed

  • Custom Graph - Legend Ordinal Order: Fixed legend not respecting ordinal order when ordinal variable is assigned to Fill, Color, Stroke, Shape, or Linetype aesthetics
  • Report - Element Menu (Firefox): Fixed report element menu not clickable in Firefox
  • Report - View Settings: Fixed View Settings not working for graphs in reports
  • Report - Embed Mode: Fixed report tab disappearing when navigating back from embed mode
  • Report - Embed Mode Save: Save project to OPFS before entering embed mode to prevent data loss
  • Data Table Menu - Checkbox UI: Fixed "Save data with project" checkbox not visually updating when clicked directly on the checkbox
  • Data Table - File Selection: Fixed file selection to use input element so it can be opened from command palette
  • Custom Graph - Int64 Axis Tick: Fixed decimal tick values appearing on Int64 type axis
  • SQL Query Editor - INTERVAL Type: Display DuckDB INTERVAL type in human-readable format
  • Storage Management: Display project names instead of project IDs in the Saved Projects list
  • Dataset Rename: Automatically update SQL queries when renaming a dataset that is referenced by SQL Query operations
  • SQL Query Editor: Fixed false positive detection of multiple statements when semicolon appears inside string literals
  • Project Lineage: Fixed table references in SQL subqueries not being detected for lineage tracking
    • WHERE clause subqueries (IN, NOT IN, EXISTS, comparison)
    • Scalar subqueries in SELECT list
    • HAVING clause subqueries
    • FROM clause subqueries (derived tables)
    • Nested subqueries
  • SQL Query Editor: Fixed UNION/INTERSECT/EXCEPT queries being incorrectly rejected as unsafe operations
  • E2E Test - Quick Access: Fixed test using CSS class selector that didn't work in production builds

[2025.12.01]

Added

  • Open from URL - CSV Support: Load CSV files directly from URLs with progress display, cancellation, and Content-Type validation
  • Application Settings: Added settings dialog with trusted URL whitelist management for Open from URL
  • Report - Add Text Button: Added "Add Text" button to report header kebab menu

Fixed

  • Graph Builder - X-Axis Label Rotation: Improved label rotation logic to compare label width with band width
  • Data Table - Filter Expression: Unified filter expression syntax to DuckDB SQL standard (quotes and operators)
  • Settings - UI Separation: Separated Settings and Storage Management into distinct buttons
  • DuckDB Worker - Initialization: Fixed DuckDB being initialized twice in worker
  • Data Table - Save Filtered Dataset: Automatically opens the new tab after saving filtered dataset
  • Time Series - Resize: Fixed Time Series graph not resizing with container
  • Create New Tab - Linear Regression: Removed deprecated Linear Regression option from dialog

[2025.11.30]

Added

  • PWA Support: Added Progressive Web App support for offline access and installation
  • DuckDB Worker - SQL Cancel: DuckDB now runs in a Web Worker with SQL query cancellation support
  • Data Table - Save Filtered Data: Filter results can now be saved as derived datasets
  • Graph Builder - Tile Ordinal Axis: Tile (Heatmap) now supports ordinal axis scales

Fixed

  • Data Table - Reload Cache: Fixed transitive derived dataset cache not being cleared on primary dataset reload
  • SQL Editor - DATE Type: Fixed DATE type displaying as numbers in SQL query results
  • Graph Builder - Dataset Selection: Fixed ID duplication error in dataset selection
  • SQL Editor - Materialized View: Fixed Materialized View checkbox state not persisting correctly

[2025.11.27]

Added

  • Help Menu - Documentation: Added Documentation submenu with Japanese/English links
  • Graph Builder - Geom Tile: Added geom_tile for creating heatmaps and tile-based visualizations
    • Supports continuous color scales for numeric fill values
  • Graph Builder - Summary Statistics: Added stat_summary transformation for aggregate visualizations
    • Mean, median, min, max, sum, and custom percentile functions
    • Output selection (y, ymin, ymax) for different geometry types
    • Complete option to show all x-axis categories including those with no data
  • Graph Builder - Fixed Fill Color: Added option to set a fixed fill color independent of data
  • Dataset Metadata - Description: Added ability to edit dataset descriptions in Dataset Metadata modal

Fixed

  • Graph Builder - Facets: Fixed aesthetic scale domains to be unified across all facet panels
  • Graph Builder - Facets: Fixed "Complete missing combinations" option to apply consistently across all panels
  • Graph Builder - Alpha Aesthetic: Enabled Alpha aesthetic mapping for Bar, Line, Area, and Tile geometries

[2025.11.25]

Added

  • Project Lineage - Context Menu: Right-click context menu for lineage graph nodes
    • Open/Delete menu for datasets, models, and reports (Focus/Close for tabs)
    • Shows dependencies in warning dialog before deletion
    • Deletes all dependent objects when confirmed
  • Documentation Link: Added "Documentation (ja)" link in About dialog for quick access to Japanese documentation
  • MDS URL Duplicate Detection: Prevent duplicate projects when opening same URL multiple times
    • Shows confirmation dialog when opening an MDS URL that was previously loaded
    • Three options: Open Existing (use cached version), Open as New (create new copy), or Cancel
    • Displays project information (name, last modified, fetched time) in confirmation dialog
    • Tracks source URL and fetch timestamp for each project (sourceUrl, sourceUrlFetchedAt)
    • Helps users avoid accidentally creating duplicate projects from the same source
  • Embed Mode - Local Projects: Enter Embed mode from locally opened projects
    • "Embed Mode" menu item in report menu (⋮ button)
    • Browser back button returns to normal ProjectView
    • Auto-loads project from storage when accessing embed URL directly

Fixed

  • Embed Mode - External MDS Loading: Fixed /?mds=<URL>&embed=true not working at root path
    • Root path with mds parameter now correctly renders EmbedView
    • Shows proper error message when mds parameter is missing in embed mode

Removed

  • Report HTML Export: Removed the "Export Report as HTML" feature
    • The hacky DOM-cloning approach had reliability issues with CSS and SVG rendering
    • Use browser's print function (Cmd+P / Ctrl+P) and "Save as PDF" as an alternative

[2025.11.24]

Added

  • Embed Mode: Embed reports in external websites using iframe
    • URL format: ?mds=<URL>&embed=true&report-id=<ID> or &report-name=<NAME>
    • Clean view-only display without menus or editing UI
    • "Created with MIDAS" attribution in bottom-right corner
    • Falls back to first report if no report specified
  • Graph Builder - Responsive Height: Graphs now automatically adjust to container height changes
  • URL-based MDS Loading: Load MDS project files directly from URLs using ?mds= parameter
    • Share projects by simply sharing a URL
    • Three-tier security validation: blocks cloud metadata endpoints, URL-based whitelist, warning dialogs for untrusted sources
    • 10MB file size limit to prevent DoS attacks
    • Protects users by warning about public file hosting services (GitHub, S3, etc.) where unverified content may exist
    • SEO-friendly canonical URLs (excludes tracking parameters)

Fixed

  • Graph Builder - Pair Plot: Fixed Pair Plot to scale dynamically based on container size instead of using fixed dimensions
  • Crosstab - Bar in Cell: Fixed minimum values showing no bar in Bar in Cell visual mode
  • Statistics: Fixed date/datetime column statistics (Earliest/Latest/Time span) not displaying

Changed

  • ID Generation: Unified all ID generation to use UUID v4 format with type-specific prefixes
    • All elements (graphs, reports, datasets, tabs) now use globally unique identifiers
    • Prefixes (graph-, report-, dataset-, etc.) maintained for better debugging experience
    • Eliminates potential ID collision issues in distributed or concurrent usage scenarios

[2025.11.21]

Added

  • Custom Graph - Facets: Facet Wrap and Facet Grid functionality
    • Split data by categorical variables to create multiple sub-graphs
    • Facet Wrap: Grid layout with single variable
    • Facet Grid: 2D grid with row and column variables
    • Horizontal scrolling for viewing all panels when exceeding screen width
  • Custom Graph - Density (KDE): Kernel Density Estimation statistical transformation
    • Added as independent layer statistics option alongside Identity/Count/Bin
    • Bandwidth parameter configuration
    • Y Scale options (count/density) for both Bin and Density statistics
    • Automatic "Density" Y-axis title generation
    • Grouped density curves by categorical aesthetics (color/fill/stroke)
  • Custom Graph - Secondary Y Axis: Dual Y-axis support for overlaying different scales
    • Configure right-side Y axis independently (scale type, title, domain, ticks)
    • Per-layer Y axis selection (Primary/Secondary)
    • Synchronized zoom behavior across both axes
    • Available in Cartesian coordinate system only
  • Custom Graph - Categorical Color Palette: Discrete color palette for categorical variables
    • Optimized color selection for categorical data visualization
  • Documentation: Enhanced documentation site features
    • Left sidebar navigation for improved browsing
    • 404 error page for invalid documentation URLs
  • Graph Builder - Responsive Preview: Dynamic preview height adjustment based on content

Fixed

  • Custom Graph - Color/Fill Specification: Unified color and fill aesthetics to match ggplot2 conventions
    • Bar: fill for bar color, color for border (removed color fallback to fill)
    • Area: fill for area color, color for border, changed grouping from color to fill
    • Point/Line: No changes (already compliant)
    • Added fillScale and strokeScale support across all layers
  • Custom Graph - Layer Aesthetics: Show only supported aesthetics per geometry type
    • Point: x, y, color, fill, stroke, size, shape, alpha
    • Line: x, y, color, size, linetype, alpha
    • Bar: x, y, fill, color, alpha (stroke not supported)
    • Area: x, y, fill, color, alpha
    • Prevents configuration of unsupported aesthetics that would be ignored
  • Custom Graph - Bar Position Settings: Position (Identity/Stack/Dodge) now applies correctly
  • Custom Graph - Bar Display: Corrected bar rendering issues
  • Custom Graph - Stack Position: Fixed stacked bar/area positioning calculation
  • Custom Graph - Bar Axis Overlap: Bars no longer overlap with axis lines
  • Custom Graph - Bin Statistics Aesthetics: Aesthetics (color/fill/size) now preserved when using Bin statistics
  • Custom Graph - Legend Titles: Column names now display correctly in legend titles instead of column IDs
  • Custom Graph - Bar Layer: Disabled color aesthetic for Bar layers (fill is the correct aesthetic for bars)
  • Custom Graph - Query Result Categorical Axes: Categorical columns from Query Result datasets now recognized properly
  • Custom Graph - Axis Labels: Automatic generation of axis labels (axis titles) from column names
  • Custom Graph - X Axis Tick Overlap: Fixed overlapping tick labels on X axis
  • Custom Graph - Facet Settings Layout: Improved Columns and Rows layout in Facet configuration UI
  • Custom Graph - Facet Responsive Sizing: Facet panels now resize dynamically based on parent container dimensions
  • Custom Graph - Facet Label Clipping: X axis labels in faceted graphs no longer get clipped
  • Custom Graph - Density with Faceting: Density curves and faceting can now be used simultaneously
  • Custom Graph - Flip Coordinate Histograms: Numeric histograms now render correctly when using flip coordinate system
  • Custom Graph - Density Y Axis Requirement: Fixed Density statistics specification to correctly indicate Y axis is not required
  • Graph Builder - Preview Scroll: Fixed scroll behavior in preview container
  • Graph Builder - Dataset Dropdown: Corrected dataset dropdown display issues

[2025.11.17]

Added

  • Custom Graph: Grammar of Graphics-based graph creation feature
    • Multiple geometry types (Point/Line/Bar/Area)
    • Layer-based multi-layer support
    • Statistical transformations (Identity/Count/Bin) and position adjustments (Identity/Stack/Dodge)
    • Categorical scale and color scale configuration UI
    • Additional aesthetic channels (size, fill, stroke, alpha)
    • Coordinate system transformations (cartesian/flip) and legend rendering
    • Support for ordinal/nominal columns
    • Category order customization with Reverse button
    • Two-pane layout with collapsible configuration sections

Fixed

  • Project Lineage: Fixed issue where SQL dependencies with multiple tables were not tracked correctly
    • Added support for CROSS_PRODUCT (comma-separated tables)
    • Removed duplicate edge creation
  • Graph Builder: Fixed issue where previous rendering remained when settings changed
  • DerivedDataSet: Fixed recursive evaluation of parent datasets
  • Data Table: Fixed conflict between cell copy feature and row context menu

Performance

  • DuckDB: Improved DuckDB initialization speed for SQL evaluation

[2025.11.05-2]

Fixed

  • Column Type Conversion: Fixed issue where excluded rows were not preserved after project save and reload when using EXCLUDE mode (#174)
  • Histogram: Fixed rendering issue for datasets with 1000+ rows (#176)
  • Graph Builder - Bar Chart: Fixed D3 scale replacement issue causing incorrect bar positioning

[2025.11.05]

Added

  • Dummy Coding: Transform categorical variables into dummy variables for GLM analysis
    • Option to keep original columns alongside dummy variables
    • Scale transformation functionality for categorical variables
    • Boolean columns included as-is by default
  • Dataset Metadata: Display dataset information modal showing row count, column count, data types, and other metadata
  • GLM: Web Worker implementation for non-blocking computation
    • Real-time progress tracking with iteration details
    • Convergence history saved as dataset for analysis
    • Coefficient display organized by variable in convergence history table

Fixed

  • Convert Column Type: Fixed error when dataset names contain spaces
  • Filtered Data: Fixed issue where filtered datasets created from DerivedDataSets failed to load after saving and reopening project files
  • GLM: Fixed handling of negative predicted values (μ<0) in Gaussian GLM
  • GLM Progress Dialog: Fixed layout shift during progress updates
  • GLM Convergence History: Fixed data type issues with theta_iter column and improved log-likelihood display
  • Project View: Prevented unintended scrolling behavior
  • Dummy Coding: Fixed persistence of dummy-coded datasets in project files

Performance

  • GLM: 4.7x performance improvement using TypedArray optimization

[2025.11.01]

Added

  • Release Notes: View release history from Help menu and About dialog

[2025.10.31]

Added

  • Graph Builder: Filter functionality to subset data in visualizations
  • Graph Builder - Scatter Plot: Display count of overlapping points in tooltips
  • File Format: MDS project files are now compressed with gzip, reducing file size

Fixed

  • Project Management: Project names are now properly saved and displayed in the project list
  • Project Loading: Improved performance by loading metadata only when listing projects

[2025.10.23]

Added

  • Graph Builder - Bar Chart: Top N filtering and custom sorting options
  • SQL Editor: Overwrite existing datasets functionality
  • Project Lineage: Display dependencies in duplicate name dialog

Fixed

  • Performance: Fixed stack overflow when clicking interval scale columns with large datasets
  • Graph Builder: Fixed issue where user-selected DerivedDataSet was ignored
  • Data Table: Fixed abnormally large column headers
  • Data Table: Improved row number header z-index for better scrolling display
  • UI: Hidden scrollbar in tab header area
  • SQL Editor: Fixed initial query not displaying
  • SQL Query Viewer: Improved color scheme and spacing

[2025.10.22]

Added

  • GLM: Prediction functionality for trained models
  • Graph Builder - Histogram: Faceted mode with statistical annotations
  • Graph Builder - Pair Plot: Multi-variable scatter plot matrix visualization
  • Graph Builder - Scatter Plot: 2D density visualization with configurable color scales
  • SQL Editor: Integrated CodeMirror for improved editing experience
  • Data Management: Dataset deletion with dependency checking

Fixed

  • GLM: Store feature metadata by column ID, resolve names from training dataset during prediction
  • SQL: Allow referencing unevaluated DerivedDataSet in FROM clause
  • Pair Plot: Unified axis positions and colors between histograms and scatter plots
  • UI: Export project dialog now properly displays as single modal

[2025.10.19]

Fixed

  • Sample Data: Fixed country name formatting in Gapminder dataset

[2025.10.18]

Added

  • Initial release