Changelog

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

[2026.08.03]

Added

  • Synthetic Data Generator - Factors and a Time Column Declare the Row Structure: Declaring factors — each a name with a list of levels — generates one cell per combination of levels with Rows per cell rows in each, so the row count follows from the declaration and every cell has the same number of rows. A Time column expands each of those rows into a series running from time 1 to its Length, laid out in time order. Factor and time columns become columns of the generated dataset
  • Synthetic Data Generator - Per-Group Values with By: Setting By on a column draws its value once per group and shares it across all of the group's rows — a group-level intercept shift, for example. By accepts factor, time, and categorical columns; listing several columns makes nested or crossed groupings, and naming the time column draws one value per time point shared across all series
  • Synthetic Data Generator - lag() References Past Values Within a Series: With a Time column declared, lag(column, k) in an expression returns the value k rows earlier in the same series, so a column can reference its own past — as in a Mean of 0.7 * lag(y, 1) — to generate autoregressive series. A lag pointing before the start of a series returns 0, and a definition in which two columns reference each other's lag is rejected as circular
  • Synthetic Data Generator - Comparison Operators and pow, min, max, abs in Expressions: Expressions now support the comparisons <, <=, >, and >=, which return 1 when true and 0 when false, so indicator terms can be written as products such as (0 < x) * (x < 1); a comparison involving NaN returns NaN, so an out-of-domain calculation fails the generation instead of slipping into the data as a 0 or 1. The functions pow, min, max, and abs join the existing exp, log, sqrt, and logistic
  • Synthetic Data Generator - Weibull Distribution: A Weibull distribution parameterized by Shape and Scale joins the available distributions, for lifetimes and failure times
  • Synthetic Data Generator - Presets for Three Common Designs: Choosing a preset replaces the row structure and the columns as a starting point for editing: Multilevel (random intercept) with 40 schools × 10 students, Repeated measures (subject × time) with 30 subjects × 8 time points, and Correlated random intercept and slope with 40 sites × 10 observations
  • Agent API - Synthetic Data Row Structure and Presets: The spec for datasets.generateSynthetic takes the row structure as factors, rowsPerCell, and time, and the rows option can then be omitted — a rows value that contradicts the declared structure is rejected. datasets.listSyntheticPresets returns the presets with their full specs
  • Agent API - Tab Activation and Layout Structure: tabs.activate(tabId) brings an open tab to the front of its pane, matching what clicking it does in the UI. layout.get() returns the pane tree — each split's direction, ratio, and children, and each pane's tabs and active tab
  • Agent API - Reshape, Dummy Coding, and Filtering: datasets.reshapeWideToLong, datasets.reshapeLongToWide, datasets.dummyCode, and datasets.filter create derived datasets the same way as the Reshape tab, the Dummy Coding tab, and a Data Table filter, with the same lineage and re-derivation behavior as their UI counterparts
  • Data Table - Edit an Existing Display as Link Setting Directly: A column with Display as Link configured now shows Edit Link Display... in its context menu, opening the dialog with the existing URL template already filled in, instead of requiring Remove Link Display first

Changed

  • Synthetic Data Generator - The Per-Group Distribution Kind Is Replaced by By: The distribution kind that drew a value separately within each group is removed; the same data is now declared by giving the column any distribution and setting its By to the grouping columns

Fixed

  • About - Release Notes and Legal Links Could Not Be Opened from the Keyboard: In the About dialog, the Release Notes, Terms of Service, and Privacy Policy links — and the About, Terms of Service, and Privacy Policy links at the bottom of the launcher screen — could not be reached with the Tab key or opened with Enter; they now work from the keyboard. The dialog also lays out its footer links on two lines instead of wrapping mid-word, and drops the feature summary to stay compact
  • Data Management - Opening an MDS as a Copy Could Leave a Bloated Working Copy: Opening certain saved MDS files as a copy could leave the new project's working copy holding dataset contents that should have been recomputed instead of stored, using more storage than needed until the next save; this is now avoided on every save
  • Data Table - A Hand-Written Filter Expression Compared Date and Datetime Values as Text: A filter expression typed into the Data Table filter field compared date and datetime columns as text instead of by their actual value, so a row could be silently excluded depending on how the date was written — for example, ts >= '2024-06-01T09:00:00Z' excluded a row whose stored value was that exact instant. Comparisons, IN, and BETWEEN now compare by the column's actual type
  • Graph Builder - Removing a Column From a Global Aesthetic Left Its Legend Position in Effect: A layer's legend position could keep following a scale setting left over after its column was removed from a global aesthetic shared across layers, even though that setting was no longer shown or editable on screen. Legend position now ignores a channel with no column mapped
  • Graph Builder - Changing a Layer's Fill Column Discarded Its Other Scale Settings: Changing which column was mapped to a layer's fill aesthetic discarded its legend title, domain, and threshold settings, keeping only the scale type, palette, and legend position; changing the fill column now keeps the rest of the scale settings
  • Dummy Coding - Re-deriving a Dataset Reverted Its Settings to Defaults: Re-deriving a Dummy Coding dataset — after a source reload, or opening a newly created one before it was saved — dropped which columns were included, which columns kept their original alongside the dummy variables, and any scale overrides, replacing them with defaults instead of what was configured; these settings are now persisted and used on every re-derivation
  • Dummy Coding - A Dummy Column Could Silently Start Representing a Different Category: When the source data's set of categories changed, a dummy column's ID and name were assigned by position, so the same column could end up standing for a different category than the one it was created for, and a model or report built on it would silently start measuring something else; dummy columns are now identified by category instead of position
  • Dummy Coding - The Coefficient Explanation Described a Difference in the Response Instead of the Linear Predictor: Text in the tab and documentation described each dummy variable's coefficient as the difference in the response variable from the reference category; this only holds when the link function is identity. With a logistic or Poisson link, the coefficient is a difference on the linear predictor scale (log-odds or a log rate) instead, and the text now says so
  • Statistical Models - Deleting a Model or Switching Projects Left Its Re-estimation State and Failure Notification Behind: Deleting a model did not clear its estimation state or re-estimation failure notification, so Model Detail could keep showing a deleted model as still estimating; closing or switching projects left the same kind of state behind. Both are now cleared
  • ANOVA - Re-estimation After a Reload Showed a Less Helpful Rank-Deficiency Message: When a dataset reload made an ANOVA model's design matrix rank deficient, the re-estimation failure notification showed the underlying error text instead of the explanation shown for the same problem in the tab; both now show the same explanation
  • Agent API - query and derive Returned a Different Error Code Than addColumns for a Reserved Column Name: Using a reserved __midas_-prefixed output column name returned EXECUTION_ERROR from datasets.query and datasets.derive, unlike datasets.addColumns, which returns INVALID_INPUT; both now return INVALID_INPUT
  • Agent API - Malformed Graph Configuration Values Could Throw Instead of Returning an Error: Passing a wrong-typed value into a graph configuration field — null where a list of layers was expected, for example — could throw an exception from the graph configuration methods instead of returning a normal API result; malformed input is now rejected or dropped with a warning instead of crashing the call

[2026.07.30]

Fixed

  • Data Management - The Table Went Blank When Rows Shrank While Scrolled Down: When the number of rows shown shrank while the view was scrolled deep — applying a Data Table filter, or switching the type-conversion preview to Show excluded rows only — the drawing started past the last remaining row and no rows were drawn, leaving a white area with the column headers at the bottom edge; the scroll position is now clamped to the new row count
  • Data Management - Convert Column Types Preview Froze on a Large Dataset: The conversion preview drew every row at once, so on a dataset of hundreds of thousands of rows the page stopped responding for minutes; it now draws only the rows in view, like the Data Table. The Show excluded rows only checkbox, which previously had no effect, now restricts the preview to the rows the conversion would exclude
  • Data Management - A Filtered Data Tab Kept Showing Old Rows After Its Source Changed: A Filtered Data tab opened by a drill-down or row selection kept showing a copy of the rows taken when it was opened, even after its source dataset was reloaded or edited; it now re-derives its rows from the changed source with the stored filter, and when a column the filter references no longer exists, it reports that and keeps the previous view
  • Data Management - A Date Outside Years 1–9999 Corrupted the Result or Failed the Query: A date or timestamp value outside years 1 to 9999 in the result of a dataset operation was stored as a corrupted string (for example '+099999-01'), and a value far enough outside made the whole query fail; such a value now becomes a missing value, with a warning giving the column and the number of rows affected
  • Data Management - A NaN in a Date Column Became 1970-01-01 and in a Datetime Column Failed the Operation: When a date column contained a numeric NaN, registering the dataset with the query engine stored it as 1970-01-01 — a valid-looking date — and a NaN in a datetime column made the registration fail, so every operation on that dataset failed; both now become missing values
  • Data Table - Clearing a Sort While a Filter Was Active Kept the Sorted Order: With a filter applied, sorting a column and then clearing the sort left the rows in the last sorted order instead of returning to the filter's original order, and the row order written by Save Filtered Data could depend on it; both now follow the unsorted filter order
  • Cox Regression and Kaplan-Meier - An Event Coding Other Than 0/1 Was Silently Treated as All Censored: An event column using another coding — for example 1 = censored, 2 = event — ran with every row counted as censored and nothing indicating it; the analysis now stops with an error listing the unexpected values and their row counts, most frequent first, and asking for 1 = event, 0 = censored. A time column containing zero or negative values is reported the same way, and a Cox regression whose data contain no events now shows an error instead of failing without a message
  • ANOVA - Missing-Value Exclusion Could Empty a Factor Level Without Notice: Rows dropped for missing values could remove a factor level or a two-way cell entirely with nothing indicating it, and the group statistics did not show how many rows each group lost. The group statistics now include an Excluded column when any rows were dropped, with rows that cannot be attributed to a group (missing factor value) noted below the table; a warning names a level or cell that disappeared; and a two-way analysis with interaction whose cell was emptied by the exclusion reports the exclusion as the cause instead of a generic empty-cell error. The exclusion breakdown is also available through the Agent API. The saved two-way group-statistics dataset also showed its Group column as two levels joined by a control character; it now reads "A × B"
  • Random Forest - OOB Accuracy Showed 0 When No Sample Had an OOB Prediction: A classification Random Forest in which no sample was ever out-of-bag showed an OOB accuracy of 0, indistinguishable from a model that got every out-of-bag prediction wrong; it now shows "-" with a warning explaining the cause and noting that permutation importance shows 0 for the same reason
  • Graph Builder - Stacked Area Series Split Only by Color Merged Into One Tangled Area: In a stacked or fill-position area chart whose series were distinguished by the color aesthetic with no fill assigned, the stacking treated each color as its own series but the drawing joined all points into a single path, connecting points across series into a self-intersecting fill — and such a chart could also raise a false duplicate-X warning; each series is now drawn as its own area
  • Graph Builder - A Categorical Column With a Continuous Color Scale Crashed a Faceted Graph: A graph mapping a categorical column to color or fill with a diverging scale type, combined with facets, threw a rendering error that brought down the whole Reports tab (with a sequential scale type it silently drew with a broken color mapping instead). The column type now wins: such a graph draws with a categorical scale, and a warning states that interpretation. The same rework fixes related facet problems: a numeric column's color domain shared across panels could shrink, domain min and max settings were ignored with facets, and a domain with min and max swapped, a non-finite bound, or an out-of-range center is now corrected with a warning
  • Reports - One Element's Rendering Error Brought Down the Whole Reports Tab: A rendering error in a single report element replaced the entire Reports tab with an error screen; the failure now stays inside that element, which shows an error notice in its place — the other elements still render, the failed element can still be edited or deleted, and fixing its settings restores it
  • Agent API - renderStatus Judged a Faceted Graph Without Splitting Panels: The renderStatus returned by reports.addGraph, reports.updateElement, and reports.getContent evaluated a faceted graph as one panel over the whole dataset, so it could report ok while the actual rendering, which splits the data into panels, failed or drew nothing; the status is now computed with the same panel splitting as the rendering — empty when no panel has a drawable point or the facet column is missing, error when the panel count exceeds the Max Facet Panels limit. A configuration the graph screen rejects with an error also now reports error. Panel warnings — in renderWarnings, which tabs.getGraphBuilder returns as well — carry the panel title, and a warning common to all panels is reported once
  • Agent API - A Color-Scale Type Conflicting With the Column Type Passed Validation Silently: layers[].scales accepted a scaleType or palette inconsistent with the assigned column's type — a diverging scale on a categorical column, for example — with no warning, even though rendering resolves such a scale to categorical and an incompatible palette then keeps the graph from being drawn; the response now warns with the actual interpretation and its consequences. An unrecognized scaleType string, which was stored as-is and later crashed graph rendering, is now removed at the input with a warning

Performance

  • Data Import - Importing a Large CSV Takes Less Than Half the Time: Column-type detection now narrows the candidate types on a sample of rows and then verifies only the surviving candidates against every row, without changing which types are detected; on a 500,000-row, 9-column file this cut detection from about 16 seconds to 1.2 and the whole import from about 27 seconds to 11. The automatic save right after import also no longer serializes derived data that can be recomputed from the primary data, halving the saved size and the save time
  • Data Management - Faster First Analysis on a Large Dataset: Registering a dataset's rows with the query engine — done before the first analysis operation after an import, a reload, or a background engine restart — is faster; on a 500,000-row, 9-column dataset the first operation dropped from about 3.5 to 1.9 seconds
  • Data Management - Every Dataset Operation Sent the Full Row Data to the Query Engine: Each query sent the target dataset's entire rows to the query engine even though only its name and schema were needed, blocking the page noticeably on large datasets; on a 500,000-row dataset a query dropped from about 780 to 190 milliseconds and the time the page was unresponsive from about 260 to 90 milliseconds
  • Data Table - Sorting a Large Table Blocked the Page on Every Click: Sorting a numeric column in a table of hundreds of thousands of rows blocked the page for about a quarter of a second on each click; the same sort now blocks for at most about 95 milliseconds, and about half the clicks stay under 50

[2026.07.29]

Added

  • Graph Builder - Shape, Size, Opacity, and Line-Type Scales per Layer: A layer's Aesthetics section can now configure a scale for the shape, size, alpha (opacity), and line-type channels, joining the existing per-layer color and fill scales. Shape and line type take the sequence assigned to the categories, a legend title, and a legend position — when there are more categories than entries, the sequence repeats from the start; size and alpha take the output range. The same scales can be set per layer through the Agent API's custom graphs, which reports an unknown shape or line-type name, two categories assigned the same shape or line type, and an out-of-range value in warnings
  • Graph Builder - Warning When a Stacked Area Series Holds Both Positive and Negative Values: In a stacked or fill-position area chart, a series that holds both positive and negative values is stacked partly above and partly below the baseline, so it cannot be drawn as one continuous band. The graph now shows a warning for such a series and suggests alternatives — a stacked bar chart, one facet per series, or the identity position
  • About - Bundled Dataset Licenses in the Third-Party Licenses Page and the Terms: The Third-Party Licenses page now has a Bundled Datasets section listing every bundled sample dataset's license, source, and attribution alongside the existing software licenses, and the Terms of Service now state that the bundled datasets are third-party works and that redistributing a CC BY 4.0 dataset requires its attribution
  • Agent API - Dataset Renaming, Download, Creation, and Cell Editing: datasets.rename renames a dataset (rewriting the SQL of derived datasets that reference it, as the UI rename does), datasets.renameColumn renames a column, datasets.download saves a dataset as a CSV, TSV, or JSON file with the same formatting and encoding options as the UI export, datasets.create creates a dataset with the given columns and row count, every cell starting as a missing value, and datasets.setCellValues writes individual cell values — the input is validated in full before anything is written, so one invalid entry changes nothing
  • Agent API - Run PCA, Kaplan-Meier, and Cox Regression: models.run now runs PCA, Kaplan-Meier, and Cox regression. Rows with missing values are dropped by the same rules as the analysis tabs. The Cox result returns the effect estimates — log hazard ratio, standard error, and the hazard ratio with its confidence interval. These three analyses are not kept as saved models, so models.save rejects them with an explanation
  • Agent API - models.configure for Every Analysis Tab With Saved Models: models.configure, previously limited to GLM, now writes the settings of GLM, GLMM, Random Forest, ARIMA, linear regression, and ANOVA tabs, updating only the fields passed
  • Agent API - Model Predictions and Model-Result Datasets: models.predict computes predictions from a saved GLM, linear regression, or Random Forest model into a derived dataset — for GLM and linear regression with a chosen level for the confidence interval of the mean and the prediction interval for individual observations. models.saveAsDataset saves a model's coefficients (GLM, linear regression, or GLMM fixed effects), covariance matrix (GLM or linear regression), or GLMM random effects (BLUP) as a derived dataset, with the same lineage and re-derivation behavior as the UI's Save as Dataset
  • Agent API - Errorbar and Text Geometries: Custom-graph layers can now use the errorbar and text geometries, which were available in Graph Builder but rejected by the API
  • Agent API - Graph Warnings Are Readable From the API: The diagnostics Graph Builder shows in its warning strip — such as excluded non-finite values and the new mixed-sign stacked-area warning — can now be read from the API: tabs.getGraphBuilder returns the current graph's warnings, and reports.addGraph, reports.updateElement, and reports.getContent return a report graph element's warnings in renderWarnings. A multi-panel graph is included; previously it reported no warnings at all

Fixed

  • Statistical Models - Changing the Settings After a Fit Crashed the Analysis Tab: In GLM, GLMM, and Linear Regression, changing the variable selection, the intercept, or another fit setting after a completed fit could crash the whole tab into an error screen, because the results were re-rendered from the old fit combined with the new settings. The results section now shows a note asking to run the analysis again; restoring the settings brings the results back, and changing only the confidence level still updates the intervals without a re-fit
  • Statistical Models - A Model Could Stay Marked as Awaiting Re-Estimation After It Succeeded: After the model's source data changed — a dataset reload, a derived-dataset edit, or an Agent API write — a Random Forest, ARIMA, ANOVA, or DoE model whose re-estimation succeeded was still treated as awaiting estimation — Model Detail kept showing it as estimating, and saving the project stored that state. The Random Forest prediction tab also offered models still awaiting re-estimation, which then failed with a wrong explanation
  • Statistical Models - Saving Right After a Dataset Reload Created a Duplicate Model: Duplicate-model detection skipped a model awaiting re-estimation, so saving a GLM, GLMM, or linear regression model with the same specification — or adding a DoE model to a report — before the re-estimation finished created a second identical model
  • Statistical Models - A Failed Save Could Leave Partial Results or Lose the Existing Model: When a model was saved together with its result datasets and one of the names collided, the parts already written stayed behind; overwriting a saved linear regression model removed the old model before writing the new one, so a failure at that point lost the model entirely. A save now succeeds or fails as a whole, and the error message names the colliding dataset
  • ANOVA - Ineligible Columns Disappeared From the Variable Selectors Without Explanation: The Response, Factor A, and Factor B selectors silently omitted columns that did not qualify, so a column missing from the list gave no clue why; choosing Factor B first also allowed the same column to be selected as both factors, which ran and failed with a confusing error; and a saved selection that had become unusable — its column deleted or its measurement scale changed — went undetected. All columns are now listed, with ineligible ones disabled and the reason shown; a selection that is no longer valid disables Run Analysis and states its reason, and results that no longer correspond to the settings are annotated. A help button on each selector explains which columns qualify and the statistical cautions around boolean responses, numeric factors, and the declared measurement scale
  • Agent API - ANOVA Factor Eligibility Was Judged by Column Type Instead of Measurement Scale: models.run judged whether a column can be an ANOVA factor by its data type while the UI uses the measurement scale, so a numeric column declared nominal was rejected even though the ANOVA tab accepts it, and a string column declared interval was accepted; the API now follows the measurement scale, with the same explanations as the UI
  • Data Management - Saving a Derived-Dataset Edit Overwrote Changes Made After the Tab Was Opened: With a derived-dataset edit tab open (SQL, Crosstab, Computed Column, Dummy Coding, Reshape, Convert Column Types, or Synthetic Data), a change to the same dataset made through another route — another edit tab, the Agent API, or a dataset rename that rewrote a SQL query — was silently overwritten when the tab saved; the save is now rejected with guidance to reopen the editor, and the other change is kept
  • Data Management - Reload All URL Datasets Always Warned That Annotations Would Be Cleared: The confirmation dialog showed a fixed warning about excluded rows and row comments being cleared even when no dataset had any; it now totals the excluded rows and row comments across the datasets to reload, adds each dataset's breakdown to the list, and shows no warning when there is nothing to clear
  • Graph Builder - A Zero Value Interrupted a Negative Series' Stacked-Area Fill: In a stacked area chart, a zero value was always stacked on the positive side, so a zero inside a negative series (for example -2, 0, -2) split the series' fill and, when another series was positive, drew the zero point up at that series' height; a zero value is now stacked on the same side as its neighboring non-zero values
  • DoE - The Wizard's Designs Confounded the Third and Later Factors With Interactions: The design wizard generated designs in which the third and later factors were completely confounded with interactions of the earlier factors — for example, three factors in eight runs produced a design whose third factor equaled the interaction of the first two, instead of the full factorial. The wizard now produces the full factorial whenever the run count allows it, and with more factors it keeps main effects unconfounded with two-factor interactions as far as the chosen design size permits. The wizard also now rejects an empty response variable name and level labels consisting only of whitespace
  • Project Lineage - A Fading Edge Label Never Came Back: When a lineage element was removed and re-added while its fade-out was still running — for example, switching a filter off and back on quickly — the edge's operation label stayed invisible, and clicking an element mid-fade could select an already-deleted item
  • Sample Datasets - Iris Contained the Two Samples UCI Documents as Erroneous: The bundled iris data carried the two samples whose values the UCI distribution itself documents as differing from Fisher's paper; the three affected values are corrected — the 35th sample's petal width from 0.1 to 0.2, and the 38th sample's sepal width from 3.1 to 3.6 and petal length from 1.5 to 1.4 — so results computed on the bundled iris change accordingly, and the dataset's attribution notes the modification

[2026.07.23]

Added

  • Cox Regression - Diagnostics for a Converged but Unreliable Fit: Cox regression now flags a fit that returns finite coefficients and standard errors but shows signs of separation that make the estimates unreliable — near-separation of a single predictor, a divergence along a combined direction of near-collinear predictors, or a fit reported as converged while its last optimization step was still substantial. The warning appears below the coefficient table and notes that the coefficients are available but their standard errors and confidence intervals should not be relied on
  • Graph Builder - Crossbar Geometry: A crossbar geometry draws a rectangle spanning ymin to ymax with a center line at y. Combined with the summary statistic's outputs (for example mean to y, lower_se to ymin, upper_se to ymax) it shows a central value and an interval from settings alone. It is available in Graph Builder and in the Agent API's custom graphs
  • Data Import - Open a Sample Dataset From a URL: A #sample=<id> URL hash now opens a built-in sample dataset directly (for example #sample=mpg), creating a "Sample: " project and saving it, the same as clicking the sample on the launcher. An unknown id shows an error and stays on the launcher
  • GLM - In-Sample Note on Prediction Accuracy Metrics: The GLM prediction tab now shows a note when the accuracy metrics are computed on the same dataset the model was fit to, indicating that the metrics reflect an in-sample fit
  • Reports - pairPlot Scales to the Paper Width When Printing: When printing, a pair plot now scales down to fit the paper width instead of being clipped at the page edge, keeping each cell square. The scaling only shrinks — a pair plot with few columns is not enlarged beyond its natural size
  • Agent API - Create a Project From CSV or a Sample With No Project Loaded: With no project loaded, the Agent API can now create a project from a CSV file, a CSV at a URL, or a built-in sample dataset, and list the available samples (project.createFromCsv, project.createFromCsvUrl, project.openSample, project.listSamples)
  • Agent API - Import From URL Accepts Header and Encoding Options: datasets.importFromURL now accepts hasHeader and encoding, matching the buffer import and the URL import in the UI. When encoding is omitted the URL import reads UTF-8 with no auto-detection, and with hasHeader: false the columns are named Column1, Column2, and so on

Changed

  • Statistics - The Tool No Longer Asserts That Points Are Outliers: The scatter display mode "Points + Density (Outliers Only)" drew every point — the same result as "Points + Density (All Points)" — so its label was misleading; it has been removed, and "Points + Density (All Points)" is now simply "Points + Density" (a project using the removed mode is migrated to it). Help and diagnostic text that declared points to be outliers — the kurtosis help and a GLM diagnostic plot — now describes their position instead
  • Data Management - Derived-Dataset Edit Forms Exclude the Dataset Being Edited and Show Apply Errors Inline: When editing a derived dataset (Dummy Coding, Column Type Conversion, Reshape, Computed Column, or Crosstab), the dataset being edited is no longer listed as a possible source — previously it could be selected and the save was then rejected. A failed Apply in Dummy Coding and Column Type Conversion now shows its error inline next to the button, as Computed Column and the SQL editor already did, instead of as a global notification

Fixed

  • Agent API - postHoc Set Through models.run Was Not Kept on Reload: The Tukey HSD choice (postHoc) passed to models.run was not saved with the model, so re-fitting after the dataset was reloaded always computed Tukey HSD regardless of the setting
  • Agent API - Two-Way ANOVA Silently Ignored a postHoc Request: For a two-way ANOVA, postHoc: true in models.run was accepted and then silently ignored, since a two-way ANOVA does not compute Tukey HSD; it is now rejected with an INVALID_INPUT error, as is a non-boolean value such as 1 or "true"
  • Statistics - Add to Report Ignored Grouping: With grouping active (Show stats by), adding a Statistics chart to a report produced a report drawing all groups instead of the single group on screen; the report now carries the grouping condition (combined with the Data Table filter when one is set) and its title includes the group label, for the statistics cards, numeric histograms, date distribution, category-frequency bar chart, and time series
  • Statistics - Category-Frequency Bar Chart and Date Distribution Ignored the Data Table Filter: These two sections drew the full dataset even with a Data Table filter or grouping applied; both now draw the filtered rows and carry the filter into an Add to Report
  • Statistics - Double-Clicking a Bar to Drill Down Opened the Unfiltered Rows: Double-clicking a bar or bin to drill down (numeric histogram, category-frequency bar chart, date distribution, or time series) opened Filtered Data containing the pre-filter rows even when the section was showing a filtered or grouped view; the opened rows now stay within the on-screen scope
  • Statistics - Selecting Rows From a Bin and Nested Filtering Did Not Respect the Filter: Clicking a histogram bin to select its rows selected the pre-filter rows instead of only the visible ones; a category value's double-click could open rows that did not match how its drilldown was defined; and stacking a filter on an already-filtered view produced a doubly nested scope rather than a single combined filter
  • Statistics - Relationships Pair-Chart Settings Carried Over to a Different Dataset: The chart type, aggregation, and orientation chosen for a category-and-numeric pair in the Relationships section were keyed by column name alone, so switching to a different dataset with a same-named column silently reused the settings; each setting is now scoped to its dataset
  • Graph Builder - Non-Finite Values Dropped From an Aggregation Were Not Shown: When a summary or box-plot aggregation dropped non-finite values (NaN, +Infinity, -Infinity) from its input, the aggregate was drawn from the reduced sample with no indication; the count of excluded values, broken down by kind, now appears in the graph's warning strip. Because the exclusion shifts order statistics — dropping +Infinity moves the median and quantiles down, dropping -Infinity moves them up — the counts are shown by sign
  • Graph Builder - Error Bars Disappeared When a Group's First Row Had a Non-Finite Value: In a summary layer whose outputs set only ymin and ymax (not y), an error bar was dropped entirely when the group's first row had a non-finite y, even though the interval itself was finite; the base point is now taken from the first row with a finite input value
  • Graph Builder - Stacked Area With a Sign-Changing Series Drew a Self-Intersecting Fill: In a stacked or fill-position area chart, a series whose value changed sign across x drew one path that interpolated between the positive and negative bands, producing a self-intersecting fill; each run of a single sign is now drawn as its own subpath, and the gap between two adjacent points of opposite sign is left unfilled
  • Graph Builder - A Secondary-Axis Layer First Made the Primary Axis Use the Wrong Column Type: When a layer assigned to the secondary (Y2) axis came first, the primary (Y1) axis took its column type — its integer tick formatting and its date-axis detection — from the Y2 column, and brush selection could build a mismatched expression; the Y1 axis now uses the first primary layer's Y column
  • Graph Builder - An Aggregated Point Showed Another Row's Values in Its Tooltip: A point aggregated from several rows could show an unrelated row's raw column values in its tooltip, and in a chain of statistics that skipped null rows, click selection and the tooltip could point to a different row; a point with no single source row now omits the raw column values (shown as "-"), while a point from a single row keeps its own values
  • Graph Builder - A Single Non-Finite Value Blanked the Histogram: One non-finite x value (NaN or an infinity) emptied the bin thresholds, so the whole histogram showed blank even when every other row was finite; non-finite x is now excluded before binning
  • ARIMA - A Converged Fit With No Standard Errors Was Shown as Normal: An ARIMA fit that converged but could not compute standard errors showed the standard error as "0" — a wrong number — with no warning. An uncomputable standard error now shows as "-" (the Agent API returns null), and a warning appears when the variance-covariance matrix is unavailable or a coefficient is pinned at the stationarity or invertibility boundary (near a unit root)
  • ARIMA - Residual ACF and PACF Lag Axis Was Ordered as Text: The Lag axis of the residual autocorrelation and partial autocorrelation plots ordered the lags as text (1, 10, 11, ..., 2, 20, 3, ...) instead of numerically
  • GLMM - Estimates Depended on the Predictors' Scale for Non-Gaussian Families: For a non-Gaussian GLMM (Poisson, binomial, gamma, or a Gaussian response with a log link), changing a predictor's units altered the random-effect variance — which should be unaffected — and left the coefficients and their standard errors off the exact unit rescaling they should follow; the same model now gives consistent results regardless of a predictor's units
  • GLMM - Random-Effects Table Header Read "Estimate" on Screen but "Conditional Mode" Elsewhere: The random-effects (BLUP) table headed its estimate column "Estimate" on the results screen but "Conditional Mode" in the saved dataset, Model Detail, and reports; all now show "Conditional Mode", and the results-screen table matches the other coefficient tables' layout (Group, Conditional Mode, Std. Error, Rank)
  • GLM and GLMM - Diagnostic Warnings Named "coefficient N" Instead of the Predictor: Separation warnings and a "variance is not positive definite" error identified a term as "coefficient N" instead of by the predictor's name; they now use the predictor names
  • ANOVA - A Negative Sum of Squares Was Clipped Without Notice: When two-way ANOVA produced a negative sum of squares and clipped it to zero, this was only logged; a warning now names the affected term, and one-way ANOVA's negative between-group sum of squares is reported the same way
  • Statistical Models - Coefficient-Table Confidence-Interval Bounds Used Fewer Decimals Than the Estimate: In the OLS, GLM, GLMM, ARIMA, and DoE coefficient tables, the confidence-interval bounds were shown with four decimal places while the point estimate and standard error used six; the bounds now use six as well
  • DoE - A Factor Reduced to Two Levels by Missing-Value Exclusion Was Analyzed Without Notice: The level-count check ran after excluding rows with missing values, so a factor with three or more levels that missing-value exclusion happened to reduce to two was analyzed silently; the check now runs on the columns before exclusion, and a factor left with too few levels by exclusion reports that as the cause
  • Reports - A Report Element That Could No Longer Be Re-Derived Stopped the Whole Project From Loading: When a report element's re-derivation failed for a user-caused reason — its model had been deleted, or a re-fit failed — loading the project stopped instead of loading the rest. Such a failure is now recoverable: only the affected element shows that it cannot be re-derived, and an element downstream of it is noted as failing because of that dependency
  • Reports - External-Report-URL Warning Dialog Did Not Follow the Dark Theme: The warning shown before opening an external report URL in an embedded view used fixed colors and did not adapt to the dark theme; it now uses the theme's colors and fonts
  • Data Management - Switching the Source in a Source-Replace Edit Reset Every Field: Changing the dataset in a source-replace edit (Crosstab, Dummy Coding, or Reshape) reset every field. Compatible settings on a same-named column are now carried over — the row and column fields, and a numeric value field, for Crosstab; the action, scale override, and an existing reference category for Dummy Coding; and both directions' column settings and output names for Reshape — and any settings that could not be carried are listed in a notice
  • Data Management - Deleting a Prediction-Result Dataset Warned That Its Model Would Be Removed: Deleting a prediction-result or diagnostics dataset warned that the upstream model that produced it would be destroyed and wrongly closed that model's tab, even though the model is not deleted; the confirmation and the tabs that close now match what is actually removed
  • Data Management - Creating a Dataset With a Duplicate Name Showed an Internal Error: Creating a dataset whose name already existed surfaced a raw store exception containing an internal ID; the Create Dataset dialog now checks for a duplicate name first
  • Data Management - SQL Derive Could Tag a String Column With the Parent's Enum Name: Deriving with SQL from a parent whose column was an enum could leave a string-typed column in the result carrying the parent's enum name while staying a string, an inconsistent state; a derived column now carries an enum name only when it is actually an enum, and an enum whose name cannot be resolved is demoted to a string with a nominal scale
  • Cox Regression and Kaplan-Meier - Help "Full documentation" Links Returned 404: The Full documentation links in the Cox regression and Kaplan-Meier help pointed to a page that no longer existed, so all 13 of them returned 404; they now point to the current cox-regression and kaplan-meier pages
  • Workspace - Selecting a Browser Autofill Suggestion Could Disable All Keyboard Shortcuts: A keydown carrying no key value — from selecting a browser autofill suggestion, as in the Open from URL field, or during IME composition — threw an error in the global shortcut handler and disabled every keyboard shortcut; such events are now ignored

[2026.07.18]

Added

  • Statistics - Box Plot for Category-Numeric Pairs: In the Relationships section, a category-and-numeric pair now offers a chart selector to switch between the aggregated bar chart and a box plot showing each group's median, quartiles, and whiskers, with outliers drawn as individual points. The box plot supports both orientations, click selection (the box selects the category's rows, a point selects that value's row), and a tooltip, and it can be added to a report. A box plot geometry and statistic are also available for the Agent API's custom graphs
  • ARIMA - Deterministic Linear Trend Term: ARIMA and seasonal ARIMA can now include a deterministic linear trend (a slope against time), estimated together with the model's other coefficients and reported with a confidence interval. The trend is estimated only for a model with no differencing; with differencing the form disables the option and explains that the trend would either coincide with the drift term (a single difference) or be removed (two or more differences). Automatic order selection now also avoids over-differencing a series that has a trend but is otherwise stationary
  • ARIMA - Cancel a Running Fit: A running ARIMA fit can now be stopped with a Cancel button. A hint notes that a seasonal period of 52 or more can make a fit slow and that automatic order search repeats the fit for each candidate order
  • Graph Builder - Legends for Stroke and Line-Type Aesthetics: A layer that maps a column to the stroke (outline color) or line-type aesthetic now shows a legend for it, matching the existing legends for color, fill, and shape. The Show Legend checkbox now appears whenever any legend-bearing aesthetic is mapped, not only color or fill
  • Workspace - Duplicate an Analysis Tab: Right-clicking an analysis tab (GLM, GLMM, ANOVA, DoE, Linear Regression, Cox Regression, Kaplan-Meier, PCA, Random Forest, or ARIMA) now offers Duplicate Tab, which opens an independent copy that carries the same settings but no results and no saved-model state — so you can, for example, place two fits with different orders or predictors side by side to compare. Also available in the Agent API
  • Data Management - Jump to the Blocking Dataset When Contributing Rows Cannot Be Traced: When Contributing rows cannot trace a row back through the lineage, the notice — and the warning shown when choosing a graph drill-down target that cannot be traced — now includes a button that opens the blocking dataset in Project Lineage, selecting and centering it, and revealing it if a filter had hidden it

Changed

  • Statistical Models - Save and Report Actions No Longer Require Saving the Model First: In GLM, GLMM, and Linear Regression, the Save as Dataset, save prediction intervals, and Add to Report actions were disabled until the model had been saved. They are now always available; using one on an unsaved model opens a dialog to name the model (and the dataset, for Save as Dataset) and saves the model together with the chosen output
  • DoE - Unbalanced-Design Warning Split Into Empty-Cell and Non-Orthogonality Warnings: The single unbalanced-design warning has become two. An empty-cell warning states that effect estimates then depend on assuming the excluded interactions are negligible; a separate warning appears when the design's terms are not orthogonal — from unequal cell sizes or irregularly missing cells — and cautions about reading the cell means and intercept. A regular fractional (orthogonal) design no longer raises the second warning
  • Selected Rows - Inapplicable Menu Items Are Now Shown Disabled With a Reason: The Selected Rows tab previously hid Open as Filtered Data, Save as Dataset, and Contributing rows when they did not apply (for example, a manual selection with no filter expression, or a selection whose rows cannot be traced). All three are now always shown and disabled with a tooltip stating why
  • Security - Signing Is Now an Explicit Step on Export: MIDAS no longer signs as a side effect of saving. Save to Browser signs nothing, and exported MDS files are always signed; the first time you export, MIDAS asks for a signer name to create your key instead of generating an anonymous key automatically (the Agent API returns a NO_SIGNING_KEY error when no key is set). The signature format was changed to record provenance, so MDS files exported before this release — and projects saved to the browser before it — can no longer be opened; re-export anything you want to keep with Export Project

Removed

  • Data Management - Automatic Backup Folder: The optional automatic backup folder — which wrote a copy of each saved project to a local folder, in Chromium browsers only — has been removed, along with its settings. Use File > Export Project to keep copies of a project

Fixed

  • GLM - Prediction Accuracy Metrics Were Misleading or Wrong for Non-Gaussian Families: The GLM prediction tab always showed R², RMSE, and MAE regardless of the model family, which is misleading for a binary or count response; for a grouped binomial model the calculation was outright wrong (it compared success counts against a probability), and a boolean response column was dropped from the metrics entirely. The metrics now depend on the family — R²/RMSE/MAE for Gaussian, Brier score and AUC for binomial, and RMSE/MAE with mean deviance for gamma, Poisson, and negative binomial — rows whose value falls outside the family's valid range are excluded, and the number of observations used is shown alongside
  • Cox Regression - Convergence and Matrix Steps Depended on the Predictors' Scale: Cox regression's convergence check and its internal matrix solves used thresholds tied to the predictors' scale, so a predictor recorded on a very large or small scale could report a spurious convergence failure or matrix failure for a fit that was actually fine. Convergence is now judged on scale-invariant criteria, and a fit with a strong but finite effect — from near-collinear or quasi-separated data — is no longer misjudged as having no solution
  • ARIMA - A Constant Term Was Silently Included in Twice-Differenced Models: With total differencing of 2 or more (for example an airline model, SARIMA(0,1,1)(0,1,1)), the constant term was on by default and quietly included, even though for such a model it corresponds to a high-order polynomial trend that is rarely intended. The constant is now dropped in this case — the form disables the checkbox with an explanation, the results note the omission, and the Agent API reports it in warnings — while a once-differenced model keeps its drift term
  • Statistics - Add to Report Ignored the Data Table Filter: With a filter applied in the Data Table, adding a Statistics tab chart to a report produced a report that drew the unfiltered data rather than what was on screen. The report now carries the filter and applies it, matching the screen, for the Relationships bar and box plots, the pair plot, numeric histograms, time series, and the statistics cards. The category-frequency bar chart and date distribution ignore the filter on screen as well and are unchanged, tracked separately
  • Statistical Models - Same-Type Analysis Tabs Shared Form-Field IDs, So a Label Click Focused the Wrong Tab: With two tabs of the same analysis type open (ARIMA, GLM, GLMM, Linear Regression, or Random Forest), their form fields used identical element IDs; clicking a field's label could move focus to the other tab's field instead. Each tab's fields now have IDs unique to that tab
  • Data Management - Deleting a Model From Project Overview or Project Lineage Understated What Would Be Removed: Deleting a model from Project Overview showed only a plain confirmation that did not list the derived datasets, downstream models, and report elements that would also be deleted, and left the affected tabs open; deleting from Project Lineage skipped the confirmation entirely when the model had no dependents. Both now show the same confirmation listing everything to be removed and close the affected tabs
  • Graph Builder - Preview Flickered and Resized While Adjusting Settings: The graph preview was rebuilt from scratch on every settings change, so adjusting a control such as a slider made the preview flicker and momentarily change size instead of updating smoothly. The preview now updates incrementally; switching the geometry still clears the previous geometry's marks, and changing the dataset or graph type still resets the view (zoom, pan, and selection mode)
  • Graph Builder - Errorbar and Ribbon Layers Left a Stale Drawing When All Their Points Were Filtered Out: When a filter removed every point an errorbar or ribbon layer needed (its ymin/ymax values), the layer's previous drawing stayed on screen instead of being cleared. These layers now remove their existing marks before skipping the draw
  • **Graph Builder - Tooltip's Observation Count (n)WasMissingOutsideCountBasedCharts:Thetooltipvariablen) Was Missing Outside Count-Based Charts**: The tooltip variable `nshowed "-" for charts other than counts and histograms — a scatter point and a mean bar chart both showed "-" instead of the point's own observation count (1) or the group's size.$n` now reports the number of observations each statistic actually used (the group size for a mean or box plot, the sample size for an ECDF or Q-Q plot, and so on); the summary statistics are the ones that exclude non-finite values from that count. The tooltip field label was renamed from "Count" to "Observations"
  • Graph Builder - Global Aesthetics Other Than X and Y Could Not Be Seen or Cleared in the GUI: The Global Aesthetics section offered only X and Y, so a global color, fill, size, shape, or similar mapping set through the Agent API could not be viewed or removed in Graph Builder and could only be changed through the API. These channels now appear in the section — when a layer's geometry supports them or a value is already set — and can be cleared there
  • Graph Builder - Shape Legend Disappeared When Fill and Color Shared One Legend: When a layer's fill and color aesthetics were combined into a single legend, the same layer's shape legend was not collected and did not appear. Each aesthetic's legend is now gathered independently
  • Data Management - Newly Added Lineage Nodes, Edges, and Labels Stayed Bright While a Node Was Selected: In Project Lineage, selecting a node dims the unrelated parts of the graph, but if the graph then changed — for example when a new derived dataset was added — the newly drawn edges and labels were not dimmed and stood out brightly, and the selected node's own dimming could be undone by a trailing animation. Newly added elements are now dimmed consistently with the rest while a selection is active

Performance

  • ARIMA - Faster Exact Maximum Likelihood for Large Seasonal Periods: Fitting an ARIMA or seasonal ARIMA model with a large seasonal period is now substantially faster — for example, a single fit with a period of 365 that took about 345 seconds now takes about 120, and a period of 52 dropped from about 1.9 to 0.9 seconds. Small periods are unchanged

Security

  • Security - Trust of a Shared MDS Could Be Laundered Through Re-Export or a Different Browser: A file signed by an unknown signer could show as Trusted, and could bypass the Data Table link gate, after being opened in a different browser or edited and re-exported, because a file's trust was read from whatever signature it currently carried and from a self-reported source field in it. A file's trust level is now taken from its provenance — the creator plus everyone who edited and re-exported it — as the lowest level among them, fixed when the file is imported and never raised by saving, reloading, or re-exporting; only registering a signer's key raises it. Data Table links are disabled whenever the provenance includes an unknown signer, and stay disabled even after the project is edited and re-saved

[2026.07.15]

Added

  • ARIMA - Seasonal Models (SARIMA): ARIMA now fits seasonal models, SARIMA(p,d,q)(P,D,Q)s. In addition to the non-seasonal order you can specify a seasonal period and seasonal differencing, autoregressive, and moving-average terms, with confidence intervals for the seasonal coefficients. Automatic order selection now also chooses the seasonal differencing and seasonal terms. Seasonal models are supported in the form, results, Model Detail, report elements, and the Agent API
  • ARIMA - Residual ACF and PACF Plots in Model Detail: The Model Detail view for a saved ARIMA model now shows residual autocorrelation (ACF) and partial autocorrelation (PACF) plots, matching the diagnostics shown in the ARIMA analysis tab. A model without stored correlogram data — one saved before this change, or a degenerate fit — does not show the section
  • Data Import - Dropping Multiple CSV/TSV Files Imports Them All: Dropping several CSV, TSV, or TXT files onto the launcher at once now imports all of them as separate datasets in one project; previously only the first file was imported and the rest were silently ignored. Dropping a set of files that includes an MDS project or ZIP archive is rejected with an error dialog (dropping a single file is unchanged)

Changed

  • ARIMA - Exact Maximum Likelihood Estimation: ARIMA and seasonal ARIMA models are now fit by exact maximum likelihood. The previous method approximated the influence of the series' first observations, which could shift the parameter estimates — most noticeably for short series — and made the residual diagnostic plots show inflated variance at the start of the series, where early residuals could look like outliers. Residuals now have a consistent scale across the whole series
  • Statistical Models - Model-Result Dataset Default Names Include the Source Dataset: When a model result is added to a report, the default name of the generated dataset (for example, a coefficient table, covariance matrix, or prediction intervals) now includes the source dataset name in brackets — for example, GLM Coefficients (gaussian/identity) [Auto MPG]: mpg ~ weight. The same formula fit to two datasets with the same columns can now be told apart by the default name alone

Fixed

  • Statistical Models - Running a Model on a Model-Produced Dataset Failed With a Missing Row-ID Error: Running a model on a dataset that was itself produced by a model — such as a coefficient table, a covariance, ANOVA, group-statistics, or Tukey HSD table, prediction intervals, variable importance, GLMM random effects, or a correlation table — failed with a "System row ID column not found" error, because these datasets were built without the internal row identifier that other datasets carry
  • Statistical Models - Adding a Second Model's Summary to a Report Could Fail on a Name Collision: Adding a model's summary to a report failed when another model built from the same formula and (for GLM/GLMM) the same family and link had already produced a dataset, because the two shared the same default name. The default name is now made unique with a numeric suffix (name (1), name (2), …) when needed, and re-adding the same model reuses its existing dataset instead of creating another
  • Data Management - Model Deletion Warning Understated the Deletion and Left Tabs Open: Deleting a model already removed datasets derived further from its results (for example, a query built on the model's coefficient table) and models trained on those datasets, but the confirmation warning listed only the datasets the model produced directly, and tabs showing the further-derived datasets and downstream models stayed open after the deletion. The warning now lists downstream models in their own section and states they will be deleted as well, and all affected tabs now close
  • Graph Builder - Fill-Position Bar Chart With Positive and Negative Values Rendered Incorrectly: In a bar chart with fill position (segments scaled so each bar fills the full height, i.e. a 100% stacked bar), a negative segment was drawn overlapping the positive segments instead of on its own side of the baseline, and when positive and negative values in a bar nearly canceled out, the segment proportions could grow far beyond the bar. Positive and negative segments are now accumulated separately, and each bar is scaled by the total of the absolute values
  • Graph Builder - Line, Area, Step, and Ribbon Layers Ignored a Continuous Color Scale: A line, area, step, or ribbon layer with a continuous (sequential or diverging) color scale assigned to its color aesthetic (fill, for area layers) ignored the scale and drew in a default color. These layers now apply the continuous scale
  • Graph Builder - Log/Square-Root Scale Warning Mislabeled Infinite Values: When a column mapped to a log or square-root axis contained infinite values, the warning counted them as "non-positive" or "negative" values, which is inaccurate for a positive infinity. The warning now describes them as values outside the scale's valid range, and the requirement text states that the values must be finite (for example, "Log scale requires finite values greater than 0")
  • ARIMA - Constant Series After Differencing Reported as Non-Convergence: Fitting an ARIMA model with autoregressive or moving-average terms on a series that becomes constant (or all zero, when fit without an intercept) after differencing reported a non-convergence error; it now reports that the series variance is zero after differencing, matching the message already shown for models without those terms
  • Agent API - System Columns Were Accepted as Input: setColumnSchema accepted changes to an internal system column (the row identifier, shown as "Row #"), and methods that take a column as input did not reject system columns; a not-found-column error could also suggest a system column name. System columns are now rejected with an INVALID_INPUT error across these methods, and they are excluded from column-name suggestions
  • About Dialog - ZIP Missing From the Supported File Formats: The About dialog's list of supported file formats did not include ZIP, though the launcher and documentation already listed it

[2026.07.11]

Added

  • Reports - Print Options for Wide and Multi-Page Tables: A data table or crosstab wider than the paper is clipped at the page edge when printing. The Resize dialog now offers two alternatives, set per element: shrink the text so the table fits the paper width (no smaller than a minimum text scale you choose, with the shrunken size also shown in the on-screen report view), or print the table on its own landscape page (supported by Chrome and Firefox; Safari ignores it and keeps the orientation from Page setup). The header row of a table repeats at the top of every printed page, and Resize can now turn this repetition off
  • Statistical Models - Add to Report and Save as Dataset From Every Model Tab: GLM and GLMM results can now be added to a report from an Add to Report button in the results area; previously these tabs had no such control, and the only route was opening the saved model in the Model Detail tab. Saving the model first is still required. GLMM coefficients can now also be saved as datasets (one for the fixed effects, one for the random effects). The Add to Report control is now the same button with the same choices in Linear Regression, GLM, GLMM, and Model Detail

Fixed

  • Data Management - Using a Derived Dataset Before Opening It Could Fail: After a project is reopened, a derived dataset holds no computed rows until something recomputes it. A SQL query referencing such a dataset could fail with "Project file appears to be corrupted" even though the file was fine, and running a model or adding a report element on such a dataset through the Agent API was rejected as having no data. These operations now compute the datasets they need first. In addition, warnings raised during that computation (for example, values that failed a column type conversion) were silently dropped when the computation was triggered by a query — they are now reported as usual — and a query that fails because a referenced derived dataset cannot be computed now names that dataset in the error message

[2026.07.07]

Added

  • Reports - Header, Footer, and Page Numbers When Printing: Page setup now includes optional header and footer text and a page-number display, in addition to the paper size, orientation, and margin settings already there. Header and footer text can include the report title, the current date, and the page number and page count, and print on every page. This uses native browser print styling, so it renders in Chrome and Safari; Firefox does not display the header, footer, or page numbers when printing

Fixed

  • Graph Builder - Point Layer Shape Aesthetic Had No Effect: Assigning a column to a point layer's shape aesthetic was accepted but ignored; every point was still drawn as a circle. Points now draw as one of six shapes (circle, square, triangle, diamond, cross, plus) according to the assigned column's value, with a corresponding legend. A warning appears when the shape column has more categories than there are distinct shapes to represent them
  • Statistical Models - Condition Number Warning Lacked a Link to Its Explanation: The high condition number warning shown in Linear Regression, GLM, ANOVA, and DoE for a poorly conditioned design matrix did not link to further explanation; it now links to the condition number documentation. Separately, that documentation covered only correlation among predictors as a cause of a high condition number; it now also covers predictor value scale (a predictor far from mean zero, or predictors with widely differing variances) as a second, distinguishable cause, and explains that standardizing predictors lowers the condition number when scale is the cause but not when correlation is
  • GLM / Linear Regression Diagnostics - Cook's Distance Showed 0 for the Most Influential Observations: An observation with leverage very close to 1 — typically the most influential point in the data — showed Cook's distance as 0 instead of a large value, because the calculation treated any leverage of 0.999 or higher as if it were exactly 1 (where the statistic is genuinely undefined); only a leverage of exactly 1 now shows as not computed. Separately, for a model fit without an intercept, the Cook's distance contour plot overestimated the number of model parameters by one, shifting the reference contours out of position; the count is now taken from the same source as the rest of the diagnostics summary
  • Graph Builder - Category Order Panel Order Did Not Match the Axis: The Category Order panel sorted a numeric-looking text column (e.g., product codes stored as text) in numeric order, while the axis itself sorted the same column alphabetically; reordering categories in the panel did not reflect how the axis actually displayed them. The panel now uses the same sort rule as the axis, and its label ("Natural Sort" or "Alphabetical") reflects which rule applies
  • Graph Builder - Flipped Coordinates Applied Zoom, Pan, and Implicit Axis Range to the Wrong Axis: With flipped coordinates, an axis domain limit, a zoom/pan drag constraint, and a statistic's implicit axis range (for example, a histogram's count axis starting at zero) were still computed against the chart's unflipped axes; restricting the logical X axis, for instance, constrained panning on the vertical axis instead of the horizontal one. These are now resolved against the axis actually shown after flipping
  • Graph Builder - Flipped Coordinates Showed the Wrong Axis Scale Type, Title Position, and Margin: With flipped coordinates, a date/time axis lost its calendar-aware tick snapping and instead used the tick and title settings computed for the chart's unflipped axes (rotation, padding, integer-only ticks), and margin calculations reserved space for a right-hand secondary axis even when flipping had disabled it. These are now computed for the axis actually displayed after flipping
  • Data Management - Replacing a Model Could Orphan Datasets Derived From Its Results: Replacing a saved model (for example, re-running a GLM and overwriting the previous fit) deleted only the datasets the model directly produced, not datasets built on top of those (for example, a SQL query built on the model's coefficient table), leaving such further-derived datasets referencing a model that no longer existed. Replacing a model now deletes the same set of dependent data as deleting a model outright, and the overwrite confirmation dialog for GLM, GLMM, and Linear Regression now describes this fuller scope
  • Data Management - Discarding Changes via Close Project Left the Project Marked as Unsaved: Choosing Close Project and then Discard Changes did not reset the project's saved state, so opening a different file afterward could show the unsaved-changes confirmation for changes that had already been discarded
  • Data Management - Reload Dataset Reset Manually Set Measurement Scales: Reloading a dataset from a new file restored every column's measurement scale (nominal, ordinal, interval, or ratio) to its automatically inferred value, discarding any scale set manually beforehand, even though the Reload Dataset dialog stated that measurement scales would be kept. A manually set scale is now preserved across reload for a column that still matches by name and type
  • Data Management - Renaming a Column Blocked Reloading From the Same File: After renaming a column with Edit Column Name, reloading the dataset from the same source CSV/TSV file failed, because the reload matched columns by their current display name rather than the file's original header. The reload now matches by the original imported header, so a renamed column reloads correctly and keeps its new name
  • Data Management - Contributing Rows Could Not Trace Through a Column Type Conversion: A dataset produced by Convert Column Types (for example, a text column converted to integer) could not be traced further back with Contributing rows; it reported the operation as unsupported. Contributing rows now traces through a column type conversion, including when rows that failed to convert were excluded
  • Data Management - Replacing or Re-Editing a Derived Dataset Could Create a Circular Lineage: In SQL Editor or Add Columns (computed column), saving a result under the name of a dataset that had been used as its own source (via "Edit Operation..." or the FROM clause) created a dataset whose lineage referenced itself, leaving it permanently unable to be evaluated. This is now blocked before the change is saved
  • Documentation - Embedded App Demos Failed to Load: The interactive app demo embedded in the Getting Started page, and the equivalent demo on the manufacturing tutorial page, failed to load in production and showed a network error instead of opening the sample file, because the pages referenced the demo's data file with a URL that did not resolve correctly outside local development

[2026.07.06]

Added

  • Data Import - Two-Stage CSV/TSV Import: Importing a CSV or TSV file now produces two datasets: one that keeps every column's values exactly as read, as text (its name gets a " (raw)" suffix, e.g. "Iris (raw)"), and one with columns converted to their inferred types, which keeps the original file name and is the one opened and used for analysis by default. If every column is inferred as text, only the raw dataset is created. Reloading a dataset from a new file now only checks that column names match; a column whose values shifted its inferred type (for example, an integer column gaining one row with a decimal value) no longer blocks the reload, since the conversion step absorbs the change, while a value that cannot be converted still stops the reload and names the affected column. datasets.importFromURL() and datasets.importFromBuffer() now return the id and name of the converted dataset, with the raw dataset available via sourceDatasetId and sourceDatasetName
  • Data Management - Auto-Detect Types and Editable Source for Convert Column Types: The Convert Column Types tab has a new "Auto-detect types" button that inspects each text column's values and proposes a target type, with guards against likely misdetection (for example, a column with leading zeros or integers too large to keep full precision stays text, and a column containing only 0/1 is not read as boolean). A saved Convert Column Types result can now also be reopened with "Edit Operation..." (from Project Lineage or Project Overview) to change its source dataset and reconvert while keeping the same dataset id; the field settings are reset for the new source, and affected dependent datasets, models, and reports are counted in a warning before applying the change
  • Data Management - Source Dataset Can Be Swapped for More Derived Dataset Types: "Edit Operation..." — which lets you swap a derived dataset's source and recompute it while keeping the same dataset id — was previously available only for SQL Editor and Synthetic Data Generator results. It now also works for Crosstab, Add Columns (computed column), Dummy Coding, and Reshape (Wide to Long / Long to Wide) results; changing the source resets the operation's field settings so they can be reconfigured against the new source. Filtered datasets are not yet covered
  • Data Management - Contributing Rows Failure Notification Names the Blocked Dataset: When Contributing rows cannot trace a row back to its source, the failure notification now states which dataset in the chain blocked the trace, matching the wording already used by the upfront traceability warning described below. datasets.traceRowLineage() and datasets.openContributingRows() include the same information in a hop field
  • Graph Builder - Select & Drill Down On Target Dataset: A graph layer can now declare, via the new "Select & drill down on" control, which dataset it logically represents, separate from the dataset it actually draws from. For a graph built on an intermediate dataset (for example, a GROUP BY aggregation), setting a target here makes clicking a mark select the corresponding rows in the target dataset instead of the intermediate one, and double-clicking open Contributing rows traced through row lineage into the target rather than the intermediate rows. The choice is checked immediately for whether every step between the graph's dataset and the target can actually be traced; an untraceable choice is still accepted, but shows a warning naming the dataset where tracing would fail (in the Agent API, as an entry in warnings). Available from Graph Builder, a report element's edit dialog, and the Agent API (tabs.configureGraph, reports.addGraph, reports.updateElement)
  • Statistics - Aggregation and Orientation Controls for Relationships Bar Charts: In the Relationships section, a bar chart pairing a category column with a numeric column now has an Aggregation selector (Sum, Average, Median, Min, Max) and an Orientation selector (Vertical, Horizontal), set independently for each pair; previously the chart was always an average shown vertically, with nothing in the chart indicating that it was an average. The axis title and tooltip now name the aggregation shown (e.g., "Mean of Salary"). The Agent API's bar chart aggregation option also gained Median
  • Cox Regression - Complete Separation Diagnosis: When a predictor separates the ordering of events so strongly that no finite maximum-partial-likelihood estimate exists — the survival-model counterpart of complete or quasi-complete separation in logistic regression, sometimes called a monotone likelihood — Cox regression now detects this and names the responsible predictor(s) in the fit-failure message, instead of reporting a generic singular- or non-positive-definite-matrix error
  • Agent API - window.midas.help() Method Name Filter: help() called with no argument now returns only the list of method names (it previously returned the full description of every method at once, tens of thousands of characters of text); passing a method name, e.g. help("project.openFile"), returns that method's full description, signature, and example. The match on method name ignores case and an argument-list suffix; an unmatched or non-string argument returns the method list with a note explaining why
  • Agent API - Custom Graph Tooltip Configuration: tabs.addGraphLayer(), tabs.updateGraphLayer(), reports.addGraph(), and reports.updateElement() accept a tooltip option to configure a layer's tooltip — a capability already available in Graph Builder but previously missing from the Agent API. It takes either an array of fields (each with a field, such as $x, $y, $n, or a column name/id; an optional label; a format in d3-format syntax; and a type of "date" or "datetime" for timestamp fields), or { content: "encoding" } to generate the tooltip automatically from the layer's column mappings. Omitting tooltip keeps the previous behavior of no tooltip; tabs.updateGraphLayer() accepts tooltip: null to remove an existing configuration

Changed

  • Data Management - GLM, Kaplan-Meier, Cox Regression, Linear Regression, ANOVA, DoE, and ARIMA Tabs Can Now Be Open More Than Once at a Time: Previously only one tab of each of these types could be open at once; opening another switched to the existing tab. Multiple tabs of each of these types can now be open at the same time, matching Random Forest, PCA, and GLMM, which were never limited this way

Fixed

  • Linear Regression - Result Help Text Omitted Several Cases: The VIF help text stated that VIF > 5 "suggests moderate" and VIF > 10 "suggests severe" multicollinearity, worded as if these were fixed thresholds; it now states that VIF = k means a coefficient's standard error is √k times as large as it would be with uncorrelated predictors, and that there is no universal cutoff. Separately, the help text for R², standard errors and confidence intervals, and the null deviance did not mention that these show "-" for a degenerate (constant or near-constant) response, that a saturated model (as many predictors as observations) fails outright with an error rather than returning a result with undefined standard errors, or that a model fit without an intercept uses a sum of squares — and null deviance — taken around zero rather than around the mean, which is not directly comparable to a model fit with an intercept. The help text now covers all of these
  • GLM Diagnostics - Pearson Residuals Plot Was Blank for a Gaussian GLM: For a GLM using the Gaussian family with the identity link — created from the GLM tab rather than Linear Regression — switching the diagnostics plot from Deviance to Pearson residuals showed an empty plot. The Pearson residuals column was omitted from the diagnostics data whenever family and link matched ordinary least squares, while the tab's Deviance/Pearson switch was decided by the model's declared type instead; both are now decided the same way, so the Pearson residuals plot renders for these models. GLM models using a non-Gaussian family, and models created from the Linear Regression tab, were not affected
  • GLM / Cox Regression - Complete-Separation Detection Depended on a Predictor's Scale: GLM's existing check for complete or quasi-complete separation in a binomial model judged the raw magnitude of a coefficient, so a predictor recorded on a larger scale — which produces a smaller coefficient for the same separation — could avoid detection. It now uses the same scale-invariant measure as Cox regression's new separation diagnosis: a coefficient's contribution to the linear predictor over the predictor's observed range. Messages for both models no longer point to remedies MIDAS does not implement (such as a penalized-likelihood method available in other software); they now suggest recoding, combining, or removing the separating predictor, or reviewing cell counts, within MIDAS
  • GLMM - Singular-Fit Warning Depended on the Response's Measurement Units: The check for a singular (boundary) fit compared the estimated random-effect variance to a fixed absolute threshold. For a linear mixed model (Gaussian family, identity link), this meant the same fit could be flagged as singular or not depending only on the units the response was recorded in — for example, expressing the response in smaller units could trigger a false warning, and larger units could hide a genuine boundary fit. The check now compares the random-effect standard deviation to the residual standard deviation, a ratio that does not depend on the response's units. Poisson and binomial models, where this ratio was already the effective comparison, are unaffected
  • GLMM - Random Intercept Help Did Not Note Its Effect Is Nonlinear for Non-Identity Links: The help text for a random intercept described it only as allowing the response's baseline to vary across groups, without noting that for a non-identity link (such as logit or log) this variation happens on the link (linear predictor) scale, so its effect on the response scale is not linear. The help text now states this
  • GLMM - Random Effects Table Mislabeled Its Values, Used the Wrong Measurement Scale, and Broke Ties by Row Order: The saved model's Random Effects (BLUP) table in Model Detail named its estimate column "Random Intercept," but the values shown are the random effect's own conditional mode, not a group's total intercept (overall intercept plus random effect); the column is now named "Conditional Mode." Its estimates, together with the fixed-effect estimates and confidence intervals, were labeled with a ratio measurement scale even though they are signed deviations without a meaningful zero point; they are now labeled interval. Groups tied for the same estimate were numbered in row order instead of at the same rank; tied groups now share the average of the ranks they span (for example, two groups tied for 2nd and 3rd both show rank 2.5). This applies to both the Gaussian (LMM) and non-Gaussian (GLMM) model paths, in the tab, reports, and the Agent API
  • ANOVA - Degenerate Designs Showed Internal Assertion Text Instead of a Clear Error: A design that passed ANOVA's basic check (at least 3 valid observations) but was still unworkable — for example, too few observations for the number of groups, leaving zero or negative error degrees of freedom, or too few factor levels remaining after excluding missing values — reached an internal consistency check, and the ANOVA tab and Agent API showed that check's wording (such as "Factor A must have at least 2 levels") instead of an explanation meant for users. These cases are now caught before fitting and reported with a message that states the actual requirement, such as how many observations are needed for the number of groups present
  • DoE - Large-Offset Numerical Stability: Sum-of-squares and effect calculations in DoE could lose precision for response data with a very large constant offset; the response is now centered before the calculation, matching the treatment already applied to ANOVA
  • ARIMA - Switching Between Manual and Auto Order Selection Left the Previous Result on Screen: Switching between "Manual" and "Auto (Grid Search)" order-selection modes kept the previous run's result or error message on screen, even though it no longer matched the current form settings. Switching modes now clears the previous result and error and hides the results section until the model is run again
  • Statistical Models - Near-Constant Response Produced Meaningless R², Sums of Squares, and Effect Sizes: When a response variable had no meaningful variation — whether exactly constant or varying only at the scale of floating-point rounding — several models could report numbers that looked like ordinary results but were not. Linear Regression's R² could show as a large negative number or -Infinity, and its coefficient standard errors, confidence intervals, standardized coefficients, and prediction/confidence intervals could be computed from noise instead of reported as undefined. ANOVA and DoE could show sums of squares and mean squares as a tiny nonzero number that displayed as an exact 0 rather than as undefined, and DoE's effect-plot error bars did not follow suit when the corresponding standard error became undefined. Random Forest's permutation importance could silently include trees whose out-of-bag R² was undefined. All of these now show "-" for a near-constant response, with a warning explaining why. Separately, these warnings were computed only when a model ran and were lost once the model was saved, so reopening a saved project could show a misleading number again where a warning had previously appeared; warnings are now saved with the model and persist across reload in Model Detail, reports, and the Agent API's describe()
  • Statistical Models - Boolean Columns Were Treated as Numeric Regardless of Their Measurement Scale: A boolean column appeared as a numeric variable in analysis tabs (Linear Regression, GLM, GLMM, Random Forest, PCA, Cox Regression, ANOVA, ARIMA) even when its measurement scale was left at the default, nominal, while the same column was rejected as non-numeric by the corresponding Agent API call for some of these analyses — an inconsistency between the tab and the API for identical data. Both now follow the column's measurement scale: a boolean column with a nominal scale no longer appears in these numeric variable lists; setting its scale to interval or ratio makes it available, as for any other column. Error messages now name the scale requirement directly, for example stating that a column has a nominal measurement scale but the analysis requires interval or ratio
  • Statistical Models - Inconsistent Placeholders for Missing or Non-Finite Values: Several places showed "N/A" for a value that could not be computed (which should show "-"), an inconsistent em dash for a missing confidence interval, or, in one case, the literal text "null": a report's Mean/Std Dev/Min/Max snapshot, a boolean column's true/false ratio in the Statistics tab, a dataset's row count in its metadata dialog and in Project Lineage, Random Forest's observed/predicted/residual table, Kaplan-Meier's confidence interval, and GLM Diagnostics' residual table. All now follow the same rule: "-" for a value that cannot be computed, "N/A" for a non-finite result
  • Reports - ANOVA Report Elements Added via the Agent API Did Not Survive a Reload: An ANOVA table, group statistics, or Tukey HSD table added to a report through the Agent API (reports.addModelSummary()), or an ANOVA decomposition table added from a Linear Regression model, failed to restore when the project was reopened. Adding the same elements directly from the ANOVA tab's "Add to Report" action was unaffected, since that path already recomputed them immediately. These report elements can now be recomputed from the saved model on reload
  • Statistics - Relationships Showed Both a Vertical and a Horizontal Bar Chart for the Same Category-Numeric Pair: Pairing a category column with a numeric column in the Relationships section produced two duplicate bar charts, one in each orientation. Only one chart is now shown per pair, with its orientation set by the new Orientation selector (Vertical or Horizontal)
  • Statistics - Aggregation State and Labels Could Mismatch in Relationships Bar Charts: For certain column name combinations, selecting an aggregation for one category-numeric pair could change the aggregation shown for a different pair; a bar chart with multiple series showed the aggregation of only its first series in the axis title even when other series used a different one; and a summary-statistic bar chart's axis label named the statistic (for example, "quantile") without its parameter, such as which quantile or how many standard deviations. All three are corrected
  • Graph Builder - Stacked Bar Tooltip Showed the Cumulative Value Instead of the Segment Value: Hovering over a segment of a stacked or 100%-stacked bar chart showed $y/$n as the cumulative total up to that segment rather than the segment's own value. The tooltip now shows the segment's own value; the 100%-stacked chart still reports a proportion, unlabeled as such, which is tracked separately
  • Graph Builder - Bar Without a Selection Expression Was Fully Highlighted When No Rows Were Selected: While rows were selected in the data table, a bar with no selection expression linking it to the selection — for example, a count of records on a numeric axis — could be drawn as fully selected even when none of its rows were part of the selection, because a bar with zero matching rows out of zero total rows satisfied the "fully selected" check. The check now requires at least one matching row before treating a bar as fully selected
  • Graph Builder - Flipped Coordinates Were Not Applied to Area, Step, Line, Ribbon, and Contour Layers: Turning on flipped coordinates left these layers drawn in their unflipped (vertical) orientation, and a stacked area layer could extend outside the plot area regardless of orientation. Flipped-coordinate handling for these layers is now unified with the other geometries, and the stacked-area baseline is now included when computing the axis range
  • Graph Builder - Stacking Positive and Negative Values Overlapped Segments: In a stacked bar or area chart, positive and negative values in the same stack were accumulated with a single running total, so a negative segment could be drawn on top of the positive segments instead of stacking separately. Positive values now stack upward from zero and negative values downward from zero, independently
  • Graph Builder - Aggregation Passed Non-Finite Values Through Silently, and an Unsupported Method Fell Back to Average Without Warning: Graph aggregation (used for error bars, mean/median reference lines, and category-order sorting) did not exclude infinite values, so a non-finite value could produce a corrupted statistic with no indication anything was wrong; and specifying an unsupported aggregation method for a bar chart silently used the average instead. Non-finite values are now excluded, consistent with ANOVA and DoE, and an invalid aggregation method is now rejected with an error
  • Graph Builder - Partial Row-Selection Highlight Was Drawn Outside Negative Stacked Bar Segments: When some, but not all, of a stacked bar's contributing rows were selected, the highlight overlay for a negative-valued segment could be drawn outside the bar's actual position, in both vertical and horizontal orientations. The overlay now aligns with the segment it highlights
  • Graph Builder - Point and Text Layers Ignored Dodge Position Under Flipped Coordinates: With flipped coordinates, a point or text layer using dodge (spreading marks within a category) applied the offset only on the unflipped axis, so all marks in a category were drawn stacked on top of each other on the visible axis. The offset is now applied on the correct axis after flipping
  • Graph Builder - Horizontal Bar Dodge Sub-Bars Overlapped Instead of Being Placed Side by Side: With flipped coordinates, a bar chart using dodge to place sub-bars side by side within a category instead drew every sub-bar at full width in the same position, hiding smaller values behind larger ones; vertical bar charts were not affected. Horizontal dodge now uses the same position and width calculation as vertical, placing sub-bars side by side
  • Graph Builder - Horizontal Stacked Bar Fill Segments Did Not Split by Color: With flipped coordinates, a stacked bar chart's color-filled segments were not drawn as separate segments, so the bar appeared as a single solid color instead of a stack of colors. The horizontal layout now uses each segment's own range, matching the vertical layout
  • Graph Builder - Geometry Help Did Not Explain How a Statistic Changes What a Channel Draws: The Geometry section's help text did not mention that applying a statistic (such as a histogram's bin count) replaces a channel's drawn value and range with the computed result rather than the mapped column's own values, or that the "Drawn from" indicator shows where each channel's value actually comes from. The help text now covers this
  • Data Management - SQL Editor Stayed in a Running State After Reopening a Saved Project: Saving a project while a SQL query was executing, then reopening it, restored the query's "running" flag without clearing it, so neither the Execute nor the Cancel button worked and the tab stayed stuck. The flag is now cleared when a project is opened, unless the tab is simply being moved between panes within the same session, where an actually-running query is left alone
  • Data Management - MDS File Size Grew Without Bound Across Reload Round-Trips: Data belonging to a derived dataset that is not meant to be saved with the project (not materialized) — such as synthetic-data-generator output or GLM diagnostics — could be written into the project file anyway each time the project was reloaded and re-saved, growing the file's size without bound. An internal marker that excludes such data from being saved was not restored when a project was loaded, so a later recomputation wrote its result back without the marker. The marker is now restored consistently on load, dataset creation, and recomputation; a project file already affected by this is repaired the next time it is opened
  • Data Management - Overwriting or Re-Editing a Dataset Left Dependent Data Stale: Overwriting a dataset via the Agent API (datasets.derive(), generateSynthetic(), or addColumns() with overwrite: true) left dependent derived datasets and model estimates showing the previous data until the project was reloaded. Separately, changing a derived dataset's source through "Edit Operation..." (SQL Editor, Synthetic Data Generator, or Add Columns) left a report's Statistics Summary element showing the previous statistics until reload. Both are now updated without a reload
  • Data Management - Edit Operation and tabs.open() Could Reuse an Unrelated Tab of the Same Type: Opening "Edit Operation..." for a saved SQL Editor or Synthetic Data Generator result, while an empty tab of that same type was already open, switched to the existing empty tab instead of opening the edit, without showing the intended settings. The Agent API's tabs.open({ datasetId }) could similarly ignore the dataset argument when a tab of that type was already open. Both are fixed by the same change: a tab reused for a given type must now also match what it is showing or editing
  • Data Management - Duplicate-Name Dialog's Replace Could Break a Dataset's Lineage and Column References: In the SQL Editor and Add Columns (computed column) tabs, saving a result under a name that already existed offered a "Replace" option regardless of how the existing dataset had been created, so a dataset built one way (for example, by Synthetic Data Generator) could be replaced by an unrelated kind of result (for example, a SQL query), losing its actual lineage; the replacement also assigned new column ids, breaking column references in any dataset or model built on top of it. "Replace" is no longer offered when the existing dataset was created by a different kind of operation, and a replacement that is allowed now keeps the existing schema's column ids
  • Agent API - models.run() Help Did Not Name the Error Returned for an Ephemeral Dataset ID: The help text stated that ephemeral datasets "are rejected" without saying what happens when one is specified by id; it now states this returns an INVALID_INPUT error

[2026.06.29]

Added

  • Data Management - Synthetic Data Generator: A new Synthetic Data Generator tab lets you generate a dataset by specifying, for each column, a probability distribution whose parameters can be written as expressions that reference the values of earlier columns. Available distributions include normal, uniform, gamma, Poisson, Bernoulli, categorical, a fixed (deterministic) value, and a value drawn separately within each group; parameter expressions support constants, column references, arithmetic, the functions exp, log, sqrt, and logistic, and values selected by category. Out-of-range parameters (for example a non-positive standard deviation or a probability outside 0–1) are flagged before generation. The specification and its random seed are kept with the dataset, so reloading the project regenerates the same data
  • Data Management - Trace Contributing Rows to Any Ancestor Dataset: For a row in a derived dataset, the Contributing rows action now opens a submenu listing every ancestor dataset it can be traced back to — from the immediate parent up to the original imported data — so you can jump straight to the contributing rows in a chosen ancestor in one step. From an opened Contributing rows view you can also keep moving one level further toward the original data. Previously you could open only the immediate parent
  • DoE - Factor Effects Table: A new Effects sub-tab in the DoE tab shows, for each term (main effects and interactions, excluding the intercept), the effect estimate, its standard error, and its confidence interval; no test statistics or p-values are shown. The effect estimate is the difference in mean response between the two levels of a factor, and each main-effect term names its contrast direction (level A − level B) so the sign of the estimate is unambiguous. The table can be added to a report
  • Graph Builder - "Drawn from" Layer Summary: Each layer now shows, for every drawing channel (x, y, color, size, and so on), where the value actually drawn comes from — a mapped column, the output of an applied statistic, or a fixed geometry value. This helps explain cases where applying a statistic makes the drawn value differ from the column you mapped (for example, a binned chart draws y from the bin count and x from the bin center)
  • Statistics - Correlation Matrix Labeled as Pearson (Linear) Correlation: The correlation matrix now shows a "Pearson (linear) correlation" sub-label in its header, stating which correlation coefficient it reports
  • Agent API - datasets.generateSynthetic(): datasets.generateSynthetic(spec, options) creates a synthetic dataset from a data-generating-process specification, the same one used by the Synthetic Data Generator tab

Changed

  • Data Management - Expand to Source Rows Renamed to Contributing Rows: The right-click action formerly labeled Expand to source rows is now labeled Contributing rows, in the row and cell menus and on the Selected Rows tab
  • DoE - Analyses Persist as Models and Report Elements Follow Source Reloads: A DoE analysis added to a report is now kept as a saved model, and its report elements (such as the interaction plot) are re-derived from that saved analysis. After you reload the source dataset, the DoE report elements follow the reloaded data instead of staying a fixed snapshot taken when they were added
  • Graph Builder - Fixed Color, Size, and Opacity Are Set in the Geometry Section: Setting a constant (non-data) color, size, or opacity for a layer is now done with the controls in the layer's Geometry section; the Aesthetics section maps columns only and no longer offers a fixed-value option. Constant values saved in earlier versions are moved to the Geometry settings automatically when a project is opened
  • Agent API - openContributingRows Replaces expandToSourceRows: datasets.expandToSourceRows(datasetId, rowIndices) has been renamed to datasets.openContributingRows(datasetId, rowIndices, targetDatasetId?) and takes an optional ancestor dataset to trace to in one call; passing an ancestor that is not traceable returns INVALID_INPUT. Code calling the old name must be updated
  • Agent API - Fixed Aesthetic Values Are Rejected in Graph Mappings: Supplying a constant color, size, or opacity in a graph layer's aesthetic mapping now returns INVALID_INPUT; an aesthetic mapping takes a column only, and constant values are set as geometry parameters instead

Fixed

  • Linear Regression - R² Was a Meaningless Value for a Constant Response: When the response was constant, R² was computed from a total sum of squares that rounding left as a tiny positive number, producing a meaningless value; a constant response now shows R² as "-", since it is undefined
  • GLM - Fit-Failure Messages Exposed Internal Row Numbers and Gave Misleading Advice: When a GLM could not be fit, the error message referred to internal observation indices (such as mu[3]) counted after rows with missing values were dropped, and it suggested changing the link function even when the cause was separation or extreme predictor scales; messages now refer to "one observation," and for a binomial model whose fitted probability reached 0 or 1 they point to complete or quasi-complete separation, predictors on very different scales, or high-leverage observations
  • GLM - Null Deviance Was Reported as a Number When It Could Not Be Computed: When the null (intercept-only) model's fitted mean fell outside the family's valid range, the null deviance was reported as a misleading number; a degenerate null model now reports it as not computed, while the rest of the fit (coefficients, standard errors, confidence intervals, AIC) is kept
  • GLM - Overflow During Fitting Was Reported as a Standard-Error Problem or Slipped Through as Success: When extreme predictor or response values overflowed during fitting, the failure was reported as a problem computing standard errors and surfaced only after fitting appeared to finish, and for Poisson and binomial models an infinite deviance, residuals, or fitted value could be presented as a successful fit; an overflow is now caught where it occurs and reported as a fit failure pointing to extreme values in the predictors or the response
  • GLM / Linear Regression - Convergence History Dropped Coefficients for Some Variable Names: The convergence-history table silently lost a coefficient column when two variable names mapped to the same internal column name (for example, A and a, or x.1 and x_1); each coefficient now keeps its own column
  • ANOVA - Non-Finite Response Values Silently Corrupted or Froze a Re-Estimated Model: When a saved ANOVA model was re-estimated, an infinite response value passed through and made a sum of squares undefined while the model still reported success, and a non-numeric (NaN) value in a numeric column caused an error that left the model stuck; the model now excludes the same missing and invalid values whether it is first computed or re-estimated
  • ANOVA / DoE - Empty and Blank Cells Were Treated as Data: An empty response cell was read as the number 0, and a factor label consisting only of whitespace created a phantom group; such cells are now excluded as missing in both ANOVA and DoE
  • Random Forest - R² Was 0 Instead of Undefined for a Constant Response: When the response was constant (or the data was empty, a single value, or non-finite), the coefficient of determination and the out-of-bag R² were reported as 0 rather than undefined; they now show "-", and trees whose out-of-bag R² is undefined are excluded from the permutation importance averages
  • ARIMA - Automatic Order Selection Over-Differenced a Stationary Series: For a stationary series with a root close to the unit circle (for example, a strongly autocorrelated AR(1) series), automatic order selection chose a redundant difference; the differencing order is now decided by a stationarity test before the remaining terms are selected, and the tab shows the chosen order together with the test result behind it
  • Mixed Models (LMM) - Variance Component Estimates Were Not Fully Reproducible: The estimated variance of the random effect could differ slightly between fits of the same model — for example, after rescaling a predictor — by up to about 1%; the estimate is now reproducible
  • Graph Builder - Changing a Layer's Geometry to Bar Left Grouped Bars Drawn on Top of Each Other: Switching a scatter layer (or another layer whose Position was set to Identity) to a bar geometry kept that Position instead of the bar's natural stacking, so bars grouped by fill or color were drawn over each other at the same x; the Position now changes to the new geometry's default when it was left at the previous geometry's default
  • Graph Builder - Ordinal Enum Axis Order Was Mislabeled "Custom" and Reset Discarded the Defined Order: Assigning an ordinal enum column to an axis showed "Category Order (Custom)" with a Reset button before any reordering, and Reset reverted the axis to alphabetical order; the axis is now treated as custom only after you reorder it, and Reset restores the enum's defined order
  • Graph Builder - Integer Axis Ticks Did Not Follow Zoom on the X and Y1 Axes: For an axis using an integer column or a count statistic, the integer tick labels stayed at the full data range while zooming, even though the secondary Y axis followed the zoom; the X and Y1 integer ticks now follow the zoomed range like the other ticks
  • Graph Builder - A Fixed Opacity Was Pulled Toward a Middle Value in a Faceted Chart: In a faceted chart, a layer's fixed opacity (alpha) was drawn at a midpoint instead of the value you set; a fixed opacity is now applied as set
  • Graph Builder - Editing a Graph Discarded Unsaved Changes When the Graph Was Updated Elsewhere: While the graph Edit dialog was open, an update to the same graph from elsewhere (for example, an Agent API call that changed the element) re-initialized the dialog and discarded your in-progress edits; the dialog now keeps your edits and re-initializes only the next time it is opened
  • Data Management - Renaming a Dataset Could Lose Concurrent Changes to Other Datasets: While a dataset rename was updating dependent SQL queries, another change made at the same time to a different dataset could be lost — an added dataset disappeared, a deleted one reappeared, or a schema change reverted; concurrent changes to other datasets are now preserved
  • Data Management - Deleting One Dataset Removed Unrelated Datasets Built From a Parentless SQL Query: A dataset built from a SQL query that references no other dataset (such as SELECT * FROM generate_series(1, 100)) was mistakenly treated as depending on an unrelated dataset, so deleting that unrelated dataset also deleted the SQL-built one and reloading it re-evaluated the SQL-built one needlessly; such datasets no longer carry a false parent
  • Data Management - A Derived Dataset's Enum Column With Out-of-Range Values Kept the Wrong Type: When a derived dataset produced an enum column containing values outside the enum's definition, its schema still reported the enum type while the data was stored as text, causing mismatches in how the column was shown, saved, and inherited by datasets derived from it; the column is now typed as text from the moment it is created
  • Data Management - Correlation Matrix Column Measurement Level Changed After Reloading the Project: A saved correlation matrix's columns came back with a different measurement level (ratio instead of interval) after the project was reloaded; the measurement level is now the same on reload as when the matrix was created
  • Data Management - A Recoverable Failure While Evaluating a Derived Dataset Was Reported as File Corruption: When evaluating a derived dataset failed for a recoverable reason such as a SQL or reference error, the message always blamed a corrupted file; recoverable errors are now reported as such
  • Data Management - Cancelling the Unsaved-Changes Prompt While Opening a File Left the Open Stuck: When opening a file with unsaved changes present, choosing how to handle a duplicate project (replace or copy) or approving a signature warning and then cancelling the unsaved-changes confirmation left the open in a stuck state, where the duplicate-project dialog did not reappear and the open could not be completed or cleanly cancelled; cancelling now aborts the file open completely
  • Statistical Models - Uncomputable Statistics Showed Different Placeholders in a Tab Than in a Report: A model statistic that could not be computed appeared one way in its tab and another way in a report; the placeholders are now consistent, showing "-" when the value is undefined and "N/A" when it is non-finite
  • Agent API - models.glm.configure() Silently Accepted Duplicate Predictor Columns: models.glm.configure() accepted the same predictor (x) column listed more than once without any warning or error; duplicate predictor columns are now rejected

[2026.06.25]

Added

  • Data Management - Decimal and Scientific Notation in Filter Expressions: Filter expressions now accept numeric literals written with a leading dot (e.g., .5, -.5) and in scientific notation (e.g., 5e3, 5.5e-3, 5E+3), in addition to plain integers and decimals. For example, distance > 5e3 filters rows where distance exceeds 5000. A literal too large to represent (such as 1e400) is rejected with an error rather than silently matching every row
  • Data Management - Expand to Source Rows for Crosstab and Reshape Datasets: Expand to source rows now works on datasets built by a crosstab and by a reshape (wide-to-long and long-to-wide), in addition to SQL-query and filtered datasets. Selecting rows in such a derived dataset and choosing Expand to source rows opens the parent rows that contributed to them, so you can drill down from an aggregated or pivoted view to the underlying detail rows. For example, expanding a row of a Region x Product crosstab opens every source row for that region. Previously the action was unavailable for these datasets
  • Data Management - Notification When Background Re-Estimation After a Reload Fails: After reloading a dataset, dependent models are re-estimated in the background. When that re-estimation failed (for example, because the new data had too few observations for a model), nothing appeared on screen, so a model could stop producing results with no indication until its tab was opened. A persistent notification now appears at the bottom-right for each failed re-estimation, naming the affected model and the reason; an Open Model button opens the model, and the notification stays until you dismiss it
  • Reports - Page Setup for Printing: A new Page setup option in the report header menu lets you set the paper size (A4, Letter, or A3), orientation (portrait or landscape), and page margins in millimeters. These settings apply when you print the report or export it to PDF
  • Reports - Element Layout and Page-Break Controls: The Resize dialog for a report element now includes layout options that apply both on screen and when printing. You can set the element's alignment (left, center, right, or full width) and width (fit to width, small at 33%, medium at 66%, large at 100%, or a custom percentage), mark it to keep together so it is not split across a page break, and have it start on a new page when printing
  • Agent API - datasets.traceRowLineage() Supports Crosstab and Reshape Datasets: datasets.traceRowLineage() can now trace one hop of row lineage for datasets built by a crosstab and by a reshape (wide-to-long and long-to-wide), matching parent rows by value. Previously these datasets returned traceable: false with the reason unsupported-operation

Changed

  • Data Management - Column Names Starting With a Digit Require Double Quotes in Filter Expressions: In a filter expression, an unquoted token beginning with a digit is now read as a numeric literal. Previously a column name that began with a digit but also contained letters or underscores (e.g., 2024_sales) could be referenced without quotes; such a name must now be enclosed in double quotes, as in "2024_sales" > 1000. Without the quotes the leading digits are interpreted as a number and the filter does not match the intended column
  • Data Management - Column Names Starting With __midas_ Are Rejected: Column names beginning with __midas_ are reserved for MIDAS internal columns. Naming a user column this way previously caused confusing failures elsewhere (for example, Expand to Source Rows could fail because an internal step mistook a real data column for an internal one). Such names are now rejected at the points where columns are named or renamed: renaming a column in the Data Table, creating a dataset manually, and any operation that would produce an output column with this prefix (computed columns, SQL-derived datasets, Wide to Long, Long to Wide, and crosstabs). When you rename a column to a reserved name in the Data Table, the edit field stays open so you can correct the entry. CSV/TSV import handles this automatically: a header starting with __midas_ is renamed to a non-reserved name and a warning is shown for each renamed header
  • Agent API - Reserved __midas_ Prefix Rejected in Dataset Methods: datasets.addColumns() now returns an INVALID_INPUT error when a column name starts with the reserved prefix __midas_ (reserved for MIDAS internal columns). datasets.derive() and datasets.query() return an EXECUTION_ERROR when the SQL produces an output column whose name starts with this prefix; alias such columns to a non-reserved name. datasets.importFromURL() and datasets.importFromBuffer() automatically rename headers starting with __midas_ to non-reserved names and include a warning for each renamed header in result.warnings

Fixed

  • Data Management - Resolving a Duplicate Dataset Name in the SQL Editor Looped Instead of Saving: When saving SQL query results under a name that already existed, choosing a different name or the suggested incremented name in the duplicate-name dialog reopened the dialog instead of saving; the query result is now saved under the resolved name. Entering another already-existing name in the rename field correctly re-triggers the duplicate check
  • Data Management - Pressing the SQL Editor Run Shortcut During Execution Could Start a Second Run: While a SQL query was running, pressing the run shortcut (Ctrl/Cmd+Enter) again could start a second execution; the shortcut is now ignored until the running query finishes or is cancelled
  • ANOVA - Saved ANOVA Model Stuck in an Error State After Reloading Its Source Data: Reloading the source dataset of a saved ANOVA model left the model in a permanent error state, so its results and diagnostics no longer displayed. Other model types recovered from a reload, but ANOVA did not; a saved ANOVA model is now re-estimated from the reloaded data, preserving its mode, sum-of-squares type, confidence level, and group ordering
  • Reports - Report Data Tables Ignored the Column Number Format: A data table added to a report did not apply the per-column number format or the default number format from Settings > Display, showing unformatted raw values instead. For example, a column set to comma grouping with 2 decimals displayed 1234.5 as 1234.5 rather than 1,234.50; the report data table now matches how values appear in the Data Table tab
  • Reports - Report Markdown Edit Was Lost When Switching Tabs While Typing: While editing a report's Markdown content, switching to another tab (or otherwise leaving the editor) within a fraction of a second of your last keystroke discarded that final edit; the most recent change is now saved before the editor closes
  • Reports - Clearing a Report's Markdown Content Did Not Save: Deleting all the text in a report's Markdown editor and confirming the close (Done, Escape, or Ctrl/Cmd+S) restored the previous content instead of keeping it empty; emptying the content now persists as entered
  • Embed Mode - Created with MIDAS Attribution Badge Kept a White Background in Dark Theme: In an embedded report, the "Created with MIDAS" attribution badge had a fixed near-white background and shadow that did not follow the active theme, so it appeared as a bright box under a dark theme; the badge now uses the theme's surface color and shadow

[2026.06.24]

Added

  • Data Management - Expand to Source Rows: For a row in a derived dataset, you can now right-click and choose Expand to source rows to open a Source rows tab showing the original rows that contributed to it. This works for datasets derived through SQL queries (tracing GROUP BY aggregations, joins, subqueries, and CTEs) and through filters; when a join draws from more than one parent dataset, each parent opens in its own tab. The action is also available from the Selected Rows tab, and is grayed out with an explanation for datasets where tracing is not supported (imported data, unsupported derivations, and the Source rows view itself). Saving the result as a dataset preserves the relationship, so the contributing rows reflect the current state of the source data rather than a fixed snapshot
  • Project Lineage - Operation Labels on Graph Edges: Edges in the Project Lineage graph now show the operation they represent (such as SQL Query, Add Columns, or Trained on) as a label at their midpoint, with the same text available as a tooltip on hover; previously edges carried no operation label and edges of the same kind shared a single color, so the specific operation could not be told from the graph alone

Changed

  • ANOVA - Default Sum-of-Squares Type Changed From Type I to Type III: New ANOVA analyses open with Type III sums of squares selected by default, replacing Type I. For two-way designs with unequal group sizes, Type I results depend on the order in which the two factors are entered, which is easy to overlook; Type III evaluates each factor adjusted for the other terms in the model, so the result does not depend on factor order. Analyses in existing saved projects keep the sum-of-squares type stored with them and are unchanged
  • Data Management - Reload Dataset Accepts Files With Extra or Reordered Columns: Reloading a dataset from a new file no longer requires the file to have exactly the same columns in the same order. The reload now succeeds as long as every column already in the dataset is still present with the same name and data type; the new file may add columns or list them in a different order. Files that drop, rename, or change the type of an existing column are still rejected, and models, derived datasets, graphs, and reports that reference the existing columns continue to work
  • Data Management - Reload Dataset Warning Now Names What Will Be Cleared: The Reload Dataset dialog previously showed a generic warning that excluded rows and row comments would be cleared, even for a dataset that had none; the warning now appears only when the dataset has excluded rows or row comments, and states how many of each will be cleared
  • Data Management - Row Selections Saved as Datasets Now Require a Filter: A selection of rows can be saved as a dataset only when it is defined by a filter expression; selections made by clicking rows can no longer be saved (Save as Dataset is disabled for them). Datasets saved from a row selection in earlier versions used unstable row positions and are removed when a project is loaded, along with any datasets derived from them; a warning reports how many datasets were removed, and report elements that referenced a removed dataset are dropped as well. To keep such a subset, recreate it with a filter expression
  • Project Lineage - SQL Query Diagram Removed From the Detail Panel: The diagram that drew an SQL query's structure as connected nodes in the Project Lineage detail panel has been removed. The query's SQL text remains shown in the same panel. The diagram repeated information already available from the SQL text and the dataset dependency graph without making the query easier to understand
  • Agent API - Create Methods Return id: Methods that create a resource now return its identifier in an id field, matching the field name used in list() results. Previously datasets.derive(), datasets.normalize(), datasets.addColumns(), datasets.addOrthogonalPolynomials(), datasets.importFromURL(), datasets.importFromBuffer(), datasets.buildMapping(), models.save(), and reports.create() returned datasetId, modelId, or reportId; code reading those fields must use id instead

Fixed

  • Graph Builder - Facet Panels Stayed Blank After Their Data Became Valid Again: In a faceted chart with free scales, a panel that had shown a "No valid data points" message did not redraw when a configuration change (such as switching the X variable) made its data plottable again; the first panel recovered but the rest stayed blank, showing only the interaction toolbar. Removing and re-adding the facet, or reopening the tab, was the only workaround
  • Graph Builder - Warnings From Panels Other Than the First Were Lost: In a faceted or Multi-Panel chart, when a panel other than the first hit a computation problem (for example, a density curve omitted because every value in that group was identical), no warning appeared; warnings are now shown for every affected panel, each prefixed with its panel or group label so you can tell which one produced it
  • Graph Builder - Density Curve Disappeared for Some Data With Repeated Values: For some columns the density curve did not appear even though the values varied — for example, a small sample with repeated values such as 0, 2, 2, 2 — because the spread used to size the curve was measured as zero; the curve is now drawn for such data, and is still omitted (with a warning shown instead) only when the middle 50% of the values are identical or every value is the same
  • Graph Builder - Y1 Axis Showed Integer-Only Ticks When a Y2 Layer Used a Count: In a dual-axis chart, adding a layer that used a count on the Y2 axis forced the Y1 axis to show integer-only tick marks even when its own data was continuous; the Y1 axis now chooses its tick format from its own layers only
  • Graph Builder - Axis Showed Repeated Integer Labels for a Decimal-Only Range: When an axis used an integer column or a count/bin statistic and its range was set to contain no whole numbers (e.g., 0.1 to 0.9), the tick labels repeated integers such as "0, 0, 1" instead of the decimal values; this affected the X axis, the Y axis, and the secondary Y axis, which now show the actual decimal values
  • Graph Builder - Bar Chart With a Date on the X Axis Was Mis-Drawn or Crashed: Assigning a date or date-time column to the X axis of a bar chart that counts records drew the axis on a plain numeric scale instead of a time axis, and when the dates could not be read as numbers the chart failed with an internal error and made the report unrenderable; date and date-time columns are now treated as a time axis in bar charts, both in Graph Builder and when adding a graph through the Agent API
  • Mixed Models (LMM) - Fit-Failure Message Misidentified the Cause: When a linear mixed model failed to fit because a matrix was near-singular or could not be inverted, the error message attributed the problem to the design matrix (and, in the near-singular case, to highly collinear predictors); the matrix involved is the information matrix and collinearity is only one possible cause, so the message now refers to the information matrix and suggests checking for collinear or redundant predictors as one thing to look at
  • GLM / Cox Regression - Overflow Produced Infinite or Undefined Standard Errors Instead of a Fit Error: When extreme predictor or response values overflowed during fitting, GLM and Cox regression could report standard errors and confidence-interval bounds as Infinity or undefined while still presenting the fit as successful (e.g., a GLM with a log link and very large response values); these cases are now reported as a fit failure, with a message pointing to extreme values in the predictors or the response
  • Cox Regression - Incorrect Coefficients Were Reported as a Successful Fit for Ill-Conditioned Designs: When the model was ill-conditioned — typically from strongly collinear predictors or predictors on very different scales — Cox regression could accept coefficient updates without checking that the fit actually improved and then report convergence, so the resulting hazard ratios and confidence intervals were wrong with no warning; each update is now accepted only if it does not worsen the fit, and when no acceptable step can be found the fit is reported as not converged
  • Project Lineage - Transformation Details Were Blank for Most Derived Dataset Types: Selecting a derived dataset in the Project Lineage panel showed only a heading and no content in the Transformation section for many derivation types, such as computed columns, reshape, and dummy coding; the panel now shows the key settings for every derivation type — for example, the expression of a computed column, the column mapping of a reshape, or the encoding of dummy coding
  • Data Management - Tracing Source Rows Returned Wrong or Missing Rows in Some Cases: Tracing a derived row back to its source rows could fail in two ways: when the output had two or more columns with the same name (such as a self-join), it silently returned too few rows or none; and when two datasets had names differing only in letter case, it could resolve to the wrong source
  • Data Management - A Query on an Unevaluated Derived Dataset Broke Later Queries That Used It: Running a query that referenced a derived dataset before it had been evaluated (for example, just after its parent changed) caused that query, and every later query that referenced the same dataset, to fail until the page was reloaded; such queries now run correctly and leave other queries unaffected
  • Data Management - Queries on Unevaluated Model Output Failed: SQL queries and computed columns that referenced a model's output (coefficients, diagnostics, or predictions) failed when that output had not yet been evaluated, and the failure carried over to later queries until the page was reloaded; such queries now evaluate the model output first and run correctly
  • Data Management - Deleting a Model Left Its Derived Datasets Orphaned: Deleting a model removed its own output tables but left datasets the user had derived from them in the dataset list with no valid source; deleting a model now removes those dependent datasets as well
  • Data Management - Opening an MDS File From a URL Downloaded It Even When the Prompt Was Cancelled: When opening an MDS file from a URL, the unsaved-changes confirmation appeared only after the file had already been fetched, so cancelling discarded the downloaded data; the confirmation now appears before the download, so cancelling avoids the network request
  • Agent API - Data Methods Included the Internal Row # Column: datasets.describe(), datasets.profile(), datasets.query(), and datasets.fetch() included the internal row-number column (Row #) in their data and column counts, so the column count from datasets.describe() did not match the one from datasets.list(); Row # is now excluded from all four, and the counts agree
  • Agent API - Wrong Recovery Advice for an Unevaluated Derived Dataset: When datasets.profile(), datasets.fetch(), or datasets.buildMapping() was called on a derived dataset that had not been evaluated, the error said the dataset had no data and advised running a query referencing it to trigger evaluation, which did not actually make the data available to these methods; the message now states the dataset has not been evaluated and advises opening it in a Data Table tab, or reading its rows with datasets.query()
  • Reports - One Failing Report Element Crashed the Whole App and Blocked Reopening the Project: When a graph or other report element threw an error while rendering, the failure brought down the entire application, including unrelated tabs and datasets, and saving in that state made the project crash again on every open with no way back through the normal UI; a failing element is now contained to its own tab, which shows an error message with recovery guidance while the rest of the app keeps working
  • Reports - ANOVA and Crosstab Elements and DoE "Add to Report" Masked Internal Errors: When an internal error (an implementation bug) occurred while rendering an ANOVA or crosstab report element, or while adding a DoE result to a report, it was caught and turned into a misleading message, or — for an interaction plot — a failing panel was silently skipped, so the underlying bug never surfaced; these internal errors now propagate instead of being masked, while genuinely recoverable problems such as a missing or non-numeric column still show their usual messages
  • Data Import - Launcher Drop Errors Were Off-Screen and a Duplicate Drop Zone Appeared: When a file dropped onto the launcher could not be opened (for example, an empty or unsupported file), the error appeared in a banner below the bottom of the window and was invisible without scrolling; errors now appear in a dialog. Dragging a file over the launcher also showed a separate full-screen drop zone on top of the existing Open File area, so two drop targets appeared at once; the existing area now highlights in place instead

Performance

  • Random Forest - Prediction Was Slow on Large Datasets With Many Missing Rows: On large datasets, producing predictions and class probabilities slowed noticeably as the number of rows with missing values grew; results were unaffected, and prediction time now scales with the number of rows regardless of how many are skipped
  • Data Management - Normalize Variants Could Hang on Columns With Many or Long Values: Normalizing spelling variants in a text column with many unique values, or with very long values, could run for a very long time without finishing, leaving the operation stuck on "Processing"; such columns now finish quickly

[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