# Changelog

All notable changes to Plotvera are recorded here, newest first. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning follows
[Semantic Versioning](https://semver.org/) for `APP_VERSION` (see
`docs/OPERATIONS.md` for what that means in practice, and how it differs from
`ENGINE_VERSION`).

> Every version below has an annotated git tag (`git tag -l 'v*'`) and a
> record in `evidence/releases/`, and can be opened as it was at
> plotvera.app/versions. From 1.2.0-beta.10 on, releases are made only with
> `scripts/release.sh` (see `docs/RELEASING.md`), which writes the dated entry
> here from a plain-English summary.

> Note on versions before 1.0.0: there were no tagged releases while the app
> was being built (`package.json` sat at the Vite scaffold default `0.0.0` the
> whole time). The 0.x entries below are reconstructed from git history so
> there's a real record of what shipped and when. Nothing is invented: every
> line maps to a real commit.

## [Unreleased]

## [1.2.0-beta.87] - 2026-10-24 - statistics engine 1.20.0

- Plotvera by Anaphase: the top bar, About, the welcome screen, the front page, the project panel's Home button and the legal pages show the Anaphase mark with Plotvera by Anaphase, and the browser tab, home-screen icon and link preview use the Anaphase app icon. On phones narrower than 480 px the front page shows the mark alone, so Open Plotvera stays on screen. Files, links, saved work, the connector link and its 27 tools, the plotvera.app address and every number are unchanged (statistics engine 1.20.0, as in 1.2.0-beta.86).
- Company details: Plotvera is made by Anaphase Ltd (company number 17537023), 71-75 Shelton Street, London WC2H 9JQ. This replaces the earlier "incorporation pending" wording in About, the front page, the privacy notice (0.3), terms (0.2), the AI and connector pages, the security policy (0.3) and the legal pages footer. The licence notice reads Copyright (c) 2026 Anaphase Ltd.
- One contact address: support, privacy and security questions go to contact@anaphasescience.com, in the app, the privacy notice, terms, storage, AI and accessibility statements (0.2), the security policy, security.txt and the pricing waitlist links.
- The licence at /evidence/LICENSE now opens in the browser as plain text instead of downloading.

## [1.2.0-beta.86] - 2026-10-22 - statistics engine 1.20.0

- Plotvera is now made by Anaphase (Anaphase Ltd, incorporation pending). About, the front page and the welcome screen say Plotvera, by Anaphase. The name, files, links, saved work, the connector link and its 27 tools, the plotvera.app address and the plotvera R and Python packages are unchanged.
- New pages: /privacy, /terms, /storage, /ai and /accessibility, rendered from the reviewed documents, plus a repository licence (PolyForm Shield 1.0.0), a security contact and security.txt. About links all of them.
- Survival analysis setup now offers reference-group selection, and new graphs get readable names (statistics engine 1.20.0; survival setup results may differ from engine 1.19.0 where the reference group changed).
- The assistant settings show the hosted assistant as "not yet funded"; bring your own key as before. AI answers carry a note that they are drafts for you to check.
- Plans and pricing (draft, version 0.1) can be read from About and the navigator footer. Nothing is gated; Free includes everything you see today.
- Release gate fix: the 100,000-sample property test checks correctness only, so a slow machine cannot fail a correct result.

### Plotvera is now part of Anaphase
- Plotvera is now made by Anaphase (Anaphase Ltd, incorporation pending). About, the front page and the welcome screen say Plotvera, by Anaphase. The name, files, links, saved work, the connector and every number are unchanged.
- About now links the licence, terms, privacy, storage, AI and accessibility pages and gives a support address; Report a problem can email the report.
- Colour schemes styled on journals now have neutral names (for example Coral & cyan); type the journal name to find them.

## [1.2.0-beta.85] - 2026-10-21 - statistics engine 1.19.0

Percentage of baseline is now available in the Analyse & graph wizard for XY tables. The choice opens the existing baseline settings before creating a linked table and graph. Verified desktop and phone click-through, baseline values at 100%, unchanged source data and cancellation without extra graphs.

## [1.2.0-beta.84] - 2026-10-21 - statistics engine 1.19.0

### Selectable highlighted groups and clearer baseline plotting
- Highlight each group opens a proper dialog with independent Show and Panel choices, a preview and a panel count. Only selected panels are created.
- Highlighted panels are collected under collapsible headings beneath the source table, including panels generated by older versions. Existing graphs and source data are retained.
- Add Plot % of baseline to the graph's Analysis tools. The baseline wizard creates one matching graph when opened from a graph, with each subject's baseline at 100%.
- Keep the wizard and its Create button inside phone screens, and retain selected groups when saving or reopening a linked figure.
- Numerical algorithms are unchanged. Existing percentage-baseline calculations are reused.

## [1.2.0-beta.83] - 2026-10-21 - statistics engine 1.19.0

### Clear AI connection and editable saved analyses
- Make Connect AI a prominent button in the assistant and keep the AI toolbar label visible.
- Reopen saved analyses with their selected groups and assumptions; update results in place or save a separate analysis, with Undo.
- Stop layout Fit zoom repeatedly changing when scrollbars appear and disappear.
- Display the current filename when opening a renamed Plotvera project.
- Numerical algorithms are unchanged. Results change only when analysis inputs or options are deliberately changed.

## [1.2.0-beta.82] - 2026-10-21 - statistics engine 1.19.0

### Lighter home page and roomier phone screens
- The welcome panel on the home page is now a light card like the rest of the app (only the top bar stays navy).
- On a phone, the data table's buttons take 135 px instead of 241, so about three more rows of data show: Analyse data, New graph and Overview share one row, Help me choose, Check data and Transform share one row you can swipe, and "Each column is a / Each data set is a" fold behind a "Called: mice, groups" button. Transform opens as a sheet at the bottom of the screen.
- On a phone, the graph page has Tools, View and zoom on one row, and the layout page tools fit in 3 rows instead of 5.
- Dashes taken out of on-screen sentences in the test guide, dose-response advice, Choose an analysis and elsewhere.
- No computed number changes.

## [1.2.0-beta.81] - 2026-10-21 - statistics engine 1.19.0

### Rank tests and median survival now match R and Prism (statistics engine 1.19.0)
- Mann-Whitney and Wilcoxon matched-pairs now give the exact P whenever each group has fewer than 50 values and there are no ties, as R does (before, only up to 30). With 31 to 49 values a P can change slightly, and in rare cases cross 0.05.
- Paired Wilcoxon brackets on graphs now show the same exact P as the results sheet.
- Spearman's P is exact for small samples, as R: 4 points in perfect order now give P = 0.083, not "< 0.0001".
- Median survival: when a curve sits exactly on 50%, the median is the midpoint to the next death, as Prism and R report. The graph's median line moves with it.
- The median's 95% CI says "not estimable" when everyone died before the band crossed 50% (R gives NA), instead of the last death time.
- Computed numbers can change for these cases only, so the statistics engine is now 1.19.0. 89 new random datasets are checked against R on every release.

### Rank tests and median survival now match R (statistics engine 1.19.0)
- Mann-Whitney and Wilcoxon matched-pairs give the exact P whenever each group has fewer than 50 values and there are no ties, as R does (it was 30 or fewer). Between 31 and 49 values the P can change slightly, and in rare cases cross 0.05.
- Paired Wilcoxon brackets on graphs now show the same exact P as the results sheet (they always used the approximation before). With zero differences dropped, both use the approximation, as R.
- Spearman's P is exact for up to 9 pairs and uses R's Edgeworth series up to 1,290 pairs when there are no ties. 4 points in perfect order now give P = 0.083 instead of "< 0.0001".
- Median survival: when a curve sits exactly on 50%, the median is the midpoint to the next death, as Prism and R report (it was the first time at 50%). The graph's median line follows.
- The median's 95% CI shows "not estimable" when everyone has died before the band crosses 50%, as R does, instead of the last death time.
- New validation: 89 seeded random datasets checked against R 4.3.3 on every release.

## [1.2.0-beta.80] - 2026-10-21 - statistics engine 1.18.0

### Nothing on screen overlaps or gets cut off
- Top bar: no buttons overlap at any window width checked, from 640 px (a 1280 laptop at 200% zoom) to 1536 px. A long project name now shortens with "..." instead of sliding under the commands. On narrower windows the Beta badge, the "Saved / Not saved" chip and the "-" button step aside first (saving is still in Project actions).
- Project list: Home, New data table, All graphs, Audit trail and the version lines always stay on screen on short laptop screens; only the tables and layouts scroll, and the open item scrolls into view.
- Phone project list: wider, with one "..." button per row (rename, delete and the rest) so graph names are readable again.
- Layout page: one row of tools at 1280 and 1536 px. Add picture now lives under Insert (with stats tables, legends and text boxes), and zoom sits on the strip just above the page. On a small page the templates appear under the page instead of on top of its ruler.
- Data tables: column headers never break mid-word (eg "Stimulation round"), and a long table name no longer leaves the import and export buttons on a line of their own.
- No computed number changes.

## [1.2.0-beta.79] - 2026-10-21 - statistics engine 1.18.0

### Table pop-ups no longer cut off
- "How to label" and "Keyboard tips" under a data table used to open upwards, so on a short table their first lines disappeared under the top of the table. They now open downwards unless there's room above.
- No numbers change.

## [1.2.0-beta.78] - 2026-10-21 - statistics engine 1.18.0

### Tidier analysis tools, and more room on phones
- Opening Analysis tools on a graph now gives one neat strip of buttons under the preview header. The zoom control stays on the header row instead of dropping to a line of its own, and the graph moves down far less.
- Add comparisons opens inside the graph card. Before, it could push the whole graph sideways.
- Grouped (Prism-style) tables fold the long labelling advice behind a "How to label" button next to Keyboard tips.
- The project navigator shows the app version and the statistics engine version on one line each, instead of three ragged lines.
- On a phone, help search puts the search box near the top, and data tables keep only row numbers and X frozen, so there's room for about 3 data columns instead of under 2.
- No numbers change.

## [1.2.0-beta.77] - 2026-10-21 - statistics engine 1.18.0

### Bigger text everywhere, and dialogs that fit the screen
- Nothing in the app is smaller than 14 px any more. The last 13 px text (home page, project navigator, Help menu, help search, Report a problem, Share, Export for Prism, Publication export, layouts page, Audit trail, the tour, table guide and right-click menus) is now 14 px.
- Export for Prism keeps its title and its Export button on screen on an 800 px tall laptop; only the middle scrolls. The long note about what Prism can't receive folds behind "Why graphs and analyses stay behind".
- The Help menu is wider, so each description fits on one line. The feedback dialog is now titled "Report a problem", like its menu item.
- No numbers change.

## [1.2.0-beta.76] - 2026-10-21 - statistics engine 1.18.0

### Roomier graph settings panel
- Everything in the Graph settings panel is now at least 14 px: notes, choice buttons, fields, the auto ticks and the curve fit, AUC, colour and format pop-ups (about 270 places were 13 px).
- Data sets list: each group's name gets its own line, so names like G3_PBMC(9602)+9585_CART#1 read in one line instead of a narrow five-line column. Role, Show and the order arrows sit underneath, and the arrows are bigger to click.
- "Show on graph" is one tick per line, so labels like "X axis line and ticks" no longer wrap.
- Replicate display choices are a clean list, Summary line choices are two by two, and the hazard ratio button has its own row.
- No numbers change.

## [1.2.0-beta.75] - 2026-10-21 - statistics engine 1.18.0

### Roomier first dialogs: Choose an analysis, Prism import review, results
- Choose an analysis is wider on laptops. The list of tests scrolls on the left; the one you pick, its options and the Run analysis button stay in view on the right, so you never scroll down to find Run. On a phone, Run analysis is pinned to the bottom.
- The picked test is highlighted, and before you pick, the side panel says what to do.
- Review Prism compatibility gives your file's tables and graphs most of the dialog (the two "how to open" choices now scroll with them), all text is 14 px, and the footer says in plain English that nothing changes until you open it.
- Result pages: Decimal places and P values no longer squash on a laptop, the audit trail is readable at 14 px, and phones get more width for the tables.
- No computed numbers change.

- Choose an analysis is wider on laptops: the list scrolls on the left and the chosen analysis, its options and Run analysis stay in view on the right (pinned to the bottom on phones).
- Review Prism compatibility gives the file's tables and graphs most of the dialog, with 14 px text throughout and a plain-English footer.
- Result pages: Decimal places and P values no longer squash, and the audit trail is 14 px.

## [1.2.0-beta.74] - 2026-10-21 - statistics engine 1.18.0

### Roomier data table page
- The table header is now two tidy rows: the table's name and type sit next to "Each column is a" and "Each data set is a", and the buttons you use (Overview, New graph, Analyse data, Help me choose, Check data, Transform) sit on the row below.
- The note about the table is one line ("Time course: 10 groups × up to 10 mice over 5 time points"), with More for the advice. Dismiss it and the grid moves up.
- On a 1280 px laptop a whole 10-mouse group now fits across the grid without scrolling. Numbers are never cut short.
- Column letters, row numbers and mouse labels are 14 px, and the keyboard reminder line is now a Keyboard tips button.
- No computed numbers change.

## [1.2.0-beta.73] - 2026-10-21 - statistics engine 1.18.0

### Check data: outliers in replicates, fixed inside Plotvera
- New Check data button on every table (with a count), also offered after a smart import or paste when it finds something. It flags a bad well in technical replicates (Grubbs plus a % from the others rule), replicate CVs above 20% (settable), impossible values (% over 100, negative counts), exact duplicates, mice far from their group and gaps. It never changes data.
- Each finding says how it was decided, with Show me, Exclude this value, Keep and Undo. An excluded value stays in the table, struck through, and is left out of every graph, statistic and derived table; graphs say "n excluded: 1 technical replicate, Grubbs P < 0.05". Right-click > Include again brings it back. Saved in the project; old projects open unchanged.
- Computed numbers can change, but only on tables where you exclude a value (statistics engine 1.18.0). Grubbs, CV and a t test after excluding a value match R.

### Check data: outliers in technical replicates and other data-quality flags, fixed inside Plotvera (statistics engine 1.18.0)
- New: Check data in every table's toolbar, with a count on the button. It is also offered after a smart import or a paste when it finds something. It never changes data and never blocks anything.
- Checks: a technical-replicate outlier in each set of replicates (Grubbs' test at α = 0.05 for 3 or more, plus a replicate more than 20% from the mean of the others that also sits clearly apart; duplicates report the CV only), high replicate CV (above 20% by default, settable), impossible values (% outside 0-100, negative counts, negative durations, a lone 0 among large readings), exact duplicates (rows, columns, data sets, identical replicates), subjects far from their group (Grubbs at α = 0.05, on log10 values when the readout spans decades, with the robust MAD + Benjamini-Hochberg screen at Q = 1% shown as a second opinion and named as Plotvera's stand-in for Prism's ROUT; kept apart from technical outliers), and missing data (a subject with far fewer timepoints, a group with n < 3 for a parametric test).
- Each finding has one plain line, how it was decided, Show me (lights up the cells), Exclude this value, Keep and Undo. Exclude all flagged leaves out every outlier, impossible value and copy (never high CVs or gaps).
- Excluded values stay in the table, struck through with a small coral dot, and are left out of every graph, statistic, comparison and derived table (fold of baseline, % of first, one timepoint, log and other transforms keep them excluded). Graphs say "n excluded: 1 technical replicate, Grubbs P < 0.05" underneath; results carry an Excluded note. Show excluded values hides or shows them; right-click > Include again (or Include all again) brings them back. Right-click > Exclude value works on any cell.
- Saved in the project file (an optional `qc` record per table); older projects open unchanged. Exclusions follow their rows and columns through inserts, deletes, sorts and copies of the table; an edited value is no longer excluded.
- Assistant and built-in helper: check_data, table.checkData, table.exclude and table.include; "check for outliers", "flag outliers in the triplicates", "exclude that point", "CV above 15%". Two new help pages.
- Computed numbers: any number from a table with an excluded value differs (by design), so the statistics engine is now 1.18.0. A table with nothing excluded gives exactly the same numbers. Grubbs (G, critical value, P = R outliers::grubbs.test), replicate CV, the robust screen and a t test after excluding a value are checked against R in the validation suite.

## [1.2.0-beta.72] - 2026-10-21 - statistics engine 1.17.0

### Fold of baseline: each mouse divided by its own baseline, kept linked
- New: Transform > Fold of baseline (and % of baseline) on an XY time course. Each mouse's values are divided by its own baseline: its earliest measured value (default), its value on a day you pick, or the mean of its values up to a day (eg day -1 and day 0). You can divide by each group's mean baseline instead, and show fold, percent or log2 fold.
- The new table stays linked to your data: edit a value in the original and the fold table and its graphs update straight away. It is read-only with a banner saying where it came from, a Go to source button, and Unlink to keep the values as an ordinary table.
- Each graph of the original gets a fold version with the same look and group colours, a Y title ending "(fold of baseline)" and a dashed line labelled baseline at 1.
- A mouse whose baseline is missing, 0 or negative is left blank and named, never divided by zero or silently dropped. Deleting the original asks whether to keep the linked tables.
- Computed numbers: this adds new numbers (the fold values), so the statistics engine is now 1.17.0. No existing analysis, transform or saved project gives a different number.

### Fold of baseline: each mouse divided by its own baseline, linked to the data (statistics engine 1.17.0)
- Transform > Fold of baseline… (and % of baseline…) on an XY time course divides every value by each subject's baseline: its earliest measured value (default), its value at an X you pick, or the mean of its values up to an X (eg day -1 and day 0). Divide by each subject's own baseline or by its data set's mean baseline; show as fold (1 = baseline), percent or log2 fold.
- The new table is linked, not a copy: edit the source and the fold table and its graphs update in the same step (one Undo reverts both). It is read-only with a banner naming the source and baseline, a Go to source button and Unlink to freeze it. Deleting the source asks whether to delete or keep linked tables. The recipe is saved in the project file; older versions open the table as an ordinary table.
- Each graph of the source gets a fold twin: same graph type, shown groups and colours, title and Y title ending "fold of baseline", and a dashed reference line labelled baseline at 1 (100 for percent, 0 for log2 fold).
- A missing, zero or negative baseline is never divided by: that subject is left blank and named in the banner.
- Assistant: transform_data and the table.transform command take fold_of_baseline with baselineMode, baselineX, per and output; the built-in helper understands "normalise to baseline", "fold change from day 0", "divide by the first value for each mouse" and "percent of baseline at day -1". percent_of_first now makes the same linked table. New help page: How do I normalise each mouse to its own baseline?

## [1.2.0-beta.71] - 2026-10-20 - statistics engine 1.16.0

### Deleting a group keeps everything else in place; analyse only some groups more easily
- Deleting a data set no longer hands its colour or its P value bracket to the next group: colours (picked or from the scheme), symbols, legend settings and comparison brackets stay on the right groups, as in Prism, and highlight panels made for the deleted group go. One Undo brings it all back.
- More ways to delete: right-click the data set's name above its columns, select several and "Delete these 3 data sets…", select a data set from its header and press Delete (with "Clear values only" as the other choice), the graph's series menu, the project list (right-click a table > Data sets), and survival or contingency groups. One dialog lists the values, graphs and results affected.
- Analyze: a clearer "Data sets to include" tick list with All, None and Control + … links. The result reads "Data sets: B7H3, B7H3 + O2 (NT, GD2 CAR, GD2 CAR + O2 left out)"; its n and methods sentence describe only those groups, and Show on graph brackets only them. Log-rank and contingency tests can be run on some groups too. "compare B7H3 vs B7H3 + O2 only" runs the mixed model on those two.
- No computed number changes for existing analyses: a test on every data set gives exactly the same result as before, and a test on some data sets gives the same numbers as the same test on a table holding only those.

- Deleting a data set no longer moves other groups' looks: colours (picked or from the scheme), symbols, hidden legend entries, point labels and comparison brackets were kept by position, so deleting a middle group handed its colour and its P value bracket to the next group. They now stay on the right groups, as in Prism, brackets involving the deleted group go, and highlight panels made for it are removed. All of it is one Undo step.
- More ways to delete: right-click the data set's name above its columns for a short data-set menu (it used to give the browser's text menu), several data sets at once from the table menu ("Delete these 3 data sets…"), the Delete key on a data set selected from its header (with "Clear values only" as the other choice), the series menu on the graph, the project list (right-click a table > Data sets), survival and contingency groups, and "remove the GD2 CAR data set" in the built-in helper. One dialog lists the values, graphs and results affected.
- Analyze: "Data sets to include" is a larger tick list with All, None and Control + … links, remembered while the project is open. The result now reads "Data sets: B7H3, B7H3 + O2 (NT, GD2 CAR, GD2 CAR + O2 left out)", its n and methods sentence describe only the groups analysed, and Show on graph brackets only those groups. Survival (log-rank) and contingency tables can be subset too. The assistant's run_analysis and the analysis.run command take dataSets, and on a time course "compare B7H3 vs B7H3 + O2 only" runs the mixed model on those two.
- Help: "How do I delete a group?" and "How do I run a test on only some groups?".

## [1.2.0-beta.70] - 2026-10-20 - statistics engine 1.16.0

Data sets can now be deleted from anywhere: right-click a data set in the table (Delete data set…, or Delete group… on grouped tables), right-click a data set or legend entry on a graph (Delete from table…), the bin icon in the graph's Data sets panel, or tell the assistant "delete NT". Each asks first and Undo brings it back; the values go from the table, so every graph and result of that table updates. Hide is still there for keeping values but not drawing them. Analyze now has "Data sets to analyse": untick arms to run a test (eg the mixed-effects model) on just two of five groups without duplicating the table; the result names what was included, and the assistant understands "mixed model on B7H3 and B7H3 + O2". In Highlight each group layouts the control is black only in its own panel and grey elsewhere; a new Control group option (wizard and layout settings) keeps it black in every panel when wanted. The Plot tools button above the graph is now Analysis tools.

## [1.2.0-beta.69] - 2026-10-20 - statistics engine 1.16.0

Assistant works without an API key. When Claude or ChatGPT is linked through the connector, anything the built-in helper can't do gets a button that opens that app with the question pre-filled (the box no longer tells you to connect an AI that is already linked). Pasting an API key switches the full assistant on by itself, and a saved key that was never switched on gets a one-click "Switch on" link. The built-in helper now also does colours ("make NT grey"), colour schemes, axis ranges ("y axis 0 to 100"), reference lines ("dashed line at 50", "LOD 1e5"), renames, symbols and line styles, chart types from a bare phrase, unquoted titles, curve fits, statistics options (nonparametric, paired, Bonferroni) and running a named or the recommended test ("run a t test", "run the stats").

- Roomier top bar: one 56 px row of 14 px labelled commands (no tiny captions), Undo and Redo always on the bar at laptop widths; a roomier graph page at 1280 px; 14 px graph type choices and analysis descriptions.

## [1.2.0-beta.68] - 2026-10-20 - statistics engine 1.16.0

### Pictures in layout slots
- An empty slot in a layout now offers Add picture as well as Add graph: a schematic from BioRender or BioGlyph, a photo or a gel (SVG, PNG or JPEG) takes that frame, fitted and centred at its own proportions, and takes the slot's panel letter. Dropping a picture file onto an empty slot does the same. Undo takes it out again.
- No computed numbers change.

## [1.2.0-beta.67] - 2026-10-20 - statistics engine 1.16.0

### Area under the curve from the table, X titles in layouts, matching colours
- Choosing Area under the curve from a data table (Analyse, the table guide, the navigator or the assistant) now opens the same AUC wizard as the graph, on that table's graph. A single XY curve still gets the plain trapezoid area.
- Layouts keep the X axis title under every panel (eg "Day" on every panel of a time course page); only a title you hide yourself is left off. Prism graphs whose X column is just "X" take the study's X title, eg "Days from CAR-T".
- The same group is the same colour on every graph, even across tables with different order or capitals (CAR19 / car19). Groups named like a control (NT, UTD, Mock, Vehicle, PBS, Ctrl) are grey without marking them. Changing a group's colour offers "all graphs" by default and never overrides a colour you set by hand on another graph.
- Y titles no longer show a file name or "Y"; when you retitle an axis, Plotvera offers the same title to sibling graphs that said the same thing.
- No computed number changes (colours and titles only); engine version unchanged.

## [1.2.0-beta.66] - 2026-10-20 - statistics engine 1.16.0

### X axis labels stay at the angle you pick
- Picking 0° for the X tick labels in Format axis now keeps them level. Before, 0° was read as "not set", so labels that Plotvera thought were crowded tipped back to 45°, and numeric X axes picked up the Tick labels menu's diagonal.
- 45° and 90° chosen in Format axis now also apply to group names and row titles on the X axis. An explicit choice in the label-angle menu still wins.
- No computed numbers change.

## [1.2.0-beta.65] - 2026-10-20 - statistics engine 1.16.0

### Layouts without blank space, graphs you can reshape, panels you can swap
- Every graph in a layout now fills its panel: axes, labels, legend and stars reach the panel edge, with no blank strip to the right of a graph or under its X axis. A graph is never padded to line up with a neighbour that has longer labels (axes that nearly line up are still snapped together). The same on screen and in PDF, PNG and SVG exports.
- Percent axes with comparison stars no longer keep an empty band between the title and the stars, and a wrapped legend beside a graph is only as wide as its longest line.
- In the graph view, shortening or stretching an axis, dragging the corner handle or typing a canvas size changes only the plot's shape. Text, symbols and lines stay the same size on screen. A reshaped graph keeps its shape when you add it to a layout.
- In a layout, drag a graph onto another to swap them (B and D trade places), or onto an empty slot to move it. Right-click for Swap with… and Move to position…; letters follow the positions. Removing a graph leaves an empty slot with Add graph and Delete slot, shown only while editing. Everything can be undone.
- No computed number changes: statistics, P values and fits are untouched (graph drawing only).

- Layouts: every graph fills its panel. Axes, labels, legend and stars reach the panel edge; no blank strip to the right of a graph or under its X axis, and no panel is padded to line up with a neighbour that has longer labels. Measured on screen and in SVG, PNG and PDF exports.
- Percent axes with comparison stars keep only the room the brackets reach, so no blank band between the title and the stars; a wrapped right-hand legend is only as wide as its longest line.
- Graph view: changing the X or Y axis length, the corner handle or the canvas size changes only the plot's shape. Text, symbols and the on-screen zoom stay the same. A reshaped graph keeps its shape when added to a layout.
- Layouts: drag a panel onto another to swap them, or onto an empty slot to move it; right-click > Swap with… / Move to position…; letters follow positions. Removing a graph leaves an empty slot with Add graph and Delete slot (never exported). All undoable.

## [1.2.0-beta.64] - 2026-10-18 - statistics engine 1.16.0

### Smart import you can check, cell by cell
- Smart import now shows "What I read": one line per decision (sheet, header row, group column with n per group, control, measures vs counts, "%" cells, rows left out and why, summary rows, day labels read as days), each marked Sure, Fairly sure or Please check, and most can be changed right there.
- "The file, as read" shows the original sheet with each table's cells in their own colour, headers and group columns marked, Mean/SD rows marked "Not data" and left-out rows struck through with the reason. Click a table to light up its cells, or a cell to see where it goes; rows can be left out or put back from there.
- Every import is checked against the file on its own: each value against its cell and group, and every number imported or listed as left out. A totals line reconciles the rows ("Read 24 rows: 20 mice used, 2 left out (NEG.fcs, Sample1.fcs), 2 summary rows ignored"); if anything doesn't add up it says so in red and Import waits for you to confirm.
- When unsure, smart import asks one plain question with the likely answer picked, instead of guessing. Over a new corpus of 71 real-layout exports (FlowJo, FACSDiva, CytExpert, OMIQ, Cytobank, plate readers, ELISA, Luminex, qPCR, IncuCyte, xCELLigence, IVIS, calipers, survival, messy Excel and CSV) it reads every scored file correctly and is never confidently wrong (was 26 files).
- Each imported table keeps an import record with the project: file SHA-256, every decision, rows left out and the source cell of every value. Point at a value or graph point to see "From file, sheet, row 27 (m23...), column F"; "Show source" reopens the marked sheet, even after saving. It is in the audit trail and the methods sentence.
- Percent axes stop at 100 with the significance brackets above; per-mouse time courses get a group legend; hollow points are explained; log-axis error bars that run off the axis end in an arrow.
- Computed numbers can change for new imports of some files (decimal-comma CSVs, Excel time cells, repeated column titles as replicates, hidden rows), so the statistics engine moves to 1.16.0. Saved projects and every statistical method are unchanged.

## [1.2.0-beta.63] - 2026-10-18 - statistics engine 1.15.0

### Imported FlowJo graphs come out finished
- Smart import now lays each file out as its own A4 figure page, named after the tissue in the file name (eg "Spleen", "PB", "PB time course"), with a title, lettered panels A, B, C in an even grid, and every graph ready to export as PDF, PNG or SVG.
- Percentage measures get figure-style Y titles, eg "CCR9+ (%)" or "Blasts (% of total CD45+)", and tables are labelled with the tissue. The control group is the same grey on every graph, column and time course alike, and each other group keeps one colour throughout.
- A per-mouse time course also gets a mean ± SEM graph per group with a legend, and the mixed-effects model (group, day and group × day, each mouse a random effect) runs on import, with its P values written under that graph's title. Only the overall tests run by default, because they're the part checked against R (lme4/lmerTest).
- Column graphs (bars, dot plots, box and violin) no longer leave a blank strip on the right where a legend would go, so the plot uses the whole width. Group names a little too long for their slot (eg "CCR9+CD7") now break onto two level lines instead of tipping every label sideways.
- No computed numbers change. Saved projects open with the same tables and statistics; their column graphs just draw wider.

## [1.2.0-beta.62] - 2026-10-18 - statistics engine 1.15.0

### FlowJo table exports import right first time
- Dropping a FlowJo table export (.xls/.xlsx) now opens smart import straight away, even when the workbook also has a sheet you regrouped by hand; that copy is skipped with a one-line note, and groups separated by blank rows stay one table.
- The % and frequency columns are ticked ahead of raw counts and named from their header (eg "% CD7+"). One click on Import gives a dot plot per measure (every mouse, mean ± SEM, linear axis from 0) with one-way ANOVA and Dunnett vs the control group (NT, Ctrl, Mock, PBS...) already run and its stars on the graph.
- Stars that come from an analysis in the project are linked to it, so the "exploratory annotation" warning only shows for brackets added on the graph alone. Error bars never pull a % axis below 0.
- NEG tubes with no group and control tubes (Sample1, Unstained, FMO) are left out and listed ("Left out: NEG.fcs (no group)"), with Put them back. Mean/SD rows at the bottom of an export are never imported as data, in smart or plain import.
- A time course laid out as one block of columns per bleed day (D9, D16, D22...) becomes one XY table with every mouse as its own subcolumn, graphed as one line per mouse coloured by group.
- New: Transform > "Make a column table grouped by <column>" (and a prompt on the table) turns a long table into column tables, one per measure, so no copy-pasting by hand.
- Smaller fixes: Select all / Select none in smart import, an optional label for tables when several files go into one project, pasting "29.3 %" keeps the number, column graphs title the Y axis with the table's measure instead of "Value", and Holm-Šídák is no longer labelled as Prism's default (GraphPad recommends Dunnett vs a control and Tukey for all pairs).
- Numbers can change: tables made by the plain importer no longer include the Mean/SD footer rows, so statistics on such tables can differ from before (statistics engine 1.15.0). Nothing changes for saved projects: they open with identical results.

## [1.2.0-beta.61] - 2026-10-18 - statistics engine 1.14.0

### Example card P values
- The P values printed on the Home and front page example graphs now read like Prism (P = 0.0006, P < 0.0001) instead of P = 0.000555. Display only; no computed number changes.

## [1.2.0-beta.60] - 2026-10-17 - statistics engine 1.14.0

### A new look, a front page and a bolder Home
- First-time visitors to plotvera.app now see a front page explaining what Plotvera does, with example graphs drawn from the built-in example data. "Open Plotvera" goes straight into the app, and returning users, shared links and the installed app skip it as before. It's always at plotvera.app/welcome.
- Home has a welcome panel for first visits (open the repetitive stimulation example, open a Prism file, or take the tour), six large example graphs drawn from each example's real data, and a compact chooser for the 8 table formats. Returning users see their recent projects first.
- The top bar is now Plotvera navy with the real logo, a blue Save button and a clearer save status (red for "Save failed"). App text uses Inter and Manrope, and nothing in the bar is smaller than 13 px.
- No computed number changes. Graph, figure, PowerPoint and Prism exports keep their existing fonts and output.

## [1.2.0-beta.59] - 2026-10-17 - statistics engine 1.14.0

### A calmer opening page and a light top bar
- The Home screen now asks "What are you graphing?" and leads with three quick ways in: open or import a file (.prism, .pzfx, .pptx, CSV, Excel), paste from Excel, or ask the assistant.
- The eight data table types are equal tiles with a small example graph and one line each; hover or keyboard focus shows the full description.
- Six example datasets show with thumbnails; "See all examples" lists every one, including the Repetitive stimulation assay. Returning users see their recent projects first.
- The top bar is now white with dark text, and the save status is a clear chip: amber "Not saved to a file - only in this browser" until the project is saved to a file, green once it is.
- Ctrl+O (Cmd+O on a Mac) now opens or imports a file.
- No calculations changed: every computed number is the same as before.

## [1.2.0-beta.58] - 2026-10-12 - statistics engine 1.14.0

Direction C visual system and clearer new-analysis onboarding

- Leads the home screen with starting a new analysis instead of Prism import.
- Creates new Column tables with two blank groups and explicit naming prompts.
- Applies the precision navy/cobalt interface language across the app chrome.
- Keeps Prism, PowerPoint and dataset import visible as secondary existing-work paths.

## [1.2.0-beta.57] - 2026-10-09 - statistics engine 1.14.0

Treatment-focus figures now keep every panel visually identical.

- Replaces repeated legends with each group name directly on its graph, using the group colour and black for the control.
- Preserves equal plot widths and the same axis furniture on every panel.
- Adds figure-wide Log Y and Log X switches that update every linked graph together.
- Repairs older saved treatment-focus layouts automatically when they are rendered.

## [1.2.0-beta.56] - 2026-10-09 - statistics engine 1.14.0

Plotvera now has one flexible viewing system for graphs and layouts.

- Added normal, focus, and graph/layout-only full-screen modes.
- Added arbitrary typed zoom while keeping graph editing live at small and large scales.
- Added independently collapsible project and settings panels.
- Moved the blinking filming cursor into the View menu.
- Added separate live Edit and clean Present pop-out windows, with project-scoped synchronisation.
- Added browser coverage for 375% zoom, Escape, hidden filming tools, and pop-out editing.

## [1.2.0-beta.55] - 2026-10-09 - statistics engine 1.14.0

## Collapsible project panel

- Hide the left project panel from its header to give graphs and layouts the full workspace width.
- Restore it with a visible Project panel button.
- Toggle it with Ctrl/Cmd+Shift+E.
- Remember the choice on that computer.
- Add browser regressions covering panel resizing, restoration, and the keyboard shortcut.

## [1.2.0-beta.54] - 2026-10-09 - statistics engine 1.14.0

## Blinking mouse caret for filming

- Replaces the fixed centre caret with a blinking caret that follows the mouse across the graph.
- Hides the ordinary pointer over the graph while filming mode is active.
- Keeps the toolbar and right-click Show/Hide blinking cursor controls.
- Adds a browser regression for pointer following and right-click removal.

## [1.2.0-beta.53] - 2026-10-09 - statistics engine 1.14.0

## Easier filming cursor access

- Adds Show blinking cursor directly to the graph right-click menu.
- Changes the item to Hide blinking cursor with a checkmark while active.
- Keeps the existing graph-toolbar toggle and the view-only, non-exported behaviour.

## [1.2.0-beta.52] - 2026-10-09 - statistics engine 1.14.0

## Filming cursor on graphs

- Moves the Blinking cursor control from the data table to the graph preview toolbar.
- Shows a large blinking caret directly over the graph canvas for screen recording.
- Keeps the filming aid out of saved projects, undo history and exported figures.
- Updates the Awaiting data filming example instructions.

## [1.2.0-beta.51] - 2026-10-09 - statistics engine 1.14.0

### Blinking cursor for filming

- Added an Awaiting data (filming) example dataset to the opening screen.
- Data tables now have a Blinking cursor toggle beneath the grid.
- When enabled, the selected empty cell displays a large clean animated caret for screen recording without changing the data.
- The toggle is local to the current view and can be switched off instantly.

## [1.2.0-beta.50] - 2026-10-09 - statistics engine 1.14.0

### Linked animal-study figures

- Highlight each group now opens a guided wizard with an actual-size preview. Grey context is the default; pale group colours remain available.
- The wizard controls mouse-line thickness, individual points and mean, median or geometric-mean summary lines before creating the figure.
- These choices are stored with the linked layout and survive save, reopen and restyling.
- Treatment-focus layouts now have a clear Edit all linked graphs action. Axes, fonts, annotations, constant lines and statistical display edited on any linked graph propagate across the whole family, while each panel retains its own highlighted group and title.
- Layout settings can switch background treatments between grey and pale group colours and reapply the complete focus style.
- Plotvera now maps explicit subject IDs across animal measurement and survival tables. A linked layout reports how many animals match across which tables. Matching is case-insensitive and never assumes row order.
- The 10-mouse browser regression checks the complete wizard, linked editing, subject matching and exploratory joint-model workflow.

## [1.2.0-beta.49] - 2026-10-09 - statistics engine 1.14.0

### Highlight each group now follows the intended visual contract

- The command is now available directly in the right-hand Graph settings panel as well as the graph toolbar.
- Each generated panel keeps exactly one focused group in colour and draws every other group in neutral grey.
- Focus figures force individual dots, summary markers and other point modes off. Individual trajectories use thicker lines.
- Existing treatment-focus layouts have a Reapply highlight styling button, so they can be repaired without recreating the layout.
- A focused negative control is black. Non-control focused groups retain their group identity colour.

## [1.2.0-beta.48] - 2026-10-09 - statistics engine 1.14.0

### Exploratory joint BLI and humane-endpoint modelling

- Treatment-focus layouts now offer an advanced guided analysis that links longitudinal tumour signal to humane-endpoint timing using explicit mouse IDs.
- The model is designed to run on realistic small animal studies, including 5 mice per group, while clearly labelling the result exploratory.
- Small cohorts receive prominent warnings. Results report effect estimates, approximate 95% uncertainty intervals, convergence diagnostics and data counts. Plotvera deliberately gives no treatment P value or significant/non-significant verdict for this analysis.
- The existing separate BLI and survival analyses remain the default and should remain the primary presentation.
- Subject matching, group consistency, duplicate IDs, post-endpoint measurements, event counts and per-group sample sizes are checked before fitting.
- Numerical outputs are checked against an independent base-R implementation. Statistics engine 1.14.0.

## [1.2.0-beta.47] - 2026-10-08 - statistics engine 1.13.0

- Treatment-focus figures are now genuinely linked, so formatting, annotations and statistical display can be changed across every highlighted-group panel at once.
- Negative controls stay black, focused treatments retain their real colours, and context treatments use muted versions of their own colours instead of acquiring grey identities.
- Highlighted mouse time courses default to thicker individual trajectories with no point markers or summary line, and the linked layout exposes figure-wide controls for these choices and panel titles.
- Treatment-focus layouts remember their source, control and panel relationships across save and reopen, follow source-table renames until renamed by hand, and clearly show when an edit affects the whole linked figure.
- Ordinary multi-graph layouts can match every panel to the first graph's appearance in one action while preserving each graph's titles, axis labels and statistics.

## [1.2.0-beta.46] - 2026-10-08 - statistics engine 1.13.0

- Add a one-click **Highlight each group** command for multi-group graphs.
- Create one layout panel per treatment group, keeping that group coloured while greying the others.
- Link panel Y ranges and use matched plot areas, shared legends and repeated-axis-title hiding.
- Keep a layout's complete composition together when its page size changes, and restore it when changing back.
- Make every layout edit its own reliable Undo step.
- Use A4 portrait or landscape for ordinary imported Prism layouts; keep US Letter as an explicit option only.

## [1.2.0-beta.45] - 2026-10-08 - statistics engine 1.13.0

- Prism import now offers Keep Prism appearance or Improve for publication.
- Publication mode recognises mouse tumour/BLI studies, applies evidence-backed log axes, shows individual trajectories and links matching layout scales.
- Added a permanent regression test using the exact CD7 MOLT4 Prism project.

## [1.2.0-beta.44] - 2026-10-07 - statistics engine 1.13.0

- Stops stale or hidden Plotvera tabs from taking over the Claude / ChatGPT connector from the current refreshed tab.
- Adds a short-lived active-tab lock in the browser and relay-side protection so older connector clients cannot replace a newer heartbeat-capable tab.

## [1.2.0-beta.43] - 2026-10-07 - statistics engine 1.13.0

- Keeps Claude / ChatGPT connector browser tabs alive with bidirectional heartbeat messages, fixing the roughly 60-second stale-tab disconnect that made health checks look connected while real tool calls timed out.
- Refreshes the connector tool manifest so Claude Science / Claude / ChatGPT see the current connector wording.

## [1.2.0-beta.42] - 2026-10-07 - statistics engine 1.13.0

- The assistant panel now says when Claude or ChatGPT is connected instead of showing the limited-helper warning.
- The assistant header names the connected external assistant, or the selected full-assistant provider when enabled.
- Added clear links to connector details and to switch AI providers from the assistant panel.

## [1.2.0-beta.41] - 2026-10-07 - statistics engine 1.13.0

- Forced DOMPurify to the patched 3.4.16 release via the workspace override.
- Cleared the production dependency audit while preserving the existing patched image-size exception.
- Rebuilt Plotvera so PDF/export paths use the patched sanitizer dependency.

## [1.2.0-beta.40] - 2026-10-07 - statistics engine 1.13.0

- Added an obvious PowerPoint round-trip export for graphs, including a top-bar shortcut when a graph is open.
- Renamed the old PowerPoint export path to slide-only so users can see whether the editable project is embedded.
- Added a Claude / ChatGPT connector entry in project actions and clarified the assistant setup path.
- Updated help copy to explain round-trip PowerPoint and external AI connector setup directly.

## [1.2.0-beta.39] - 2026-10-06 - statistics engine 1.13.0

- Added a per-panel layout switch to stop one graph inheriting whitespace from neighbouring panels with larger axis labels or legends.
- Kept global plot-area matching for the rest of the layout, so aligned figures still work when wanted.
- Added a regression test for unwanted bottom whitespace from inherited X-axis furniture.

## [1.2.0-beta.38] - 2026-10-06 - statistics engine 1.13.0

Fix Prism-imported graph axis titles. Rebuilt Prism graphs now carry evidence-backed axis labels from the imported table and graph names, including bioassay units such as pg/mL, instead of leaving graph views and layouts to infer labels differently. Generic Prism bookkeeping titles such as X, Category, Subject or Row titles are hidden rather than drawn as misleading X-axis titles. Adds a regression for cytokine bead array style imports.

## [1.2.0-beta.37] - 2026-10-04 - statistics engine 1.13.0

Prism migration review

- The Prism import review now calls out missing source graphs explicitly before opening the project.
- If a Prism file contains graphs that Plotvera cannot safely rebuild, the review shows a red "Review before trusting" box with the exact graph names.
- The graph count now says how many editable graphs will open and how many source graphs need review, instead of hiding that discrepancy in the inventory.
- Added regression coverage on the full Prism demo corpus, which has 17 source graphs and 4 non-editable source graphs, so this cannot silently regress.

Checks: full Vitest suite and production build.

## [1.2.0-beta.36] - 2026-10-02 - statistics engine 1.13.0

XY replicate subject lines

- Added an explicit "Each subject, no summary" graph option for replicate time courses, so BLI can be shown as individual subject lines without a median or mean.
- Added a separate Subject line width control in the Replicates panel. This changes individual subject traces, not the median/mean line.
- Renamed the old preset from "Individual lines + median" to "Individual lines, with median" and the chart picker from "Each mouse + median" to neutral table-aware wording.
- Carried subject-line width into R/Python code export, the assistant tool schema and the Claude/ChatGPT connector tools.
- Updated help, accessibility descriptions and regression tests for the new replicate-line behaviour.

Checks: full Vitest suite, production build, prism bundle gate.

## [1.2.0-beta.35] - 2026-10-02 - statistics engine 1.13.0

Edit placed graphs directly in layouts

- Selecting a graph panel in a layout now shows layout-only graph controls in the inspector.
- A placed graph can have its own layout title, X axis title, Y axis title, title visibility, legend visibility and axis-title visibility without changing the source graph.
- A placed graph can locally override tick, axis-title, legend and graph-title point sizes, so the panel can be tuned while looking at the layout.
- Layout-only graph edits are saved in project files and share links.
- Add render tests proving layout-only edits affect only the placed panel.

## [1.2.0-beta.34] - 2026-10-02 - statistics engine 1.13.0

Improve layout panel ordering and picture lettering

- Inserted pictures now participate in layout panel letters, so a schematic or imported image can be panel A, B, C, etc.
- The selected-picture inspector now has the same panel-letter controls as graphs, including manual letter and hide-letter options.
- Add Earlier/Later controls for graph and picture panels to change the figure letter order without changing visual stacking or moving the item.
- Rename the layout setting to "Letter graph and picture panels".
- Preserve manual panel order in project files and share links.

## [1.2.0-beta.33] - 2026-10-02 - statistics engine 1.13.0

Improve graph and layout font choices

- Add a shared Plotvera font catalog with distinct CSS stacks for Arial/Helvetica, Inter/system sans, Aptos/Calibri, Verdana, Trebuchet, Georgia, Times, Palatino and Courier.
- Use the shared font catalog in graph controls, selected-text formatting, layout typography and project validation.
- Render graph and layout SVG text with the selected font stack instead of falling back through the same Arial-like list.
- Add one-click layout typography presets for Nature/Science, Cell, Lancet/NEJM/JAMA and talk slides.
- Add tests for font persistence, distinct stacks and journal typography presets.

## [1.2.0-beta.32] - 2026-10-02 - statistics engine 1.13.0

Fix axis range typing and survival constant lines

- Axis range min/max boxes no longer commit while a number is half-typed or temporarily blank.
- Press Enter or leave the box to commit the finished range value, avoiding transient invalid-axis errors while editing.
- Applies to the side-panel axis controls and the in-place Prism-style axis popover.
- Survival/Kaplan-Meier graphs now show Constant lines in the settings panel.
- Adding a constant line on a survival graph starts at 50% survival, and can be labelled from the panel or in place on the graph.

## [1.2.0-beta.31] - 2026-10-02 - statistics engine 1.13.0

Fix condition renames preserving graph identity, colours and shown data sets

- Renaming a condition/data-set now carries graph settings keyed by that condition to the new name.
- Preserves data-set roles, project colours, visible series, series order, trend lines, hazard-ratio pairs and statistic include lists when a condition is renamed.
- Adds regression tests so renaming CAR to CAR + MYRF cannot repaint/reorder the graph or silently show hidden sets again.
- Adds an Excel-style fill handle to selected data-table cells.
- Drag the handle down or right to copy values or continue numbered labels like Donor 01, Donor 02.

## [1.2.0-beta.30] - 2026-10-02 - statistics engine 1.13.0

Fix survival table parsing, copy-to-project wording, and excess graph bottom spacing.

- Survival tables now accept unambiguous event words such as Dead, Event, Endpoint, Alive and Censored as well as 0/1.
- Ordinary graphs no longer reserve a large empty strip below the X axis title, giving layout panels more usable plot area.
- Copy-to-project now says the target must be in Plotvera’s in-app tab bar; separate browser tabs or windows are not copy targets yet.

## [1.2.0-beta.29] - 2026-10-02 - statistics engine 1.13.0

Import Prism column graphs with native subject labels.

- Prism column tables with native subject/subcolumn titles now import their values and graphs instead of being dropped.
- Survival graph names from Prism are cleaned up so they appear as Survival rather than Prism-internal names.
- Verified on Summary_huCAR-TF in vivo study.prism: 27 source graphs become 27 editable graphs.

## [1.2.0-beta.28] - 2026-10-02 - statistics engine 1.13.0

Add Prism-style X axis label source controls.

- Category XY graphs can show X values, row titles, or row numbers on the X axis.
- Exposed in the graph side panel, axis popover, right-click menu, assistant actions, and Claude/ChatGPT connector schema.
- Existing graphs remain on Auto.

## [1.2.0-beta.27] - 2026-10-02 - statistics engine 1.13.0

Control and Hero colour selection is now less jumpy and more literal.

- Marking a data set as Hero or Control clears stale manual colour overrides for that same data set, so the visible colour actually changes to the role colour.
- Ordinary colour schemes no longer repaint unrelated arms into a new role-aware order when one arm is marked Hero or Control.
- An unrelated arm only moves if its current colour would be confused with an active role colour.
- Added regression coverage across every colour scheme, plus the real browser role-colour workflow.

## [1.2.0-beta.26] - 2026-10-02 - statistics engine 1.13.0

X-axis category labels now separate Auto from a hard 0 degree setting.

- Added an Auto X-label mode that keeps the previous smart fitting behaviour for older graphs.
- Picking Horizontal/0 degrees now forces labels to stay flat, even when names are long.
- The graph settings, Format Axis popover, right-click menus, assistant actions and AI tools all use the same Auto / 0 / 45 / 90 / Hidden options.
- Moving the X-axis title closer works with flat labels because the renderer no longer reserves a rotated-label gutter after 0 degrees is chosen.
- Added a regression test covering long labels, Auto rotation, hard 0 degrees and negative X-title distance.

## [1.2.0-beta.25] - 2026-10-02 - statistics engine 1.13.0

AUC output tables are now recorded as derived values from the source table rather than appearing as unrelated raw data.

- AUC value tables created by the wizard carry source-table metadata and save/reopen with it.
- The navigator groups AUC value tables and their graphs under the original table, with labels that explain they are linked outputs.
- Deleting a source table also deletes its derived AUC table and graphs, avoiding orphaned result data.
- AUC graph settings now describe individual symbols as values calculated from the source table.
- Added project-file and store regression tests for derived AUC output links.

## [1.2.0-beta.24] - 2026-10-02 - statistics engine 1.13.0

Graph type choices are now at the top of Graph settings.

- The first settings section is now Graph type, open by default.
- It shows recommended graph types for the current table first, with less likely applicable choices under More graph types.
- AUC value graphs get direct choices for Bar + readings, Simple bar, Dot plot and Box & whisker at the top.
- Help and assistant action guidance now point users to Graph settings > Graph type, with the right-click Chart type route still available.
- Colour scheme popovers now adapt to the available screen height, so lower options like Legacy schemes remain clickable after the settings panel grows.

Checks: TypeScript, production build, colour picker unit test, palette browser check, browser matrix, AUC wizard browser check, Prism parity graph switching check, in-place formatting browser check.

## [1.2.0-beta.23] - 2026-10-02 - statistics engine 1.13.0

Labelled constant/reference lines now have their own label-size control.

- Click a labelled constant/reference line and use the floating toolbar Label size control.
- Double-click or right-click Format reference line to set Label size in the full panel.
- The Constant lines section also has a pt field for each line.
- The value is saved with the graph, used by exports, and available to the assistant/update_graph tool as labelSize.

Checks: focused Vitest suite, TypeScript build, production build, in-place formatting browser check, context-menu browser check.

## [1.2.0-beta.22] - 2026-10-02 - statistics engine 1.13.0

- Layouts now have a top-level Add picture button for schematics and figure images.
- PNG and JPEG images from BioRender, PowerPoint or other tools can be dropped or pasted directly onto a layout page.
- Picture items now say that they are embedded in the project and export with the layout.

## [1.2.0-beta.21] - 2026-10-02 - statistics engine 1.13.0

- Share now detects when Plotvera cloud storage is not configured and points users to the self-contained link or shared Dropbox, OneDrive or Google Drive folders instead of offering a dead upload path.
- Colour swatches now commit on click only, so hovering or tabbing through the colour picker no longer accidentally previews or appears to select the wrong colour.
- Prism, JSON and project imports can now open larger files, up to 50,000 rows per sheet and 500,000 data cells per project, while keeping the same safety checks.
- The Claude / ChatGPT connector setup now says to connect the Plotvera tab before copying the personal link, so the setup path is clearer.

## [1.2.0-beta.20] - 2026-10-02 - statistics engine 1.13.0

AUC plots are easier to customise: AUC result graphs now show an AUC plot section with one-click Bar + readings, Simple bar, Box & whisker, and Dot plot options. Individual AUC readings can be switched off directly, and new parametric AUC bar graphs use the current stronger bar fill instead of the old washed-out fill.

## [1.2.0-beta.19] - 2026-10-02 - statistics engine 1.13.0

- Fixes the release runner browser concurrency setting so staged browser tests really run at the intended lower parallelism.
- Carries forward the layout Link panels change from 1.2.0-beta.18: shared legend, matching colours by group name and native graph aspect on drop.

## [1.2.0-beta.17] - 2026-10-02 - statistics engine 1.13.0

- Constant/reference lines now expose a label field directly in the floating toolbar.
- The graph side panel constant-line rows now include a label box.
- Right-clicking a reference line now includes "Edit label…".
- Browser coverage now checks that a survival reference line can be labelled in place and the label appears on the graph.

## [1.2.0-beta.16] - 2026-10-02 - statistics engine 1.13.0

- Prism imports now ignore trailing blank native CSV rows instead of counting them as real table rows.
- Real blank rows inside a table are still preserved.
- Prism exclusion metadata that points into unused slack rows no longer blocks import.
- Added regression coverage for Prism tables with more than 20,000 trailing blank rows.

## [1.2.0-beta.15] - 2026-10-01 - statistics engine 1.13.0

- AUC result pages now have an Edit assumptions button.
- Editing reopens the AUC wizard with the saved scale, baseline, window, missing-value, unit and test choices selected.
- Updating re-runs the same saved AUC result in place, preserving its result id and links instead of creating a duplicate.
- The AUC browser test now covers changing a saved result from log10 to raw scale and confirms no duplicate analysis is made.
- The release validation gate now caps Vitest workers so heavy validation tests do not fail just because the runner is overloaded.

## [1.2.0-beta.14] - 2026-10-01 - statistics engine 1.13.0

- Graph editing windows can now be minimised to a compact title bar and restored without losing the selected graph element.
- The graph settings side panel can now be hidden and brought back, giving the graph more room in a browser window.
- Dragging an axis now changes that axis' physical length by default: dragging the X axis makes the graph wider without changing the Y height or data range. Alt-drag keeps the old range-slide behaviour.
- The on-graph axis hint now explains the new behaviour plainly.

## [1.2.0-beta.13] - 2026-10-01 - statistics engine 1.13.0

### Not every experiment is a mouse study

- Each table now says what one column and one data set are, in a chip above
  the table: "Each column is a: donor", "Each data set is a: product". Choices
  include subject, mouse, rat, animal, patient, donor, participant, sample, well,
  replicate, culture, flask, plate, or your own word; and group, arm, condition,
  treatment, product, cell line, donor group, or your own. Plotvera guesses it
  from the names (M1 or G1-M1 = mouse, D01 or Donor 2 = donor, P001 = patient,
  A1/B12 = well, Rep 1 = replicate, IVIS/BLI/tumour/study day = mouse).
- Results, methods sentences, notes, legends, tooltips, Analyse & graph, the
  AUC wizard, smart import, the assistant, help articles and the connector all
  use those words, so a donor experiment reads "n = 6 donors per group" and
  never mentions mice. Old projects open unchanged; their words are guessed.
- Area under the curve: one AUC per subject, or the area under each group's
  mean or median curve. The mean curve keeps Bailer's standard error and now
  also shows a bootstrap 95% CI; the median curve uses a bootstrap CI and
  comparison (2000 resamples, fixed seed). Checked against R.
- New example dataset: "Repetitive stimulation assay" (4 CAR-T products x 6
  donors x 6 rounds of % target killing; invented numbers, labelled as example
  data).
- Statistics engine 1.13.0: new numbers only (median-curve AUC and bootstrap
  CIs). Every existing result is unchanged.

## [1.2.0-beta.12] - 2026-10-01 - statistics engine 1.12.0

### Marketing email images
- New high-resolution screenshots for the beta marketing email, hosted at plotvera.app/brand/marketing/v2/. No change to the app itself or to any computed number.

## [1.2.0-beta.11] - 2026-10-01 - statistics engine 1.12.0

### Clearer validation page

- plotvera.app/validation now counts the NIST problems Plotvera deliberately
  does not attempt (too large to fit safely in the browser, or a model the
  equation editor cannot write) as known limitations with their reasons,
  instead of as unexpected failures, and shows every method by its name.
  No calculations changed.

## [1.2.0-beta.10] - 2026-10-01 - statistics engine 1.12.0

### Version control, validation and stress testing

- This is the first release made with the new release process: tested on a
  staged copy first, tagged, recorded, and openable later at
  plotvera.app/v/1.2.0-beta.10.
- Statistics engine 1.12.0: some curve-fitting results and a few other numbers
  can change (details below). Compare with care against results made under
  engine 1.11.0.

### Statistics engine 1.12.0: numbers that can change

Read this before comparing a result with one made under engine 1.11.0. All of
these were found by the new validation package (below).

- **Curve fitting (nonlinear regression, every model and "fit your own
  equation")**: the fitter now rejects a step that makes the fit worse, and
  only says "Converged" when the fit is genuinely at a minimum. Before, it could
  report "Converged: Yes" on a poor fit (for example an exponential decay on
  the R Indometh data: R squared 0.10, residuals 133 times larger than the best
  fit). Fits that were already right move by about one part in a million;
  fits that were wrong now reach the right answer or say they did not converge.
- **Two-way repeated-measures ANOVA**: the Huynh-Feldt epsilon was slightly too
  small (eg 0.378 instead of 0.425 on R's CO2 data). The P values use
  Greenhouse-Geisser and are unchanged.
- **Normality tests with exactly 3 values** now run Shapiro-Wilk instead of
  refusing with a misleading "overflow" message.
- **Correlation confidence intervals** (Pearson, Spearman) use the exact normal
  quantile instead of 1.96: limits move in the fifth significant figure.
- **P values** can no longer come out a hair above 1, and a median or quartile
  falling between two equal values is now exactly that value.

### Fixed (found by the new stress and fuzz tests)

- Exporting a table to `.pzfx` or `.prism` dropped a blank row in the middle of
  the table, shifting every later row up.
- A category with no values (eg a dilution with no colonies counted) vanished,
  with its label, on Prism export and re-import.
- XY rows with values but no X (eg unknown samples beside an ELISA standard
  curve) were dropped when a `.prism` file was opened.
- Re-importing a CSV could read the header as data, keep stray quote marks, or
  split a one-column list on a stray `|` or `;`; CSV export now quotes cells
  containing tabs, `;` or `|` so they read back into the right columns.
- Copying cells that contain a comma before a quote and pasting them back into
  the grid put the whole row in one cell.
- Damaged SPSS and Excel files now give a plain "damaged file" message instead
  of an internal error; a damaged share link no longer leaves errors behind.
- The frequency distribution near the largest representable number showed a
  bin edge of "-Infinity"; the AUC wizard could show "Infinity" mice per time
  when an arm had no time point in the window.

### Added: version control, validation and stress testing

- Every release now has a version number, a dated entry here and a git tag,
  and goes out only through `scripts/release.sh`: it runs every test, deploys a
  staged copy, runs all the browser tests against that copy and only then puts
  it live. `scripts/rollback.sh` puts any earlier version back in seconds.
- **plotvera.app/versions** lists every release and every production build
  since June, and **plotvera.app/v/** followed by a version number (eg plotvera.app/v/1.2.0-beta.9) opens exactly that version,
  so a paper can name the version it used and a reader can open it.
- **plotvera.app/validation**: every statistical method and curve model
  Plotvera offers, checked against R and NIST certified values, with the
  largest error for each, plus import round trips, picture regression tests,
  fuzz tests and stress tests. Gaps are listed, not hidden.
- Every exported SVG, PNG, PDF and PowerPoint file, and every saved project,
  now records the Plotvera version that made it. The About box shows how to
  cite the exact version.
- Tests run on every change to main and every night on our own server, with an
  alert when anything fails.

## [1.2.0-beta.9] - 2026-10-01

### Designed in Plotvera, kept as R or Python code

- **Show code** above every graph: the graph as commented ggplot2 (R) or
  matplotlib (Python) code that rebuilds it from its data, updated live as the
  graph is edited. Copy it, download the .R / .py, or a .zip with the code, the
  data as CSV, the reusable theme, the .plotvera file and a README. Anything the
  code cannot reproduce exactly is listed above the code and at the top of the
  script.
- **The look on its own**: `theme_plotvera_<name>()` and colour scales with
  control / hero roles for any ggplot, a `.mplstyle` file and palette helper for
  matplotlib.
- **Figure layouts as code**: patchwork (R) or matplotlib subfigures, each panel
  at its exact position in mm, with the layout's text sizes in points.
- Checked by running the exported code for 23 graphs and 3 layouts (the JAX and
  Janice files and every chart family) in R 4.3.3 with ggplot2 4.0.3 and in
  Python with matplotlib 3.11.2, and comparing the pictures with Plotvera's own.
- **From R and Python into Plotvera**: an R package (`plotvera::open(df)`,
  `plotvera::open(ggplot)`) and a Python package (`plotvera.open(df)`,
  `plotvera.open(fig)`), installable from plotvera.app/integrations (not on CRAN
  or PyPI). The data travel in the link after # or in a local .plotvera file;
  nothing is uploaded.
- **Open SPSS, Stata and SAS files** (.sav, .dta, .xpt) with value labels
  applied, and ImageJ / Fiji Results tables tidied on the way in.
- Help pages: Export your graph as R or Python code, Use Plotvera with R, Use
  Plotvera with Python. The assistant can open the code panel and export code.

### Help that matches the app

- New Help menu and help centre: search across all help, a getting started tour,
  keyboard shortcuts, What's new (with a one-time dot when there is something
  new), an import formats guide inside the app, and how-to pages with a "Show me"
  button.
- The keyboard shortcuts list is generated from the real key handlers, and a
  test fails if the list and the handlers drift apart.
- The assistant has a help.search command that answers from the help articles
  and cites them.
- The graph tip is shorter and can be dismissed.
- Help pages can be linked directly: plotvera.app/#help opens Search help and
  plotvera.app/#help/axes (or any page id) opens that page.
- Docs refreshed to match what has shipped: capability matrix, known issues,
  privacy (connector data flow), Prism compatibility and README.

### How this release went out

Between 1.2.0-beta.8 (20 August) and this release, 69 production builds went
live while still calling themselves 1.2.0-beta.8: 2 on 21 Aug, 3 on 23 Aug,
2 on 18 Sep, 12 on 19 Sep, 7 on 25 Sep, 4 on 26 Sep, 7 on 27 Sep, 20 on
28 Sep, 2 on 29 Sep, 6 on 30 Sep and 4 on 1 Oct. They were reconstructed
afterwards from Vercel's deployment list and the git history: each now has a
tag `v1.2.0-beta.8+<build>` (eg `v1.2.0-beta.8+098291c`) and is listed, with a
link that opens exactly that build, at plotvera.app/versions. A result whose
audit record says "1.2.0-beta.8" can be traced to its build by the build code
in the same record.

### Other features shipped since 1.2.0-beta.8

- Project tabs: several projects open at once (up to 12), each with its own undo,
  file and unsaved dot. Opening `.prism`, `.pzfx`, `.plotvera` or a PowerPoint
  deck now opens a new tab (or fills a blank one) instead of replacing the
  workspace.
- Save and Save as with a name and folder, Autosave to this file (Chrome, Edge
  and the desktop app; other browsers download a copy), a recent files list and
  a project library in the browser. New `.plotvera` extension; `.plotvera.json`
  still opens. Project schema version 7.
- PowerPoint import: Prism embeds the whole project in each graph pasted into
  PowerPoint, and Plotvera extracts it, including Prism layout pages, which
  become Plotvera layouts. Plain `.prism` files bring their layouts too.
- The For Prism button can write a `.prism` package (data tables only) as well
  as a `.pzfx`. It has not been opened in GraphPad Prism.
- JSON data import adds tables.
- The Claude and ChatGPT connector: use your own Claude (Pro/Max) or ChatGPT
  (Plus/Pro, Developer mode) subscription through a custom connector link. A
  relay service carries tool calls between the chat app and the open tab.
- Split axes (2 or 3 pieces), axis number formats, and an option to show log-axis
  zeros at the axis floor (marked).
- Time-course graph types; mixed-effects model (arm x day) and AUC per subject
  through Analyse & graph.
- Data grid: drag and shift selection, copy and paste of blocks with Excel,
  Prism and Sheets, fill down and right, clear, and column widths (drag,
  double-click to fit).
- Hazard ratios pair by pair on Kaplan-Meier graphs.
- In-place formatting: click for a floating toolbar, double-click for a
  popover, right-click menus everywhere.
- TIFF export for graphs (300/600/1200 dpi) and layouts.

### Every statistic on a graph, customisable like hazard ratios

- One model for everything written on a graph: n per group, the error-bar
  note ("Mean ± SEM, n = 5-8 per group"), fit results (equation, R²,
  EC50/IC50, LogEC50, Hill slope, top, bottom, n), the fit's 95% confidence
  band, correlation r/P, median survival, ROC AUC and comparison labels. Each
  lets you choose which groups, which numbers, the wording ({tokens}),
  renamed parts (EC50 → IC50), decimals and P style, where it goes (a box
  you drag anywhere, after each legend entry, under the group names, under
  the graph, at the end of the curve or the median lines) and how it looks.
- Reachable on the graph: click to format with the toolbar, double-click for
  the popover (What to show / Numbers / Wording / Position / Style),
  right-click for which groups, numbers and position, or right-click the plot
  > Statistics on graph. The hazard-ratio panel uses the same sections.
- Point labels: right-click a point > Label this point (the subject or mouse
  ID), or label every point above or below a value. Labels drag with a leader
  line and never overprint.
- Legend title; the "values not shown on log axis" note can be formatted,
  moved and hidden.
- Result sheets: choose the columns each table shows, decimal places and how
  P values are written. Display only; the stored results never change.
- All of it is in the assistant (graph.statItem, graph.pointLabels,
  analysis.display, and text size/style/hide for the new items).

### Assistant: do it or show me, for anything in Plotvera

- One command registry lists every user-facing action (toolbar, right-click
  menus, settings panel, dialogs, shortcuts, tables, layouts, files) with a
  plain description, where it lives, its parameters and how risky it is. The
  assistant's tools are generated from it, and a test fails if a new menu
  item or toolbar button is not registered.
- Ask in plain English and the assistant does it, with an Undo card; deleting
  tables, graphs or layouts, clearing a table, changing a table's type,
  restyling every graph or running more than 3 analyses at once needs a Confirm
  click first. Ask "how do I…" and a "Show me" guide spotlights the real
  control step by step, opening menus for you, with "Just do it" at each step.
  Ambiguous requests get one short question with clickable answers.
- The assistant knows what is selected (a graph element, a block of cells),
  data set roles (control/hero), the graphs and layouts in the project and your
  recent actions, so "make this bigger", "hide these" and "compare the hero
  with control at day 21" work.
- The full assistant can now change everything on a graph: text sizes and
  styles, show/hide of any element, axis format, number format and split axes,
  reference lines, annotations, Kaplan-Meier display, and comparisons on time
  courses at chosen days.
- Without a key the built-in helper understands common commands (log scale,
  hide a group, bigger font, comparisons vs control, error bars, legend) and
  offers "Show me" guides for the rest. Keywords now match whole words only.
- OpenAI (GPT-6 Sol/Luna/Astra) joins Anthropic and OpenRouter as a
  bring-your-own-key provider. Settings explain that chat subscriptions can't
  be used as keys.
- Evaluated with a real Claude model on 40 scientist requests over real Prism
  files: see `test/assistant_eval/`.

### Colours: one colour chooser everywhere, and matching colours across graphs

- Every colour control (data sets, text, axes, grid, reference lines, fit
  curve, comparison lines, backgrounds, the right-click Colour menu) now opens
  the same colour popover right beside what you clicked. The browser's own
  colour picker is gone.
- The popover shows the graph's theme colours with four lighter/darker rows
  under each (as in Office), colours already used in this graph and in the
  project, recently used colours (per scheme, per project and overall),
  standard colours, and the Control & hero colours. Tooltips give the hex
  code and what uses it.
- Custom colours: a saturation/brightness field with a hue slider, a hex box
  that also takes rgb(), hsl() and names like navy, an eyedropper (Chrome),
  and Pick from graph to take the colour of anything on the canvas.
- Hovering a swatch previews it on the graph; clicking applies it as one undo
  step. Arrow keys move between swatches and Enter applies.
- A data set's colour applies to that data set on every graph in the project
  by default ("This graph only" keeps it local). Data sets without a picked
  colour keep the colour they have on the first table that has them, so the
  same arm matches across tables. One-table projects are drawn as before.
- Add a custom colour to the current colour scheme; it then shows in Theme
  colours on every graph using the scheme. Match colours to another graph
  (by data set name), apply this graph's scheme to all graphs, and save the
  current colours as a named scheme, all from a data set's colour popover.
- Error bars and legend text can follow each data set's colour.
- The assistant can do the same: colours by name (hex, rgb() or names; now
  stored as hex), matchColoursTo, applyColourSchemeToAllGraphs,
  errorBarsFollowColour, legendTextFollowsColour, saveToMyColours and
  useMyColourSet.
- Pick from graph is a mode, never a trap: a banner says how to leave (Esc,
  right-click, Cancel), a loupe magnifies the graph under the pointer with
  the colour and its code, and the colour previews live. Scrolling, zooming,
  the navigator and the Data sets list keep working; Shift-click applies and
  keeps picking. Switch to a table, layout or All graphs mid-pick and the pick
  carries on: pick there and you come back to the graph with the popover
  open where it was. It reads each element's own colour (fill, stroke,
  background), not antialiased pixels, and works on thumbnails too.
- Pick from screen (Chrome/Edge) is a separate, labelled button for colours
  outside Plotvera; it offers Apply or Save to My colours, and Esc returns to
  the popover unchanged.
- My colours: a personal colour library at the top of every colour popover.
  Save with + Save beside the colour code, from Pick from screen, or by
  right-clicking anything on a graph (Save this colour). Name, reorder,
  delete and group colours into sets; a set becomes a colour scheme in one
  click. Kept in this browser for every project; the saved colours a
  project uses are written into its project file and join the library when
  it is opened elsewhere. Export/import as a small JSON file.
- Colours from an image: drop, paste or choose a picture and get its 4 to 10
  main colours (k-means in Lab space; white/black backgrounds and
  antialiasing shades ignored), preview them on the graph, use them, or save
  them as a scheme or a My colours set.
### Layouts 2: templates, auto-arrange, live stats, and stats linked to graphs

- **Page templates** in one click: 1 × 2, 2 × 2, 2 × 3, 1 big + 2 small,
  time course + survival + stats table, and slide with title. Graphs already
  on the page move into the frames; empty frames take a graph dropped on them
  or picked with their Choose button.
- **Auto-arrange** packs graphs into rows, each panel at the shape its graph
  reads best (narrow for a two-column scatter, wide for a time course). Journal
  pages get the height the figure needs instead of stretched panels; stats
  tables and legends go full width underneath.
- **Editing**: equal-spacing guides (with the gap in mm) as well as edge and
  margin snapping, millimetre rulers, page margins and panel gap settings,
  group and ungroup, bring to front and send to back, lock, Alt+arrow fine
  nudge, Ctrl+wheel and +/-/0 zoom. Letter styles A, A., (A) and A).
- **One legend per set of data sets**: panels showing the same groups (same
  names, colours and symbols, or a subset) share one legend and give the room
  to their plots. **Hide repeated axis titles** along a row or down a column.
  Both on for new layouts, off for existing ones.
- **Live stats on the page**: a stats table from any result (choose the table
  and its columns; P values journal style, exact or as stars) or from a
  graph's comparisons, a one-line-per-result stats summary, and an automatic
  **figure legend** written from each panel (what it shows, n, error bars,
  tests and corrections) that updates with the data and copies as text.
- **Thumbnails** of every layout in the navigator. **Export every layout** as
  one multi-page PDF (each page at its own size) or one PowerPoint deck with
  each figure legend in the speaker notes.
- **Stats linked to graphs**: a Stats chip in the graph header lists the
  comparisons on the graph (test, statistic and df where the test has a
  single one, adjusted P, n, means ± SD, difference, Cohen's d, correction,
  methods sentence) and the results of its table, with Open full results.
  Clicking a comparison's bracket or stars opens its numbers.
- A results page lists **Graphs using these results** with pictures, **Show
  on graph** (pairwise results become brackets the graph computes from the
  data; a log-rank P or hazard ratio goes under the title) and **Add to
  layout**. In the navigator, results and graphs are grouped under their
  table with link badges (hover to see what's linked) and one click to the
  table + stats + graphs view.
- The assistant can make and change figure layouts, read a graph's stats,
  put a result on a graph and write the figure legend.
- Project files move to schema 7; everything new is optional and older
  layouts keep their look.

### Fixed

- PDF export: after a bold label, plain text further down the page came out
  bold (svg2pdf only switches font when the weight differs from its parent's).
- PDF export: tick labels like 2.0×10⁸ drew their exponent on top of the axis
  line (right-aligned text with a raised part was anchored by its first run).
- A survival panel too short for its at-risk table no longer prints "At-risk
  table omitted — increase height" into the figure.
- Slides: default text is now 14 pt ticks / 16 pt axis titles (18/20 pt left
  2 × 2 slides with slivers of plot).

### Layouts: multi-panel figures with matching fonts

- New **Layouts** section in the navigator, as in Prism. A layout is a page
  (Nature 89/183 mm, Cell 85/174 mm, A4, US Letter, PowerPoint 16:9 or a
  custom size in mm) holding graphs, text boxes and pictures.
- Graphs are never scaled as pictures. Each is redrawn at its panel's real
  size with the layout's text sizes in points (defaults 7 pt ticks and 8 pt
  titles for journals, larger for pages and slides), so the text is identical
  in every panel however big or small it is. The graphs themselves are
  untouched; "Use each graph's own fonts" opts out.
- Place graphs by dragging them from the navigator, with Add graph, or
  right-click > Add to layout. Move and resize with the mouse; panels snap to
  a mm grid and to each other's edges and centres (hold Alt to place freely).
  Align, space evenly, same size, arrange in an N x M grid in one click.
- Match plot areas: panels that share an edge get their plotting frames lined
  up, so axes align across rows and columns. Same Y range links the Y axes of
  selected panels.
- Automatic panel letters (A, B, C or a, b, c; inside or outside the corner;
  bold; per-panel override), and axis titles or graph titles too long for a
  panel wrap onto two lines instead of shrinking. Panels too small for the
  chosen text are flagged, with one click to lower every size together.
- Live-linked: editing a table or graph redraws its panels. Double-click a
  panel to edit its graph.
- Export exactly: vector PDF and SVG at the page's mm size, PNG and TIFF at
  300 or 600 dpi (resolution recorded in the file), and a PowerPoint slide
  with the figure at true size.
- Prism projects that contain layouts arrive with them: the graphs are placed
  where Prism had them (read from the layout sheet) with its text boxes.
- Project files move to schema 6 (optional `layouts`); older projects open
  unchanged.

### Fixed

- Vector PDF export wrote every bold label (Prism-style bold axis text and
  titles) in a substituted, non-embedded Times-Bold. Bold text now embeds the
  same Noto Sans Bold as everything else.
- Solid lines were written with `stroke-dasharray="0"`, which the PDF
  converter drew as nothing: connecting lines, solid fits and agreement lines
  were missing from vector PDFs.

## [1.2.0-beta.8] — 2026-08-20 — statistics engine 1.11.0

**Deployed as a research beta to https://plotvera.app on 2026-08-20.** This
application release adds Prism-style subject/subcolumn identity to raw replicate
tables without changing statistics engine 1.11.0. The deployed app publishes
its exact clean commit and asset hashes at `/evidence/release.json`.

### Subject-safe replicate entry and Prism handoff

- Raw Grouped and XY replicate tables can retain an independent subject or
  replicate ID for every data-set subcolumn, so a weekly mouse time course can
  visibly distinguish, for example, `CAR-T / Mouse C01` from
  `Control / Mouse K01` while preserving the physical observation order.
- The labels participate in undo, portable save/open, browser persistence,
  provenance fingerprints, bounded matrix paste, CSV handoff, and supported
  Prism/PZFX import-export paths. Structural edits that would orphan or move a
  label fail closed rather than silently reassigning a subject.
- Portable project schema 4 adds per-data-set subcolumn-label metadata while
  retaining the schema 0-3 shared-label read path. Older projects migrate
  without guessing group-specific identities.
- A table without a verified PZFX mapping no longer forces a crude all-project
  error. The dialog names every unsupported table and requires explicit
  acknowledgement before exporting the supported subset; nothing is omitted
  silently.
- Unsupported tables also expose a direct CSV download in that dialog, and
  export failures remain in the accessible dialog instead of opening a native
  browser alert.

### Survival figure labelling

- Kaplan-Meier number-at-risk tables reserve a measured label column before
  the first count. Group names no longer collide with the time-zero value at
  narrow, screen, or publication dimensions, while every count remains aligned
  to its X-axis tick.

## [1.2.0-beta.7] — 2026-08-20 — statistics engine 1.11.0

**Deployed as a research beta to https://plotvera.app on 2026-08-20.** This
release prevents common-origin and complete-tie inputs from producing false
citable decisions, and preserves the advertised Prism open–edit–PZFX round
trip when an imported grouped category is renamed. Exact production
fingerprints are published in `/evidence/release.json`; the external, legal,
archive, assistive-technology, viewer and provider gates in
`docs/LAUNCH_GATES.md` remain open.

### Scientific-integrity corrections

- Grubbs' iterative outlier statistic now uses bounded affine coordinates. An
  exact common response origin can no longer reverse its first-pass decision,
  change the selected source row, or trigger a false iterative exclusion; the
  displayed mean and SD remain in source units.
- Friedman inference and direct paired or independent Dunn follow-up now fail
  closed when complete ties leave zero rank variance. Undefined rank
  statistics no longer appear as citable `P = 1`, `W = 0`, or `ns` decisions.
- Exact direct and dispatcher regressions plus the machine-readable validation
  registry distinguish these computed-result changes as engine 1.11.0.

### Prism grouped-data round trip

- When a grouped Prism row title is only a redundant copy of its category,
  editing or pasting a new category now keeps that hidden copy synchronized in
  the same undoable mutation. Genuine independent row or subject annotations
  remain untouched and still fail closed if PZFX cannot represent them.
- The pinned modern `.prism` corpus now covers open, category rename, PZFX
  export, reopen, editable point-and-mean graph reconstruction, and direct X/Y
  axis controls without silently merging a prior workspace.

## [1.2.0-beta.6] — 2026-08-20 — statistics engine 1.10.0

**Deployed as a research beta to https://plotvera.app on 2026-08-20.** This
release corrects a KS-Lilliefors P-value branch that could reverse the visible
normality decision, and adds a deliberately noninteractive mobile
graph-overview scale. Exact production fingerprints are published in
`/evidence/release.json`; the external, legal, archive, assistive-technology,
viewer and provider gates in `docs/LAUNCH_GATES.md` remain open.

### Corrected KS-Lilliefors inference

- KS-Lilliefors now evaluates the published Dallal-Wilkinson upper-tail
  equation directly within its stated domain and uses the Stephens
  modified-statistic branch implemented by R `nortest` otherwise. A five-point
  alpha-crossing fixture now reports `D = 0.332`, `P = 0.075` and Pass instead
  of the former unrelated approximation's `P = 0.00398` and Fail.
- Direct, combined-battery, dispatcher, provenance and `n > 100` branch tests
  pin the reference domains. Missing, sparse, non-finite, undersized and
  zero/non-finite-spread direct inputs now fail closed without a false
  normality verdict. These computed-result changes require engine 1.10.0.
- KS-Lilliefors, Anderson-Darling, skewness and kurtosis now use bounded affine
  coordinates before returning mean and SD to source units. Exact `8 × 10^15`
  translations preserve formerly reversed KS and Anderson-Darling decisions;
  genuinely unrepresentable source-unit spread remains unavailable.

### Mobile graph overview

- Graph previews add 75% and responsive **Fit** overview levels, giving narrow
  mobile screens a whole-figure overview while preserving the readable 100%
  default. Reduced
  previews remove direct SVG edit/drag controls and disclose that they are
  noninteractive; the full-size 44-pixel axis buttons remain available only for
  chart families that actually support them.

## [1.2.0-beta.5] — 2026-08-20 — statistics engine 1.9.0

**Deployed as a research beta to https://plotvera.app on 2026-08-20.** This
release changes computed multivariate results where engine 1.8.0 was sensitive
to a harmless common origin, and also fixes two reproducible compact-layout
failures. Exact production fingerprints are published in
`/evidence/release.json`; the external, legal, archive, assistive-technology,
viewer and provider gates in `docs/LAUNCH_GATES.md` remain open.

### Corrected multivariate origin contract

- Correlation matrices, correlation-matrix PCA, and standardised k-means now
  form per-variable moments in bounded affine coordinates, anchored to an
  observed source value when finite differences permit and scaled from zero
  for the extreme-range fallback. Adding an exactly representable common
  origin can no longer change correlation inference, PCA
  eigenvalues/loadings/scores, or a k-means partition and within-cluster
  objective.
- A five-row exact-translation fixture pins a correlation-matrix result at
  `r = -0.923`, `P = 0.0254` before and after adding `8 × 10^15`; the previous
  raw-sum path returned `r = -0.865`, `P = 0.0583` after translation and flipped
  the displayed alpha decision. A six-row k-means fixture likewise pins the
  same `{1,6}|{2,3,4,5}` partition and `SSE = 3.973` instead of changing the
  scientific row assignments solely because of source origin.
- Correlation and PCA now retain their exact finite structure for supported
  opposite-extreme inputs whose raw sums or differences overflow, while
  constant variables and genuinely non-finite derived values still fail
  closed. K-means numeric and source-centroid overflow refusals now carry the
  explicit unavailable flag as well as warning-only output, so direct consumers
  do not have to infer failure from result-block structure.
- Method provenance and the machine-readable validation registry now disclose
  the common-origin-stable sample-SD coordinates and the exact invariance
  evidence. These computed-result changes require statistics engine 1.9.0;
  results cited under engine 1.8.0 are not silently relabelled.

### Responsive interface

- The project header now remains a single 48-pixel row without page overflow at
  laptop widths. Open, Save and Share remain visible, while secondary commands
  move into the existing keyboard-accessible Project actions menu until the
  full strip has measured room at 1680 pixels.
- The data-transform panel now stays within 320-by-480 and 390-by-480
  viewports, anchors inside the mobile canvas, and scrolls internally so every
  transform remains reachable; desktop alignment is unchanged.

## [1.2.0-beta.4] — 2026-08-20 — statistics engine 1.8.0

**Deployed as a research beta to https://plotvera.app on 2026-08-20.** This
app-only release keeps statistics engine 1.8.0 unchanged. Production promotion
used a clean, version-matched build and strict browser smoke; the exact deployed
commit and asset hashes are published in `/evidence/release.json`. The external,
owner, legal, archive, assistive-technology, viewer and provider-configuration
gates in `docs/LAUNCH_GATES.md` remain mandatory before a general launch claim.

### Prism workflow and graph editing

- The Home screen now leads with direct `.prism` and `.pzfx` project opening,
  names the compatibility preview and source-analysis limitations, and explains
  the safe route back to Prism instead of hiding interoperability in generic
  import copy.
- A confirmed Prism/PZFX open now replaces the current workspace in one
  validated state change; it can never append source tables to an unrelated
  project. Non-empty workspaces require an explicit replacement acknowledgement,
  while cancellation, malformed files and rejected candidates leave the current
  workspace untouched.
- Added an explicitly data-only **Export for Prism (`.pzfx`)** handoff using
  GraphPad's published XML table profile. Verified column, XY, grouped,
  survival, contingency, parts-of-whole, adjacent XY-replicate and typed-summary
  layouts round-trip through the bounded reader and generated probes validate
  against GraphPad's published Prism 8 XSD. Unsupported or lossy tables stop
  the whole export. Plotvera analyses, results, provenance and graph styling are
  not embedded, and Plotvera does not claim to write modern `.prism` packages.
- Cartesian graph axes are now direct controls: clicking/tapping an axis line,
  tick or title, or using Enter/Space on its 44-pixel target, opens and focuses
  the matching Axes editor without changing existing bounds. Supported manual,
  fixed, forest and axisless chart families expose only valid controls.
- Replaced prominent emoji and text-glyph controls with a coherent bespoke
  inline-SVG icon system across Home, navigation, project actions, dialogs,
  tables and graph controls. A source gate rejects pictographic or raw
  single-character command controls. The Prism export handoff uses a
  focus-trapped dialog with safe-default Cancel and explicit
  included/not-included disclosures.
- The mandatory browser release gate now closes the docked Assistant through
  the toolbar toggle—the exact path that crashed in the stale public build—and
  verifies that the React root, main workspace and closed-state control remain
  intact. A deeper browser gate also covers Hide, Escape, mobile, rapid toggles
  and dock/modal breakpoint transitions.

## [1.2.0-beta.3] — 2026-08-14 — statistics engine 1.8.0

**Unreleased release candidate; not deployed to production.** The engine moves
through 1.4.0 for regression/survival changes, to 1.5.0 for the corrected
Shapiro-Wilk, repeated-measures, Dunn and Welch decision contracts, and to
1.6.0 for fully repeated two-way interaction sphericity correction, and to
1.7.0 for nonlinear response-unit integrity, response-origin-stable two-way
ANOVA, and supported non-switching normality guidance, and to 1.8.0 for
multiple-testing/logistic origin stability plus diagnostic overflow and
interpretation corrections below. The
external, owner, legal, archive, assistive-technology, viewer and deployment
gates in `docs/LAUNCH_GATES.md` remain mandatory.

### Prism project interoperability

- Public builds now preview and atomically import Prism 10+ `.prism` packages
  and plain-text `.pzfx` project data. The parser is part of the default bundle,
  and the release evidence records its supported extensions and safety
  contract instead of claiming that public builds are parser-free.
- Imported `.prism` graphs are redrawn as editable Plotvera graphs only when a
  table link and evidence-backed family/axis mapping are available. `.pzfx`
  graphs are explicitly labelled native reconstructions from the imported
  table. Layouts, fonts, custom drawing objects, pixel geometry, and opaque
  styling are not claimed to match Prism.
- Every Prism project receives a non-mutating compatibility preview and a
  one-shot portable-envelope check before commit. Legacy binary `.pzf`,
  malformed/encrypted/over-expanded containers, and unsupported structures
  fail closed without a partial import.
- Stored source analyses and result sheets are reported only as compatibility
  information: they do not become current Plotvera results and are never rerun
  with inferred or default parameters.
- Expanded the pinned, offline, MIT-licensed GitHub corpus with the paired
  14-table Biomiha `.prism`/`.pzfx` demo. It now verifies all 17 modern source
  graph sheets, both stored analysis definitions, replicate and survival data,
  exclusions, missing columns, and SD/SEM/CV/N/asymmetric-summary encodings.
  Every unavailable graph or analysis is named in the preview rather than
  guessed, and summary/error columns are never misplotted as response series.
- Explicit Prism SD, SEM, N, CV-derived SD/CV%, asymmetric-offset and absolute
  limit layouts now retain typed portable roles and draw their stored bounds
  directly. In the full pinned modern project, 12 of 17 source graph sheets are
  now editable reconstructions (the remaining five are named and unavailable);
  the paired PZFX project reconstructs all 14 source tables. No raw replicates
  or error statistics are invented.
- Prism row-title and subject identifiers now remain separate annotations that
  are visible and editable in the table gutter, fingerprinted with the data,
  saved in portable projects, and included in safe CSV exports.

### Corrected scientific contracts

- Per-feature Welch tests now remove one shared response origin before
  estimating their contrast, variance and P value. The exact planned-family
  fixture that previously changed from P = 0.0487 (one discovery) to P =
  0.0509 (no discoveries) after adding 10^15 is invariant.
- Simple and multiple logistic regression now fit centred/scaled predictors
  and back-transform coefficients and covariance to source units. Simple slope
  inference is identical after a 10^15 X origin or unit rescale; misaligned,
  nonbinary, nonfinite and constant-predictor inputs fail closed. A
  numerically zero slope withholds only the undefined X-at-50% inverse, and
  tiny reporting units that push only a per-unit odds ratio outside the finite
  exponent range no longer invalidate finite coefficient inference. Separated
  or nonconverged fits label coefficient tables and narratives diagnostic-only
  instead of displaying a significance conclusion.
- Bland–Altman pair means halve before addition, Grubbs uses scale-stable
  summaries, and even-sample MAD medians halve before addition. Finite
  same-sign inputs near 10^308 no longer fail merely because an avoidable raw
  sum overflowed; truly nonfinite derived contrasts still fail closed.
- ROC direct inputs now fail closed unless marker/label arrays align, every
  marker is finite, and every label is exactly 0 or 1. AUC below 0.5 is now
  described as inverse discrimination (smaller marker values associated with
  outcome 1), with an explicit warning that the larger-is-positive Youden
  cutoff is not an inverse-direction optimum. A perfectly reversed marker is
  no longer called a near-chance failure or given an "optimal cutoff" claim.
- Correlation-matrix output and provenance now disclose that every coefficient
  and P value uses one listwise-complete row set and that matrix P values are
  unadjusted exploratory outputs rather than multiplicity-controlled decisions.
- Bland–Altman plot coordinates and robust MAD+BH candidate/all-point tables
  now retain original source-row identities across omitted cells; Grubbs and
  MAD+BH plain summaries name those rows too. A compacted row number can no
  longer be cited as the excluded observation.
- Every built-in nonlinear model now fits every response-dimensional
  parameter in response-normalised coordinates while reporting parameters,
  standard errors, confidence intervals and covariance in the source units.
  Registry-wide exact and noisy fixtures pin parameter, uncertainty,
  prediction, SSR, Sy.x and covariance invariance from 10^-6 through 10^6.
  Named exponential decay/growth/association/plateau families use positive
  rate coordinates and directional span constraints; two-phase decay also
  keeps positive amplitudes and Kfast > Kslow. Michaelis-Menten Km, Gaussian SD
  and sine wavelength are likewise fitted in positive coordinates, so an
  otherwise stationary candidate cannot expose a definitionally invalid
  negative value. Michaelis-Menten and linear-dose log-logistic models reject
  negative substrate/concentration X values while still allowing a zero-dose
  control; inverse interpolation also withholds an algebraically finite negative
  concentration for an out-of-range response. Gaussian, polynomial and sine
  curves withhold inverse interpolation because they have multiple possible X
  roots and the current project contract does not declare a branch; constrained
  two-phase decay retains its unique numeric inverse. Exact opposite-direction curves,
  negative-R² candidates and fits without residual degrees of freedom fail
  closed. A graph overlay is now drawn only when that same analysis result is
  available, and SVG accessibility text plus the editor disclose the selected
  model and status. Custom equations remain unscaled and unbounded unless
  their dimensions can be declared explicitly in a future contract.
- Ordinary and repeated-measures one-way ANOVA now use stable centred responses
  for their sums-of-squares, covariance and sphericity arithmetic, and Type-III
  two-way ANOVA centres before each full and reduced OLS solve. Adding a common
  10^15 response offset therefore leaves their effect tables and narratives
  unchanged, including pinned alpha-boundary fixtures. Tukey and Dunnett
  follow-up calculations use the same centred group means and pooled variance;
  a pinned Dunnett adjusted P = 0.051731 decision no longer crosses alpha.
- Ordinary linear regression now computes means, covariance and residuals in
  centred coordinates and evaluates predictions relative to the fitted data
  origin while retaining the source-axis intercept. A common exactly
  representable 10^15 shift on X, Y or both no longer reverses the pinned
  P = 0.0501 nonsignificant slope decision.
- Balanced nested t and nested ANOVA now use stable finite-midrange subject
  means and decompositions. Adding a common 10^15 response origin no longer
  reverses their pinned near-alpha subject-level decisions.
- One-sample t contrasts and pooled/Welch unpaired calculations now centre
  before variance and difference arithmetic. Analyze and graph Welch output
  share the same stable calculation, so a common 10^15 response origin no
  longer reverses the pinned P = 0.0487 significant decision.
- Pearson correlation now removes common X/Y origins before its existing scale
  normalisation. Adding 10^15 to both axes leaves the pinned P = 0.00997 and
  two-star significance tier unchanged.
- Z-score derived-sheet transforms now centre finite columns before computing
  and serialising the standardized values. An exact seven-value fixture is
  byte-identical after a common 10^15 response origin.
- Offline and online normality guidance now uses the supported
  Shapiro-Wilk/normality-battery result instead of the retired legacy
  D'Agostino path. Diagnostic departures and skewness are described as
  sensitivity evidence, never as an automatic parametric-to-rank-test switch;
  the table's declared study design remains authoritative.
- Shapiro-Wilk statistics now use the full-precision R/Royston AS R94
  coefficient construction throughout the supported range, preserving the
  exact three-observation branch, and P values use its finite-sample transform
  for 4-11 observations. Four-, 41- and 50-observation alpha-crossing
  references are pinned through the direct, battery and public dispatcher
  paths so neither rounded weights nor the wrong P-value branch can reverse a
  normality decision. Constant and non-finite inputs are refused instead of
  producing a false pass/fail verdict, including in AI-derived summaries.
- Multiple linear regression now solves a centred and scaled design with
  column-pivoted Householder QR, transforms coefficients and covariance back to
  source units, and refuses rank-deficient or ill-conditioned designs. Large
  harmless predictor offsets no longer produce impossible negative R²/F
  results; translation/unit invariance and NIST Longley coefficient, standard
  error and F references are executable release evidence.
- Hill-model nonlinear fitting now uses stable positive log coordinates for K
  and n, response-normalised Vmax optimisation, data-derived bounded multistart
  seeds, and response-scale-relative convergence checks. Exact/noisy generating
  fixtures recover Vmax, K and n from 10^-6 through 10^6 response scales; a poor
  stationary restart cannot become a current citable result.
- Multiple-testing corrections now retain every declared nonblank feature in
  the planned BH/Holm family. Untestable rows are explicit NA entries with a
  reason and still count in the correction family, preventing anti-conservative
  discoveries when a feature is missing or has zero variance.
- Nested t/ANOVA now refuse unequal technical-replicate counts instead of
  allowing replicate imbalance to weight subject means. Grubbs, PCA and
  k-means outputs retain visible source-row identity after complete-case
  filtering rather than renumbering compacted observations.
- Graph-only paired comparisons across three or more groups no longer export
  unadjusted raw P labels; they are withheld until a validated repeated-measures
  post-hoc family is available. Small sample size likewise no longer causes the
  online Assistant to override a researcher-declared parametric design.
  Automatic XY recommendations now preflight the exact row-averaged primary
  series, so constant-X/Y imported replicates cannot recommend a fit or
  correlation that the analysis engine will immediately refuse.
- Repeated two-way ANOVA narratives now use the reported GG-corrected P values
  for within-subject main-effect decisions. Fully repeated interactions with
  more than one contrast degree of freedom now estimate epsilon from the
  covariance of orthonormal per-subject A x B contrast scores; corrected
  interaction degrees of freedom and P values drive the table, stars,
  narrative and provenance. A pinned 3 by 2 reference crosses from uncorrected
  P = 0.031356 to corrected P = 0.070452, preventing the earlier
  sphericity-assumed false-positive decision.
- Repeated-measures one-way ANOVA now likewise uses the Greenhouse-Geisser-
  corrected P for its primary table, stars, significance decision, narrative
  and citable provenance whenever there are 3+ repeated conditions. The raw
  sphericity-assumed and Huynh-Feldt P values remain explicitly labelled
  sensitivity outputs and cannot silently drive a contradictory conclusion.
- Kruskal-Wallis Dunn follow-up now accepts ordinary unequal independent-group
  sizes while the paired Friedman path retains its equal-length requirement.
  Independent parametric graph annotations now use Welch's t test
  deterministically instead of choosing pooled versus Welch after inspecting
  the observed SD ratio.
- Cloud-share failures now distinguish a refusal before storage from an
  indeterminate lost acknowledgement after an insert attempt; the UI no longer
  promises that no copy exists when the database may already have committed it.
- BYOK online AI now uses OpenRouter's maintained `openrouter/free` router
  instead of a retired model-specific free slug. The settings and privacy copy
  disclose that the selected compatible model/provider can vary by request.

### Reliability, privacy, and release hardening

- Portable projects and bulk imports now reject any data row wider than its
  declared header list, preventing an accepted-but-invisible research cell.
  Every portable list is also required to be dense: JavaScript array holes in
  tables, labels, results, parameters, provenance, or top-level collections
  fail before JSON could silently turn them into `null`. ROC, Bland-Altman,
  Grubbs and robust MAD inputs apply the same indexed presence check instead of
  letting sparse values disappear from a scientific result.
  AI and cloud-share endpoints enforce their UTF-8 request limits while reading
  the stream and cancel as soon as an untrusted chunked body crosses the cap.
- User-supplied OpenRouter keys are page-session scoped in `sessionStorage`.
  Startup removes the persistent key used by earlier betas even when the
  Assistant stays closed; the release browser gate proves that migration.
- If a final browser-autosave flush fails, leaving the page requests
  confirmation instead of silently losing the only current snapshot. Healthy
  autosave remains quiet. Independently, 20 minutes of changed work without a
  project-file download now shows a recurring Save reminder; Save and reopening
  that exact project clear it, while later edits start a new reminder period.
- GitHub Actions are pinned to immutable commits with read-only token
  permissions, common deployment-secret/private-key files are ignored, and the
  launch record now states explicitly that the current third-party notice is
  scoped rather than a complete transitive licence approval.

### Publication and accessibility

- Publication PDF is now a physically sized vector export rather than a JPEG
  wrapper. It preserves chart geometry as PDF drawing operations, embeds Noto
  Sans for Greek/common scientific text, rejects external/raster SVG resources,
  and has a real-browser artifact gate for page dimensions, embedded font,
  Unicode map and absence of image XObjects.
- Kaplan–Meier figures now share the inferential survival engine and include
  pointwise Greenwood complementary-log-log 95% confidence bands plus a
  number-at-risk table in SVG, PNG, PDF and PowerPoint output. Compact canvases
  preserve the plot and explicitly disclose omitted risk rows or legend groups.
- Graph-editor segmented choices have contextual accessible group/option names;
  Y minimum/maximum controls are unique; the New data table menu supports entry,
  arrow/Home/End navigation, Escape and focus restoration; graph route headings
  no longer announce “graph graph.”
- Multi-cell clipboard paste now follows RFC-4180 quoting, preserves embedded
  newlines and intentional blank rows, and rejects malformed or oversized
  blocks before either table view mutates. Spreadsheet CSV export neutralises
  formula-leading text while preserving genuine signed numbers and Unicode.
- Successful file/project imports use a dismissible in-app status announcement
  instead of a blocking browser alert.
- The complete clean-evidence browser workflow now has recorded local passes in
  Chrome 151 and Edge 151. The same semantic workflow also passes in the
  CI-pinned Playwright Firefox build; stock-Firefox version coverage and
  Safari/iOS remain explicit open gates.
- Project schema 2 preserves typed source-summary roles. Version-1 and unversioned
  projects migrate without guessing roles from column names.
- Project-wide graph styling now preserves each Prism source-summary graph's
  semantic Source/None uncertainty choice. Render/export normalises impossible
  restored modes and describes displayed versus hidden source intervals exactly.
- Autosave now snapshots project-only state and defers JSON compression behind a
  bounded debounce, so edits at the supported 20,000-row envelope no longer
  synchronously recompress the whole project; page hide/visibility still flushes
  the latest state for durability.
- Browser-autosave decompression is streaming and bounded against compression
  bombs while retaining enough wrapper headroom to reopen an exact-limit 16 MiB
  portable project.

## [1.2.0-beta.2] — 2026-08-13 — statistics engine 1.3.0

**Unreleased release candidate; not deployed to production.** This iteration
changes computed outputs and failure contracts, so the statistics engine moves
to 1.3.0. It remains a research beta and must satisfy every applicable manual,
external, legal, owner-review, archive, and deployment gate in
`docs/LAUNCH_GATES.md` before public promotion.

### Corrected scientific contracts

- Survival tables now use one fail-closed parser for analysis and graphing:
  time must be finite and non-negative, event must be exactly `0` or `1`, and
  partially entered rows are identified rather than silently recoded. The
  current Cox workflow accepts exactly two groups and records the reference,
  comparison, binary coding, and hazard-ratio direction instead of treating
  three or more labels as an ordinal covariate.
- One-sample, paired, Student, and Welch t-test output now includes the
  applicable mean-difference interval and explicitly labelled Cohen effect
  size. Pearson output adds its test statistic and degrees of freedom, clamps
  floating-point round-off to the valid correlation interval, and leaves a
  small-sample Fisher-z interval unavailable rather than inventing one. Ordinary
  linear regression now reports intercept confidence limits, residual standard
  error and degrees of freedom, slope t, and model F.
- Frequency distributions now represent constant data with one closed bin,
  document the exact rounded Freedman–Diaconis-derived/fallback rule and bin boundaries,
  and apportion displayed percentages so they total exactly 100.00%.
- Diagnostic 2×2 analysis now refuses zero disease-status or test-result
  margins, reports zero accuracy for a completely wrong classifier, and uses
  the correct specificity condition for the negative likelihood ratio.
- Descriptive statistics no longer analyse a grouped-table category column as
  measurements, and empty measured data fail closed. Custom fits, correlation
  heatmaps, and bubble charts now retain complete same-row X/Y/size or
  multivariable observations rather than independently compacting columns.
- Analysis options now use one method-keyed canonical contract across execution,
  saved results, fingerprints, and methods text. Unsupported or misspelled
  models, transforms, post-hoc choices, repeated-measures designs, corrections,
  and cluster counts fail closed instead of silently selecting a different
  calculation; irrelevant imported options cannot enter a citation.
- K-means requires the requested number of distinct standardized complete rows
  and accepts only finite solutions with exactly k nonempty clusters. Paired
  multiple-testing rows are matched by sample-column position, refuse odd
  layouts, and omit incomplete pairs without reconnecting different samples.
- Descriptive and nested summaries now use scale-stable finite arithmetic for
  means, variance, quantiles, intervals, and downstream inference. Valid large
  finite observations are retained, while an unrepresentable derived result is
  refused instead of becoming an em dash inside an apparently current result.
- Derived-sheet transforms are calculated atomically and serialized with
  round-trip numeric precision rather than the result-display formatter.
  Arcsinh and signed-log transforms use stable library formulas, so finite
  extreme values are neither rounded into different data nor converted to
  missing placeholders.
- Multiple-testing output now preserves same-position paired observations,
  distinguishes paired sample size from independent group sizes, assigns
  stable feature labels to all-numeric tables, and refuses a family when a
  displayed mean or adjusted probability is not finite.
- Dense two-way ANOVA now runs a shared linear-time preflight before either the
  advisor or solver allocates a design matrix. Browser execution is refused
  above 400 full-model parameters or a 100-million `n x p^2` work estimate,
  with guidance to retain the scientific design and use a validated external
  workflow rather than silently dropping levels or observations.
- Custom nonlinear equations now share parser and execution limits across UI,
  assistant, project recomputation, and direct engine calls: at most 20 fitted
  parameters, bounded equation/token/AST complexity, a positive residual degree
  of freedom, and a calibrated six-million-unit combined LM work budget.
  Oversized fits are refused before optimizer or covariance allocation.
- Provenance observation counts now follow the actual method units (complete
  pairs/rows, matched subjects, nested subjects, survival records, or tested
  features) rather than falling back to a raw numeric-cell count. Loaded
  records with invalid options or an unverifiable fingerprint remain visible
  only as stale historical output.

### Added

- Added a one-sample Wilcoxon signed-rank workflow with a finite hypothetical
  value contract, an all-zero-difference refusal, and explicit symmetric-shift
  wording. Its validation status remains partial.
- Added a publication-export dialog with single-column, double-column, current,
  and custom physical-width choices. SVG stores millimetre width/height while
  preserving its viewBox; PNG is rasterised to the calculated pixels at 300,
  600, or 1200 DPI and receives a standards-based `pHYs` resolution chunk.
  PDF remains a clearly labelled raster compatibility export at the current
  canvas size. These controls do not assert journal compliance; target-journal
  colour, font, format, and viewer checks remain required.
- The guided setup now carries the selected study design, runnable analysis
  intent, and suitable initial graph into the created table. Its analysis keys
  match the actual dispatcher, and independent parametric comparisons use
  Welch's test as the assumption-light default.
- Result pages now create only a graph family that truthfully represents the
  completed analysis (for example ROC, Bland–Altman, histogram, survival,
  correlation heatmap, or a fitted XY curve). Unsupported, stale, or
  unavailable results do not offer a misleading default graph.
- Runtime edits, file imports, workbook commits, generated results, undo/redo,
  and project loads now preserve the same portable-codec and 16 MiB invariant
  used by Save/Open. Multi-sheet workbook import is atomic; sparse oversized
  worksheet ranges and compressed workbook expansion are rejected before
  SheetJS parsing; generated tables retain at most 5,000 display rows with an
  explicit omission note while computation and provenance continue to use all
  observations.

### Graph, layout, and accessibility hardening

- Narrow-screen previews preserve readable chart text in a keyboard-focusable,
  horizontally scrollable region with explicit 100–200% zoom controls rather
  than shrinking a desktop SVG to illegible text.
- Correlation heatmaps require at least three complete same-row observations,
  surface constant-variable failure, reserve space for long labels, rotate
  colliding labels, and choose cell text by contrast. Right-side legends size
  to their labels and retain full labels in SVG titles when display text must
  be shortened.
- Invalid logarithmic Y-axis choices are disabled with an explanation, and log,
  symlog, and axis-break states can no longer silently conflict. Survival and
  heatmap validation failures render an accessible unavailable state instead
  of an empty or misleading figure.
- Publication figures use one exact error-bar contract: 95% confidence limits
  use the correct t critical value and observed ranges retain asymmetric min/max
  endpoints. Before-after plots preserve complete subject rows; forest nulls
  are determined from an explicit ratio/difference role; volcano plots require
  a declared design and use Benjamini-Hochberg-adjusted P values for their axis,
  threshold, and colouring.
- Bubble area is proportional to its nonnegative size value (including a truly
  zero-area observation), heatmap geometry stays finite at the minimum canvas
  size, and axis-drag affordances are exposed only where the renderer implements
  the corresponding linear scale.
- Stacked bars and areas now refuse negative, missing, duplicate, or
  incompletely aligned components instead of clamping or inventing zeroes;
  their raw-point overlay is withheld because it cannot represent composition
  replicates truthfully. Split-axis gaps must contain no plotted mark, error
  endpoint, fit, annotation, or reference line.
- Histogram bars now occupy their numeric bin intervals and label every shared
  boundary. Manual plotting ranges clip data marks to the plot frame without
  clipping axes or titles, and forest/Bland–Altman labels use adaptive numeric
  precision rather than displaying distinct small values as zero.

### Validation and release status

- Added method-validation lifecycle dossiers that exercise input, reference,
  boundary, recomputation, project/share, and provenance evidence for selected
  methods. One-sample t and Pearson remain `partial` because the required
  product/statistics-owner review of the exact published limitations is still
  pending. No method is promoted merely because its executable categories pass.
- This changelog does not record a passing test count, build SHA, preview URL,
  production deployment, independent statistical review, DOI, browser/assistive-
  technology sign-off, external-viewer approval, trademark clearance, parser
  licensing decision, repository licence, or monitored support contact. Those
  facts must be recorded from the exact clean candidate when they exist.

## [1.2.0-beta.1] — 2026-08-13 — statistics engine 1.2.0

**Release candidate; not deployed to production.** This beta starts the public-readiness
hardening pass. It must pass the preview and external-decision gates in
`docs/LAUNCH_GATES.md` before production.

### Corrected

- 2×2 contingency provenance now pairs a Fisher exact methods sentence with
  the Fisher exact P value rather than the preceding Yates chi-square P value.
- Increasing four-parameter dose-response fits report `LogEC50` consistently
  rather than the inhibition-specific `LogIC50` label.
- Raw positive concentration series now run explicit linear-scale log-logistic
  3PL/4PL models. Sparse series retain the advisor's fixed-slope three-parameter
  choice rather than being promoted to an unidentified four-parameter fit;
  scale-stable log10 midpoint parameterisation prevents molar-scale fits from
  starting orders of magnitude away from their transition. Zero-dose controls
  are defined at the appropriate asymptote, and golden tests cover sparse 3PL,
  increasing/decreasing molar-scale 4PL, convergence, parameters, and R².
- Nonlinear fits now preserve and display optimizer termination evidence, use
  a bounded restart-stability check for noisy least-squares optima, suppress
  uncertainty for nonconverged candidates, leave mathematically undefined
  AICc values unavailable, and never recommend a model when fit/F-test/AICc
  prerequisites fail. Raw-dose provenance records the positive EC50 log10
  reparameterisation and numerical coordinate range.
- Dose-response and nested recommendation cards now agree with their table
  design and explanatory copy; normality guidance no longer treats a
  normality P value as an automatic test-family switch.
- Excel ZIP containers are routed to the spreadsheet importer before Prism
  file sniffing.
- Regression and curve overlays now share one rowwise missing-value and
  duplicate-replicate extraction contract, so an audited fit and its figure
  cannot silently use different observations.
- One-sample, paired, Student, and Welch t tests now refuse insufficient or
  zero-variance inputs instead of narrating an undefined result as non-significant.
  Pearson/Spearman correlation and linear regression likewise require enough
  complete pairs and non-zero predictor variance before reporting inference.
- Exact non-horizontal linear fits now report the limiting slope P value of zero
  instead of passing an infinite test statistic through the numeric t CDF; an
  unavailable linear fit is also omitted from figures rather than drawing NaN points.
- One-way ANOVA, Mann–Whitney, Kruskal–Wallis and contingency inference now
  refuse undersized, degenerate, non-finite or invalid-count inputs instead of
  rendering undefined statistics as a non-significant conclusion.
- Failed, underidentified, separated, or non-finite nonlinear, custom, and
  logistic fits are retained only as diagnostic output. They are explicitly
  unavailable, cannot mint/copy provenance, cannot interpolate unknowns, and
  are withheld from assistant result summaries.
- Logistic, multiple-logistic, and ROC outcomes must now be explicitly coded
  0/1; incomplete rows remain paired and any other nonblank code is refused.
  Contingency tables likewise distinguish a deliberate blank-as-zero policy
  from invalid, fractional, negative, non-finite, unsafe-integer counts.
- Robust MAD + BH screening no longer silently switches to a Grubbs test when
  MAD is zero. Bland–Altman, Grubbs, and robust-outlier workflows now refuse
  overflowed or non-finite derived statistics instead of narrating placeholder
  values as an inferential conclusion.
- Two-sided Fisher exact inference now uses a numerically stable
  hypergeometric recurrence rather than repeated factorial scans. Golden
  references cover zero-cell and independently enumerated tables, while a
  million-count fixture verifies that large valid margins remain responsive.
- Exploratory graph brackets now use the same failure boundary: undefined t,
  pooled-ANOVA, Mann-Whitney, Wilcoxon, or Dunn inference displays an em dash
  rather than a fabricated non-significant annotation. Raw paired brackets
  retain only rowwise complete pairs.
- Loaded results whose SHA-256 input fingerprint does not match the current
  table/method/options are preserved as historical records but visibly marked
  non-citable. Warn-only analysis refusals likewise do not mint new provenance
  or automatically add an invalid fit overlay; stale numbers are withheld from
  online-assistant context and result tools until the analysis is re-run.
- Fingerprints now hash a structured, versioned encoding of table fields and
  recursively sorted typed options, so control characters, row boundaries,
  nested option objects, and result-facing labels cannot alias one another.

### Security and privacy

- Added a versioned project codec, input bounds, graph-style sanitisation,
  transactional open/share loading, and visible persistence failure handling.
- Bounded data cells, tables, graphs, results, rendered result blocks, import
  bytes, and workbook sheets across every create/import/save/share path; large
  grids paginate and grouped layouts fall back safely instead of mounting an
  unbounded number of controls.
- Upgraded SheetJS to its supported 0.20.3 distribution. Pinned and backported
  the two relevant `image-size` parser guards, with malicious-sample regression
  tests and an explicit CI audit disposition until upstream metadata catches up.
- Made self-contained local sharing the default. Cloud upload and online AI
  now require explicit informed action with accurate data-flow disclosure.
- PowerPoint export no longer embeds a hidden self-contained project/data link;
  editable project sharing is a separate, explicit action.
- Fixed the Assistant close/unmount crash and removed automatic cloud upload
  when the Share dialog opens.
- Added restrictive browser security headers and tightened the cloud-share
  endpoint’s origins, payload handling, cache policy, and burst limit.

- Public builds now compile the proprietary Prism parser implementation out of
  the module graph. Both the bundler and a post-build scanner fail if restricted
  modules or format-specific signatures leak into JavaScript; an exact CI-only
  opt-in is required to produce a restricted compatibility build.
- API limits now count UTF-8 bytes rather than UTF-16 code units, and
  per-instance burst-limit maps are bounded with fail-closed eviction. Online
  assistant responses explicitly use `Cache-Control: no-store` so user prompts
  and model replies are not retained by browser or intermediary HTTP caches.

### Graphs and accessibility

- Added accessible SVG titles/descriptions, keyboard-operable project
  navigation, state semantics for graph controls, improved focus/contrast,
  and responsive graph/editor layout.
- Kaplan–Meier figures now mark censored observations and preserve the source
  time-axis label.
- Nested figures show one mean per independent subject rather than treating
  technical replicates as independent observations. Multivariable tables
  default to a correlation heatmap rather than a shared-unit column graph.
- Audited regression analyses now activate the corresponding linked fit
  overlay. Graph-only fits and significance annotations are labelled
  exploratory until an audited analysis exists.
- CSV/text and multi-sheet Excel imports now preview without mutating the
  project, require an explicit first-row/header decision, and commit only the
  selected or confirmed workbook sheets.
- Grid edits use structural sharing, bounded history, atomic paste, and
  transactional derived-result recomputation so undo/redo cannot restore data
  with mismatched analysis provenance.

- Completed focus entry/trapping/Escape/restore for the walkthrough and
  responsive Assistant drawer; added view/result announcements, accessible
  result-table captions and row headers, uniquely named sibling navigator
  actions, keyboard-operable mobile project actions, AA text/focus tokens, and
  400%-equivalent dialog reflow coverage.
- Export artifacts omit editor-only label prompts; PowerPoint no longer repeats
  the chart title in a second native heading, and export failures remain visible
  in an assertive, dismissible status instead of disappearing silently.
- Palette display names are neutral visual descriptions rather than publisher,
  product, or entertainment-brand labels; stable internal keys preserve saved
  beta-project colours.

### Release governance

- Vercel now invokes the type-checking package build; GitHub CI gates the
  documented production dependency audit, lint, tests, golden validation,
  browser/edge-API type checks, and production build.
- Added a headless-Chromium release smoke gate for the desktop dose-response,
  result provenance, accessible graph, Assistant workflow, consent-gated cloud
  sharing, and client-only local sharing; transactional quoted-delimiter CSV
  preview/cancel/commit; and project navigation, graph sizing, and
  horizontal-overflow checks at a 390 px mobile viewport.
- Added real export-artifact tests: standalone SVG XML/Unicode validity, PDF
  page/image/xref integrity, and an unzipped PowerPoint package containing an
  editable SVG and bounded data slide without a hidden project link. External
  application and visual-fidelity checks remain release gates.
- Pinned pnpm 10.9.0 for reproducible CI/preview installs and replaced
  version-specific audit flags with an exact advisory/version/path validator;
  any new production high-severity advisory still fails the release gate.
- Kept API tests outside Vercel function discovery and aligned the root
  TypeScript contract with the platform compiler, so preview builds contain
  only the intended `ai` and `share` functions.
- Added a capability matrix, validation report, launch gates, security policy,
  product README, and `CITATION.cff`.
- Shipped the exact capability, validation, manifest, privacy, security,
  accessibility, support, known-issues, browser-support, and schema documents
  plus release notes and citation metadata beside every build. A release
  fingerprint records the full commit, versions,
  toolchain, parser-gate state, and SHA-256 of every document and emitted JS/CSS
  asset; browser smoke re-downloads and verifies those bytes.
- Added a machine-readable registry for all 41 advertised analyses and all 17
  nonlinear models, including explicit partial/covered/unvalidated status, input-design
  profiles, executable evidence, shared persistence/provenance evidence, and
  visible limitations where model-specific reference coverage remains open.
- Direct proprietary Prism project parsing is disabled in public builds by
  default pending licensing/legal review. CSV/Excel migration remains available.
- Removed unsupported competitive-equivalence wording and preserved each audit
  record’s own app/engine attribution in combined methods output.

## [1.1.0] — 2026-07-12 — statistics engine 1.1.0

**First production release** (live on plotvera.app). Everything previously sat
on a preview only; this entry covers both the audit-trail/citability work and
the validation + UX + assistant work that shipped with it.

> **Read this before comparing a result to one produced by engine 1.0.0.**
> `ENGINE_VERSION` moved 1.0.0 → 1.1.0 because computed numbers **can change**.
> Engine 1.0.0 only ever existed on a preview build, but if you have a saved
> project or a result whose audit record says `engine 1.0.0`, re-run it: the
> analyses below now give different (corrected) numbers.
>
> - **Mann-Whitney / Wilcoxon signed-rank** — small samples with no ties now use
>   the **exact** null distribution (as GraphPad Prism and R do) instead of the
>   normal approximation. P values differ for roughly n < 20-25. The result
>   states which method was used.
> - **Chi-square on 2x2 tables** — now applies the **Yates continuity
>   correction** (R's `chisq.test` default). The 2x2 chi-square P is larger
>   (more conservative) than under 1.0.0. 3xN tables are unchanged.
> - **Repeated-measures ANOVA (one- and two-way)** — now also reports
>   Greenhouse-Geisser / Huynh-Feldt epsilon and the **GG-corrected P**. The
>   uncorrected P is unchanged and still shown.
> - **Multiple logistic regression** — the **intercept** standard error, Wald z
>   and P are corrected (1.0.0 reported the standardised-space SE, which was too
>   small and could overstate intercept significance). Slope/OR estimates are
>   unchanged.
> - **Wilcoxon consistency** — the per-row Wilcoxon used by "Multiple t tests"
>   and by graph significance now matches the standalone Wilcoxon analysis
>   (tie + continuity corrected). Under 1.0.0 those paths disagreed.
> - **Pearson/Spearman at r = ±1** — now reports P < 0.0001 instead of a blank.
> - **Nonlinear fits (Michaelis-Menten and similar)** — the Km/EC50 starting
>   estimate is now data-driven, so fits that previously stalled over a wide X
>   range now converge; "Converged" is no longer reported for a failed fit.

### Added (1.1.0)
- **Validation:** 132 new golden tests (222 total) — every analysis now has a
  reference-value test. No fabricated reference numbers: assertions come from
  exact identities, shown hand-computations, or canonical datasets.
- **Honest method labels** (they flow into the citable methods sentence): the
  FDR outlier test is labelled "ROUT-style", not Prism's regression-based ROUT;
  the normality analysis names the tests it actually runs (Shapiro-Wilk /
  KS-Lilliefors / Anderson-Darling); Dunnett is labelled Bonferroni-adjusted.
- **Agentic AI assistant:** the built-in assistant can now read your data and
  results and run the right test for you (client-side tool calling — your data
  stays in the browser). A deterministic "Run this test" works with no AI at all.
- **Prism-grade UX:** family-tree Navigator (results/graphs nested under their
  data table), auto-created linked graphs, keyboard nav + Excel paste in the
  grouped grid, undo/redo + global shortcuts, delete confirmation, first-class
  "Parts of whole" table type, nested sample dataset.

### Known limitations (1.1.0)
- Two-way repeated-measures ANOVA: sphericity correction is reported for the
  **main effects** only. The interaction epsilon is not computed and is flagged
  as such in the output — do not cite an interaction GG correction from 1.1.0.

### Added (audit trail / citability, previously unreleased)
- Statistics engine versioning (`src/version.ts`): `APP_VERSION` (whole app)
  and `ENGINE_VERSION` (stats engine only) are now tracked separately, with a
  `citationString()`/`versionTag()` helper so a result can be cited properly
  in a methods section.
- Golden-test suite (`src/stats/__golden__/`, run via `pnpm golden`):
  reference values for distributions, t-tests, nonparametric correlation, and
  regression/survival methods, run under Vitest. This is the first automated
  check that the statistics engine's outputs are correct, not just that the
  UI doesn't crash.
- Build-time audit trail (`vite.config.ts`): every build is stamped with the
  git commit (`BUILD_SHA`) and build date (`BUILD_DATE`), so a number a user
  sees can be traced back to the exact code that produced it.
- `vitest` added as a dev dependency; `test`, `test:watch`, and `golden` npm
  scripts.
- This documentation set: `docs/OPERATIONS.md`, `docs/SUPPORT.md`,
  `docs/PRIVACY.md`, and this changelog.

### Changed
- `package.json` version bumped from the scaffold default `0.0.0` to `1.0.0`
  to reflect that this is genuinely the first real, versioned release.

---

## [0.8.0] - 2026-06-27 to 2026-06-29

GraphPad Prism file import. The single biggest feature addition after the
initial build, spread across ~17 commits.

### Added
- Import of GraphPad Prism `.pzfx` files (plain XML, and ZIP/gzip-compressed).
- Import of the newer Prism 10+ `.prism` package format (ZIP of per-table CSVs
  + a `document.json` manifest), including forward-compatibility handling for
  Prism 11.
- Prism import recreates graphs (mapped to the nearest matching Plotvera chart
  type) and re-runs a curated set of Prism analyses live through Plotvera's
  own stats engine, rather than copying Prism's stored numbers.
- Prism survival tables reshaped into Plotvera's long `[Time, Event, Group]`
  format and rebuilt as Kaplan-Meier graphs with log-rank.
- Prism grouped/replicate tables reshaped into Plotvera's grouped table view
  (groups x replicate sub-columns).
- File picker accepts any extension (browsers hide unrecognised extensions
  like `.pzfx` by default) and routes by file content, not filename.
- Legacy binary `.pzf` (pre-2014 Prism) explicitly rejected with a message to
  re-save as `.pzfx`, rather than silently mis-importing it.
- Imported graphs default to the GraphPad Prism colour palette.

### Fixed
- Out-of-memory crash on large Prism imports: all sheets/graphs/analyses are
  now committed to the store in one state update instead of dozens of
  sequential calls.
- localStorage quota crash on large projects: persisted state is now
  deflate-compressed and base64-encoded before being written
  (`compressedStorage` in `src/store.ts`), typically 5-10x smaller.
- Chart x-axis category labels auto-rotate when they would otherwise overlap.
- Fit-check x-axis labels now read from the correct data source for
  column/bar/box/violin charts.
- Time-series tables imported as XY (not grouped), with replicate Y columns
  correctly averaged into one line per group.

---

## [0.7.0] - 2026-06-24

### Added
- QA campaign: a 466-story test inventory covering the UI and statistics,
  used for a structured test/fix/retest loop (`qa/PLOTVERA-STORIES.csv`,
  `qa/PLOTVERA-QA-RESULTS.md`).

---

## [0.6.0] - 2026-06-21

### Fixed
- Cox proportional hazards now uses Efron's method for tied event times,
  matching R's `survival::coxph` default.
- Two-way ANOVA correctly computes Type III sum of squares for genuinely
  unbalanced designs; hardening for real-world pairing and missing-data
  combinations; log-like axis/transform edge cases.

---

## [0.5.0] - 2026-06-20

Product naming settled during this window: briefly "Facet", then renamed to
"Plotvera" (repo and deploy URL stayed `graphite`).

### Added
- Editable-vector PowerPoint export: charts embed as native SVG objects so
  PowerPoint 2016+ can "Convert to Shape" and edit every element, with a PNG
  fallback if SVG embedding fails; optional second slide with the underlying
  data as a real editable table.
- Project sharing: gzip+base64 hash-URL sharing (no backend needed) plus an
  optional cloud short-link via a new `/api/share` endpoint.
- Round-trip from an exported PowerPoint slide back to the editable graph in
  the app.
- Histogram and bubble chart types; frequency distribution and area-under-
  curve analyses; nested t-test and nested ANOVA; multiple-t-tests panel
  (feeds volcano plots); XY data transforms (smooth/differentiate/integrate);
  custom-equation curve fitting with a hand-written expression parser.

### Fixed
- `api/share.ts` moved to the correct Vercel runtime (edge, then a follow-up
  fix) so it degrades cleanly to a "not configured" response when no cloud
  store is set up, instead of erroring.
- Hardening pass after a QA review: fixed several crashers, chart NaN
  handling, and UX/branding issues.

---

## [0.4.0] - 2026-06-19

Five rounds of feature work landed the same day, per the author's own
"Round N" commit naming.

### Added
- 12 new statistical analyses, hardened import, 31 colour palettes and 14
  continuous colormaps (Round 1).
- Publication-quality export and 10 new chart types; deeper AI advisor
  (Round 2).
- Deeper nonlinear regression, a full normality-test battery (Shapiro-Wilk,
  KS-Lilliefors, Anderson-Darling), live recomputation of analyses when data
  changes, and save/load of project files (Round 3).
- Volcano and QQ plots, chart annotations, Cox PH survival with Gehan-Breslow
  and hazard-ratio output, repeated-measures two-way ANOVA (Round 4).
- PowerPoint export, correctly styled and computed significance comparisons,
  a dose-response assistant, and a guided decision-tree walkthrough for new
  users (Round 5).

### Fixed
- Statistical correctness fixes across the existing test suite (part of
  Round 1 — see `qa/PLOTVERA-QA-RESULTS.md` for the specific bugs found and
  fixed, including a post-hoc-table duplication bug in one-way ANOVA and an
  under-estimated Spearman confidence interval).

---

## [0.3.0] - 2026-06-15

### Added
- Repeated-measures one-way ANOVA and Friedman test for matched 3+ groups.

---

## [0.2.0] - 2026-06-11

### Added
- Prism-grade graph customisation, computed (not typed-in) significance
  brackets, and multivariate analyses (PCA, k-means, multiple regression).
- Experiment design (paired/unpaired, parametric/nonparametric) declared once
  on the data table and inherited by every analysis and graph built from it.
- Built-in AI assistant with bring-your-own-OpenRouter-key support, later
  protected on the shared-key path with an origin allowlist, per-IP rate
  limit, and a cheap default model.
- 13 graph-customisation features: journal colour palettes, draggable axes,
  split/broken axis scales, significance-bracket styling.

---

## [0.1.0] - 2026-06-10

### Added
- Initial build: GraphPad Prism-style statistics and graphing web app
  (project name `graphite`).
- Curve-fit overlay, significance-bracket editor, smoother violin plots, and
  the first Playwright-based visual test harness.
