Changelog
All notable changes to this project will be documented in this file.
[2026.10.10]
Added
- SQL Editor - Force Stop for a Query That Does Not Cancel: When a query is still running 3 seconds after Cancel Query, the button changes to Force Stop, which restarts the SQL engine to end the query without reloading the page. If a save, export, project load, or data import is in progress at that moment, a dialog lists what will fail before stopping, and an operation stopped this way fails with a message saying that a query was force stopped
- Custom Graph - Proportion Scale for Time Bin: The Y Scale of the Time Bin statistic offers Proportion, the count of a bin divided by the number of rows of its group, so the bars of each group sum to 1
- Agent API - Delimiter of CSV Imports:
datasets.importFromURL(),datasets.importFromBuffer(),datasets.createFromCsv(),datasets.createFromCsvUrl(), anddatasets.reload()acceptdelimiter - Agent API - Save Data with Project of a Derived Dataset:
datasets.list()anddatasets.describe()returnsaveDataWithProjectfor a derived dataset, anddatasets.setSaveDataWithProject()changes it - Agent API - Row Exclusion and Row Comments:
datasets.excludeRows(),datasets.listExcludedRows(),datasets.restoreRows(),datasets.listRowComments(),datasets.setRowComments(), anddatasets.removeRowComments()do what the Data Table does, invalidating dependent datasets, models, and reports in the same way. Excluding and restoring returnEDIT_MODE_ACTIVEwhile a Data Table tab has the dataset open in Edit Mode
Changed
- Projects - New Project File Format: A project file is now a zip holding the project's metadata and one Parquet file per dataset, instead of compressed JSON. Files saved by earlier versions still open and are converted; the stored data of their derived datasets is recomputed when first needed
- Data Management - Materialized View Is Renamed Save Data with Project: The Data Table menu and Project Overview call the setting Save data with project, since it only decides whether the computed data is written to the project file; a change to a parent still discards the data and recomputes it
- Data Management - Prediction Interval, Variable Importance, and GLMM Random Effects Datasets Are Recomputed Like Other Derived Datasets: These datasets were always saved with the project and locked in Project Overview; they are now recomputed from their source, and the lock is removed. A prediction interval dataset has Save data with project turned on when it is saved, to avoid refitting each time the project is opened. Prediction tables saved by an older version in a form that cannot be recomputed are removed when the project is opened, together with the datasets, models, tabs, and report elements that depended on them, with a warning naming each
- Reshape - Row # Cannot Be Chosen as a Column: The ID, variable, and value column lists of Wide to Long and Long to Wide no longer offer Row #. A saved Reshape that used it stops with an error that explains how to copy the row number into a regular column with SQL first
- Convert Column Types - Only String, Integer, and Enum Columns Convert to Enum: Enum Types is no longer offered for float64, boolean, date, and datetime columns, which must be converted to string first; converting them to enum produced only missing values before. A saved conversion with such a step opens without it, with a warning naming the column
- Statistics - The Tab Is Named Statistics: The tab name no longer includes the dataset that was active when the tab was created, since the tab follows the active dataset and the two could differ; the dataset name is in the tab's header
- Data Import - The Delimiter Is Chosen Instead of Detected: The delimiter is no longer guessed from the file. Import Data, Open from URL, and Reload Dataset have a Delimiter field with Comma, Tab, Semicolon, and Vertical bar, whose default follows the file name: Tab for .tsv and .txt, Comma otherwise. The delimiter is saved with the dataset and is the default of Reload Dataset
- Data Import - Files With Unreadable Rows Are Not Imported: A file with a row of a different number of fields, an unclosed quote, a row over 64 MB, or mixed line endings is rejected. The error gives the number and content of the first such row and the number of other unreadable rows, and Import Data stays on the settings screen so the delimiter or encoding can be changed and the file read again
- Data Import - Text That Cannot Be Decoded Stops the Import: Bytes that cannot be decoded with the chosen or detected encoding were imported as replacement characters with a warning giving their number; the import now fails with an error naming the row and pointing to the encoding setting of Import Data or Open from URL
- Filter Expressions - Invalid Conditions Match No Rows: A condition that refers to a column not in the dataset, compares a column with a value of another type, or applies LIKE to a non-text column had results of its own in some cases (a text compared with a datetime column was read as a date, LIKE on a date column compared its text form, and a missing column counted as all missing so IS NULL matched every row). Such a condition now matches no rows and its negation matches every row, including when a saved filter is re-derived after a column changed type or disappeared. A LIKE pattern that is not a text, such as
species LIKE 5, is rejected - SQL Editor - Casting Text With a Time Zone Offset to TIMESTAMP Ignores the Offset: After the SQL engine update,
CAST('2025-01-15 14:30:00+09' AS TIMESTAMP)in a query or computed column gives the written time instead of converting to UTC; a saved query is re-evaluated by this rule when the project is opened. Use TIMESTAMPTZ to apply the offset. Datetime columns, Convert Column Types, and CSV import are unaffected - Agent API - Conversion to Enum From Other Types Is Refused:
datasets.setColumnSchema()returnsINVALID_INPUTfor a float64, boolean, date, or datetime column converted to enum and suggests converting to string first
Removed
- Data Import - Fix Rows: The screen for correcting rows with a different number of fields is removed; such a file is not imported, and the error names the first unreadable row
Fixed
- Convert Column Types - Converting an Integer Column to Enum Produced Only Missing Values: Every value of an int64 column became missing, regardless of the enum definition
- Filtered Data - Saving Contributing Rows of a Filtered View Made a Dataset That Could Not Be Reopened: Save as Dataset in a Contributing rows tab opened from a Filtered Data tab kept a reference to the temporary view, and after the view's tab was closed the project failed with an error that the dataset was not found. The unsaved views are now saved together with the dataset, the dialog lists them, and Save as Dataset is disabled with a reason when a view's tab has already been closed
- Statistics / Selected Columns / SQL Editor - Tabs Were Closed When the Dataset Active at Their Creation Was Deleted: These tabs follow the active dataset, but deleting the dataset that was active when they were created closed them, a SQL Editor with its unsaved query included, and Project Lineage listed them under that dataset
- Projects - Export Project Marked the Project as Saved: After Export Project, the project counted as saved although the copy in the browser was not updated, so a second export produced the file as it was before the edits, and Close Project did not ask about unsaved changes
- Projects - Saving During the Download of an Exported Project Failed the Download: For a project exported without edits, a Save to Browser while the download was in progress made the download fail
- Projects - A Failed Save to Browser Gave No Notice: When Save to Browser or Ctrl+S failed, nothing was shown
- SQL Editor - Cancel Query Failed a Save or Load in Progress: Cancelling restarted the SQL engine, so a save, export, project load, or data import running at that moment failed; now only the running queries are interrupted
- Data Table - The Restore Button of an Excluded Row Was Out of View: In the dialog opened by View excluded rows, a table wider than the dialog (e.g., with long exclusion reasons) had to be scrolled sideways to reach a row's Restore button; the Actions column now stays at the right edge
- Graph Builder / Analysis Tabs - A Derived Dataset Whose Data Was Discarded Was Shown Empty: After an upstream change discarded the computed data of a derived dataset, the Graph Builder drew an empty graph and the analysis tabs did not recompute it. They now recompute it, the graph says that evaluation is pending or why it failed, and Export CSV evaluates the dataset instead of writing a header-only file
- Data Management - A Derived Dataset Evaluated While Its Source Changed Kept the Old Result: When the source data, operation, enum definition, or model changed during an evaluation, the result from the old input was kept as current; it is now discarded and the evaluation runs again
- Data Management - Save in Convert Column Types, Reshape, Apply Mapping, and GLM Prediction Registered Data From a Source That Had Changed: When the source changed between the preview and Save, the dataset was registered with the data computed from the old source; it is now registered without data and recomputed when needed
- Agent API - Methods That Derive a Dataset Registered Data From a Source That Had Changed:
datasets.derive(),datasets.addColumns(),datasets.reshape(),datasets.dummyCode(),datasets.filter(),datasets.setColumnSchema(),datasets.normalize(), and the others that register a dataset computed from a source registered the data computed from the old source when the source changed during the call; the dataset is now registered without data, andwarningssays that the returned row count is from the discarded computation - Agent API - datasets.profile(), fetch(), and buildMapping() Returned NO_DATA for a Derived Dataset That Had Not Been Computed: The methods now evaluate the dataset first.
datasets.setColumnSchema()also skipped the check for values outside the enum definition on such a dataset; it now evaluates the dataset and checks them - Statistical Models - A Re-estimation That Finished After the Training Data Changed Was Kept: A saved model whose training data changed during its re-estimation kept the result of the old data; it is now discarded and the model is re-estimated, and a prediction dataset computed from the old estimate is not registered
- Contributing rows - Wrong Rows Were Shown for SQL Datasets Over a Parent Whose Row # Skips Values: For a SQL or Convert Column Types dataset whose parent has gaps in Row # (a filtered dataset that keeps the original Row #, or a primary with excluded rows), Contributing rows, click selection in graphs, and a saved contributing rows dataset showed other rows or rows of all missing values
- Statistical Models - An Error From a Run on the Previous Data Stayed After Reload Dataset: The GLM, GLMM, Linear Regression, ARIMA, Cox Regression, Random Forest, PCA, ANOVA, and Kaplan-Meier tabs kept the error message of a run on the data before Reload Dataset. A run interrupted by Reload Dataset now ends with "The dataset changed while the analysis was running. Run the analysis again."
- Statistical Models - A Missing Selected Column Was Reported by Its Internal ID: When a column selected in the GLM, GLMM, Linear Regression, or ARIMA tab, or used by a saved model, was no longer in the dataset, the message showed the internal column ID; it now names the column's role
- GLM - A Model Without Intercept Was Refused When the Offset Put an Observation Outside the Link's Domain: A model without an intercept stopped with an error when the offset put an observation outside the domain of the link. The fit now runs, with the null deviance shown as "-" as for models with an intercept and an offset; when the fit cannot start, the error names the offset as the cause
- GLMM - The Gamma Dispersion Was Labeled Residual Variance: In the GLMM tab, Model Detail, and the report's Model Stats element, the dispersion parameter of a Gamma model was shown as a residual variance with a standard deviation; it is now Dispersion (φ) with "-" for Std.Dev., since it is not a variance
- GLMM - Non-Finite Variance Components Were Shown as Infinity or NaN in Reports: Variance components and ICC that could not be computed were shown as "Infinity" or "NaN" in the GLMM report elements; they are now shown as "N/A"
- GLMM - A Constant Response Stopped With a Collinearity Error or Gave a Near-Zero Residual Variance: For a Gaussian model with the identity link, a response with the same value in every row either stopped with an error about collinearity or produced a residual variance of rounding-error size; it now stops with an error saying that the response does not vary
- GLMM - The Singular Fit Warning Asserted That the Groups Do Not Differ: The warning attributed a singular fit to data in which the groups do not differ, although a search that stopped at the boundary can also cause it; the warning now names that cause too
- GLMM - A Response Too Large for Double Arithmetic Stopped With an Error About Collinearity: When the sum of squares of the response or the value used to scale it overflowed, the fit stopped with an error about collinearity or an internal error; it now asks to rescale the response
- ARIMA - Estimation Jumped to the Boundary of the Stationarity Region and Stopped There: A single step could carry the search to a point where a coefficient is at ±1, where the likelihood is flat, so the fit stopped there. Steps are now limited; in 8,692 test fits, fits that ended at a worse point than the best known went from 6.1% to 4.5% for orders with p or q at most 1 and from 9.5% to 4.9% for orders with both at least 2
- ARIMA - A Fit Stopped on the Boundary Was Reported as Converged: A fit whose likelihood still increases toward the inside of the region is now reported as not converged
- Data Import - Shift-JIS Half-Width Katakana Was Detected as EUC-JP: A Shift-JIS file containing a run of half-width katakana was detected as EUC-JP, so its text was imported as replacement characters; the detection now prefers a candidate that decodes the start of the file
- Data Import - Importing a CSV Larger Than About 537 MB Failed: The whole file was turned into one text, which has that limit; the file is now read in pieces, and a 773 MB file of 9 million rows and 10 columns imports
- Data Import - Type Detection Failed for a File With Hundreds of Columns: Detecting the types of a 3-row file with 200 columns ran out of memory, which failed the whole import; it now takes 0.29 s, and 800 columns take 1.5 s
- Data Management - Memory Grew Every Time a Dataset Was Registered With the SQL Engine: Each registration, on import, derivation, or query, left memory the size of the dataset unreleased
- Data Management - Changing Save Data with Project Discarded Dependent Data and Re-estimated Models: Turning the setting on or off invalidated the dependent datasets, filtered views, analysis results, and models although it does not affect the computation
- Data Management - Prediction Interval and Variable Importance Datasets Disappeared After an Upstream Change: These datasets could not be recomputed, so a change to their source left them unopenable
- Open From URL - Changing the Encoding After a Failed Fetch Did Not Enable Open: The previous error stayed and Open remained disabled
- Custom Graph - The Y Axis of a Time Bin Had No Title: In the Graph Builder, the y axis of the Time Bin statistic was untitled; it now reads Count, Density, or Proportion by the Y Scale
- Custom Graph - The Tooltip Proportion of a Small Bin Showed 0: For the Bin and Time Bin statistics, in a group of more than about 20,000 rows, the proportion of a bin with one row was shown as 0; it now shows four significant digits
- Agent API - models.run() and models.configure() Accepted Columns the Tab Cannot Select: A string predictor, for example, was accepted and failed with a wrong error about too few rows; such columns now return
INVALID_INPUTwith the column name and the reason, as does a column given in two roles. A categorical predictor is pointed todatasets.dummyCode() - Agent API - models.predict() and models.saveAsDataset() Registered a Dataset From a Model Replaced During the Call: When the model was re-estimated while the call was running, the dataset computed from the old estimate was registered; the call now returns
INVALID_INPUT
Performance
- Projects - Opening, Saving, and Importing Large Data: With the new file format and the column-oriented internal format, a CSV of 3 million rows and 10 columns imports in 27.4 s instead of 35.8 s, saves in 5.6 s instead of 13.6 s, exports in 5.2 s instead of 17.2 s, and reopens in 23.1 s instead of 136.4 s, with 581 MB of memory in use after import instead of 1,267 MB. A computed column derives in 1.1 s instead of 9.9 s, while a filtered dataset derives in about 0.4 s instead of 0.1 s. Files of 6 and 9 million rows import, derive, save, and reopen
- Data Import - Type Detection and Conversion With Many Columns: Detecting the types of a 3-row file with 100 columns takes 0.39 s instead of 0.84 s; converting 400 columns takes 0.23 s instead of 2.3 s for int64 and 1.0 s instead of 10.2 s for datetime, and the preview of the exclude mode 0.9 s instead of 9.8 s
- GLMM - Probit Fits Take About 20% Less Time: The inverse link is computed once per observation; a probit fit on synthetic data went from 117 ms to 95 ms, and other links are the same or a few percent faster
- Custom Graph / Cox Regression - LOESS Smoothing Is Faster on Large Data: The Cox diagnostics on 100,000 rows take about 0.6 s instead of 1.1 s
[2026.10.06]
Added
- Data Table / Reports - The Reason Links Are Shown as Plain Text: When the project contains content from an unknown signer and links are therefore shown as plain text, a notice above the Data Table (including Filtered Data and Contributing rows) and above report text says so and explains how to turn links on: trust the signer from the Unknown badge in the menu bar. The notice is not shown in embedded view
- Cox Regression - Explanation of the Log-Log Plot: The plot's heading has a help button and a link to the documentation, and the text under it states that the group curves are not adjusted for the other covariates, so they need not be parallel even when the model's proportional hazards assumption holds, and that the curves vary more at their ends
- Agent API - Reading and Editing the Operation of a Derived Dataset:
datasets.describe()returnsoperationfor a derived dataset whose operation can be edited;tabs.open()acceptseditingDatasetIdand opens the same editing tab as Edit Operation in the UI;tabs.list()returnseditingDatasetIdfor such tabs - Agent API - The Smoothed Curve of the Schoenfeld Residual Plot: The Cox regression result of
models.run()returns, indiagnostics.schoenfeldTrends, the smoothed curve drawn on the Schoenfeld residual plot for each covariate
Changed
- Enum - Categories of a Nominal Enum Column Follow the Enum Definition Order: The categories of an enum column with nominal scale were ordered by code point on graph axes and legends and in Dummy Coding, and by the browser's language in the Data Table, while facets and Crosstab used the definition order. All of these now follow the enum definition order for any scale, so the default reference category of Dummy Coding can change. The Category Order panel of the Graph Builder shows "Enum Order" for every enum column, and the Scale override of Dummy Coding no longer changes the category order. A saved dummy coding keeps its reference category; only the order of its dummy columns may change when it is re-derived
- Data Table - Excluded Rows Are Reviewed and Restored From the Data Table: The Excluded Rows tab is replaced by a line above the Data Table of a primary dataset with excluded rows, such as "3 rows are excluded from this dataset.", and its "View excluded rows" button, which opens a dialog for restoring rows. This works for every primary dataset of the project. Restore All asks for confirmation because it discards the reasons and times of exclusion, and the button is disabled in Edit Mode. Excluded Rows tabs in saved projects are removed when the project is opened, with a message pointing to the new place
- ARIMA - Estimates of Some Candidates Change: The estimation starts from fewer points, so a candidate may reach a different local maximum of the likelihood than before, while the order chosen by Auto rarely changes. A fit evaluates the likelihood about a quarter fewer times
- Agent API - setColumnDisplayFormat() Sets the Link and the Number Format Separately:
formattakes{ link: { urlTemplate } }and{ number: { formatSpec } }as separate keys; a key left out keeps its setting, a key set tonullis cleared, andformat: nullclears both. The previous form withtypeis no longer accepted, anddisplayFormatindatasets.describe()uses the new form - Agent API - Cox Regression Results That Did Not Converge: When the iteration stops before converging,
models.run()returnsnullfor the coefficients, standard errors, hazard ratios and their intervals, log partial likelihood, AIC, concordance and its standard error, diagnostics, and baseline; the values where the iteration stopped are inlastIterateCoefficientandlastIterateLogPartialLikelihood, and the reason is instopReason - Agent API - GLM Divergence Returns NUMERICAL_ERROR: A GLM whose iterations diverged or whose linear predictor left the range of the link returned
MODEL_EXECUTION_ERROR; it now returnsNUMERICAL_ERROR
Removed
- Agent API - The excluded-rows Tab Type:
tabs.open()no longer opens an Excluded Rows tab, since the tab no longer exists; excluded rows are reviewed in the Data Table
Fixed
- GLMM - Estimates of Non-Gaussian Models Did Not Maximize the Reported Likelihood: For models other than Gaussian with the identity link, the fixed effects were estimated together with the group-level effects instead of at the maximum of the likelihood that the tab reports with AIC and BIC. Estimates, standard errors, AIC, and BIC change for these models, and a fit takes about 1.5 to 2.6 times as long (10,000 rows and 50 groups)
- GLMM - The Dispersion Parameter Was Not Used Consistently: For models that estimate the dispersion (Gamma, and Gaussian with a link other than identity), the penalty for the group-level effects in the likelihood was not divided by the dispersion, and the residual variance, the variance of the group-level effects, and the standard errors of the BLUPs did not all use the same value; all now use its maximum likelihood estimate
- GLMM - Gaussian Models With a Non-Identity Link Depended on the Unit of the Response: Fitting the same data with the response in a different unit (e.g., grams instead of kilograms) gave estimates that were not simply rescaled, and could change whether a singular fit was reported
- GLMM - Gamma Models With the Inverse or Identity Link Judged a Singular Fit Differently Depending on the Unit of the Response: The range searched for the group-level variance and the singular fit judgment changed when the response was rescaled
- GLMM - Gamma Models With the Inverse Link Failed With an Internal Error: When the linear predictor reached zero or below during the estimation, the fit stopped with an internal error. The update is now shortened to keep the linear predictor in range, and when the fit still cannot continue, the error message says so and suggests a link without this restriction, such as log, noting that it models the mean on a different scale
- GLMM - A Singular Fit Was Reported When a Better Estimate Existed: When the likelihood had a local optimum both at a group-level variance of zero and at a positive variance, the search could discard the latter and report a singular fit. This happened typically in data with a small group whose mean was far from the others. On a set of 4,602 test fits, such stops at zero went from 41 to 2, and the search evaluates about 2.4 times as many points
- GLMM - A Constant Response Gave Degenerate Estimates or an Unclear Failure: For families that estimate the dispersion, a response with the same value in every row produced a dispersion near zero with a meaningless log-likelihood, or failed, depending on rounding; it is now rejected with an error before fitting
- GLMM - A Negative Response in a Poisson Model Failed With an Unclear Error: The response of families other than Gamma was not checked before fitting; it is now checked for every family
- GLM / GLMM - Messages About Invalid Response Values Named an Internal Index: The message now gives the value and the values the family accepts
- GLM / GLMM - Probit Models Used an Approximate Normal Distribution Function: The normal distribution function behind the probit link was accurate to about 1e-7, which kept probit GLMMs from converging and slightly shifted probit GLM estimates
- GLMM - Saving a Model Collapsed the BLUP Table: After "Show all N rows" was clicked, Save Model folded the table back
- GLM - Standardized Residuals and Cook's Distance Were Computed for Observations With Leverage 1: In the binomial, Poisson, Gamma, and negative binomial families, an observation with leverage 1 (e.g., the only observation of a factor level) got very large values instead of "-" and appeared in the Scale-Location and Residuals vs Leverage plots; the Gaussian family already showed "-". In addition, when a predictor had a large mean, rounding error could keep an observation's leverage from being recognized as 1
- Cox Regression - Estimates Were Shown for a Fit That Did Not Converge: Standard errors, hazard ratios, intervals, AIC, concordance, survival curves, and diagnostics were shown from the last iteration, with only a general warning that the model did not converge. A warning now states why the iteration stopped and names the covariates whose coefficients were extreme, and the coefficient table shows only Variable and Coef at Last Iteration
- Cox Regression - Fits at the Optimum Were Reported as Not Converged: With large values of the linear predictor, rounding error in the log partial likelihood exceeded the threshold for accepting a step, so a fit that had reached the optimum was judged not converged and its estimates were hidden
- Cox Regression - Separated Data Was Reported Inconsistently: Depending on where a covariate's zero lay, separated data raised the separation error or an unexplained non-convergence; it now raises the separation error
- Cox Regression - The Log-Log Plot Gave No Note When a Group Could Not Be Drawn: When only one group could be formed, or a group had fewer than two event times with survival strictly between 0 and 1, nothing said so; a note now appears and the points of such a group are not drawn
- Cox Regression - The Log-Log Plot's Median Threshold Label Was Rounded to Two Decimals: The rounded label could contradict which group a value belonged to; it now shows the shortest number consistent with the groups
- ARIMA - Values Removed From the Series Were Not Reported in the Tab: When missing or non-finite values were dropped from the series, the tab gave no warning. A warning now gives their number and states whether the remaining values keep their time spacing and, for seasonal models, whether the seasonal position shifts; it also appears in Model Detail and in the Agent API results
- ARIMA - Points Where the Likelihood Could Still Increase Were Reported as Converged: The estimation stopped and reported convergence when the improvement per iteration became small, which happened near the boundary of the stationarity and invertibility region. Convergence is now reported only where the gradient is small or no step improves the likelihood; more candidates may be reported as not converged (5 instead of 1 in 1,920 fits to short series), and a fit to a series of 10,000 values or more takes about three times as long
- ARIMA - A Lower-Likelihood Point Was Reported as Converged: When the run reaching the highest likelihood had not converged, a nearby converged run with a lower likelihood was reported instead; the highest-likelihood point is now reported, marked as not converged
- ARIMA - Order Selection Results Mixed In Candidates That Were Not Compared: The Top 10 table listed the first ten candidates including those that did not converge or failed, and candidates beyond ten were not shown. The table now lists only compared candidates, and a new Candidates Excluded from Selection table lists every excluded candidate with its status and, for failures, the reason
- PCA - A Saved Dataset Went Back to All Components When Re-Derived: A Variance, Loadings, or Scores dataset saved with Number of Components set gained the remaining components after re-derivation. Saved projects are updated when opened, except for datasets that were already re-derived with all components. The dataset's lineage details show Number of Components
- PCA - A Report's Scree Plot Lost Its Data After the Project Was Reopened: The data behind the Scree Plot element was re-derived without the column the graph used
- PCA - Adding the Same Result to a Report Twice Referred to a Missing Dataset: The second graph pointed to a dataset that had not been added to the project
- Variant Normalization - A Candidate List Built Before Reload Dataset Could Still Be Saved: After the dataset was reloaded, including during a Nearest Neighbor run, the list built from the old values stayed on screen and could be saved with Save Mapping; it is now held back with a notice to run Build Mapping again. Changing the column, method, or normalizer keeps the list with a notice, and changing them back restores it with its edits
- Data Management - Datasets Made by Reshape, Crosstab, PCA, and Predictions Had No Row Number Column: GLM, GLMM, and Linear Regression failed on such datasets (e.g., the result of Wide to Long), their Data Table numbered rows from 1 instead of 0, and excluding rows of a GLM convergence history or a Variant Normalization mapping failed. Saved projects are updated when opened
- Data Management - A User Column Named "Row #" Could Not Be Told Apart From the Row Number Column: Such a column is now renamed "Row #_2" with a warning on import and when a saved project is opened. Renaming, computed columns, Reshape, Crosstab, New Dataset, the Synthetic Data Generator, and SQL queries refuse to create a column with this name
- SQL Editor - SELECT * Over a Join Failed: A query such as
SELECT * FROM A JOIN B ...failed because both tables carried a row number column - SQL Editor - Column Completion Missed the Tables in FROM: In long queries, or when the browser was busy, completion did not offer the columns of the tables in FROM and JOIN
- Filter Expressions - != Left Out Rows With Missing Values:
x != 1did not return rows wherexis missing, whileNOT (x = 1)did; both now return them, and saved filters that use!=on a column with missing values now include those rows. A missing value matches!=, NOT IN, NOT BETWEEN, NOT LIKE, and NOT ILIKE, and none of the positive comparisons - Filter Expressions - Comparisons With NULL Were Accepted: Expressions such as
x = NULLorx IN (1, NULL)were evaluated although no value equals NULL; they now raise an error that points to IS NULL and IS NOT NULL, including when a saved filter is re-derived - Crosstab - Double-Clicking the Missing-Value Category Opened No Rows: The cell of the missing-value category opened an empty table instead of the rows with a missing value
- Custom Graph - Clicking a Bar or Point of the Missing-Value Group Selected Rows of Other Groups: With a color or fill grouping, selecting a mark of the missing-value group also selected the rows of every other group at the same x
- Custom Graph - A Layer With an Invalid Filter Expression Disappeared Without a Warning: The layer is still not drawn, but a warning now gives the reason, in the Graph Builder and above a report's graph element
- Custom Graph - A Secondary-Axis Layer Limited Panning of the Y1 Axis: A layer on the Y2 axis with a statistic of fixed range, such as ECDF, restricted pan and zoom of the Y1 axis to that range
- Custom Graph - Tooltips of ECDF, Q-Q, and ROC Layers Named Values After the Input Column: The tooltip labeled quantiles, proportions, and rates with the name of the column they were computed from; it now uses the same names as the axis titles
- Custom Graph - Q-Q and ECDF Axis Titles Did Not Name the Plotted Quantity: The Q-Q plot's axes are now titled Theoretical Quantile and Sample Quantile, and the ECDF's y axis is titled Cumulative Proportion instead of Cumulative Probability, since it is the proportion of the sample at or below x
- Custom Graph - The Plot Stayed Shifted When Its Aspect Ratio Offset Returned to Zero: With a fixed plot aspect ratio, the plot area kept its previous offset when the offset became 0
- Graph Builder - A Statistic Parameter Field Kept Its Draft When the Value Changed Elsewhere: When a value was changed, for example through the Agent API, while its field was being edited, the field kept showing the old draft
- Data Table - A Column Could Not Have Both a Number Format and Link Display: Setting one replaced the other. Both can now be set, and the formatted value is shown as the link; Default in Number Format and Remove for link display each clear only their own setting. Saved projects are updated when opened
- Data Table - The Help Listed Ctrl+C and Ctrl+A for Selected Rows: These shortcuts act on text selected in the page, not on rows or columns selected in the table, and are removed from the help
- Data Table - The Help Did Not Describe Multi-Column Sorting: Ctrl/Cmd+click on a sort arrow, which adds a column to the sort, is now listed
- Data Table - The Number Format Submenu Was Always Open: The submenu of Number Format... in the column menu was drawn open regardless of the pointer; it now opens only while the item is hovered or focused
- Data Table - Context Menus Ran Off the Edge of the Screen: Column, cell, and row menus opened near the right or bottom edge extended past it; menus are now kept on screen, and submenus open to the left or shift up when needed
- Data Table - Clicking Inside the Column Menu Closed It: Clicking Number Format... or a disabled item closed the whole menu
- Statistics - The Filter of Another Data Table Tab Was Used: With two Data Table tabs open for the same dataset, the Statistics and Selected Columns tabs could compute with the filter of a tab other than the active one
- Reports - New Reports Were Described With Internal Column IDs: A report created from Add to Report got a default name and a description (shown in the report list) built from column IDs instead of column names
- Reports - Data Table Links Whose URL Template Used a Hidden Column Stayed Plain Text: In a report's data table element, a URL template that referred to a column not shown in the element did not produce a link
- Projects - Saving a Project With a Large Imported CSV Failed: A project whose content exceeded about 540 million characters, such as one holding a CSV of several hundred MB, failed to save or export with "Invalid string length"
- Projects - Edits Made During Export Project Were Lost: An edit that finished after the Export Project dialog opened, such as Save as Dataset just before Ctrl+Shift+S, was missing from the exported file and was undone in the open project when the export finished, bringing back closed tabs
- Data Import - Import Warnings Were Not Shown When Opening a CSV From the Launcher: Opening a CSV or TSV file from the launcher (Open File, dropping files, Open from URL, or a
#csv=link) only logged warnings about the data; an Import warnings dialog now lists them before the project opens, with Open anyway and Back - Data Import - A One-Column CSV Raised a Delimiter Warning: A file in which every row had a single field produced a warning that the delimiter could not be detected
- Data Import - Some Warnings Ended With "at row undefined": Warnings without a row number showed this text
- Data Import - A Parse Finishing After Import Data Was Closed Affected the Next Import: A parse that completed after the dialog was closed wrote its result into the preview and cleared the loading indicator of a newer run
- Data Import - Creating a Project Stopped Without a Message When the SQL Engine Crashed During Startup: The operation waited forever; it now fails with an error, and the next operation starts the SQL engine again
- Data Import - The Text of an Imported CSV Stayed in Memory: Values kept a reference to the whole file text; after importing 1 million rows and 10 columns (103 MB), memory in use went from 439 MB to 351 MB. Copying values out of the file text makes the import itself slower, 1.3 s instead of 0.95 s for the same file
- UI - Escape Closed Dialogs That Were Working: Reload Dataset, Export Data, and Export Graph could be closed with Escape while processing, although their close button was hidden; for Reload Dataset, the error of a failed reload was then not shown
- UI - Escape Closed More Than One Dialog: With dialogs stacked, such as a key dialog over Settings, a confirmation over Open from URL, or context help over a dialog, one Escape also closed the dialog behind
- UI - Tab Moved Focus Out of an Open Dialog: Focus could move to the page behind a dialog; it now cycles within the topmost dialog and returns to the element that had it when the dialog closes
- UI - The URL Security Warning Hid the Open From URL and Import Data Dialogs: The warning now appears over the dialog, and after Cancel the focus returns to the Fetch or Open button
- UI - Dropdown Menus Stayed Open When Focus Left Them: Pressing Tab out of a dropdown menu left it open, and clicking a separator moved focus out of the menu
- Open From URL - A Download in Progress Could Be Cancelled Only With Escape: The close button was hidden and clicking outside did nothing while loading; both now cancel and close, as Escape did
- Settings - Escape While Editing a Signer Name Closed Settings: Escape now only cancels the edit
- Agent API - tabs.setDataset() Reported Success for Tabs That Did Not Change: For tab types whose open tab does not follow a dataset change, such as
computed-column,dummy-coding,sql-editor, andfiltered-data, the call returned success while the tab stayed on the old dataset; it now returnsINVALID_INPUT - Agent API - Log and Square-Root Axis Problems Were Not Reported When Configuring a Graph:
tabs.addGraphLayer(),tabs.updateGraphLayer(),tabs.configureGraph(), andtabs.setDataset()saved a graph whose log or square-root axis met values outside its domain, or whosedomainwas outside it, without a warning; such problems are now listed inwarnings - Agent API - Layer Warnings Did Not Say Which Layer They Came From: In
tabs.configureGraph(),reports.addGraph(), andreports.updateElement(), each layer warning now starts with the layer's name, orLayer Nand the panel when it has none; warnings oftabs.addGraphLayer()andtabs.updateGraphLayer()no longer start withLayer "name": - Agent API - Invalid theta and family-link Combinations Were Accepted: A
thetathat is not a positive finite number, or a link the family does not accept, was passed on to the fit bymodels.run()and stored in the tab bymodels.configure(); both now returnINVALID_INPUTand leave the tab unchanged - Agent API - Invalid Graph Layer Filter Expressions Were Not Reported: A layer whose filter expression could not be parsed was left out of the graph without an entry in
renderWarnings - Agent API - models.configure() Kept the Previous Link When Only family Changed: The link now returns to the family's default, as in the UI
Performance
- Cox Regression - Fitting Took Time Proportional to the Square of the Number of Observations: The partial likelihood, the baseline hazard, and the diagnostics now take time proportional to the number of observations. With 20,000 observations and 3 covariates, one evaluation of the partial likelihood went from 840 ms to 2.7 ms, the baseline from 277 ms to 21 ms, and the diagnostics from 491 ms to 29 ms. The concordance index still takes time proportional to the square
- Cox Regression - The Schoenfeld Residual Plot Froze the Page: The smoothed curve was computed on the page at every event time, in time growing with the square of the number of events; it is now computed in the background with the other diagnostics at up to 200 time points
[2026.09.28]
Added
- Agent API - responseDegenerate for Random Forest:
models.run()andmodels.describe()returnresponseDegeneratefor a Random Forest model, telling whether the response held a single class (classification) or did not vary (regression); it is absent for models saved before this release
Changed
- Custom Graph - Interval and Confidence Levels Are Entered as Percentages: The smooth statistic's Interval level (%) and the survival statistic's Confidence Level (%) take a percentage between 50 and 99.99, the same unit as the confidence levels of the analysis tabs, instead of a fraction such as 0.95. The survival statistic's Confidence Level is a number field instead of a choice of 90, 95, and 99. The Agent API's
levelandconfLevelstat parameters use the same unit and range; saved graphs are updated when their project is opened - Custom Graph - Panning an ROC Curve Stops at a False Positive Rate of 0 and 1: After zooming in on a graph drawn with the
rocstatistic, dragging horizontally no longer moves the x axis beyond the range a false positive rate can take, as the y axis already did - Crosstab - Changing a Setting Removes the Previous Result: The table built with the previous settings stayed on screen with an "outdated" icon; it is now taken off the screen with a notice, as in the other analysis tabs, and it comes back if the settings are changed back
Fixed
- Analysis Tabs - Results Computed Before Reload Dataset Were Shown as Current: In the GLM, GLMM, Linear Regression, Cox Regression, ARIMA, and Crosstab tabs, a result that arrived after Reload Dataset ran during the computation was shown, saved as a model, and added to reports as if it came from the reloaded data; it is now held back with the notice that the dataset has changed
- Analysis Tabs - Unsaved Results Stayed on Screen After Reload Dataset: The ANOVA, Cox Regression, Kaplan-Meier, PCA, Random Forest, ARIMA, and Crosstab tabs kept showing the result of the previous data after the dataset was reloaded; it is now taken off the screen with a notice, as in the GLM tab. A Random Forest prediction is also taken off when the dataset it predicts on changes or the model it used is re-estimated
- Analysis Tabs - Settings Could Be Changed While an Analysis Was Running: Variables and other settings that affect the result could be edited during a run, leaving the form out of step with the result that then appeared; they are now disabled until the run ends, while help and Cancel stay available
- Random Forest - Fitting and Predicting Froze the Page: Growing the trees ran on the page itself, so the page did not respond until a fit or prediction finished, including when a saved model was re-estimated or a prediction dataset was re-derived; the computation now runs in the background with a progress message
- Random Forest - A Classification With Only One Class Showed Perfect Scores Without Explanation: When the response held a single class, Accuracy, Precision, Recall, and F1 were trivially 100% and every variable importance was 0 with no warning; a warning now says so
- Random Forest - OOB Accuracy Was Reported From a Single Observation: When only one observation had out-of-bag predictions, OOB accuracy was shown as 0% or 100%; it now shows "-" with a warning, as OOB R² already did for regression
- Random Forest - The Prediction Summary's Std Divided by n: The standard deviation of the predicted values used n instead of n − 1, unlike SD in the Statistics tab; it now uses n − 1 and shows "-" for a single prediction
- Linear Regression - A Sum of Squares Set to Zero Was Not Reported: When a term's sum of squares in the ANOVA Table came out negative beyond rounding error, it was set to 0 without any warning; a warning now names the term and points to collinearity among the predictors
- Statistical Models - The Observation Count Was Labeled Differently Across Tabs and Reports: The Model Summary and the report's OLS Fit, ANOVA Fit, and ARIMA Model Fit elements said "N (observations)" or "N observations"; all now say "Observations"
- Linear Regression - Residual Std. Error Omitted Its Degrees of Freedom in the Tab: The Model Summary card showed the residual standard error without the residual degrees of freedom that the report's OLS Fit element shows
- ANOVA - Negative Sums of Squares Within Rounding Error Raised a Warning: A sum of squares whose true value is 0 (e.g., an interaction with no effect in balanced data) could come out as a tiny negative number and trigger the "clipped to zero" warning; the warning now appears only when the negative value exceeds what rounding error can produce
- GLMM - Estimation Warnings Were Lost When the Model Was Saved: Warnings such as a singular fit or non-convergence appeared only in the GLMM tab's results and in the Agent API's run result; they are now kept with the saved model and shown in Model Detail and in the report's Model Stats element, also after the project is reopened
- GLMM - Singular Fit and Kenward-Roger Warnings Had No Link to the Documentation: These warnings now carry a Full documentation link in the GLMM tab, Model Detail, and reports
- GLMM - Report Model Stats Omitted the Observation Count: The Model Stats element of a GLMM did not show Observations and N incomplete
- Kaplan-Meier - The RMST τ Field Could Not Be Edited After a Run: Once the analysis had run, clearing the τ field put the default value back immediately, so a new value could not be typed; the field can now be cleared (empty means the default, shown as the placeholder), and a value of 0 or less is marked invalid instead of being accepted
- Kaplan-Meier - Changing the Confidence Level Relabeled Old Intervals: The result table's heading switched to the new confidence level while the intervals were still those computed at the previous level; changing the level now removes the result until the next run
- Cox Regression - The Log-Log Plot Split an Even Number of Values Above the Median: A continuous covariate was split at the upper of the two middle values instead of their average, so the groups differed from a median split
- Cox Regression - The Log-Log Plot Could Contain an Empty Group: When the median of a continuous covariate equaled its maximum, the "above the median" group had no observations
- ARIMA - A Boolean or Numeric-Text Column Could Not Be Used in the Tab: A boolean column or a text column of numbers declared interval or ratio lost its values in the ARIMA tab although the Agent API accepted it
- Custom Graph - Axis and Legend Category Order Depended on the Browser Language: The default order of categories of a nominal text column followed the browser's locale and could differ from the category order of Dummy Coding; it now follows Unicode code point order everywhere (all uppercase letters before lowercase), and the labels that said "Alphabetical" now read Code Point Order, Category name order after limit, and, for the Bar Chart's Sort Order, Category Order
- Custom Graph - Categories Missing From a Custom Order Lost Their Order: When an axis with a custom category order met two or more categories not in that order (for example, new values after reloading the source), all categories fell back to row order
- Custom Graph - Legends Above or Below the Graph Overlapped: Legend items placed on top or bottom were spaced at a fixed width, so long category names overlapped, and items did not wrap to a new line; a continuous legend at the bottom had its tick labels cut off, and at the top it overlapped the plot
- Custom Graph - A Legend Too Wide for the Graph Disappeared Silently: When the graph was too narrow for the legend, the legend was left out without a warning; the graph warning now says "The graph is too narrow for the legend."
- Custom Graph - The Y1 Axis Followed a Secondary Layer: When the first layer was on the secondary Y axis, the Y1 axis title and category order came from that layer instead of the first primary layer
- Custom Graph - Reference Lines Added a Spurious "0" Category: An xmean or xmedian line on a categorical y axis, or a reference line when no other layer had points, added a "0" category to the axis
- **Custom Graph - An Explicit y` in the tooltip without a format showed the share as a fraction such as 0.25; it is now shown as a percentage labeled "% of total", as the default tooltip does, unless a format or label is given
- Custom Graph - Facet Columns and Rows Accepted Negative and Fractional Numbers: Such values in the wrap layout's Columns and Rows fields were used as they were; they are now treated as unset (Auto)
- Custom Graph - Label Layers Drew No Labels When the Tooltip Was Not Set: A label layer whose label content used
$nor a column name drew nothing unless the layer's tooltip was also configured - Custom Graph - A Label Layer Drew No Labels Without Explanation: When the label content field had no value at any point of the layer (typically a raw column on a layer with an aggregating statistic), no label appeared and nothing said why; the graph warning now names the field and lists the variables available on that layer
- Custom Graph - Labels With a Prefix or Suffix Were Drawn for Points Without a Value: With a prefix or suffix set, points whose value could not be found were drawn as, for example, "n=-", while points whose value was the text "-" were left out
- Graph Builder - Layout for Narrow Screens Was Never Applied: At a width of 768 px or less, the settings rows did not stack, fields did not widen to the full width, and the preview padding did not shrink, because the styles for narrow screens were invalid
- Reports - Graph Warnings Were Not Shown: Warnings raised while drawing a graph appeared only in the Graph Builder tab; they now also appear above a graph element in the report and in its edit dialog
- Reports - Links in Report Text Ignored the Project's Trust Level: Links written in a report's Markdown text were clickable in a project from an unknown signer and could use schemes other than http and https, unlike links in data columns; they now follow the same rule, showing plain text where a column link would, and open in a new tab without sending the referring page
- Reports - The Data Table Dialogs Allowed Up to 10,000 Rows: Maximum rows could be set to 10,000 in the dialogs while the element is limited to 1,000; the field now keeps values within 1 to 1,000
- Reports - Data Table Columns Were Saved in the Order They Were Checked: A data table element listed its columns in the order they were ticked in the dialog instead of the dataset's column order
- Reports - Colors of a Data Table Element Were Inserted Into the Editor Preview Without Escaping: The header and alternating row colors of a data table element were written into the report editor's preview markup as they were
- Data Table - Sorting an Ordinal Enum Column Descending Put Undefined Values First: Values not in the enum definition moved to the top in descending order; they now stay after the defined values and before missing values in both directions. Crosstab row and column headers had the same problem
- Data Table - Copy Cell Value Ignored the Column's Number Format: Copying a cell shown as 12.34% in a percent-formatted column pasted 0.1234; the copied text now matches the text shown in the cell
- Data Table - Column Names Could Be Edited in Views That Cannot Rename Them: Filtered Data and Contributing rows views let a column name be put into editing although the rename could not be saved, and offered Edit Scale of Measurement where the scale could not be changed; the name now shows the reason and the menu item is not offered
- Data Table - The "+ Add Row" Line Flashed in the Middle of the Data: While scrolling quickly in Edit Mode, the "+ Add Row" line could briefly appear between data rows
- Data Table - Comment Tooltips Had a Black Background in the Light Theme: Row comment tooltips did not use the same colors as cell tooltips
- Data Table - The Row Selection Survived a Change to the Rows: After Reload Dataset or row exclusion replaced the rows of a dataset, the previous row selection was kept on it and on datasets derived from it, pointing at rows that no longer existed
- Data Management - Converting an Enum Column Rounded Values Silently: Converting an enum column to an integer, number, boolean, date, or datetime type did not apply the rules used for text columns, so a level such as '1.5' became 2; such values now fail the conversion
- Data Management - Two Datasets Created in Quick Succession Could Collide: A dataset created with New Dataset in the same millisecond as another one could be silently dropped
- Data Management - Reshape Preview Could Show the Result of Earlier Settings: Changing the dataset, mode, columns, or name, or pressing Reset, while Generate Preview was running let the earlier preview appear under the new settings
- Data Management - Two Identical Convert Column Types Tabs Could Open: Opening Convert Column Types from different columns of the same dataset opened a separate tab each time
- Data Management - Re-Deriving a Prediction Whose Predictor Columns Were Gone Failed With an Internal Error: When a predictor or offset column no longer existed in the dataset a GLM prediction was made on, re-deriving the prediction stopped with an internal error instead of saying it could not be re-derived
- Data Management - Dataset Selector Labels Pointed to Another Tab in Split Panes: With two Convert Column Types, Add Columns, Dummy Coding, or Orthogonal Polynomials tabs open side by side, the Dataset label of one tab was tied to the selector of the other, so clicking the label or reading it with a screen reader reached the wrong tab
- Data Management - Scale Edit Dialog Lost the Chosen Scale: When the column was updated while Edit Scale of Measurement was open, the scale chosen in the dialog was replaced by the saved one
- SQL Editor - A Query Still Using a Renamed Dataset's Old Name Could Be Saved: After renaming a dataset referenced by a query open for editing, Update Query showed a conflict dialog, and Overwrite saved the query with the old name, which then failed to evaluate; queries that used the old name also kept running against the old table. The rename is no longer treated as a conflict, the old name stops resolving, and a query whose tables do not all resolve is not saved
- SQL Editor - The SQL Engine Did Not Start Offline: Two extensions of the SQL engine were downloaded from DuckDB's server each time MIDAS started, so without a network connection and without a cached copy, the SQL engine failed to start
- SQL Editor - The SQL Engine Contacted DuckDB's Server at Startup: The same extensions were fetched from DuckDB's server whenever no cached copy was available, such as on the first start or after an update; they are now served by MIDAS itself, so starting the SQL engine no longer contacts an outside host
- Data Import - The URL Tab of Import Data Fetched Untrusted URLs Without Asking: Data > Import Data... fetched from a URL outside the trusted list without the URL Security Warning that Open from URL shows, and without the refusal of the strict setting that blocks untrusted domains
- Open From URL - Projects Over 10 MB Were Refused Regardless of the Import Size Warning Setting: Opening an MDS file from a URL or in embedded view failed above a fixed 10 MB limit; it now asks for confirmation above the Import Size Warning threshold, as CSV imports do, and opens without asking when the setting is No limit
- Open From URL - Back After Cancelling an Import Started It Again: After cancelling a CSV or MDS import from a URL, the browser's Back button returned to the import URL and showed the warning or started the download again
- Projects - Reading View Could Open the Previous Project: When the save that precedes Reading View finished after you had switched to another project, Reading View opened for the project you had left
- UI - Error Messages Looked Different From Tab to Tab: Errors in the Kaplan-Meier, Cox Regression, PCA, ARIMA, Crosstab, SQL Editor, Reshape, and other tabs and dialogs used their own box styles; they now use the same notice style as the other tabs
- Appearance - Text on Red, Green, and Orange Buttons Failed the Contrast Guideline in the Light Theme: Text on danger, success, and warning buttons and similar filled backgrounds now meets WCAG AA in the light theme, with no change in the dark theme
- Documentation Site - The Language Menu Closed While Moving the Pointer Into It: The menu closed when the pointer crossed the gap between the label and the list, and it could not be kept open by clicking; it now opens and closes by click, Escape, or clicking outside, and screen readers are told whether it is open
- Agent API - tabs.setDataset() Did Not Carry Settings Over the Way the UI Does: Switching a tab's dataset through the API did not match columns by name or clear settings as the tab's own dataset selector does; it now applies the same rules and lists the settings it dropped in
warnings.tabs.open()for a Graph Builder with bothdatasetIdandtabViewStateno longer discards the given filter expression - Agent API - labelContent.field Required a Column Id: A label layer's
geom.defaults.labelContent.fieldaccepted only an internal column id, so a column name drew no labels; it now accepts a column name or id likeaesandtooltip, and an unknown column returnsCOLUMN_NOT_FOUND - Agent API - setCellValues() Read Dates and Datetimes Differently From Cell Editing: Date and datetime strings are now checked against the same accepted forms as the Data Table and stored in the same normalized form, and a datetime without an offset is read as UTC
- Agent API - models.configure() Ignored Settings the Tab Does Not Hold:
postHocfor ANOVA andmaxIterations,tolerance, andtiesMethodfor Cox regression were accepted and silently dropped; they now returnINVALID_INPUT - Agent API - ARIMA autoSelect Accepted Search Bounds Beyond the Tab's Limits:
maxP,maxD, andmaxQabove 5, 2, and 5 were accepted bymodels.run()andmodels.configure(); they now returnINVALID_INPUT, as the seasonal bounds above 2 already did - Agent API - tabs.open() Gave Tabs Titles Different From the UI: The default title now matches the one the UI gives, such as the dataset, report, or model name, and the "Prediction:", "GLM Diagnostics:", or, for a linear regression model, "Diagnostics:" prefix for model tabs
- Agent API - reports.addDataTable() and updateDataTable() Repeated Duplicated Columns: A column listed twice in
columnsappeared twice in the element - Agent API - models.describe() Omitted the Warnings of a GLMM: The estimation warnings of a saved GLMM are now returned in
warnings - Agent API - datasets.getSelection() Could Return Rows That No Longer Existed: After Reload Dataset or row exclusion replaced the rows of a dataset, the call returned the previous row indexes
- Agent API - project.openUrl() Refused Projects Over 10 MB: The call now opens such a project and reports the size in
result.warningsinstead of asking for confirmation
[2026.09.16]
Added
- Cox Regression - Confidence Intervals for the Adjusted Survival Curve and the Baseline Cumulative Hazard: The adjusted survival curve now draws a confidence band, and the Baseline Cumulative Hazard table gains H₀(t) and S₀(t) interval columns. The intervals are individual intervals at each time point, computed from the uncertainty of both the baseline hazard increments and the coefficients, and the level follows the Confidence Level of the coefficient table. The Agent API's Cox
baselineresult carries the same bounds - PCA - Number of Components: The PCA tab has a Number of Components field that limits how many components are kept; left empty, all components are kept as before, and the Summary shows the kept count out of the number of variables
- ANOVA - A Perfect Fit Is Detected: One-way and two-way ANOVA now detect a model that reproduces every response value exactly. The residual mean square, the per-group mean intervals, η², and ω² are shown as "-", Tukey HSD is not computed, the residual Q-Q plot is replaced by a note, and a warning explains that the data provides no estimate of error; sums of squares and group means are still shown. A saved ANOVA model of a perfect fit is updated when its project is opened
- Data Management - Contributing Rows Through an Aggregating Subquery Without GROUP BY: Contributing rows can now trace a derived dataset whose FROM clause holds a subquery or CTE that aggregates all its rows without GROUP BY (e.g.,
(SELECT max(x) FROM t)); every parent row that passed the subquery's WHERE and JOIN counts as contributing - Agent API - datasets.selectRows() and datasets.getSelection(): Select rows of a dataset by 0-based indexes or by a filter expression, or read the current row and column selection; the selection is the same one the Data Table, Statistics, and Graph Builder highlight, and a filter-based selection can be opened as Filtered Data and saved as a dataset. The temporary views of Filtered Data and Contributing rows tabs can be addressed too
- Agent API - models.predict() Returns Prediction Accuracy: The result carries
accuracywith the same metrics as the GLM Prediction tab (null when the dataset has no response column or for a Random Forest model) andonFittingDatatelling whether the prediction was made on the fitting data - Agent API - RMST, Cox Diagnostics, and Baseline Survival in models.run(): A Kaplan-Meier run accepts
tauand returns the restricted mean survival time per group with the pairwise differences inrmst; a Cox regression run returns the proportional-hazards diagnostics indiagnosticsand the baseline cumulative hazard and survival inbaseline - Agent API - models.configure() for PCA, Kaplan-Meier, and Cox Regression: The settings each of these tabs holds (columns, preprocessing and the number of components for PCA; time, event, group, confidence level, and
taufor Kaplan-Meier; time, event, covariates, and confidence level for Cox regression) can be written throughmodels.configure(), with the same column eligibility checks asmodels.run()
Changed
- Linear Regression - RMSE Renamed to Residual Std. Error: The Model Summary's RMSE was the residual standard error (the square root of the residual sum of squares divided by the residual degrees of freedom) and is now labeled Residual Std. Error; RMSE is used only for the quantity divided by the number of observations, as in the prediction accuracy metrics. The summary metrics of Linear Regression, Random Forest, and the prediction accuracy section now share one set of labels and one number format
- ARIMA - Candidates No Longer Stop Short of the Maximum Likelihood: The estimation now searches over transformed coefficients that stay inside the stationarity and invertibility region instead of walling the region off with a penalty, so candidates that used to be reported as not converged (typically orders with four to six coefficients) now converge, and the fit takes fewer iterations. A candidate whose coefficients land on the region's boundary has its standard errors shown as "-", since the usual approximation does not hold there
- Agent API - fit.rmse Renamed to fit.residualStdError: The linear regression result of
models.run()returns the residual standard error asresidualStdError; saved models are updated when their project is opened
Removed
- Agent API - The tiesMethod Option of Cox Regression: Tied event times are always handled by the Efron approximation, as the Cox Regression tab has always done;
models.run()no longer acceptstiesMethod(passing it returnsINVALID_INPUT) and no longer returns it
Fixed
- Data Management - Contributing Rows Returned Every Parent Row for a GROUP BY ALL Aggregation: When the top-level query of a derived dataset aggregated with
GROUP BY ALL, Contributing rows returned all parent rows instead of the rows of the chosen group; the grouping keys are now taken from the non-aggregated select items. When the keys cannot be determined (*,EXCLUDE, orCOLUMNS(...)among the items), the row is reported as not traceable with that reason - Data Management - Contributing Rows Failed With a SQL Error on an Aggregating Subquery: A subquery or CTE in FROM that aggregated with
GROUP BY (),GROUP BY ALL, or only a HAVING clause made Contributing rows fail with an error about "Row #" missing from the GROUP BY clause; such a query is now reported as not traceable, naming the subquery - Data Management - Contributing Rows Missed Rows When an Inner DISTINCT Was Followed by LIMIT: A subquery or CTE whose DISTINCT is followed by LIMIT in the same query or a query built on it lost its duplicate removal while tracing, so a different set of rows reached the LIMIT than in the dataset itself; this form is now reported as not traceable. An inner DISTINCT without LIMIT and DISTINCT ON are still traced
- Cox Regression - A Column That Disappeared From the Dataset Crashed the Run: When a selected time, event, or covariate column no longer existed (for example after a SQL-derived dataset was re-evaluated), Run failed with an internal error; the tab now asks to select the variables again and clears the previous results
- Cox Regression - A Small-Valued Covariate Was Adjusted to Zero Instead of Its Mean: The adjusted survival curve used the covariate mean rounded to four decimals, so a covariate such as a rate or proportion with a mean below 0.00005 was set to 0; the unrounded mean is now used and only the field shows a rounded value
- Cox Regression - The Adjusted Survival Curve Started at the First Event: The curve omitted the flat segment at S = 1 between time 0 and the first event; it now starts at time 0 like the Kaplan-Meier curve. The Baseline table still lists event times only
- Data Import - A URL Import That Went Through the Problem Rows Screen Lost Its Source URL: After fixing problem rows, a dataset imported from a URL was saved without its source URL, so Reload Dataset could not fetch it again, and its name was the whole URL instead of the file name
- Data Import - Changing Encoding or Header Settings in the Preview Could Not Reach the Problem Rows Screen: Re-reading a file or URL after changing a setting in the preview reported rows with a wrong number of fields as a generic error; it now opens the same problem rows screen as the first read, and Back returns to the preview with the previous settings
- GLM Prediction - A Prediction Without Original Data Gained the Original Columns on Re-Derivation: A prediction dataset created with Include original data off was re-derived with the original columns after its source changed, and a prediction built on top of it then failed with a column name conflict; the setting is now kept with the dataset, and saved projects are updated when opened
- GLM Prediction - An Input Column With the Same Name as an Output Column Was Overwritten: With Include original data on, an input dataset already holding a column such as
glm_predicted(for example, a previous prediction result) had it silently replaced; the conflict is now reported before predicting, and Run Prediction stays disabled until the option is turned off or the column is renamed - Linear Regression - Standardized Coefficients Were Shown for a Model Without an Intercept: The Std. Coef. column scales by standard deviations taken around the mean, which does not apply to a model not fitted around the mean, while R² and VIF in the same table already followed that rule; the column now shows "-" with a note giving the reason, and saved models are updated when their project is opened
- GLM Prediction - The ROC Curve Crashed After the Response Column Disappeared: When the response column was removed from the source after a binomial prediction, so that the prediction dataset was re-derived without the observed outcome, the GLM Prediction tab that still showed the accuracy metrics failed with an internal error; the ROC curve is now simply not drawn
- GLMM - Model Detail Omitted AIC and BIC: The Model Fit section of a GLMM's Model Detail tab did not list AIC and BIC although the GLMM results and the GLM Model Detail do
- ARIMA - Residual Autocorrelations Were Reported as Zero When They Could Not Be Computed: For residuals with zero variance (for example, a white-noise model without intercept fitted to a constant series), the ACF and PACF showed 1 at lag 0 and 0 elsewhere as if computed; lags that cannot be computed are now left out of the correlogram with a note, and the Agent API returns them as null. Affected saved models are updated when their project is opened
- Custom Graph - A Density Curve on the Count Scale Was Drawn at Density Values for a Group of Identical Values: When every x value of a group was the same, the factor that converts density to counts was 0 and was silently replaced by 1, so the curve was placed on the count axis at its density values; such a group is now left undrawn and reported, with a suggestion to use the density scale
- Custom Graph - A Mean Line Was Drawn as a Control Limit for a Group of One Observation: The ymean statistic with a non-zero offset drew a line at the mean when the standard deviation could not be computed (a single observation, or values spanning more than double precision allows); no line is drawn for such a group and the graph warning names it
- Custom Graph - Smoothing Intervals and Summary Aggregates That Overflowed Were Passed Through Silently: When the y values spanned a range too wide for double precision, the lm and loess smoothing interval became ±Infinity and the summary statistic's mean, sum, and variance-based aggregates produced no value with no explanation; the graph warning now states that the range is too wide and suggests rescaling the column
- Custom Graph - A Long Legend Ran Off the Bottom of the Graph: A legend placed on the right or left with more categories than fit the graph height extended past the drawing area; it now shows as many categories as fit, ends with "+N more", and a warning states how many of the categories are shown. A continuous legend that does not fit is left out with the same warning
- Custom Graph - A Hidden Tile Layer Changed the Axis Type of Every Facet: In a faceted graph, a tile layer that was switched off still made the shared axis categorical; the same happened when a tile layer was a later visible layer, and when a categorical column was mapped to Y through a statistic such as sort or cumsum. The facets' shared axis is now decided by the same rule as the drawing itself
- UI - Screen Readers Were Not Told Why a Context Menu Item Was Disabled: The reason for a disabled item in the row, cell, column, and graph selection context menus was available only as a tooltip; it is now also announced as the item's description
- Agent API - importFromBuffer() and importFromURL() With overwrite Broke Dependent Models: Replacing a dataset in place assigned new column ids and dropped the manually set scales and display formats, so saved models and derived datasets that referred to the old columns could no longer be re-estimated or re-evaluated; columns are now matched by name and keep their ids and settings
- Agent API - tabs.open() and tabs.setDataset() Silently Ignored datasetId for the Statistics and Selected Columns Tabs: The Statistics and Selected Columns tabs follow the active Data Table, so the given dataset was ignored while the call reported success and the tab title named the dataset; the call now returns
INVALID_INPUTwith the instruction to open a Data Table for the dataset first
Performance
- Custom Graph - Panning a Graph With a Continuous Color Scale Rebuilt the Gradient on Every Frame: A line, step, area, or ribbon layer colored by a continuous scale regenerated its gradient definition, one stop per point, on each redraw; on a 20,000-point line, 60 pan steps went from about 3.8 s of main-thread time with 44 dropped frames to about 0.9 s with none. The gradient is now reused and only its end points move on zoom or pan
[2026.09.08]
Added
- Projects - New Empty Project: The launcher gains a New Empty Project card that opens a project with no datasets on the Project Overview tab, so you can start from New Dataset... or Generate Synthetic Data... without first opening an unrelated sample. Saving, exporting, and reopening an empty project all work
- GLM - In-Sample Prediction Accuracy in the Results: The results shown right after Run now include prediction accuracy metrics computed on the fitting data, chosen by the response type (R²/RMSE/MAE for gaussian, Brier score and AUC for binomial, RMSE/MAE/mean deviance for gamma, Poisson, and negative binomial), and a binomial fit draws its ROC curve inline; a note states that these are in-sample figures
- GLM Prediction - ROC Curve: A binomial prediction shows its ROC curve below the accuracy metrics, computed from the same rows as the metrics; when AUC cannot be computed (only one class observed) a note takes the curve's place. The prediction dataset also carries the observed outcome (and trial count for grouped data) as columns
- Linear Regression - MAE in the Model Summary: Mean absolute error joins RMSE in the Model Summary; the help explains that RMSE keeps its residual-degrees-of-freedom definition
- Reports - Editing a Data Table Element After Adding It: View settings in the element menu opens a dialog to change the displayed columns (a chosen list, or all columns of the dataset as it is at render time) and the maximum number of rows
- Custom Graph - Geometry Options Documented and Settable: The reference page now lists every geometry option with its type, range, default, and description, and options that existed only in the Agent API (ribbon curve type, 2D density bandwidth, color scale, and visualization, tile stroke width) can be set from the Geometry section of the layer card
- Data Import - The charset of a URL Import Is Honored: Importing a CSV from a URL without an explicit encoding now uses the charset declared in the response's Content-Type, after checking that the data decodes cleanly under it; a declaration the data does not match is reported and the auto-detected encoding is used instead
- Agent API - project.createEmpty(): Creates a project with no datasets; also available on the launcher screen
- Agent API - Multi-Panel Graphs, Brush Direction, and Axis Zoom:
tabs.configureGraph(),reports.addGraph(), andreports.updateElement()acceptpanelsandbrush, axis scales acceptzoomEnabled,titlePadding, andlabelPadding, and the layer methods take apanelIndexoption to address a panel; a multi-panel configuration built through the API now renders instead of stopping at "No visible layers" - Agent API - reports.updateDataTable(): Changes the displayed columns and maximum rows of an existing Data Table element;
reports.addDataTable()also acceptscolumns: 'all' - Agent API - Structured help():
help("method")now returns the description, each parameter with its own explanation, the return value, and the method-specific error codes with the condition that produces each, instead of one block of prose; about 70 gaps and errors in defaults, return fields, and error codes were corrected along the way, and the documentation gained the parameters it had been missing - Agent API - In-Sample Accuracy and MAE in Run Results:
models.run()returnsinSampleAccuracyfor GLM andfit.maefor linear regression - Agent API - Failed Order-Search Candidates Are Told From Non-Converged Ones: Each
orderSearchentry of an ARIMA run carries astatusof converged, not-converged, or failed with the reason inerror, and the result counts the failed candidates separately
Changed
- Statistical Models - One Notice Style Across Tabs: Success, warning, error, and informational notices in the analysis tabs, Model Detail, GLM Prediction, Dummy Coding, Column Type Conversion, and the Data Table dialogs now share the same colors and component in both themes, and errors that appear after an action are announced to screen readers
- GLM - No Completion Dialog: The "Analysis Complete" dialog with its OK button is gone; a progress bar with Cancel appears under the form while the fit runs, the results section is headed Results, and the convergence history moves to the end of the results (Save History as Dataset). GLMM and Random Forest results are headed Results as well, and GLM Prediction no longer shows a "Prediction completed successfully!" box
Removed
- Design of Experiments: The DoE Analysis and DoE Design tabs, the New DoE Design... and DoE Analysis... menu items, DoE models and their report elements, the DoE documentation and tutorial, and the Agent API methods
datasets.generateDesign(),datasets.setExperimentalDesign(),datasets.foldOverDesign(),datasets.addCenterPoints(), anddatasets.addAxialPoints()together withmodels.run({ type: 'doe' })have been removed. Opening a saved project removes its design declarations, DoE models, and the datasets, tabs, and report elements derived from them, and lists what was removed; datasets generated as designs remain as ordinary datasets. Factorial data can be analyzed with Linear Regression or ANOVA; the Injection Molding sample is now described accordingly
Fixed
- Random Forest - Renaming Class Labels Could Change the Results: When trees split their votes evenly, the alphabetically first label won, so relabeling classes changed OOB scores, the confusion matrix, and permutation importances; the class with more training observations now wins, and the class seen first in the data breaks a remaining tie. A saved classification model keeps its old rule until it is refit
- Reports - Tables Added by Add to Report Missed Columns Added Later: A coefficient, BLUP, or feature importance table froze the column list at creation, so a column added or renamed by a later re-derivation did not appear; these tables now show all columns of their dataset at render time. Tables you build by choosing columns keep the chosen list
- Statistical Models - Fit Statistics Were Labeled and Formatted Differently Across Tabs and Reports: GLM, Linear Regression, and GLMM results, the model detail tabs, and report Model Fit elements each had their own labels and decimals; they now share one set. "Deviance" became "Residual Deviance" with two decimals, "Converged: Yes (N iterations)" became "Convergence: Converged (N iterations)", and an uncomputable Null Deviance shows "-" instead of "N/A"
- Data Management - A Save Conflict in an Edit Tab Threw the Edits Away: When the operation an edit tab started from had been changed elsewhere, saving was refused with an instruction to close and reopen the tab, losing the edits; a dialog now shows both versions and lets you overwrite with this tab's edits or keep editing
- Data Table - A Typed Value Was Read by Different Rules Than an Import: Editing a cell and importing a file interpreted integers, dates, datetimes, and booleans differently. One rule now applies everywhere: integers must lie within ±2^53 and have no leading zeros, dates are read as YYYY-MM-DD (MM/DD/YYYY is no longer accepted), a datetime without an offset is UTC, booleans accept true/false, t/f, yes/no, y/n, and 0/1, and a blank value is missing rather than an error. Column Type Conversion follows the same rule, so engine-specific spellings such as 'epoch' or three-digit years are no longer converted silently
- Data Table - Row Additions and Deletions in Edit Mode Could Not Be Cancelled: Add Row and Delete Row wrote to the dataset immediately, so Cancel left them in place; they are now held with the cell edits until Done. Row exclusion and comments are unavailable from the row menu while Edit Mode is on
- Reports - A Jump Target Was Pushed Off Screen by Tables Above It: After jumping to a heading or element from the contents, an anchor, or Add to Report, a table element above the target that finished evaluating and grew moved the target out of view; the target now stays on screen until you scroll
- Linear Regression and Gaussian GLM - A Response With a Large Offset Stopped With "diverged": A response whose mean exceeded about 1e10 could not be fit on the Linear Regression tab or as a Gaussian GLM; the fit now centers the response first
- Linear Regression and Gaussian GLM - An Observation With Leverage 1 Got Meaningless Diagnostics: An observation whose leverage rounds to 1 was given a standardized residual and Cook's distance computed from a zero denominator; both now show "-"
- Custom Graph - A Mean Reference Line Vanished on a Categorical X Axis: A horizontal line placed at the mean of y (the ymean statistic with hline) was dropped before drawing whenever the x axis was categorical, and its placeholder position could leak into the axis as a spurious "0" category
- Custom Graph - The Survival Statistic Accepted Invalid Times and Events: Event values other than 0 and 1 and non-positive times were used as they were; they are now rejected with the same rule and wording as the Kaplan-Meier and Cox tabs, and the layer reports why no curve was drawn
- Data Table - Fast Scrolling Still Left Blank Rows: Dragging the scrollbar quickly could show an empty table body until scrolling stopped; rows are now updated in step with the scroll event
- Data Table - Adding a Row After Excluding the Last One Duplicated a Row Number: A row added while the last row was excluded received that row's internal number, so restoring the exclusion left two rows with the same number; an affected saved project is renumbered when opened and the change is reported
- Cox Regression - Adjusted Survival Curves Used Slightly Wrong Covariate Means: With covariates whose values carry a large offset, the mean used to adjust the curve was off in the fourth decimal because of accumulated rounding
- ARIMA - Series Near a Unit Root Could Drive the Starting Point Out of Range: On a series close to a unit root, the preliminary estimation could push the constant to an absurd value and leave the final estimation to recover from it; candidates that previously stopped without converging (e.g., an order of (2,0,2) on a short series) now converge, and the fit takes fewer iterations
- ARIMA - Candidates That Could Not Be Fit Were Reported as Not Converged: In the order search, a candidate that failed outright (too few observations after differencing, zero variance, or a likelihood that could not be evaluated) was listed as merely non-converged; the Order Selection Results table now has a Status column that names the reason
- Analysis Tabs - Plot Rendering Warnings Were Not Shown: Warnings raised while drawing the Kaplan-Meier curves, the Cox Schoenfeld residual and log-log plots, and the ARIMA residual plots were not displayed in the tab
- Statistics - Show Density Was Lost When Adding a Histogram to a Report: A histogram added to a report from the Statistics tab never carried the density curve, even when it was shown in the tab
- Projects - Saving Before Reading View Could Mark Another Project as Modified: When the save that precedes Reading View finished after you had switched to another project, the other project's signature badge showed "(modified)" and its verbatim export was affected
- Workspace - Two Context Menus Could Be Open Across Split Panes: Right-clicking in a second pane without an intervening left click left the first pane's graph or lineage context menu open
- Appearance - Primary Buttons in the Dark Theme Failed the Contrast Guideline: White text on the dark theme's primary color had a contrast ratio of 2.2:1; text on filled buttons and other filled backgrounds now meets WCAG AA in the dark theme, with no change in the light theme
- Agent API - datasets.normalize() Returned an Id That Did Not Exist: When the call reused an existing dataset with the same name and definition, the returned
idwas not the registered one; the result now carries the registered id andreused: true, and a name clash with a different definition returnsDATASET_ALREADY_EXISTS,NAME_CONFLICT, orAMBIGUOUS_TABLE_NAMEinstead of a generic execution error - Agent API - setCellValues() Accepted int64 Values Outside ±2^53: Such values were written and silently lost precision; they are now rejected with
INVALID_INPUT
Security
- Dependencies - A Malformed ZIP Could Hang the Import: Updated the ZIP library used to read zipped data files to the version that no longer loops forever on a malformed ZIP64 archive, and the diff library used by Compare Project to the version that fixes a prototype-pollution issue in its patch function
Performance
- Reports - Every Edit Recomputed the Whole Element List: The Empty and Error badges in the editor's element list were recomputed for every element on each change, stalling the editor on reports with many graphs; only elements whose inputs changed are re-checked, one at a time in idle moments, and the previous result is shown meanwhile
- Statistics - Correlation Grids Spent Time Allocating Memory: Computing the correlation of each column pair allocated working arrays per pair; removing them makes a grid about 20% faster (200,000 rows × 20 columns), with unchanged values
[2026.08.27]
Added
- Custom Graph - ROC Curve Statistic: A new
rocstatistic draws an ROC curve from a score column and a binary outcome, with the diagonal reference line on by default and False Positive Rate / True Positive Rate as the default axis titles. Rows the curve cannot use — an outcome outside 0–1, a non-positive weight, a group containing only one class — are reported per group instead of vanishing. Also configurable through the Agent API - Custom Graph - Weight Aesthetic for Frequency Weights: A new weight aesthetic lets one row stand for several observations, so grouped data (e.g., one row per dose with a success proportion and a trial count) can feed statistics that read weights; assigning a weight where no statistic reads it produces a warning
- Dummy Coding - Level Counts Shown When Choosing the Reference: The Reference selector and the Encoding Preview show each level's observation count (n = N), so levels can be compared by sample size at the moment the reference category is chosen
- Dummy Coding - A Warning for Columns With Many Categories: A column with more than 50 unique values now warns how many dummy variables it will generate, in the tab and through the Agent API; the conversion itself is not blocked
- ANOVA - Group-Mean Intervals State Their Equal-Variance Assumption: The group statistics table's per-group mean intervals are computed from the pooled error variance; a note now says so, in the tab, in report elements, and in the Agent API's report
- Agent API - models.list() Tells Estimated From Pending Models: Each model now carries an
estimationState('estimated'/'pending'), and a model whose re-estimation failed carries the reason inestimationError, so a model awaiting re-estimation can be recognized from the list alone; the model's family is also reported while estimates are absent
Changed
- Data Table - Edit Mode Checks Each Cell as You Leave It: An entry that cannot be read as the column's type is now marked in place with the reason as soon as the cell loses focus, a toolbar counter jumps to the first such cell (including ones scrolled out of view), and Done stays disabled while any remain — replacing the previous behavior of discarding unusable values on save and reporting them afterwards
- Data Management - Dataset Names Differing Only in Case Count as Duplicates: SQL queries and the Agent API resolve dataset names without regard to case, so "Iris" and "iris" were the same name everywhere except the duplicate check; creating a dataset whose name differs from an existing one only in case is now treated as a duplicate. A project already containing such pairs still opens and works
- DoE - The Q-Q Plot Uses Standardized Residuals: The diagnostics Q-Q plot previously plotted raw residuals, whose spread varies with leverage in unbalanced designs; it now plots standardized residuals
- Agent API - GLM and GLMM Runs Default to the UI's Iteration Settings:
models.run()without explicit iteration settings used its own defaults (25 iterations, 1e-8 tolerance for GLM); it now uses the same defaults as the GLM and GLMM tabs (100 iterations, 1e-6 tolerance)
Fixed
- Custom Graph - Month, Quarter, and Year Time Bins Did Not Follow the Calendar: The 1 month, 3 months, and 1 year time-bin presets used fixed widths of 30, 90, and 365 days, so bins drifted away from the month, quarter, and year boundaries their labels and tooltips named; bins now start at calendar boundaries in the viewing timezone, bars are drawn at each bin's real width (e.g., 28 to 31 days for months), and density divides by that real width
- Data Import - Going Back After a URL Import Created a Second Project: After importing data from a URL, the browser's Back button returned to the import URL, ran the import again, and left a duplicate project in the launcher
- Analysis - A Text Column Could Pass as a Numeric Variable: A string or enum column could be declared interval or ratio and then be offered as a numeric variable, and rows whose values could not be read as numbers were folded into the missing-value count; such a declaration is no longer offered in the UI and is rejected by the Agent API, the ineligibility message points to Convert Column Types, and a saved project holding such a declaration is normalized when opened
- Projects - Switching Projects While a Save Was Running Could Overwrite the Other Project: When a save finished after the user had switched to another project, the newly opened project's content could be replaced with the saved project's data, recorded as saved, and its signature badge marked modified
- Workspace - A Tab Created With New Tab or New Workspace Did Not Select the Active Dataset: A tab created through View > New Tab (Cmd+T) or in a new workspace opened with no dataset selected instead of the active one
- Workspace - A Second Copy of a Single-Instance Tab Could Open From Another Pane: Opening Project Overview, Project Lineage, Compare with File, Manage Enums, Excluded Rows, or Help from a second pane opened a duplicate tab instead of activating the existing one
- Data Table - Sorting or Filtering Sent an Edit to the Wrong Row: With a sort active, an Edit Mode cell edit was saved to a different data row; with a filter active, the edit was not saved at all. Deleting a row also shifts pending edits below it correctly now
- Data Table - Edit Mode Failures Were Not Reported: A failed save, row addition, or row deletion was recorded in the log but never shown to the user
- Data Table - Add Row on an Empty Dataset Produced Broken Row Numbers: Adding a row to an empty dataset created with New Dataset gave every new row an internal row number of -Infinity, so the rows could not be told apart; an affected saved project is repaired when opened
- Data Table - Fast Scrolling Flickered the Header and Left Blank Rows: Dragging the scrollbar quickly made the header flicker and showed blank rows until scrolling stopped
- Data Management - Switching Datasets While Apply or Save Was Running Discarded the New Input: In Column Type Conversion, Add Columns, Dummy Coding, Reshape, and a Filtered Data edit, switching the dataset while a run was in progress let the user start entering settings that were then thrown away when the finishing run closed the tab; the dataset selector is now disabled during the run
- Column Type Conversion - Auto-Detect Could Apply Another Dataset's Results: Switching datasets while automatic type detection was running applied the previous dataset's detected conversions to the new one
- Data Management - The Add Columns Preview Could Keep Another Dataset's Result: Switching datasets while a preview was computing left the previous dataset's preview and warnings on screen, and the stale result could be saved
- Column Type Conversion - A Timezone Only the Browser Knew Could Break the Whole Conversion: The timezone list for string-to-datetime conversion came from the browser, but conversions are evaluated by the SQL engine, whose timezone data differs; a name the engine could not resolve failed the entire query regardless of the error-handling setting. The list and the validation now come from the engine itself — names like US/Pacific that only the engine knows have also become selectable, and a failure to load the list shows the reason with a Retry button
- Data Management - Reload Results Miscounted Cleared Exclusions and Comments: Row exclusions and comments added while Reload All Datasets was fetching data were cleared by the reload but missing from the cleared counts in the results dialog and the Agent API result
- Data Management - Some Datasets Saved From Model Results Could Not Be Evaluated After Reopening: Promoting a view whose values exist only as stored results (such as a Random Forest importance table) to a dataset could save it in a form that failed to evaluate when the project was reopened
- Data Management - Saving a Derived-Dataset Edit Overwrote Manual Column Settings: Saving an edit to a derived dataset replaced manually set column scales and display formats with re-inferred values
- UI - A New Alert Replaced the One Being Shown: When a second alert arrived while one was on screen, it pushed the first out before it could be read; alerts are now shown one after another
- Statistics - A Column Spanning the Full Double Range Emptied the Tab: A column whose values reach both extremes of double precision made the Statistics tab fail internally and show nothing at all; the tab now renders, showing N/A for each statistic whose computation overflows (mean, standard deviation, skewness, and others), and dependent results (correlation, standardized coefficients) report not computable as well
- Statistical Models - Fit Results Outlived the Data They Were Fit On: After Reload Dataset, a GLM, GLMM, or Linear Regression tab kept showing its unsaved fit — old coefficients could be saved as a model or added to a report as if they matched the new data; the results are now cleared and a notice says the dataset was modified after the last run
- Statistical Models - A Project Saved Mid-Run Reopened With the Run Button Stuck: Saving a project while an analysis was waiting for its result stored the running state, so the reopened tab showed a disabled "Running..." button forever; affected saved files are repaired when opened
- Statistical Models - The Confidence Level Field Could Disagree With the Level in Use: Typing an out-of-range confidence level left the typed value visible while the analysis used a clamped one; the field now shows the value actually in effect after leaving it
- GLM - A VIF Column That Could Not Be Computed Gave No Reason: When VIF could not be computed, the column was simply empty; a note under the coefficient table now states the reason (a model without an intercept, or predictors whose correlation matrix is singular), in the GLM tab, the Linear Regression tab, and Model Detail
- GLM - Prediction Metrics Could Show Infinity or an Absurd R²: An overflowing RMSE, MAE, or mean deviance was displayed as Infinity, and prediction R² on a response with negligible variation relative to its magnitude could show a huge meaningless value; both now show as not computable
- DoE - A Perfect Fit Reported Noise as Error Statistics: When the model fits the data exactly, standard errors, intervals, and effect sizes were computed from floating-point noise and shown as if meaningful; a perfect fit is now flagged with a warning, the error-dependent quantities show "-", point estimates remain, and affected saved models are updated when their project is opened
- DoE - Fully Confounded Effects Failed With a Rank Error: Selecting effects that are completely confounded in the design (e.g., aliased interactions in a fractional design) failed the whole analysis with an error; the confounding is now detected up front, one effect per confounded set is estimated, and the table and a warning name what is aliased with what
- Graphs - Axis Tick Formatting Depended on Which Axis a Column Landed On: A datetime axis lost its date formatting when flipped coordinates moved it to the vertical axis, a horizontal histogram applied its axis settings twice, and the suppression of fractional ticks on count axes was applied on some axes but not others; all three axes now share one formatting rule
- Project Lineage - Edges Bypassing the Selected Node Were Highlighted: Selecting a node also highlighted edges that connect its upstream to its downstream directly without passing through it
- Project Lineage - The Context Menu Could Run Off the Screen: Right-clicking near the bottom edge opened a menu extending past the viewport
- MDS Signature - Renaming a Key Did Not Update the Badge: After renaming a trusted key or one's own key, signature badges and the Provenance panel kept showing the old name until the project was reopened
- Settings - A Double Click Could Run a Signing-Key Action Twice: Double-clicking or pressing Enter twice in the signing-key dialogs could generate a key or run an export twice; the buttons are now disabled while the action runs
- Settings - Exported Logs Were Missing Worker Logs and Error Details: Export Logs & Errors contained no entries from background computations, dropped the structured details of errors, and lost the final moments before a tab was closed
- Statistical Models - More Computations Lost Precision on Data With a Large Common Offset: Standardized coefficients, the linear-smooth line, and the mean and variance graph statistics summed values naively, losing precision on data sitting on a large offset; they now use the same precision-preserving summation as the rest of the statistics
- Reports - A Statistics Element Whose Filter Broke Fell Back Silently: When a statistics element's filter expression could no longer be applied, the element silently showed statistics over all rows; a warning banner now says the filter could not be applied
- Agent API - Graph Layer Changes Were Validated Without Their Context: A partial layer update was checked field by field rather than against the merged result, so a change leaving a required aesthetic missing, a scale type incompatible with the column, or a palette incompatible with the scale passed silently; the merged state is now validated and problems are reported as warnings
- Agent API - derive and query Could Resolve the Wrong Table: When a query's CTE definition referenced one dataset and the outer query another, the target dataset was resolved from the CTE's reference instead of the outer query's
Performance
- Cox Regression - Fitting Large Data Froze the UI: Model fitting, the proportional-hazards diagnostics, and baseline hazard estimation all ran on the UI thread, freezing the screen for the duration on large datasets with many covariates; they now run in the background and the Run button shows progress (e.g., "Running... (iteration 3 / 100)")
[2026.08.22]
Added
- Agent API - derive and normalize Report Whether Row Lineage Is Traceable:
datasets.derive()anddatasets.normalize()now return alineagefield stating, at creation time, whether the new derived dataset's rows can be traced back to its parent — with a reason and an explanatory warning when they cannot — so an agent no longer has to create the dataset and try a trace to find out - ARIMA - The Auto Search Reports Its Non-Convergent Candidates: When the automatic order search discards candidates that failed to converge, a note above the Order Selection Results now gives their count; when every candidate failed, the note states that the shown model is a fallback rather than the winner of an AIC/BIC comparison. The count is also returned through the Agent API
- Synthetic Data - The Preview Shows Column Types: The preview table's header now shows each column's type, so a definition that produces an int64 where a float64 was expected (or the reverse) is visible before a downstream analysis rejects the column
Changed
- Cox Regression - The Exclusion Count Is Split by Cause: The single "rows excluded due to missing values" count is now broken down into rows with a missing time or event value and rows with a missing covariate value (e.g., "120 rows excluded due to missing values: 85 with a missing time or event value, 35 with a missing covariate value."), so it is visible which variable shrank the analysis. The counts now also appear when the run ends in an error, which previously showed no exclusion information at all; the Agent API returns the same breakdown alongside the total
- Dummy Coding - Category Order Is Now Deterministic and Matches Graph Axes: The order of the generated dummy variables and the default reference category came from a locale-dependent string comparison, so they could differ between environments; the order now follows the same rule as graph axes — enum definition order for an ordinal enum column, numeric order for a numeric column, Unicode code-point order otherwise. A saved dataset keeps its explicitly stored reference category
- DoE - Interaction Plots No Longer Draw the Overall-Mean Line: The overall-mean reference line does not help read an interaction — which is judged from the lines' non-parallelism — and left room for misreading, so it was removed; the main effects plot keeps its overall-mean line
- DoE - Main Effects Plots Say What Their Error Bars Are: The plot title now reads "Main Effects Plot (error bars: 95% CI of level means)", following the chosen confidence level, instead of leaving the error bars' meaning unstated
Fixed
- Data Import - A Shift-JIS or EUC-JP CSV Inside a ZIP Was Always Garbled: A CSV or TSV inside a ZIP archive was decoded as UTF-8 before encoding detection could run; it now goes through the same automatic encoding detection as a local file, per file in the archive
- Data Import - A URL Import Recorded the Wrong File Size: The size shown in Dataset Metadata and Project Lineage was the decoded text's length, not the received bytes — about half the real download size for a mostly full-width Shift-JIS file
- Statistics - A Column's Summary Row and Expanded Detail Disagreed About Its Distribution: A string or boolean column set to an interval or ratio scale showed a category bar in its summary row but nothing when the row was expanded; both now use the same classification. As a consequence, a datetime column set to a nominal or ordinal scale now shows only its date distribution when expanded, matching its summary row
- Graph Builder - Every Graph Was Drawn Once at a Provisional Size: A graph rendered first at a default size and then again at the container's measured size — on first display, on every window resize, and on pane open/close — briefly showing a misplaced chart; drawing now waits for the measurement and happens once
- Graph Builder - A Group That Could Not Be Summarized Vanished Without a Word: A group with no usable values, a group whose rows were all filtered out before the computation, a group whose aggregate or automatic bandwidth could not be computed, a group whose smoothing interval could not be computed, and a stacked X position whose total was zero all disappeared from the chart silently; each case now shows a warning naming the group
- Graph Builder - Setting a Layer's Column Back to Use Global Did Not Restore the Global Column: Reverting a layer's column selection to Use global left the layer without the global column instead of inheriting it again
- Graph Builder - A Preview That Hit an Error Stayed Broken: Once the graph preview failed with an error it kept showing the error even after the configuration was corrected; it now recovers when the settings change
- Graph Builder - A Statistic Created Through the Agent API Could Not Be Edited in the UI: A layer statistic saved without its parameter block made the Statistics inputs inoperable until the graph was reconfigured
- Custom Graph - An Invalid Statistic Parameter Was Used As Given or Silently Dropped: An out-of-range bin count, a non-positive bin width, or an invalid summary output was passed through to drawing or discarded without a trace, whether set in the UI or through the Agent API; parameters are now validated against one shared declaration — drawing falls back to a valid value with a visible warning, input fields reject an out-of-range entry and state the allowed range, and sliders take their bounds from the same declaration
- Custom Graph - A Contradictory Statistic and Position Combination Was Accepted: A boxplot statistic combined with a bar or area geometry and a stacked or filled position produced a self-contradictory chart with no warning; the combinations a statistic supports are now enforced in the UI's choices, the Agent API's validation, and drawing
- Custom Graph - The Color Channel's Scale Type Selector Could Not Show Sequential or Diverging: A sequential or diverging color scale set through the Agent API left the Scale Type selector blank; both types can now be chosen and display correctly
- Reports - ANOVA Model Warnings Never Appeared in a Report: The ANOVA model-statistics report element rendered nothing at all, so warnings such as a degenerate response or vanished factor levels were absent from reports; it now shows a Fit section (design, observation and exclusion counts, with a note explaining the exclusion breakdown) and the warnings, and Add to Report from Model Detail now adds the same full set of elements as the Agent API does
- ANOVA - Scale Eligibility Was Not Checked on Every Path: Re-estimating a saved model and re-rendering a report element skipped the check that the response is interval or ratio and the factors nominal or ordinal, so a configuration rejected by the ANOVA tab could succeed elsewhere; all paths now apply the same check, and a non-numeric response fails with a message naming the scale instead of "Not enough valid observations: found 0"
- ANOVA - Tukey HSD's Std. Error Column Was Not the Standard Error of the Mean Difference: The column showed a value scaled for the studentized-range statistic, smaller than the mean difference's standard error by a factor of √2; it now shows the standard error of the mean difference, and a note states how the interval is built from it. The intervals themselves are unchanged; a saved model's column is corrected the next time its project is opened
- ARIMA - A Fit That Reached the Optimum Could Be Reported as Non-Convergent: Among the estimation's multiple starting points, a run cut off at the iteration limit could be preferred over an equivalent converged run whose likelihood differed only at rounding level; the correct coefficients were shown, but AIC and BIC were hidden and a non-convergence warning appeared. Estimated to affect roughly 1 in 2,000 fits
- ARIMA - A Weakly Identified Model Could Settle on a Worse Fit Without Warning: When AR and MA terms nearly cancel, the estimation could stop at a clearly worse solution; it now optimizes from multiple starting points and takes the best, and when a nearly-equivalent solution with clearly different coefficients remains, a warning states that the coefficients are only weakly identified — and that no warning is not a guarantee of good identification
- ARIMA - The Automatic Differencing Decision Could Change With the Series' Units: The stationarity check detected a constant series with an absolute threshold, so merely rescaling a series could change the chosen differencing order, and an extremely large scale made the test statistic not computable; the check is now invariant to the series' scale and offset within floating-point limits
- ARIMA - A Standard-Error Failure Was Explained Only in the Log: When standard errors could not be computed, the reason — parameters at the stationarity boundary, an information matrix that is not positive definite, a failed inversion — appeared nowhere in the UI; each reason now produces its own warning, the warnings appear on report elements like other models', and the Agent API reports non-convergence and degeneracy in its warnings
- Kaplan-Meier - A Group With No Events in Range Showed a Degenerate RMST as a Definite Value: A group with no event at or before the chosen τ showed RMST equal to τ with a standard error of 0 and a zero-width interval, in the same form as a real estimate; the quantity is now reported as not computable ("-")
- Cox Regression - An Extreme Spread in the Linear Predictor Broke the Baseline Hazard and Adjusted Survival: When covariate effects spread the linear predictor beyond what floating point can follow, the baseline-hazard computation stopped with an error and an adjusted survival value could overflow; both now compute, a truly indeterminate point shows as not computable, and a degenerate baseline survival estimate now carries a note pointing to the adjusted survival curves
- Cox Regression - The Same Extreme Spread Crashed the Proportional-Hazards Diagnostics: Part of the Schoenfeld residuals was silently lost and the subsequent correlation computation crashed the diagnostics; the residuals are no longer lost
- Cox Regression - A Computable rho Could Show as Not Computable, and a Partial One as Complete: The proportional-hazards diagnostic declared the correlation not computable when a covariate's large scale made the involved variances tiny, showing "-" for a well-defined rho; and a rho computed from only part of the events (some being non-finite) was shown like a complete one — it now shows as not computable instead
- Cox Regression - Re-Running With Fewer Covariates Crashed the Tab: Reducing the covariates and re-running the analysis could take down the whole tab with an error, and the log-log plot could draw a single curve labeled "undefined"
- Cox Regression - Covariate Profile and Grouping Selections Were Reset by a Re-Run: Re-running the analysis discarded the values entered for the adjusted survival curves and the diagnostic plots' grouping variable choice; they are now kept when the covariate set is unchanged, and a covariate that is removed and re-selected gets its previous value back
- GLMM - Add to Report Could Add Half of What It Saves: When saving the BLUP dataset failed, the coefficient dataset was still registered and added to the report, leaving an error message and a half-complete report element; both datasets are now saved together or not at all
- GLMM - The Saved Badge Survived a Confidence-Level Change: Changing the confidence level after saving the coefficient dataset left the badge showing Saved while the on-screen intervals were recalculated at the new level, so the saved dataset silently disagreed with the display; the badge now clears, as GLM and Linear Regression already did
- Random Forest - OOB Accuracy Changed Units Between Screens: The card shown right after fitting displayed 85.2% while the Model Detail tab and the report element displayed 0.8523 under the same label; all three now show a percentage
- Dummy Coding - A Reference Category Missing After a Reload Was Caught Too Late: When a source reload removed the stored reference category's value from the data, the problem surfaced only downstream; it is now detected before Apply, blocks Create/Update Dataset with an error, and the missing value is marked "not in data" in the Reference selector
- Dummy Coding - A Column With No Usable Values Showed "-1 dummy variables": The Encoding Preview showed a negative dummy-variable count for a column with no unique values; the error message now names the column and its count instead
- Dummy Coding - Cancel During an Update Still Applied the Update: Pressing Cancel while Update Dataset was saving closed the tab, but the save completed anyway and the update took effect; Cancel is now disabled while saving
- Dummy Coding - The Tab's Colors Did Not Follow the Theme: The tab used fixed colors instead of the theme's, so it looked out of place in the dark theme
- Data Management - Full Reset Could Hang: An open database connection — including one held by another tab — silently blocked the deletion and the reset never finished; connections are now closed properly, a still-blocked deletion is abandoned after 5 seconds with guidance to close other tabs, and a reset now also removes the offline application files
- Data Management - The SQL Editor and Add Columns Previews Hid Evaluation Warnings: A preview whose evaluation produced warnings — a non-finite result becoming a missing value, an out-of-range date — showed the resulting empty values with no explanation; the warnings now appear above the preview
- Data Management - The Internal Row # Column Leaked Into Variable Choices: Row # appeared among the selectable variables of the analysis tabs (PCA, GLM, GLMM, Linear Regression, Random Forest, ARIMA, DoE, Kaplan-Meier, Orthogonal Polynomials), in Crosstab fields, and in a report Crosstab element's edit dialog; it is now excluded everywhere, and a project saved while a selection still contained it is cleaned when opened, with a warning naming the affected tabs
- Crosstab - Renaming or Deleting a Column Used by a Crosstab Threw an Unhandled Error: Generating the crosstab, or adding one to a report, failed with an internal assertion when a configured field no longer existed; both now fail with an error message naming the missing field, and a failed add no longer leaves an empty report behind
- Synthetic Data - Apply Mapping Could Build Its Query From Stale Names: The dataset and column names embedded in the generated query came from an earlier render, so changing the dataset while the dialog was open could apply the mapping with outdated names; all names are now taken from the same current state
- Synthetic Data - A Branch Labeled proto Was Never Created: A cases level named
__proto__silently produced no branch - Synthetic Data - Category Weights With an Infinite Sum Always Picked the Last Level: When each weight was finite but their sum overflowed to Infinity, every draw returned the last category; the definition is now rejected as invalid
- Project Lineage - Opening a Dataset Could Activate the Wrong Tab: Opening a dataset node could activate a Statistics, Crosstab, or Graph Builder tab that remembered the dataset instead of showing its Data Table; only a Data Table tab is reused now
- Project Lineage - Deleting the Selected Node Left the Whole Graph Dimmed: When the selected node disappeared — deleted, or hidden by a filter — every remaining node and edge stayed dimmed with no way to recover; the dimming now clears
- Agent API - Iteration Settings Were Not Validated:
models.run()andmodels.configure()accepted invalid values —maxIterations: 0made GLM and GLMM return a degenerate result as a success, and Cox regression skipped the check in the fit itself; iteration limits, tolerances, confidence levels, and seasonal periods are now rejected as invalid input - Agent API - An ARIMA Series the UI Rejects Was Accepted: The API's minimum observation count was 4 while the ARIMA tab requires 10, so a 4-to-9-point series was estimated through the API only; both now require 10
- Agent API - models.describe() Omitted a Random Forest's OOB Score: The stored value was never included in the response, so a model whose OOB score could not be computed was indistinguishable from one whose score simply wasn't reported
- Agent API - A Simple Histogram's Bin Count Was Saved Unchecked: An out-of-range or non-integer
binswas stored as given; it is now clamped to 1–100 with a warning, and a non-numeric value is rejected - Documentation - Statistical Descriptions in the Documentation and In-App Help Contained Inaccuracies: A sweep over the in-app help and the documentation corrected statistical statements — among them a reversed claim about how Cook's Distance's reference percentile relates to the number of parameters, η² described without noting it is a decomposition of the sample, consistent survival estimators described as unbiased, and an ARIMA hint that left unstated the constraint imposed by removing the trend's intercept — and aligned terminology across the UI and documentation (predictor instead of feature, fitting data instead of training data)
Performance
- Graphs - Clicking a Selection Froze Large Charts for Seconds: After a click or rectangle selection, deciding which points to highlight re-evaluated the selection against every row for every point — about 9.5 seconds per redraw on a 10,000-point graph over 100,000 rows; the evaluation is now reused, taking under a millisecond after the first pass
- Graphs - Panning and Zooming Rebuilt Selection Structures Every Frame: The column map used to evaluate the selection was rebuilt on every pan and zoom frame, scanning all columns each time; it is now built once per dataset
- Project Lineage - Unrelated Actions Re-Laid-Out the Graph: Renaming the project, dragging a pane divider, and other actions that change nothing in the lineage rebuilt and re-laid-out the whole graph — up to about 160 ms per re-layout on a large project; the graph now rebuilds only when its displayed content changes
[2026.08.17]
Added
- Reports - Contents Menu, Heading Anchors, and a Pinned Header: The report header gains a Contents button listing the report's headings; choosing one scrolls to it. Each heading gets an anchor that is unique within the report, so a
#anchorlink written in the body jumps to it. The header now stays at the top while the body scrolls, and after Add to Report the report scrolls to the newly added element the next time it is shown - Statistical Models - Number Format on Coefficient and Other Model Tables: The coefficient, variance component, BLUP, factor effect, and Random Forest importance tables now take a per-column number format from the column header's right-click menu; the choice is saved with the tab and survives re-running the model, and Save as Dataset and Add to Report carry the formats shown on screen into the saved dataset or report element
- ANOVA - Reports Carry Observation Counts, Group-Mean Intervals, and the Tukey Assumption Note: An ANOVA section added to a report now shows the same observation and exclusion counts as the tab; the group statistics table adds each group mean's own confidence interval (labeled Individual), and the Tukey HSD table labels its intervals Simultaneous, adds q Critical, MSE, and DF columns, and notes that the intervals assume equal variances
- Histogram - Proportion Y Scale: A histogram can now show each bar as a proportion of its group's row count instead of a count — each group's bars sum to 1, so groups with different row counts can be compared by shape. Available as a Y selector on the Statistics tab's Data Distribution card, as a Y Scale setting in Graph Builder, and in reports and the Agent API. Stacked grouping cannot be combined with it, since proportions with different denominators do not add up to an interpretable total
- Statistics - A Note Counts Rows Whose Group Value Is Missing: When grouping with Show stats by, rows with a missing group value belong to no group, so the group sizes add up to less than the dataset's row count; a note below the comparison table now gives that count (e.g., "3 rows not in any group (species missing)"), and appears alone when every row is missing and no group can be formed
- Data Management - Reload Results Report Cleared Excluded Rows and Comments: Reloading a dataset clears its row exclusions and row comments, and the Reload All Datasets result dialog now shows how many of each a reload cleared, per dataset
- Agent API - reports.scrollTo:
reports.scrollTo(reportId, target)scrolls an open report to an element (elementId) or a heading (heading), matching the new in-report navigation - Agent API - Cleared Annotation Counts in datasets.reload Results: Each reloaded dataset in a
datasets.reload()result now carriesclearedExcludedRowCountandclearedRowCommentCount, so an agent can report what a reload discarded - Agent API - datasets.setColumnDisplayFormat: Sets a column's link or number display format on the dataset, matching the column menu's new default;
datasets.describe()returns the current settings
Changed
- Data Table - A Column's Display Format Now Applies Everywhere by Default: Display as Link and Number Format used to be saved only with the tab they were set in; they are now saved with the column by default and take effect in every tab showing it — including Filtered Data and Contributing rows tabs, which previously had no display formatting at all. Limiting the setting to the current tab is still available (Apply to in the link dialog, This view only in the number format menu), and an existing tab setting keeps overriding the column's, so saved projects look the same. A derived dataset keeps the column settings across re-derivation
- Agent API - Creation Results Name Their ID id:
datasets.create(),models.predict(), andmodels.saveAsDataset()returned the created resource's ID asdatasetId, andtabs.open()andtabs.duplicate()astabId; all five now returnid, the same name the correspondinglist()elements use, so the value can be passed straight to other methods. Code reading the old field names must be updated
Fixed
- Data Management - Infinity Produced by a Calculation Entered the Dataset: A calculation producing ±Infinity — a computed column dividing by zero, an overflowing expression — stored it as a regular value (only NaN became a missing value), and it could then distort downstream results, such as a distribution estimate that never accounts for all the data. A non-finite result now becomes a missing value, with a warning giving each affected column's row count; a previously saved project containing such values is cleaned when opened
- Workspace - Opening an Already Open Report or Model Created a Duplicate Tab: Opening a report, model detail, diagnostics, SQL viewer, or column-editor tab whose target was already open — from the View menu, Project Overview, Project Lineage, or the Agent API — created a second identical tab; the existing tab is now activated instead, bringing its pane to the front when it is in another pane
- Workspace - Two Tab Context Menus Could Be Open at Once: Right-clicking a tab in one pane and then, without clicking elsewhere, right-clicking a tab in another pane left both menus open; a context menu now closes when another opens, including between a tab menu and a Data Table row or cell menu
- Project Lineage - Leaving the Tab During a Zoom Threw an Error: Switching away from Project Lineage right after a zoom or Fit action could throw an error, because the zoom animation kept running against the removed view; the animation now stops when the view goes away
- Data Table - Renaming a Derived Dataset's Column Was Undone on Reopen: Renaming a column of a derived dataset appeared to succeed, but the name reverted when the dataset was re-derived or the project reopened, because a derived dataset's column names are rebuilt from its defining operation. The rename is now rejected up front, in the Data Table and the Agent API, with a message naming where the column name is actually defined (the query's alias, the imported file's header, the expression, or the Reshape settings)
- Data Management - Contributing Rows Could Not Be Traced From a Filtered Data Tab: The Contributing rows drill-down, available from other derived views, was disabled on a Filtered Data tab; it now works there, respects a further filter applied within the tab, and is also available through the Agent API
- Histogram - Grouped Density Was Normalized by All Groups Combined: In a histogram split by fill or color, the Density Y scale divided by the whole layer's point count, so no single group's area integrated to 1 and the bars disagreed with the density curve's per-group normalization; each group is now normalized by its own count. An ungrouped histogram is unchanged; a saved graph combining grouping with Density will look different. Stacking per-group-normalized values now shows a diagnostic warning, since shares with different denominators do not sum to a readable total
- Graph Builder - A Non-Positive Density Bandwidth Produced Negative Densities: A bandwidth of zero or below was used as given and could yield negative density values; such a value now falls back to automatic bandwidth selection
- Custom Graph - An Invalid Summary Configuration Drew Wrong or Missing Values: An aggregation output naming an invalid destination drew the underlying raw values as if they were the aggregate, and an out-of-range percentile made that group's points disappear without a warning; both are now rejected with a warning, and the percentile input field no longer accepts an out-of-range typed value
- Graph Builder - A Box Plot Said Nothing About a Group Too Small to Summarize: A group with fewer than 5 valid values draws quartiles interpolated from just a few observations, and a group whose interquartile range is 0 collapses the box and whiskers into a line, with nothing pointing either out; both cases now show a diagnostic banner above the graph, also reported through the Agent API's graph diagnostics
- Graph Builder - Aggregated Mean and Sum Lost Precision on Data With a Large Common Offset: The mean and sum aggregations summed values naively, so data sitting on a large offset could lose precision that the standard-deviation and variance aggregations already guarded against; they now use the same precision-preserving summation
- ANOVA / DoE - Sums of Squares Lost Precision When the First Row Was an Outlier: The round-off protection in the sums of squares was anchored to the dataset's first observation, so a dataset starting with an outlier got less of it; it is now anchored to the mean
- GLMM - A Gamma or Gaussian Model With as Many Groups as Observations Fit Without Warning: With the number of groups at or above the number of observations, the between-group and residual variances cannot be separated, but the fit completed silently and returned an overfit model; it now stops with an error, as the linear mixed model already did. Poisson and Binomial models, which do not estimate a residual dispersion, are unaffected
- ARIMA - The Likelihood Could Be Numerical Noise Near the Stationarity Boundary: When the optimizer pushed the AR parameters very close to the stationarity boundary, the likelihood computation started from a numerically invalid state and returned a value dominated by rounding error, which could misdirect the optimization and the order selection; such a point is now detected and treated as not evaluable, and a fit whose first stage lands on one backs off to a nearby evaluable point instead of failing
- ARIMA - Standard Errors Depended on the Series' Overall Level: A series sitting at a large level got degraded estimates — the intercept's standard error could be 29 times what the same series shifted to level 0 gets — and a not-yet-converged fit could pass the convergence check; estimation now standardizes the series and time axis internally and reports results on the original scale
- ARIMA - ACF and PACF Broke Down on Extreme Scales and Constant Series: A series with extremely small values could show a partial autocorrelation beyond ±1, one with extremely large values showed N/A, a constant series showed nonzero autocorrelations built entirely from rounding error, and a series with a large common offset lost accuracy; all four cases now compute correctly
- ARIMA - A Degenerate Fit Showed σ² as 0.0000 and Log-Likelihood as N/A: A fit that could not be estimated — too few observations, or zero variance after differencing — displayed σ² as 0.0000, indistinguishable from an estimate of zero, and its log-likelihood as N/A; both now show "-" (not computable). A saved model's σ² is corrected the next time its project is opened; a saved log-likelihood already read as not computable
- Cox Regression - An Extreme Spread in the Linear Predictor Broke the Fit: When covariate effects spread the linear predictor extremely wide, the risk-set denominators underflowed to zero part-way through the data and event contributions were silently dropped; the computation is now stabilized within each risk set, and a genuinely non-computable likelihood now fails the fit with an error instead of dropping contributions
- Agent API - A SQL Syntax Error Was Reported as a Missing Table Reference: A syntax error in
datasets.queryordatasets.derivereturned the same error as SQL containing no table at all, hiding the real cause; a parse failure now returns a dedicated error carrying the SQL engine's own message, and the documentation now states that FROM and JOIN name datasets by their name (case-insensitive; a dataset ID does not work) - Agent API - importFromURL Accepted a Non-String URL or Name: A non-string
urlthrew an exception instead of returning an error result, and a non-string or blankoptions.nameindatasets.importFromURLordatasets.importFromBufferwas accepted —importFromURLcould even persist it as the dataset's name; both are now rejected as invalid input
Performance
- Data Import - The Table Appeared Late When Importing a Large CSV: Importing a 34 MB, 500,000-row CSV took about 17.6 seconds until the table appeared, most of it spent converting data between internal representations and saving the new project; the conversion is faster and the first save now runs after the table is drawn, cutting the wait to about 13.9 seconds, and the loading indicator names the current stage instead of showing only "Loading..."
- Reports - An OLS Report With Both ANOVA Types Re-Fit the Model Twice on Every Load: Opening a project whose report contains both sequential (Type I) and partial (Type III) ANOVA tables for an OLS model re-fit the model once for each table — about 7.7 seconds for the two fits on a 500,000-row, 10-predictor model; the Type III table is now rebuilt from the saved model's estimates without reading the row data, so only the Type I table, which needs the row data, re-fits once (about 3.6 seconds on the same model)
[2026.08.13]
Added
- Data Management - Reload Remembers a File-Based Dataset's File: Reloading a dataset from a local file used to ask you to select the file every time; in a browser that can store file handles (Chrome, Edge), MIDAS now remembers the file after the first reload, and the dialog's Reload from file button reads it again without asking — the browser may prompt to re-allow access. If the remembered file was moved or deleted, selecting it again updates the remembered file
Changed
- Data Management - Reload All URL Datasets Renamed to Reload All Datasets and Extended to File-Based Datasets: The Data menu's Reload All URL Datasets, which reloaded only datasets imported from a URL, is now Reload All Datasets and also reloads file-based datasets that remember their file. The result reports each dataset as reloaded, failed, or needing a file selection
- Agent API - reload Replaces reloadFromURL:
datasets.reloadFromURL()has been renamed todatasets.reload(), which now also reloads file-based datasets (previously URL-based only) and accepts a dataset name in addition to an ID; the result addsneedsFileSelectionfor a dataset that could not be reloaded automatically. Code calling the old name must be updated
Fixed
- ARIMA - Order Selection Results Table's Top Row Could Disagree With the Selected Model: A fit that failed to converge still reported AIC and BIC computed from a likelihood that had never actually been maximized, so a non-convergent fit could rank above the model actually selected when the table was sorted by AIC. AIC and BIC for a non-convergent fit now show as "-" and sort to the end, so the top row always matches the selected model; the same change applies to the Fit Statistics panel for a manual fit. A model saved with a non-convergent fit before this change shows the corrected values the next time the project is opened
- Graph Builder - A Right- or Left-Positioned Legend Could Overflow Its Reserved Width: The legend's width estimate did not include its title, so a chart with a long title and short category names (for example, a "cylinders" legend) could show the title cut off at the container edge; and the margin reserved for the legend had no upper bound, so a wide legend could grow the margin until no space was left for the chart itself. The title now uses the same maximum width as category names, the reserved margin is capped to leave room for the chart, and when the capped width still isn't enough the legend truncates its title, category names, or scale ticks to fit — or is omitted entirely when there isn't room for even a single marker
Security
- Dependencies - react-router Cross-Site Request Forgery Bypass: Updated react-router (and react-router-dom) to the version that fixes a CSRF bypass that could allow an action to run before its request was rejected
[2026.08.09]
Added
- Statistics - Selected Columns Tab: What Statistics used to show for a selected column, or for the relationships between several, is now the Selected Columns tab, showing each selected column's detail in selection order. Selecting exactly two columns shows their pair detail (scatter plot, box plot, or cross-tabulation) at full pane width
- GLM - VIF Column in the Coefficient Table: The GLM coefficient table now shows a VIF (variance inflation factor) column, computed from the model's coefficient covariance matrix — matching the standard correlation-based VIF for a Gaussian, identity-link model with an intercept. It appears on an existing saved model without re-fitting, and a model without an intercept shows "-" for every predictor
- ANOVA - Warning for Very Low Error Degrees of Freedom: ANOVA now warns when the residual (error) degrees of freedom is 2 or fewer, since confidence intervals and effect-size estimates are unreliable with so few, and suggests collecting more observations
- Data Management - Interpretation Time Zone for String-to-Datetime Conversion: Convert Column Types now takes a Timezone setting for a string-to-datetime conversion, controlling how a value with no offset is interpreted; a value carrying its own offset is unaffected. The default is UTC, matching prior behavior
- Data Import - Automatic Encoding Detection for CSV/TSV Import From a URL: Importing a CSV or TSV file from a URL now detects UTF-8, Shift-JIS, or EUC-JP when no encoding is specified, the same as a local file; an encoding can also be chosen manually
- Sample Datasets - Mauna Loa CO2 Monthly Time Series: NOAA's monthly mean atmospheric CO2 concentration at Mauna Loa Observatory (1976–2024, 588 observations) joins the bundled sample datasets, as a public-domain seasonal time series
- Agent API - Timezone Option for datasets.setColumnSchema: A string-to-datetime conversion now accepts a
timezoneoption, matching the UI - Agent API - Detected Encoding in Import Results:
datasets.importFromURLanddatasets.importFromBuffernow return the encoding that was detected or used
Changed
- Statistics - Tab Reorganized Around a Full Column Summary: Statistics no longer needs a column selected to show more than a dataset overview — it now shows every column's statistics in a summary table, each row expandable, together with a correlation grid across every numeric pair. The selection-driven detail it used to show moved to the new Selected Columns tab. The default layout is now two panes: Data Table on the left, Statistics and Selected Columns on the right
- GLMM - Fixed-Effect Confidence Intervals for a Gaussian, Identity-Link Model Use Kenward-Roger Inference: A linear mixed model's (Gaussian family, identity link) fixed-effect confidence intervals now use Kenward-Roger-adjusted standard errors and a t-distribution with per-coefficient degrees of freedom, instead of a normal approximation — correcting intervals that were too narrow with few groups and matching exact t-based inference under a balanced design. The coefficient table shows the degrees-of-freedom column when this is used, and falls back to the normal approximation with a warning when the adjustment can't be computed numerically. A model saved before this change keeps its prior results until re-fit; a non-Gaussian GLMM is unaffected
- Reports - Embed Mode Menu Renamed to Reading View: The report header's Embed Mode menu item is now Reading View, matching its actual local use (viewing, printing, screenshots) instead of implying the report is published externally
Removed
- Statistics - Selected Rows Tab: Removed. Inspecting selected rows now happens by double-clicking a chart element to open them as Filtered Data; column-focused statistics are in Selected Columns. A saved project with a Selected Rows tab is migrated to drop it on open
- Statistics - Pair Plot, the Column Comparison Table, Correlation Add to Report, and the Datetime-Numeric Time Series View: These four — a scatterplot matrix for several columns, a side-by-side statistics comparison table, adding a correlation matrix to a report, and a time series view for a datetime-and-numeric pair — are removed, with no equivalent in the new layout
Fixed
- Statistics - An Overflowing Sum of Squares Made an Uncomputable Correlation Show as Zero: When a column's sum of squared deviations overflowed double precision, the correlation's denominator became infinite and the result rounded to 0 — indistinguishable from an actual near-zero correlation. This case is now reported as not computable instead of 0
- Data Table - Add to Report Ignored the Active Filter: Add to Report from a filtered Data Table produced a report element showing every row instead of the filtered ones; the filter is now carried into the element, falling back to all rows with a warning if it later becomes invalid
- Data Table - Reopening a Discarded Project Could Restore Its Previous, Unsaved Filter and Sort Settings: Using Close Project to discard changes and reopening the same file could show a Data Table's pre-close filter and sort settings, even though they were never saved, because per-tab display state was not cleared on close
- Data Management - An Existing MDS File With Circular Lineage Could Be Opened Without Warning: An MDS file saved before circular lineage was guarded against on write could contain a dataset that referenced itself; opening it loaded silently, with the problem surfacing only later as an unexplained error. Opening now detects this at load time, refuses to open the file, and names the affected datasets
- Data Management - Opening an MDS File Could Race Between the OS File Handler and the Launcher: Opening a file from the OS file manager while also opening one from the launcher screen could run two independent open flows at once, each able to reach its own confirmation dialog and load a project. Opening now goes through one shared flow, and a second attempt while one is in progress is rejected
- Data Management - Clicking a Saved Project or Sample Dataset Repeatedly in the Launcher Could Start Loading More Than One at Once: Unlike Open File and Open from URL, the launcher's Quick Access and Sample Data entries had no guard against repeated clicks while loading
- Data Management - A Second Confirmation Dialog Could Leave the First One Stuck: Showing a confirmation dialog while another was already open replaced the first one's resolution callback, so a click on the now-hidden dialog never resolved it; dialogs are now queued and shown one at a time
- Reports - A Model Statistics Element Kept Showing "Estimating..." After a Re-Estimation Failure: A
model_statsreport element kept showing "Estimating..." after its model's re-estimation had actually failed, instead of reporting the failure like the Model Detail and GLM tabs already did; it now shows "Re-estimation failed" with the error - Graph Builder - A Fill-Position Chart's Tooltip and Axis Did Not Indicate Values Were Percentages of the Total: A chart using the fill position (stacked to 100%) showed its tooltip and axis as raw numbers, without indicating they were normalized shares — a tooltip reading "Count: 0.71" was actually 71% of the total. Both now add "(% of total)" and format as a percentage; the axis also no longer collapses to ticks at just 0 and 1
- Graph Builder - A Layer's Scale Settings for an Unmapped Channel Were Hidden Instead of Shown With a Reset: Color, fill, shape, size, alpha, and line-type scale settings for a layer were shown only once a column was mapped to that channel, hiding an existing setting on a channel that no longer had one. These are now always shown when the geometry supports the channel, with a per-channel Reset button
- Workspace - Creating a New Tab From the New-Tab Combo Box Did Not Preselect the Active Dataset: Unlike other ways of creating a tab, the new-tab combo box left the dataset unset even when one was already active in the workspace; it now preselects it the same way
- Agent API - configureGraph Left Selection Tracking on the Previous Dataset After Clearing It: Clearing a graph's dataset (
datasetId: '') left click and rectangle-selection tracking on the previously active dataset, so the rendered graph, the selection behavior, andtabs.getGraphBuildercould disagree about the current dataset. A cleared selection also no longer reappears after saving and reloading - Agent API - reports.updateElement Reset an Element's Width and Layout on Every Call: Every call reset a report element's width and layout to their defaults, discarding a size or position it already had
- Agent API - tabs.updateGraphLayer Silently Discarded a Layer's filter Update: Passing
filterhad no effect — it was accepted and dropped without a warning. It is now validated (syntax, a nonexistent column, a type mismatch) and applied;filter: nullor an empty string now clears an existing filter
Performance
- Statistics - Full Column Summary and Correlation Grid Blocked the Page: Opening Statistics computed every column's statistics and every numeric pair's correlation synchronously on the main thread — about 7.4 seconds on a 200,000-row, 21-column dataset. Correlations now run off the main thread in a worker once large enough, and both computations were optimized, cutting the block to about 0.65 seconds
[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.generateSynthetictakes the row structure asfactors,rowsPerCell, andtime, and therowsoption can then be omitted — arowsvalue that contradicts the declared structure is rejected.datasets.listSyntheticPresetsreturns 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, anddatasets.filtercreate 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 returnedEXECUTION_ERRORfromdatasets.queryanddatasets.derive, unlikedatasets.addColumns, which returnsINVALID_INPUT; both now returnINVALID_INPUT - Agent API - Malformed Graph Configuration Values Could Throw Instead of Returning an Error: Passing a wrong-typed value into a graph configuration field —
nullwhere 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
renderStatusreturned byreports.addGraph,reports.updateElement, andreports.getContentevaluated a faceted graph as one panel over the whole dataset, so it could reportokwhile 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 —emptywhen no panel has a drawable point or the facet column is missing,errorwhen the panel count exceeds the Max Facet Panels limit. A configuration the graph screen rejects with an error also now reportserror. Panel warnings — inrenderWarnings, whichtabs.getGraphBuilderreturns 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[].scalesaccepted 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.renamerenames a dataset (rewriting the SQL of derived datasets that reference it, as the UI rename does),datasets.renameColumnrenames a column,datasets.downloadsaves a dataset as a CSV, TSV, or JSON file with the same formatting and encoding options as the UI export,datasets.createcreates a dataset with the given columns and row count, every cell starting as a missing value, anddatasets.setCellValueswrites 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.runnow 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, somodels.saverejects 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.predictcomputes 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.saveAsDatasetsaves 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.getGraphBuilderreturns the current graph's warnings, andreports.addGraph,reports.updateElement, andreports.getContentreturn a report graph element's warnings inrenderWarnings. 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.runjudged 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.importFromURLnow acceptshasHeaderandencoding, matching the buffer import and the URL import in the UI. Whenencodingis omitted the URL import reads UTF-8 with no auto-detection, and withhasHeader: falsethe 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 tomodels.runwas 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: trueinmodels.runwas 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 as1or"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_KEYerror 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
showed "-" 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:
setColumnSchemaaccepted 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()anddatasets.importFromBuffer()now return the id and name of the converted dataset, with the raw dataset available viasourceDatasetIdandsourceDatasetName - 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()anddatasets.openContributingRows()include the same information in ahopfield - 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(), andreports.updateElement()accept atooltipoption 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 afield, such as$x,$y,$n, or a column name/id; an optionallabel; aformatin d3-format syntax; and atypeof"date"or"datetime"for timestamp fields), or{ content: "encoding" }to generate the tooltip automatically from the layer's column mappings. Omittingtooltipkeeps the previous behavior of no tooltip;tabs.updateGraphLayer()acceptstooltip: nullto 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/$nas 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(), oraddColumns()withoverwrite: 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_INPUTerror
[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 todatasets.openContributingRows(datasetId, rowIndices, targetDatasetId?)and takes an optional ancestor dataset to trace to in one call; passing an ancestor that is not traceable returnsINVALID_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,
Aanda, orx.1andx_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 > 5e3filters rows where distance exceeds 5000. A literal too large to represent (such as1e400) 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 returnedtraceable: falsewith the reasonunsupported-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 anINVALID_INPUTerror when a column name starts with the reserved prefix__midas_(reserved for MIDAS internal columns).datasets.derive()anddatasets.query()return anEXECUTION_ERRORwhen the SQL produces an output column whose name starts with this prefix; alias such columns to a non-reserved name.datasets.importFromURL()anddatasets.importFromBuffer()automatically rename headers starting with__midas_to non-reserved names and include a warning for each renamed header inresult.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 anidfield, matching the field name used inlist()results. Previouslydatasets.derive(),datasets.normalize(),datasets.addColumns(),datasets.addOrthogonalPolynomials(),datasets.importFromURL(),datasets.importFromBuffer(),datasets.buildMapping(),models.save(), andreports.create()returneddatasetId,modelId, orreportId; code reading those fields must useidinstead
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(), anddatasets.fetch()included the internal row-number column (Row #) in their data and column counts, so the column count fromdatasets.describe()did not match the one fromdatasets.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(), ordatasets.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 withdatasets.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, matchingmodels.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, soSELECT *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
variableorvalue, 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%…%zcould 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/01were 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 returnsINVALID_INPUTexplaining 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(), andtabs.configureGraph()required a dataset ID and returned "Dataset not found" when given a dataset name, even thoughdatasets.*andmodels.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()andtabs.setDataset()returned success but did not attach the specified dataset, so the tab's dataset selection and thetabs.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
irisin the Data Table export dialog produced a name like_iris.csv_2026-...Z.csvwith 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()returnsblupElementIdin 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.,
,.2ffor 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, anddatasets.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 ingroupStatistics[].labelinstead 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., keepingstackwhen changing from bar to point); position and scales can now be explicitly reset by passingnull - 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-srcno 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()supportstype: 'linear_regression'(returns R², adjusted R², RMSE) andtype: 'anova'(returns ANOVA table with effect sizes, group statistics, pairwise comparisons) - Agent API - models.run() for ARIMA:
models.run()supportstype: '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 amodelIdparameter 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()includesrenderStatusfor 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()withdatasetIdandtabs.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()andreports.updateElement()returnedrenderStatus: "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, orlabelsfor an axis scale withouttype: '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 arenderStatusfield 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 adocumentationfield linking to the documentation site - Agent API - Dataset Name Resolution in Report Methods:
reports.addGraph()andreports.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()andconfigureGraph()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 andopenUrl()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(), andtabs.configureGraph()accept afacetsparameter for Facet Wrap and Facet Grid;facets: nullinconfigureGraphclears an existing facet - Agent API - Scale Configuration: Graph-level
scalessets axis scale types (x, y, y2); layer-levelscalessets color and fill scale types;configureGraphmerges per axis, preserving axes not included in the update
Changed
- Agent API - Dataset Methods Accept Names:
datasets.describe(),datasets.addColumns(),datasets.addOrthogonalPolynomials(),datasets.setColumnSchema(), anddatasets.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()andtabs.configureGraph()silently discarded thecoordinates: 'flipped'option - Agent API - Removing a Resource Did Not Close Its Tabs:
datasets.remove(),models.remove(), andreports.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():
updateElementreplaces the graph configuration of an existing report element;removeElementdeletes 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 newdatasets.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()acceptstype: 'glmm'andtype: '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.infomessage indicating thewindow.midasAPI is available with a pointer tohelp()
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.importFromURLanddatasets.importFromBufferwithoverwrite: falsenow 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
confidenceLeveloutside the valid range (50–99.99) tomodels.run()did not return an error; it now returnsINVALID_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
.mdURL with atext/markdowncontent 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 columnsA,A,A_2produced two columns namedA_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 optionalconfidenceLevelparameter 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_FOUNDacross all endpoints;addOrthogonalPolynomialssupports 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
tinFROM (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 previousMost Commonformat, 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: trueondatasets.query(),datasets.addColumns(),datasets.addOrthogonalPolynomials(), anddatasets.setColumnSchema()now returnsOPERATION_TYPE_MISMATCHwhen the existing dataset was created by a different operation type (e.g., overwriting anaddColumnsresult withquery())
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(), andquery()withoverwrite: trueonly 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 signersrestores 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 withENUM_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.AddModelSummaryResultgains an optionalstatsElementId. 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 anyread_*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 withread_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
ywas 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)orShape 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
FROMorJOIN, and column-name completion is added.alias./"dataset"./dataset.completes only that table's columns. Explicit completion is triggered byCtrl + Spaceon 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
*-discretevariants 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/ymaxas 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 asDataTableElemententries with a{{data_table:elementId}}reference instead of baking inline Markdown.result.datagains an optionalelementId. 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/float64by numeric value, ordinalenumby the enum definition, otherwise locale-aware string order.scales.x.limits/scales.y.limitsandsortstat 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_vlinewith a numericinterceptis suppressed and a warning logged when the corresponding physical axis (aftercoord_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 returnsnullfrom the Agent API when all paired differences are zero, instead of0 - Import Data - Slash-Separated Date Off-By-One: Dates like
2025/01/15are 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 asint64. 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 from the estimated dispersion instead of assuming , 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 displayst value/Pr(>|t|). Existing projects are migrated automatically
[2026.04.13]
Added
- Agent API - Model Inference Distribution:
models.run()andmodels.describe()now return aninferencefield alongside coefficients.inference.distributionis't'or'normal'andinference.dfis the t-distribution degrees of freedom (null when distribution is normal), identifying the reference distribution used fortestStatistic,p,ciLower, andciUpper. 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 anArrayBufferor TypedArray (Uint8Array, Node.jsBuffer). 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()anddatasets.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'saddDatasetaction and reject duplicate names withDATASET_ALREADY_EXISTSby default. A newoverwrite: trueoption deletes the existing dataset before importing - Agent API - Import Error Code Granularity:
datasets.importFromURL()anddatasets.importFromBuffer()mapped all exceptions toEXECUTION_ERROR, making CSV parse failures (empty data, invalid URL, wrong content type) indistinguishable from network or runtime errors. User-input errors now returnINVALID_INPUT, allowing agents to skip unnecessary retries - Agent API - Describe Column Identifiers:
models.describe()previously returned column IDs forcoefficients[].variable(GLM),fixedEffects[].variableandrandomEffects.groupColumn(GLMM),featureImportances[].feature(Random Forest), andmetadata.features/metadata.target(all model types), making the response inconsistent withmodels.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, andLog-Likelihood (Laplace)/AIC/BICfor 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 labeledConditional Deviancein 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 andICC (latent scale)in Model Detail - GLM - Coefficient Dataset Stable Column Names: Saved GLM coefficient datasets previously used
t_valueorz_valueas the test statistic column andPr(>|t|)orPr(>|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 toTest StatisticandP-value, and a newDistributioncolumn (tornormal) records the reference distribution. The GLM tab coefficient table in the UI still showst value/z valueandPr(>|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: trueondatasets.query(),datasets.addColumns(),datasets.addOrthogonalPolynomials(), anddatasets.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.enumsnamespace withcreate,list,update, andremovemethods 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 anoutputNameparameter for the resulting derived dataset and overwrites an existing dataset with the same name instead of accumulating duplicates - Agent API - Coefficient Confidence Intervals:
ModelCoefficientInfonow includesciLowerandciUpper, the 95% Wald confidence interval for each coefficient. Returned bymodels.run()andmodels.describe()for both GLM coefficients and GLMM fixed effects, using the same reference distribution (t or normal) as the coefficient'stestStatistic
Changed
- Agent API - Coefficient Test Statistic Field: Renamed
ModelCoefficientInfo.ztotestStatisticto reflect that GLM families with dispersion estimation (Gaussian, Gamma, Negative Binomial with fixed θ) now store t statistics rather than z statistics. Existing Agent scripts readinginfo.zmust 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/dffor the dispersion parameter, producing standard errors, confidence intervals, and p-values that systematically diverged from R; now usesPearson χ²/(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 anENUM_IN_USEerror 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_yscale 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 aheightparameter to control graph dimensions - Agent API - Graph Title:
configureGraph()accepts atitleparameter 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(), orreports.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 thereportIdparameter
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
_headersfile - 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()acceptsreportIdto 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=URLquery 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 returnsAMBIGUOUS_TABLE_NAMEerror - 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()withoverwrite: falseallowed 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_FOUNDerrors include suggestions;window.midasAPI 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 columntruedid 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 returnsINVALID_TAB_TYPEerror with available type list
Security
- CSP - Script Safety: Removed
unsafe-evalandunsafe-inlinefrom 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 label
returned 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 > NULLreturned true for non-null values; changed to return false for all comparison operators per SQL standard; useIS NULL/IS NOT NULLfor 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()supportsinitialQuery/initialOutputNamefor sql-editor tabsdatasets.query()with requirednameparameter andoverwriteoption (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.midasAPI 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 y, 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 integrationx:tab- Create and configure analysis tabs (SQL Editor, Statistics, GLM, Graph Builder, etc.)x:dataset- Create derived datasets via SQL queriesx:report- Add graphs and text to reportsx:model- Execute GLM modelsx: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=truenot 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
- URL format:
- 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