[Production] Release 2026-09-01 - #217
Merged
Merged
Conversation
* Render report PDFs inline when S3 stored them as binary. Watcher uploads of uppercase .PDF files often land as binary/octet-stream, so the report iframe downloaded the file instead of showing it. Co-authored-by: Cursor <cursoragent@cursor.com> * Bump watcher to 1.0.1 and tell agents to version shipped watcher changes. The MIME-type fix needs a package bump before a production tag; watcher/AGENTS.md keeps later branches from shipping src/ changes at the old version. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* Add a melting-curve plate report for Azure Cielo qPCR runs. Existing _MeltingCurve.csv uploads were ignored by the processor gate; parse them into per-well -dF%/dT sparklines and seed a synthetic vendor-shaped fixture so local runs can render the report. Co-authored-by: Cursor <cursoragent@cursor.com> * Show qPCR PDF reports and make melt-curve wells expandable. Report Data now renders the instrument's PDF export through the viewer TapeStation already uses, and the plate grids move to their own "Melting Curves" section. Clicking a well opens a modal with the full-resolution curve from the derivatives CSV, and a per-channel toggle switches both the grid and the modal between the derivative and the melt curve. The plate JSON carries both series so that toggle costs no download. Points are now [x, y] pairs rather than objects, which holds a 384-well run to 300 KB. Runs processed before this need reprocessing to draw. Plate geometry and well-selection state move out of the Aunty modules into shared ones now that two reports use them. Co-authored-by: Cursor <cursoragent@cursor.com> * Show both melt-curve series together and pick channels from a dropdown. The card stacked four 96-well grids and ran several screens tall. A dropdown now shows one channel at a time, carrying the well selection across so switching channels stays on the same well. Derivative and melt curve are no longer exclusive: either, both, or neither. Well tiles overlay them, each scaled to its own tile. The single-well chart gives each its own y-axis, tinted to match its line, because a derivative in %/°C and a percentage of peak fluorescence share no scale. The plate opens on the derivative alone — 96 tiles of two curves is a lot to scan — and the well chart opens on both. The well chart also marks the derivative peak, the melting temperature, with a dashed line. A flat trace gets no marker so an empty channel does not get one pinned to its first reading. Co-authored-by: Cursor <cursoragent@cursor.com> * Name the well dialog by channel and well in one heading. The header spent two lines on "A7" over "Channel2 melting curve". One heading reading "Channel2 – A7" says the same thing and leaves the chart more room. What was the visible subtitle stays on as a screen-reader description, since the heading alone no longer says what is plotted and Radix expects a described dialog. Co-authored-by: Cursor <cursoragent@cursor.com> * Put the melting curves above the PDF on qPCR runs. The plate grids are the part of the page people interact with, so they now come first and the vendor PDF sits below them. The PDF keeps the "Report Data" title that every other run variant uses for its main section. The MCP run report is reordered to match. Co-authored-by: Cursor <cursoragent@cursor.com> * Harden the melt-curve parser and simplify the report shell. Review follow-ups on the melting-curve work: - The parser dropped blank header cells but kept reading data by the filtered index, so a blank column mid-header would have shifted every later well onto its neighbour's trace. Column positions now come from the unfiltered header. - `write_plate_json` writes the plate `parse_melting_curve_file` already built instead of rebuilding it from the blocks. - `PlateWellsProvider` tracks the selected well by label rather than by position, so switching a qPCR channel stays on the same well even when the channels report different well sets. - One case-insensitive matcher per melt artifact, shared by the run-page loader and the report-file filter. - `ReportDataShell` takes an optional `count` instead of a required `total` plus a `showCount` flag. The empty card is now an exported `ReportDataEmpty`, which the melting report renders itself since its card has nothing countable to put in the heading. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* Keep wide instrument run tables scrolling inside the page. Gel Doc and SpectraMax metadata columns were stretching the main pane past the sidebar because flex items would not shrink below the table's min-content width. Co-authored-by: Cursor <cursoragent@cursor.com> * Apply npm audit fix in the web lockfile. This pulls Better Auth from 1.6.27 to 1.7.2, which is a breaking account-identity change handled in the next commit. Co-authored-by: Cursor <cursoragent@cursor.com> * Store Better Auth 1.7 account issuers so local email sign-in works. 1.7 keys accounts on (issuer, accountId). Seeded credential rows had no issuer, so Alice's password login failed with "Couldn't sign in with that email." Co-authored-by: Cursor <cursoragent@cursor.com> * Show comment counts beside the run ID in list tables. Co-authored-by: Cursor <cursoragent@cursor.com> * Verify MCP JWTs with Better Auth 1.7's verifyBearerToken. Co-authored-by: Cursor <cursoragent@cursor.com> * Keep even padding on table checkbox cells. Co-authored-by: Cursor <cursoragent@cursor.com> * Render the deleted run badge inside RunIdCell. The badge was copy-pasted identically across all eight runs tables, so RunIdCell now derives it from the run's deleted_at and no longer takes `children` or `labelClassName`. The dashboard badge picks up the default 12px size instead of 10px, so both views match. Its `labelClassName="text-sm"` was already inherited from `Table`, leaving the run ID label unchanged. Co-authored-by: Cursor <cursoragent@cursor.com> * Upgrade pyright to 1.1.411. Lockfile only; the `>=1.1.408` floor in `pyproject.toml` still holds and CI resolves the version through `uv sync`. Typecheck stays clean. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: Rename make check-all to make check * Apply the Better Auth 1.7 OAuth schema so MCP registration works. The 1.7 bump landed without regenerating the OAuth provider schema, so dynamic client registration returned a 500 and the authorization-code flow was unusable. Adds the missing columns plus the three new tables, and swaps the removed `validAudiences` option for seeded `resources`. Also updates the DCR tests for 1.7's native-only loopback redirect rule and its 201 response. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
* Roll Better Auth back to 1.6 so MCP clients can register. 1.7 rejects Cursor and Claude Code because both omit application_type and send a non-https callback. Pin the packages to 1.6.27 and add a migration that lets 1.6 insert account rows again. Leave the UI and make-check work from #216 in place. Co-authored-by: Cursor <cursoragent@cursor.com> * Stop Next from writing a nested web/web folder. Next 16 treats the git repo as the Turbopack workspace, so make dev already running in web/ wrote assets to web/web/.next. Pin the app root and ignore any leftover copy. Co-authored-by: Cursor <cursoragent@cursor.com> * Re-apply the Turbopack root pin after withMicrofrontends. Keeps client assets in web/.next so a leftover cache cannot restore them into web/web/.next on make dev. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.