You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bioinformatics Plugins on every menu: the thirteen built-in plugins (Eukaryotic and Microbial Gene Predictors, CRISPR Repeat Array Finder, Microsatellite & Tandem Repeats, Haplotype & Allele Partitioner, Taxonomic Sequence Classifier, Species Delimitation, Protein Domains & Epitopes, Transmembrane & Signal Topology, Adapter & Quality Read Trimmer, Whole-Genome Synteny Blocks, HPC Phylogeny Job Builder, External CLI Suite) are under Tools › Bioinformatics Plugins in the native macOS menu bar and the in-window menu bar, under the toolbar's Workflows ▾ menu, and in the search bar. Before, they were reachable only from the in-window menu, which the macOS desktop app hides. Each plugin's method is cited in PROVENANCE.md.
Mol 3D structure viewer*: PDB and mmCIF structures render in Mol* (MIT, credited in NOTICE) with representation presets, styles, colour schemes, a sequence panel, ligands, superposed Model B and PNG export.
Preferences that take effect: Files & Tabs › default folder for opening and saving files and default Author for new files, Export › default format for DNA, RNA, protein and alignment exports, and the other General, DNA, RNA, Protein, Gel, Trace, Enzyme, Primer and Keyboard settings are now saved, applied at once, exported to and imported from .mbcprefs.json, and restored by Reset All Preferences.
Styled macOS disk image: the .dmg opens on a light-blue grid welcome window with the app icon, an Applications shortcut and an arrow between them, and its licence agreement is set in Google Sans.
Align Structures… is on the menus: Tools › Alignment and the toolbar's Align dropdown, and the native Alignment menu on the desktop. It opens the structure alignment window (align two chains by structure, TM-align-style, or by sequence) and is disabled until the session holds a structure document; in the in-window menus the greyed item's hint gives the reason. It can be given a keyboard shortcut or toolbar button, and has a help topic.
3D Structure tab, viewer annotations: for an mmCIF structure the viewer shows the ligands bound to the chains it draws, colours by the helices and strands the file declares ("SS from file"), and highlights the residues of the selection made in the sequence view (clicking a feature selects its range). For legacy PDB text the tab says these are read from mmCIF.
3D Structure tab, Ramachandran plot: the open chain's backbone torsions are plotted under the viewer, naming the plotted model for an entry of several models ("model 1 of 2"). mmCIF only; for legacy PDB text the tab says why there is no plot.
The nightly and release reference check re-checks the Ramachandran derivation: scripts/check_reference_suite.mjs runs derive_ramachandran_maps.py --check and fails when a cell of the six region maps in crates/molbiocraft-protein/src/backbone.rs, or one of their doc comments, no longer matches what the Top8000 grids derive, as NOTICE and PROVENANCE.md describe. It fetches the six grids from their pinned commit and checks their SHA-256, so it needs network access to raw.githubusercontent.com; a failed download fails the check. node scripts/check_reference_suite.mjs --only ramachandran runs that step alone, and MOLBIOCRAFT_REFERENCE_RAMA_GRIDS=DIR keeps the grids in DIR, so a later run downloads only the ones missing. The other MOLBIOCRAFT_REFERENCE_* variables replace the commands the check runs (Vitest, cargo, Python and the derivation script) and the maps it checks. The check prints each one that is set, and with none set it runs as before.
Engine warnings appear in a shared Caution Amber note beside the result in the alignment studio and the MS digest, and a Multiple Alignment result keeps its warnings in its Notes. (US-01M6P25H)
Export > Alignment Image > SVG, PNG or PDF saves the whole active alignment as a figure (blocks of 60 columns with a ruler, consensus row, each row's name and percent identity, the studio's default colours); an alignment too large for a canvas is refused with the limit named. (US-01M6S8C5)
drag handles on the alignment studio's side panel and its sequence name and identity column (also moved with the arrow keys); both widths are kept across views and restarts; nothing changes until a handle is dragged. (US-01M6S7QS)
Installers for every platform, each built on its own system: each release now offers MolBioCraft-<version>-macOS-universal.dmg (one app for Apple Silicon and Intel Macs, macOS 11 or later), MolBioCraft-<version>-Windows-x64.msi, MolBioCraft-<version>-Windows-x64-Portable.exe (runs without installing; needs the WebView2 runtime that Windows 10 and 11 include) and MolBioCraft-<version>-Linux-x86_64.deb (sudo apt install ./MolBioCraft-<version>-Linux-x86_64.deb), with SHA256SUMS.txt, NOTICE.txt and PROVENANCE.md beside them. The Tauri bundler builds each on a macOS, Windows or Ubuntu 22.04 runner, and each is checked to be the architecture it is named for before it is uploaded. Before, the release built only the macOS disk image, and its Windows and Linux files could not hold a working app. The builds are unsigned (the Mac app is ad-hoc signed), and README.md gives the first-launch steps past Gatekeeper and SmartScreen. Only a pushed v* tag publishes a release; running the workflow by hand uploads the same files as workflow artifacts. npm run package:installers now builds only the macOS universal .app and .dmg, with the Tauri bundler. (US-01M6TK7V)
One shared inspector in every task window: Vectors, Cloning, Primers, Alignment (Pairwise and Dotplot), Tree, Chromatogram, Genomics, History/Protein and the Text tab now keep their settings in the same right-hand inspector as the Sequence view, with the same header button, Cmd/Ctrl+Alt+I, View › Panels › Inspector, resize handle and width. A window with nothing to set shows no button, and only one inspector shows at a time. Drawn on its own, outside the workbench, each studio keeps its settings where they were. (US-01M6TAW8, US-01M6TAT0, US-01M6TA1H, US-01M6TANN, US-01M6TA6T, US-01M6TAKD, US-01M6TAA4, US-01M6TAAR, US-01M6TA87, US-01M6TAZE, US-01M6TAKR, US-01M6TAZ7)
The Flatfile tab's toolbar names the chosen record format beside its label, and its format buttons report their pressed state to assistive tools. (US-01M6TAZ7)
A shared App test harness drives the real App, with its stores, menus and inspector, so each inspector change is proved in the running app. (US-01M6TB6G)
Changed
Release notes come from this changelog: each GitHub Release now carries its version's section of CHANGELOG.md as its notes (scripts/release_notes.mjs), and a tag whose version has no section, or an empty one, fails before anything is published. (CR-01M704A6)
README leads with what the app does: research tasks, studios, plugins, pipelines, preferences and file formats come first; build and engine details follow.
Same menus on desktop and web: Cloning, Restriction Cloning, Enzymes, Features, Sequence and Tools have the same items, names and order in the native macOS menu bar (Tauri and Cocoa builds), the in-window menu bar and the toolbar dropdowns. Cloning opens with Clone Insert into Vector… and Validate Clone…; Restriction Cloning holds Find Sites, Digest into Fragments…, Agarose Digest, Ligate Fragments, Restriction Ligation, Anneal Oligos and Non-Cutters; Mutagenesis gains Point Mutation and Seamless Assembly gains Parts Cloning.
Mol floating toolbar at the bottom*: the viewer's reset, screenshot, controls, expand, settings and selection-mode buttons sit in a horizontal bar at the bottom of the view, and their menus and the Screenshot and Settings panels open upward inside the view. Fullscreen expands within the app window, so the toolbar never falls outside it; the expand button or Esc returns to the normal view.
npm run package:installers copies only the .dmg to release/, as the release packaging contract requires.
The sample library's public-record samples are re-sourced: the samples PROVENANCE.md sections 4 and 5 list now come from public records, and each one that cites a record is checked against it. The twelve sample sequencing primers come from the iGEM Registry (VF2, VR and the five M13 primers, credited in NOTICE section 6) and from the NCBI T7, T3 and SP6 phage genomes that hold the five promoter primers; the three protein records, the yadF clone's coding sequence, the Taq gene and the genome records from NCBI records; and the two structure-backed proteins from RCSB PDB entries 1D66 and 1A4Y. The four yadF cloning primers are built from the BBF RFC 10 prefix and suffix and the Gateway attB1 and attB2 primer tails. The seven design primers are not re-sourced: they cite no record and are unchanged. Every alignment member is a public NCBI record (one protein is replaced by PDB 2ACT chain A, the record it names), and the alignments, trees and assembly reads are rebuilt from those records by MolBioCraft's own aligner, Neighbor-Joining and seeded read simulation. The fictitious-character alignment set and its tree are dropped. No sample keeps a Created or Modified field copied from another program's file. (US-01M6TDFV, US-01M6TGKH, US-01M6TGZ8, US-01M6TDSV)
Sequence Split view: on a viewer canvas of 760px or more, the circle and the linear map sit side by side under one zoom (65-260%) that the header buttons, Cmd+=/-/0, View › Zoom and Cmd/Ctrl+wheel all move. Cmd+0 or the zoom readout also recentres a panned circle. Linear rows hold 30-60 bases to fit their column, and a selection made on the circle turns the linear map to its page.
Alignment studio, two tab levels: the "Homology & Alignment Lenses" tab bar is gone. Distances, Lengths Graph, Virtual Gel, Fragments and Member Annotations (with its CSV export) open as inspector panels beside the grid; Chromatogram and QC Report are modes for contigs, traces and read lists; Dotplot mode draws the alignment's members; the Flatfile tab shows the alignment text with the grid's own consensus and label; the History tab's lineage opens linked documents; and the grid starts about 190px higher.
Record bar: opening a document (import, File › Open, a new sequence, an analysis result, a Navigator or search pick) folds the document table into a one-line bar showing the record's name, length, topology (none for proteins and enzyme sets) and status, giving the viewer about 148px. One toggle, "Show document table", restores it and agrees with View › Document Table and the native menu; selecting rows never folds it, and a restored session shows it as saved.
Figure first in Cloning & Gel and Phylogenetics: from a 900px canvas the controls sit in a 400px column that scrolls on its own beside the results, and the gel or tree stays in view. The gel shows on every tool tab, followed by the fragment table and a closed co-digest buffer plan whose star-activity caution also shows in the gel's header. The tree comes first, then any warning and the metrics, with the method note and Newick behind a "Method and Newick tree" disclosure. Gel labels stay at 11px or more on screen.
Accessibility floor (WCAG 2.2 AA): low-contrast text (sidebar counts, start-page links, KPI values, the map readout, the cockpit scale badge, Type IIS pills) now reads at 4.5:1 or better in both themes using the existing palette; the BLAST identity legend prints in ink with a hue swatch; no interface text is below 11px (alignment ruler included); circular-map labels are 9px or more on screen, ring coordinates are drawn whole and thinned when crowded, and the map says how many sites it left out; small controls are at least 24px; every icon-only button has a name and announces its shortcut; and every alignment residue keeps its hue while its letter reads at 4.5:1 in light and night themes.
Studios lead with what you came for: a structure with coordinates opens on its 3D viewer (predictions follow), a protein without coordinates opens on its predictions, and a Guided Pipelines report shows its steps first, with the pipeline catalogue folded into a one-row picker once a report exists.
Plain words: tree headings name the method that actually ran (for example "Neighbor-Joining tree" when Maximum Likelihood was chosen but no ML search runs, or "Maximum-likelihood tree (PhyML, GTR+Γ4)" for a desktop run), the scale bar reads "subst./site" once, headings drop library and storage names, decorative badges are gone, dialog titles drop the menu ellipsis, the status bar no longer shows the host OS, view-tab arrows appear only when the tabs overflow, and a trace under 20 bp after trimming warns before it can be saved.
One design scale: every text size, corner radius, layout gap and bar height now comes from the scale recorded in DESIGN.md. Half-pixel text steps snap to 11px or 12px (the status bar goes from 11.5px to 11px), card padding and grid gaps tighten by 2px, and card corners settle at 12px. The splash's summary, licence, status and version lines now use the 15px headline size (from 17-20.8px), and the pairwise KPI values match the MSA's 15px. The 8-9px feature swatches are sharp squares. Colours, fonts, chrome heights and the MolBioCraft wordmark lockup are unchanged on every surface.
3D superposition, Model B: a structure ticked in the document table beside the open one is compared with it by default; a pick in the Compare with list still overrides it.
Pairwise alignment: match, mismatch, gap-open/extend and protein matrix (BLOSUM62/PAM250) are now user settings with BLAST defaults (blastn 2/−3, 5+2k; blastp BLOSUM62, 11+1k), replacing hard-coded scores. Results show identity/similarity/gap/score cards, the aligned region, CIGAR, and colour-coded blocks with correct per-sequence residue coordinates.
Dotplot: nucleotide sequences use the same canvas dotplot as proteins (word size, strand colouring, annotations, PNG export).
MSA view: a summary strip (sequences, columns, identical sites, pairwise identity, gap-free columns, mean length, aligner) sits above the alignment, and preset names describe what the built-in engine actually does.
The Linux CI job frees disk before its coverage steps, so a red run means a real failure. (BG-01M6S2VQ)
The studio's nucleotide dotplot draws PRD F11's window-11, minimum-9 matches on both strands by default and names its method on the figure, its export and the file name; exact word matching remains an option. (BG-01M6RJG0)
The reference-suite check fails when the private-data test passes without its folder, and a versioned pre-push hook (scripts/git-hooks, enabled with git config core.hooksPath scripts/git-hooks) refuses any branch whose history holds the pre-strip GPL commit. (BG-01M6QFHR)
Alignments, folds and repeat scans cut at an input cap now return a warning naming the cap and what was left out. (US-01M6P244)
In the stacked layout the expanded document table sits below the map and sequence (drag the handle up to grow it), the folded record bar stays on top, and empty-state hints say the table is below. (US-01M6S7T2)
The reference check fails when the private-data test passes without its data (folder absent or holding no .fsa file), and a pre-push hook installed with sh scripts/git-hooks/pre-push --install refuses any push whose history holds the pre-strip GPL copies, from every checkout. (BG-01M6QFHR)
REST and RPC: translate_sequence now replies {protein, warnings} and find_orfs {orfs, warnings} instead of a bare string and list, VCF annotation replies gain warnings, and an unknown genetic code id (for example 258) translates with table 1 plus a warning instead of wrapping to another table. External callers of /api/v1/rpc must read the new shapes. (US-01M6P2QH)
in the stacked layout the document table sits below the sequence view; keyboard focus stays on the Document table toggle across a fold; empty-state messages name where the table is. (US-01M6S7T2)
the alignment studio's Virtual Gel and Lengths Graph fit their panel with legible axes; Export Gel (SVG) saves the same window-independent file as the Export menu; panel renamed "Gel & Darkroom Controls". (US-01M6S7ZF)
On the alignment studio's MSA grid, the inspector button, Cmd/Ctrl+Alt+I and View › Panels › Inspector now hide and show the studio's own side panel, its resize handle and its icon rail, and the grid takes the freed width (Fit to window and wrapping use it). A close also hides the rail's five result panels (Member Annotations, Distances, Lengths Graph, Virtual Gel, Fragments); they come back on reopening at the panel's dragged width, refitted to it. The Chromatogram and QC Report views have no inspector button. (US-01M6TA6T)
repeat totals now count every copy pair, so they rise sharply on repetitive sequence; N no longer forms or extends a repeat arm. (BG-01M6S1P2)
the repeat scan stops after comparing 10,000,000 copy pairs, where 250 kb of a 10%-diverged (GGAAT)n, as in HSat3, holds over a hundred million. A scan that stops gives its total as a lower bound: the Genomics studio reads "at least 10,000,000 Repeats" and "80 of at least 10,000,000, the longest found before the scan stopped", the warnings say the scan stopped, and the RPC reply carries totalIsLowerBound: true. The scan compares direct repeats before inverted ones, so when it stops among the direct ones a further warning says inverted and palindromic repeats were not compared. Totals under the bound stay exact, and every repeat caption names its arm length ("arms ≥ 10 bp, top 80 of M"). The bound counts pairs, not time: a long run of identical copies, such as a 250 kb poly-A, compares fewer pairs and can still take most of a second. (BG-01M6SQ9T)
the Genomics studio's Min Repeat Arm box scans 400 ms after the last keystroke, or at once on Enter or when it loses focus, and only at a whole number from 8 to 24; it used to scan on every keystroke, a partial "1" at 8. Until the new scan lands, the repeat list and its caption stay those of the arm they were computed at, and Enter or blur on any other value puts the box back to the arm in use. (BG-01M6SQ9T)
the protein tab's coverage note names the ORF or frame the engine translated, in document coordinates. (BG-01M6S13D)
every map, list and table that draws a subset says "the N longest of M" or "first N of M" (ORF ring, map arcs, linear schematic, contig circle, distance matrix and its TSV, split pane, consensus sites, variant calls, Viterbi segments, HGVS records); the chain table lists every chain the engine returns; sampled pairwise identity and mean GC are marked approximate. (BG-01M6S1AA)
A span or oligo holding N or another ambiguity code, in either case, now reads Tm n/a with its reason, "Tm n/a: the span holds k N or other ambiguity base(s); Tm is computed on A/C/G/T only, as Primer3 does", where it used to read a number: the construct cockpit, the status bar, the selection quickbar, Statistics, the Primer studio's custom-oligo Tm, the Oligo calculator of the new-sequence dialog, the primer import's Tm (°C) row and the cloning studio's Gibson arm. The Oligo calculator no longer deletes ambiguity codes and the primer import no longer rewrites them to A before a Tm is computed. The engine's calculate_primer_metrics keeps tmC a number and adds tmNoAnswerReason, which primer records and Gibson junction replies also carry; Gibson junctions holding N are no longer judged optimal or AT-rich, and the cloning simulator's arm and junction labels read "(Tm n/a: ...)". PCR primer design, site-directed mutagenesis and annealed oligos give the reason in a warning (and the mutagenesis and annealing history lines) for a primer or duplex holding N, the sequence view's primer label reads "Tm n/a" for a primer record carrying the reason, and Test with Saved Primers notes its effective Tm as n/a. A selection of 14 or more bases with fewer than 14 A/C/G/T read n/a before; one holding any ambiguity code now does. A gap ('-') or a stop ('*') in a span is no base, as the engine's composition reads it: it is not counted as an ambiguity code, and the quickbar takes the Wallace rule or the 14-base formula on the span's letters, as the status bar does, where it counted a gap in the length. (BG-01M6SHQ0)
The macOS app is built by the Tauri bundler: the disk image holds MolBioCraft.app and an Applications link, and shows the licence as an agreement when it is opened; LICENSE.txt, NOTICE.txt and README.md are no longer at its root (NOTICE and PROVENANCE.md stay in the app's Contents/Resources and are published beside the installers). Finder now offers MolBioCraft for the file types tauri.conf.json declares (.mbc, .gb, .gbk, .fasta, .fa, .fna, .faa, .ab1) rather than the 17 of the earlier hand-built bundle, which also listed .embl, .gff3, .dna, .pdb, .cif, .vcf, .fastq, .sam and .bed. (US-01M6TK7V)
Google Sans and Google Sans Code: the interface text is set in Google Sans (weights 400-700, with a real italic) in place of Inter, and sequences, coordinates and code in Google Sans Code in place of IBM Plex Mono. Both are bundled (SIL Open Font License 1.1), so the app still needs no download. Residue columns keep their 0.6 em advance; the mono line box is 1.252 em (from 1.3 em), so the circular map seats its coordinate labels a little closer to the ring. Exported figures (the alignment image, the dotplot's labels and the summary SVG) name the new faces, and the places that named JetBrains Mono, which the app never bundled, now use Google Sans Code. A few symbols Google Sans does not draw, such as ⌘, ⌥, ⇧, ▶, ▼, ★ and ⚠, are drawn by the system font, as ten of the interface's symbols already were. NOTICE now lists every bundled font with its copyright and licence. (US-01M6V6VN)
The gel's darkroom stain buttons show each stain's own colour and name, with no icon, and their accessible names include the visible name. (US-01M6T9QY, BG-01M6TA8Q)
The gel and the tree stay beside their controls while the inspector is open, down to a 660 px canvas. (US-01M6TA1H)
Run assembly preview sits in the header of the chromatogram's contig card on the canvas, and the pre-trim toggle sits with Contig Assembly in the inspector. (US-01M6TA87)
On the Tree view the phylogeny module draws its heading, badge and any external-program notice above a full-width tree in the workbench. (US-01M6TAZE)
The Genomics studio runs synteny, gene prediction and the CpG scan after render, showing Scanning… until each lands, so large genomes no longer freeze the tab. (BG-01M6T6HW)
The variants table says "No variants called; the warnings above say what was not compared." whenever the caller raised a warning, instead of "100% identical". (BG-01M6TE8J)
Fixed
Minimum Evolution and Maximum Parsimony no longer save a tree on a made-up distance: when a pair's distance is undefined under the chosen model (no shared sites, or too divergent), Build Tree refuses with the engine's sentence naming the pair, as Neighbor-Joining and UPGMA do. Before, the pair silently got twice the largest real distance and the tree was saved under the model's name. A bootstrap or jackknife replicate that meets such a pair is now counted in the tree's warnings. (BG-01M6SB24)
VCF annotation reads every NCBI genetic code: coding consequences now use the same NCBI tables as translation. Before, codes 3, 5, 9, 13 and others were read as the Standard code with no warning, so, for example, TGG>TGA under code 5 was called stop_gained instead of synonymous. (BG-01M6SC3D)
Startup tagline: the splash shown while the app loads breaks the tagline in the same place as the app's own splash, so it no longer reflows at the handoff. (BG-01M6ZGN1)
Mol settings panels open*: the Screenshot / State and Settings / Controls Info panels opened with no height once the toolbar moved to the bottom, and the Toggle Controls Panel button had no panel to show; both now open. Full-window view no longer gets stuck because the viewer's container trapped its fixed position.
Construct cockpit ORF badge now reads the whole selection: its codon count, internal stops and last codon were taken from the first 4,000 bp only. A cut peptide preview says so in residues, a terminal stop codon not counted, for example "(first 12 aa of 3,332)" (or "(first 18 aa of 40)" for a protein), and the In-Frame badge's "(N aa)" counts residues the same way. The status bar and the selection quickbar read "Tm n/a" for a selection of 14 bases or more with fewer than 14 A/C/G/T bases, instead of a negative or 0 °C Tm.
Large sequences, map ORF floor and readouts: the circular map says its ORF arcs show only ORFs of 120 aa or more (or the slider's minimum) in the first 60,000 bp, the split pane works out its cut-site scan from the same rule as the main view, the construct cockpit's GC, skew and duplex Tm cover the whole span instead of its first 4,000 bp, and the selection quickbar uses the Wallace Tm rule only below 14 bases, as the status bar does, with N and other IUPAC codes left out of GC and Tm in both.
Large sequences' split pane, ORF arcs and selection readouts: over 150,000 bp the split pane's linear view says where its cut sites stop, as the main view does, and the circular map says "ORFs: first 60,000 bp" when its ORF arcs come from that range only. The status bar's selection readout and the linear view's selection bar give the whole selection's GC and Tm instead of the first 12,000 bp's. RNA Statistics read "A / C / G / U" and "%GC / %AU" with U counted once, and the ORF list follows a change of topology.
Mixed-peak counts: the chromatogram studio states each read's real number of mixed IUPAC peaks in the cockpit, the parameters tab, Trace Statistics and the trimming section ("19 of 74 in the trimmed region", "311 over the whole read") instead of the 32 its peak list stops at, and the peak table says when it lists only the first 32.
Large sequences, ORFs, cut sites and statistics: on sequences over 150,000 bp the ORF counts name the range and minimum scanned, and the linear map says where its cut sites stop; Statistics are counted on the whole sequence instead of scaled up from a 12 kb sample, and a Dam or Dcm count that fills its 4,096-site list reads "at least 4,096".
Large sequences' restriction sites: a sequence over 150 kb no longer reports the sites in its first 60,000 bp as the whole molecule's. The circular map's note names the range scanned at every map size, zoom and pan ("9,570 more labels not shown, first 60,000 bp scanned", or "Cut sites: first 60,000 bp only"), the Restriction Analysis header and its "Cutting once in the first 60,000 bp" list name it too, and neither the map (no bold blue), its plate ("cut once", not "unique") nor the construct cockpit marks a unique cutter from it; the plate keeps its annotation count. A sequence over 100 kb, scanned with the 28 core enzymes, says so on the map's note, in Restriction Analysis and in the Hybrid tools Enzymes view ("Cutting once among 28 core enzymes").
Chromatogram trimming: the studio shows no high-quality region, trim coordinates, mean Phred or Save for a trace whose qualities do not support one, and says why: "No high-quality region" when no base beats the cutoff, "No quality values in this file" when it has none (said that one way on every surface), or "29 quality values for 30 base calls" when the file's quality values and base calls differ in number. Beside no region the mixed-peak count reads "over the whole read", and every HQ-window surface names its fixed P(err) cutoff 0.05. The engine's own trim reply is unchanged (BG-01M6RPCA). A read the trim cannot score (no quality values, or quality values that do not match its calls in number) says "Not trimmed" and why, instead of being reported as trimmed to 0 bp and too short to use.
3D Structure badge now says where the coordinates come from, as the structure file states it: "Measured Cα coordinates (X-ray)", "(NMR)", "(neutron)", "(fiber diffraction)", "(powder diffraction)", "(electron crystallography)" or "(solution scattering)"; for electron microscopy "(cryo-EM)" only when the mmCIF file says the specimen was vitrified, "(negative-stain EM)" only when it states a negative stain for a specimen it does not say was vitrified or unstained, and "(electron microscopy)" otherwise, as for every PDB file; any other method as the file states it; "Predicted model (AlphaFold, pLDDT in B-factor)" for an AlphaFold model, "Predicted model" for another model (a ModelCIF file, or a method that begins THEORETICAL MODEL or PREDICTED MODEL); and "Cα coordinates (source not stated)" when the file says nothing, even if its title mentions AlphaFold. A predicted model is no longer called measured, and a protein with no coordinates shows no badge.
Multi-record EMBL and GenBank files: a first record with no sequence (a CON or CONTIG record) now ends at its // line, so it keeps its own name, description, length and features instead of taking the next record's; test-data's Human_contigs.embl reads as AJ229040, "Homo sapiens 959 kb contig between AML1 and CBR1 on chromosome 21q22", as Biopython reads it.
Circular map identity plate now counts every unique site the Restriction Analysis list holds (35 on pUC19) instead of the 32 at most the map can label, and with all cutters shown it counts every cut site (429 on pUC19) instead of 32.
GenBank and EMBL import keep the continuation lines of a wrapped unquoted qualifier (/transl_except, /anticodon, as NCBI and Biopython write them), which were read into the feature's location, so a long /transl_except no longer imports cut short. Export writes a double quote inside a qualifier value as two (INSDC's rule) instead of an apostrophe, and import turns each pair back into one, including a value that begins or ends with a quote or has a doubled quote at a line break. A value whose last line ends in an unescaped quote and the closing one, such as /note="cloned from "pUC19"", ends there when the next line begins a qualifier ("/" and a name, then "=" or the line's end) or a feature or ends the feature table, as Biopython reads it, so the qualifiers after it are kept. Export's own files read back unchanged: where a line would end in doubled quotes before a line that begins a qualifier, export breaks at an earlier space instead or, with none on the line, at the first later space that reads right, so that line runs past column 79 with no upper bound (with no such space the rest of the value stays on that one line; this happened in none of the 79 reference files); inside a run with no space a width cut also steps back past one doubled quote; no other line break moves. Limits: a run with no space longer than its line still reads back with a space where it was cut; after a line ending in doubled quotes, a line beginning with "/" but no qualifier name (/gene; ..., /cgi-bin/...) stays in the value, where Biopython 1.88 reads it as a new qualifier, in MolBioCraft's export as in its own; and a quote left unescaped at the end of a line before the last closes the value there, so /note="cloned from "pUC19" then and more text" reads as cloned from "pUC19 and more text" (Biopython: cloned from "pUC19" and more text).
GenBank and EMBL import keep every value of a repeated qualifier: a feature's several /db_xref, /transl_except, /note, /EC_number or /inference were cut to the last one; each is now kept in file order and export writes one line per value, so a re-exported NCBI record keeps all its cross-references. A feature's notes hold every /note, its name comes from the first value, and a repeat written with no value (a second /pseudo) adds none, as in Biopython. Several notes still display run together in the feature table.
GenBank and EMBL round trips keep a description's own final full stop: GenBank export writes the DEFINITION's full stop after one the description already ends with ("Bacillus sp.."), and import drops only that one, so "Bacillus sp." reads back unchanged, as Biopython writes and reads it. EMBL import no longer drops the final full stop of DE, which has no such convention.
Banded alignment no longer returns an empty result scored -858,993,459 when its band would exceed rust-bio's 5,000,000-cell limit: such pairs are aligned in full when small enough, otherwise in a narrowed or diagonal band labelled a heuristic, or, when no band can hold the pair, a "Not aligned" result with no rows and score 0; large local alignments past 50 M cells use the extended k-mer band (BG-01M6Q0K7).
Banded global alignment within 5,000,000 cells now returns the exact Needleman-Wunsch optimum, and above that budget it keeps the better of the k-mer chain band and the extended band, so its scores can also rise (for example from -1,739 to 390 on a 3,147 x 2,482 homolog whose optimum is 588); every banded result above the budget is labelled a heuristic that can score below the optimum (BG-01M6Q2R6).
BLAST queries: a pasted FASTA header or ; comment line is no longer searched as query residues, including a header indented by spaces, tabs or no-break spaces, or one after blank lines or a UTF-8 byte-order mark; hits, coordinates, scores, coverage and the query cap count only the letters of the record under the first header. Text before that header is ignored, and of several records only the first is searched; each hit carries a warning saying so. An empty first record finds nothing; the record after it is not searched in its place. A subject's sequence is read as a sequence, not FASTA text, so a header sent in it (a REST client's docs[].sequence) is still searched as subject residues (BG-01M6QHDJ).
BLAST now warns when a query is longer than the program's cap (10,000 letters; blastx 30,000 nt) and only its first part was searched, including when that search finds no hits; with no hits it also says when a FASTA query held several records or text before its first header. These notices print lengths with separators (10,000 nt), and the window counts only the query letters the engine reads. Annotate by BLAST records, in the History of each target it searched only up to blastn's cap, the range searched and the target's length, even when it added nothing to that target, and its status message points there (BG-01M6Q0VH).
GenBank and EMBL export wrap a long /product, /gene, /note or definition between words, as Biopython does, so a re-imported file keeps the text wherever each word fits on a line; before, qualifiers other than /label, /note and /translation broke at a comma, or mid-word where none was in reach ("...phosphotrans ferase..."). /anticodon and /transl_except values, which have no spaces, break after a comma and read back unchanged. GenBank import keeps a full stop that ends a DEFINITION line ("E. coli" no longer reads back as "E coli"), and a value whose last word fills its line no longer gains a trailing space. Some text still cannot survive the trip: a word longer than the room on its line (58 characters in the feature table, or for a qualifier's first word the room after its key, 48 after /product=; 67 in DEFINITION, 74 in DE) is broken after its last comma that fits or, with none, cut at the width (as Biopython cuts it in the feature table; Biopython instead writes an over-long DEFINITION or DE word whole on a longer line), and reads back with a space at the break, so a URL that long is cut too; a run of spaces at a line break reads back as one (BG-01M6Q2G5).
Map to Reference / SAM import variant table: a multi-base insertion is one row carrying its full inserted sequence, supported by the reads that carry it out of the reads covering the base before it, as a samtools pileup counts it. Before, each inserted base counted as a supporting read and as coverage, so a 4-bp insertion in one read showed as one G row at 4 of 4, a homopolymer insertion in 1 of 2 reads showed 100% instead of 50%, and a mixed-base insertion showed one row per base; an insertion's coverage is now taken at the base before it rather than the base after it. An insertion that opens a SAM read's alignment has no anchor base and is no longer counted (BG-01M6Q0XK).
Every installer now ships NOTICE and PROVENANCE.md, so the third-party notices reach users, among them the CC BY 4.0 attribution (NOTICE section 6) owed for the Ramachandran region maps derived from the Richardson Lab Top8000 data. Before, they carried LICENSE but not NOTICE. The files are in Contents/Resources of the macOS app, in the install folder of the Windows MSI, and in /usr/lib/MolBioCraft and /usr/share/doc/molbiocraft/ of the Linux .deb; for the portable Windows EXE they are published as NOTICE.txt and PROVENANCE.md beside it.
3D superposition KPIs said residues were paired by position; the engine pairs them by a global sequence alignment. The boxes now read "Cα pairs (sequence alignment)" and "TM≈ (approximate TM-score)", new "Chain pair (A / B)" and "Sequence identity" boxes name the chains superposed and how alike they are, and the verdict names the chain pair (each chain by its author id, as the Ramachandran plot and the selection badge name it, with the mmCIF label id beside it where the two differ) and the engine's pairing method, counts the paired residues over those two chains, and says TM≈ is scored on the sequence-paired superposition rather than searched for as TM-align does. The viewer's pair badge names the method too.
MSA presets: the POA preset dropped residues and was rejected on every input; it now uses the rust-bio partial-order consensus as a backbone and keeps all residues. The MAFFT/MUSCLE presets left gap-only columns and reported stale identity statistics after refinement; refinement now drops gap-only columns, recomputes all statistics, and keeps a pass only if the sum-of-pairs score improves.
Protein MSA scoring: center-star alignment of proteins uses BLOSUM62 with BLAST-like gap costs (open 10, extend 1) instead of nucleotide-strength gap penalties.
Semi-global pairwise: unaligned flanks of the query are shown rather than silently dropped, and the result is labelled "Semi-global".
Consensus thresholds: residues tied at a percentage threshold now produce an IUPAC/X ambiguity code instead of an alphabetical pick.
p-distance uses pairwise deletion of indel columns, consistent with the JC69/K2P corrections.
Alignment input validation rejects mixed nucleotide/protein members and any backend result with gap-only columns.
Unaligned sequence lists no longer show a meaningless consensus and identity track.
The ancestral reconstruction report prints each node's mean confidence as the engine's percent (for example 81.0%), not 100 times too large. (BG-01M6S1T0)
On documents over 100 kb the Digest and Clone dialogs say their enzyme counts cover only the 28 core enzymes. (BG-01M6S1D2)
An exported gel figure (SVG, PNG, JPEG, PDF) is the same from every window size, with full-size labels; the on-screen gel is unchanged. (BG-01M6RJZB)
The Genomics variants tab no longer crashes on samples of about 32.7 kb and over: the caller aligns long samples in blocks, keeping engine memory small. (BG-01M6S1QP)
The record bar and the document table show OK only when every check ran and found nothing; records whose checks did not run say "Not checked" or "Partly checked", the Status sort and filters follow the same state, and a chromatogram no longer reports a made-up 2.0x coverage. (BG-01M6S1B3)
GenBank and EMBL export write a line break in a description as a space, so a description holding a "//" line no longer cuts the record short, and GenBank import reads on past an indented "//" inside ORIGIN. (BG-01M6RRQW)
An unknown protease, scoring matrix, alignment mode or genetic code now falls back with a warning naming what was asked for and what was used; an MS digest of an unknown protease reports Trypsin as the protease, and a genetic code id over 255 no longer wraps to another table. (US-01M6P2QH)
A Sanger read with no base above the quality cutoff now trims to no region instead of the whole read, in the engine trim, the viewport and contig pre-trim, so contig assembly leaves such reads out. (BG-01M6RPCA)
Statistics weighs DNA from its composition as Biopython 1.88 does (circular molecules as closed circles, ambiguity codes marked approximate), counts the whole sequence once per sequence outside rendering, and the 100-150 kb map note says the whole sequence was scanned for the core enzymes. (BG-01M6RTP1)
The default dotplot never draws N or another ambiguity code as a match, no longer lets an N gap stop a long scan early, reads U as T on both strands, and says where a capped scan stopped. (BG-01M6RJG0)
The cockpit's residue total counts to the first stop as Biopython does, a preview that reaches a stop ends on it, and the cockpit and Statistics read Tm n/a where the basic Tm has no answer. (BG-01M6RZJF)
motif search past 262,144 bp listed only plus-strand hits and read "100 FM-Index hits"; the badge now shows the total over both strands and a cut list shows "Showing the first 100 of N hits." under Search warnings. Every listed hit (up to 100) has a jump button. (BG-01M6S17C)
Translation Statistics names the range it translated, reads a minus-strand CDS from its reverse complement and an origin-spanning CDS in its two pieces, reads "0 aa" for a range with no complete codon, and with no selection or CDS translates the first 900 bp. The 64-Codon Table shows all 64 codons. (BG-01M6S17C)
past about 75 kb the restriction scan stopped at 12,000 sites, so frequent cutters read as single cutters and cutting enzymes as noncutters; every site is now counted, a capped enzyme reads "the first 2,000 of N sites", non-core enzymes over 100 kb read "not scanned", digests list every fragment, and a methylation alert from a stopped scan reads "At least N". (BG-01M6S1K2)
calling variants on a sample of about 40 kb trapped the engine; samples over about 11.4 kb are now aligned in anchored segments and long indels are called where an exact alignment calls them. (BG-01M6S1QP)
STR, gene, repeat and synteny counts read the capped list length; they now show totals with "top/first N of M" captions and warnings, and an inverted repeat is one hit at its full arm length. (BG-01M6S1P2)
whole-genome synteny read related genomes over 600 kb as less shared than they are, because it indexed genome B only every b.len()/300,000 bases: a 3 Mb pair about 99.5% identical read under half covered. Every base of B is now indexed, and such pairs read 99% or more, each block at the coordinates its bases were copied to. N and other ambiguity bases stay in place: blocks past an assembly gap keep each genome's own coordinates (they were shifted by the gap's length), no block crosses one, and coverage is of genome A's A/C/G/T bases. A "Synteny warnings" note beside the Aligned Bases & Coverage KPI names each genome's ambiguity bases and that denominator, sentence for sentence. A block must now score at least 24, at +1 per matched base and −2 per mismatch, where it had to be 16 bp long, so two unrelated genomes share no chance block (two unrelated 2 Mb genomes read 7.7% syntenic under the length rule, Mauve; they now read 0%, as unrelated 300 kb and 5 Mb pairs do). (BG-01M6SKKV)
synteny's minimum block score dropped the short collinear blocks between close indels. A block that scores less now counts when it links to the blocks beside it (on the same strand, across an insertion or deletion of up to 32 bases and at most 32 bases of genome A) and the chain reaches the score together, and the bases past each indel, which match the block before only by chance, go to the block after it. Where two blocks meet across a larger insertion or deletion (up to 1,000 bases), those chance bases also go to the block after it. On 300 kb pairs with an indel every 40 and every 25 bp, coverage at the coordinates the bases were copied to reads about 92% and 85%, where it read 78% and 63% (Mauve). A copy of a repeated element that follows an insertion into genome B or a deletion from it of up to 1,000 bases is now placed on its own copy, on either strand. It used to be skipped, or put on another copy and labelled a rearrangement, which after a 30 or 100 bp deletion happened in most trials with LASTZ. A seed off the diagonal of the block before it, held once in genome B, is no longer taken where the bases past it lie on that diagonal, so a repeat held twice also stays on its own copy far more often. (BG-01M6TAB2)
epitope prediction stopped at 16 regions and dropped a region running to the C terminus; the 3D contact overlay drew 160 contacts from the first 600 atoms; protein analysis covered only 4,000 aa. Every region and contact is now reported, proteins are analysed whole up to 40,000 aa, and a coverage note says what was analysed when anything is cut. (BG-01M6S13D)
on sequences over 300 kb CRISPR off-target counts came from a sampled seed index (a guide with 9 seed copies could read as a unique seed, specificity 100) and the two strands were searched over different halves of a sequence over 500 kb; counts are now exact over the whole sequence on both strands up to 8 Mb (a warning names the range past that), and the tab reads "top 25 of N Guides". (BG-01M6S15R)
the variant caller stopped at 500 variants and annotated 30, and invented insertions at a 100 kb cut and after net deletions over 200 bp; it now reports, annotates and exports every variant in the aligned part and warns where calling stopped on a sample over 100,000 bp. (BG-01M6S1ED)
the chromatogram consensus contig used only the first 6 ticked reads, each cut to 1,200 bp, and partly overlapping forward/reverse reads could hang or crash the engine; every ticked read is now used whole, warnings name any read left out or cut, and the KPI reads "N of M reads". Known issue: a contig of partly overlapping reads is still short and garbled (BG-01M6SQ2Y). (BG-01M6S17N)
ancestral reconstruction stopped at 60 nodes and 2,000 sites, the selection scan at 500 variable codons, the time tree at 60 nodes and the site-rate profile at 10,000 sites, with no notice; every row is now listed and reports say how many, LD statistics state the biallelic sites and pairs they used, and studio tables over 10,000 rows say so. (BG-01M6S1GB)
capped engine replies carried no total: the banded alignment now warns with each sequence's true length when it cuts, the composition reply counts every Dam/Dcm site and warns past 4,096 listed, and desktop Import Folder says how many supported files past 500 it left out. (BG-01M6S17Y)
silent-mutation candidates stopped at 3,600 nt, feature extraction at 12, annotate-from-documents skipped features over 5 kb and across the origin, and the pipeline CAI read the first 1,800 nt; each now reads the whole gene or feature set (extraction up to 2,000, transfer up to 20,000 bp) and says what a list leaves out. (BG-01M6S1Q9)
HMM segmentation, the TF-motif scan and the minimizer chainer ran on the first 100, 60 and 120 kb but reported as whole-genome results, and minus-strand TF hits were placed at the wrong coordinates; each now covers the whole genome up to 12 Mb with a covered-range warning past that, and the TF table ranks the best 250 hits across every matrix. (BG-01M6S1C1)
The protein tab no longer crashes on a DNA document that translates to no residue; it reads "n/a: no residue translated". (BG-01M6SQXX)
A join of complemented parts imports on the minus strand in the right order, so its CDS translates correctly. (BG-01M6SMBS)
The Split Top / Bottom help text says the document table sits below the viewer. (BG-01M6SHDC)
The variant caller keeps N and other ambiguity bases in place instead of dropping them, so it no longer reports false indels and shifted coordinates beside them. (BG-01M6T6GK)
Eleven primer-record Tm displays now show the no-answer reason for a primer holding N. (BG-01M6T6RZ)
The gRNA pipeline reports the number of guides found, not its capped list length. (BG-01M6T6JA)
A Sanger contig no longer silently collapses a tandem repeat holding the reads' whole overlap: a read placed only inside a repeat is left out and named, and the notes say which read the contig follows. (BG-01M6TD2N)
An empty reference or sample says there is nothing to compare instead of reading 100% identical. A real deletion beside a reference N run is no longer turned into a false call, and a SNP beside an N run of the wrong length is called rather than hidden. Run and left-out-indel warnings are capped at 20 with a count of the rest. (BG-01M6TE8J)
The release and nightly reference check reads cargo's coloured target lines, so a clean coloured run passes instead of reporting "cargo test ran no test target". (BG-01M6V3SC)
The Windows MSI builds: the .mbc file type is described as "MolBioCraft Session and Workbench File", without the bare ampersand the MSI source could not hold. (BG-01M6V9Q0)
Fixed — alignment statistics, search and variant calling (molbiocraft-align)
% pairwise identity and % identical sites are MolBioCraft's own values on MolBioCraft's own alignments, and an independent computation reproduces them exactly on each of the four aligned samples that carry the pair (COXII CDS 72.2/33.2, Pairwise protein 46.1/46.6, Three Kingdoms 36.1/6.3, Transcript variants 93.3/87.1). Identity is pooled over all pairs within each pair's overlap (end gaps not compared); a site is identical when every sequence spanning it has the same residue. Contig statistics mask the regions a row marks "Trimmed". scripts/outside-data/ref_align.py recomputes both statistics, without MolBioCraft's code, from the rows the sample library ships, and records them with the rows' SHA-256 in test-data/reference/align.json; a regression test checks each sample's stored and recomputed values against that record.
BLAST: removed the floors that forced every subject to report a raw score ≥ 18 and bit score ≥ 24.5; hits with E > 10 are dropped as in BLAST, query coverage is no longer clamped to ≥ 12 %, and the organism column shows the record's organism instead of a guess from its name.
Variant caller: the "FreeBayes" panel was a k-mer heuristic with invented qualities. It is now an alignment-based difference caller (banded semi-global alignment against the reference window) that reports SNPs, MNPs, insertions and deletions with VCF left-anchoring, haploid GT and QUAL "."; reverse-strand reads are reverse-complemented; missing base qualities are 0, not 35. The UI and VCF header describe it as such.
WASM contract: two RPC arguments were sent under the wrong key (bins, bothStrands), so protein motif searches always scanned both strands.
Fixed — phylogenetics and molecular evolution (molbiocraft-phylo)
Distances: no clamps; saturated or non-overlapping pairs are reported as not computable ("n/c") instead of being forced to a number; delta-method standard errors; within/between/net group distances come only from real group labels (a sequence description that reads Group: …, or an imported Group metadata field), not from splitting the taxon list in half. JC69, K2P, T92 and TN93 agree with independent implementations to 5×10⁻⁵ on Drosophila Adh.
Trees: Neighbor-Joining and UPGMA no longer clamp branch lengths or the reduced distance matrix (which could change the topology); NJ is validated on the Saitou & Nei textbook tree and midpoint-rooted. The "bootstrap" was a nearest-neighbour check clamped to 72–100 %; it is now a real non-parametric bootstrap (Felsenstein 1985) with split frequencies on the nodes. Invented log-likelihood offsets for RAxML/PhyML/MrBayes/FastTree and clamps on tree length, CI and RI were removed; ML, MP, ME and the external programs are labelled for what is actually computed (NJ topology scored by parsimony and JC69 likelihood).
New likelihood engine: GTR-family models (JC, K2P, T92, HKY, TN93, GTR) with discrete Γ (Yang 1994 mean rates) and invariant sites, Felsenstein pruning over compressed site patterns, ML branch lengths (Brent, exact edge likelihoods) and BFGS model parameters. Likelihoods agree with an independent numpy/scipy implementation to 10⁻¹⁰; optima agree to 10⁻³.
Model selection was a formula with fixed per-model bonuses and hard-coded Γ/I values. All 24 DNA substitution models are now fitted by ML and ranked by BIC/AICc (on demand, from a button).
Substitution matrix (previously invented with pseudocounts and multipliers) is the ML TN93+G estimate in the r_ij convention (the 12 off-diagonal rates sum to 100) with κ₁, κ₂ and R. Disparity index uses complete pairwise sites and a 1,000-replicate Monte Carlo test (the p-value was invented).
Ancestral sequences: marginal ML reconstruction (TN93+G) and Fitch parsimony at every internal node of the tree (previously a weighted column count with fixed 98.9/96.2 % "confidences").
Selection: Nei–Gojobori with pathway averaging and stop-codon exclusion, Jukes–Cantor correction, bootstrap-variance Z-tests and Fisher's exact test (pseudocounts, floors and an invented SE were removed). Tajima's D uses complete-deletion sites without clamping. Per-codon values are labelled as descriptive p_N − p_S, not SLAC/FEL.
Site rates: ML Γ shape and empirical-Bayes site rates (previously entropy heuristics); the chart shows the whole alignment.
Molecular clock: ML likelihood-ratio test with clock-constrained node heights (verified against scipy) and strict-clock node ages; RelTime, CI bars and CorrTest — which were invented numbers — are reported as not implemented. Tajima's relative-rate test counts only unambiguous sites.
User trees are actually parsed and evaluated (likelihood, AICc, parsimony, OLS fit to TN93 distances); the hard-coded R² 0.9942, SSE and "gene duplication" nodes were removed.
Population genetics: π and θ use complete sites only; Fu & Li's F* uses the Simonsen et al. (1995) corrected variance; Fay & Wu's H is computed consistently on the ingroup; Rm/LD use all SNPs. McDonald–Kreitman counts changes per site, uses Fisher's exact test and no pseudocounts. Haplotype diversity has Nei's (1987) SE (was a constant ±0.024).
Data explorer: degeneracy is counted only where all sequences agree (it used to guess 0/2/4-fold from codon position for incomplete codons); ambiguity codes count as missing.
Missense diagnosis: conservation and the mutant's frequency now come from the aligned homologs at that position (previously a function of the position number); Grantham classes follow Li et al. (1984).
Tree studio: uses the opened alignment as aligned (it re-aligned only the first 720 bases of every sequence), groups come from the file, values that cannot be computed show "n/a" instead of crashing, the tree scale bar always matches its label, and each analysis runs only while its tab is open.
Fixed — cloning, enzymes and thermodynamics (molbiocraft-cloning)
Restriction sites: every cut position in the 149-enzyme catalogue is verified against Biopython's REBASE tables, and pUC19's fragment sizes against Biopython's digest (BamHI 2686; EcoRI/HindIII 51 + 2635; a four-enzyme digest 8 + 21 + 22 + 2635). I-CeuI's cut offsets and BsaXI (a Type IIB enzyme that cuts on both sides) were corrected, and DpnI no longer claims to be blocked by Dam methylation — it requires it.
Site numbering: maps and tables label a site by the last top-strand base before the cut (pUC19 "EcoRI (396)"), instead of the first base after it.
Primer Tm now matches Primer3 (SantaLucia 1998 nearest neighbours with the Owczarzy 2004/2008 salt corrections) to better than 0.1 °C in every salt regime; the monovalent-only case previously used an entropy correction that was several °C out. Duplex ΔG°37 matches Primer3's heterodimer value; hairpin and self-dimer energies carry the SantaLucia salt term.
Secondary structure: the ad-hoc stacking table was replaced by the full nearest-neighbour model — Turner 2004 for RNA, Mathews 2004 for DNA, with terminal mismatches, special tri/tetra/hexaloops, bulges, 1×1/1×2/2×2/1×n/2×3/generic interior loops with Ninio asymmetry, and multiloops. Energies and structures reproduce ViennaRNA RNAfold -d0 exactly on every test sequence (63 RNA + 63 DNA).
Cloning is sequence-exact. Constructs were previously assembled by splicing the insert in at 85 % of the vector length whenever the chosen enzymes did not cut. Every method now works from real sites and fails with an explanation when the inputs cannot support it: restriction ligation checks that both ends are compatible and picks the true backbone fragment; Gibson/HiFi/In-Fusion build homology arms from the opened vector (and state the primer tails needed); Golden Gate requires matching Type IIS overhangs and warns if the product is still cuttable; Gateway needs real att sites; TA/TOPO need a linearized vector. Features are transferred with corrected coordinates — including segmented and origin-spanning ones — and features destroyed by the cloning are reported rather than silently kept.
Site-directed mutagenesis no longer shifts the requested position (it used to clamp it into a 15 bp … length−20 window) or substitute "CAC" for an empty input; the amino-acid change is read in the frame of the CDS that covers the site (either strand) instead of assuming frame 1 from base 1.
Oligo annealing finds the real pairing register of the two oligos and reports the true overhangs and the paired length (it used to take the first 4 nt of each oligo and report the top strand's Tm); non-complementary oligos are flagged instead of "annealed".
Golden Gate overhang sets are screened by rule (palindromes, duplicates, one-mismatch cross-pairings, all-A/T) rather than reported with an invented fidelity percentage, which needs the measured T4 ligase pairing matrix.
Buffer planner: enzymes outside the built-in NEB activity table report "no data" instead of a default 100 % in rCutSmart; BsmBI, BclI and XhoI were added with their real buffers and temperatures.
CRISPR guides: the "Doench 2016 Rule Set 2" and "Hsu-Zhang" labels were removed — the activity value is a GC/3'-G/poly-T heuristic and the specificity reflects only exact 12-nt seed matches within the same sequence, with no genome-wide off-target search. Cut positions were off by one on the reverse strand.
Gel: band intensity scales with fragment mass (equimolar fragments of a digest), replacing a square-root curve with an arbitrary floor; the migration model is documented as an empirical display model rather than "Ferguson/Ogston physics".
Fixed — protein biophysics and translation (molbiocraft-protein)
Molecular weight, pI, extinction coefficient, instability index and GRAVY now match ExPASy ProtParam / Biopython exactly on every test protein (GFP 26 914.05 Da, lysozyme C, insulin A chain, pyruvate kinase 50 728.87 Da). Residue masses were rounded to 2 decimals and the result to 1, the pI used an invented pKa set (off by up to 0.9 pH units), and the instability index used a 6-rule approximation of the Guruprasad table with a 2.85 default (lysozyme 30.97 instead of 16.09, poly-E 148.5 instead of 302.4). The real IUPAC masses, Bjellqvist pKa values (including the position-specific terminal ones) and the full 400-entry DIWV table are now used.
Genetic code tables 1, 2, 3, 4, 5, 6, 11 and 12 were verified codon-by-codon against NCBI.
Codon optimisation chose codons from hand-written preference pairs and always reported "CAI 0.94". It now uses the host's codon usage table (Kazusa: E. coli, S. cerevisiae, human, mouse/CHO, Drosophila, B. subtilis), avoids runs of ≥ 5 identical bases, and reports the real Sharp & Li (1987) CAI of the sequence it designed, which matches an independent calculation. codon_adaptation_index can also score an existing CDS.
Structure geometry: the radius of gyration (mass-weighted), centroid, end-to-end distance, contact order and Kabsch RMSD were each cross-checked against NumPy/Biopython on a real PDB entry and agree exactly; what the Rg is weighted by is now documented. The Plaxco folding-rate correlation is reported only for a single chain of ≤ 300 residues, where it applies, instead of being clamped onto multi-chain complexes.
Honest labelling: the signal-peptide score is described as a von Heijne rule heuristic rather than SignalP's neural-network "D-score"; MS/MS fragment m/z values are exact but the bar heights are labelled as a qualitative guide, not predicted intensities.
Fixed — engine RPC contract (molbiocraft-wasm)
Semi-global alignment was running as a global alignment. rust-bio's semiglobal leaves only the second sequence's ends unpenalised, so a short query against a long target was charged for both overhangs: ACGTACGT vs TTTTACGTACGTTTTT came back split as ----ACGTACG----T with score −2. It is now a free-end-gap alignment on both sequences (----ACGTACGT----, score 16), which is what MolBioCraft's "free end gaps" label means: at each end, the overhanging residues of one sequence are left unaligned at no cost, the way EMBOSS needle aligns by default, where end gaps carry no penalty unless end-gap penalties are switched on. align_pairwise also accepts mode (global/local/semiglobal); it previously understood only a boolean local, so a semiglobal request was silently answered with a global alignment.
A contract test now covers all 156 RPCs the app sends: for each one it checks that the dispatcher actually reads every key of the payload. A key the TypeScript side sends under a name the Rust side never looks at is silently replaced by a default — the failure mode behind the earlier bins/overviewBins and bothStrands/searchBothStrands bugs — and is now caught by cargo test.
Fixed — file formats (validated against real files in resources/)
SCF chromatograms (Staden, many sequencers and sequence editors) are now decoded (v2 and v3, delta-encoded samples, peaks, per-base quality, run comments). Previously .scf files were scanned for the longest A/C/G/T run, imported as circular plasmids without traces, and short runs were replaced by a hard-coded GFP fragment with a synthetic trace. The COI test reads decode bit-for-bit identical to their ABIF traces and match the FASTQ qualities.
Proprietary plasmid-map .dna / .prot / .rna files were read from their packet structure: DNA/RNA/protein sequence, topology and strandedness, all features (multi-segment and origin-spanning ranges, strand, colours, qualifiers), primers and notes. Previously features were lost and every file was forced circular. (This reader has since been removed; see Removed under [Unreleased].)
ABIF (.ab1 / .abi): no more invented Phred 40 scores, synthetic Gaussian traces or evenly spaced peaks when a file lacks them (raw DATA 1-4 are used when processed traces are absent); instrument, model, sample and dye-set tags are kept. Unrecognised binaries import nothing instead of a placeholder sequence.
Chromatogram viewer: trace windows and base letters are placed by recorded peak positions (the old fixed 10 samples/base drifted away from the base calls); missing qualities are shown as missing, Mott trimming does not trim on absent qualities, and the signal-to-noise fallback of 28.5 was removed.
GenBank / EMBL: join(...), order(...) and complement(join(...)) locations, wrapped location lines and multi-line qualifiers are read; exports write joins, all qualifiers, a single source feature and a standard 79-column LOCUS line. A record without ORIGIN is no longer filled with the letters of the flatfile text; summary records export their declared length.
GFF3: names come from Name/gene/product/ID; unstranded features stay unstranded; multi-line features with one ID become segmented features; CDS phase is computed per exon on export. BED: 0-based starts converted, name/strand kept, BED12 blocks become segments.
Proprietary alignment .meg import (sequential, interleaved and multi-gene data; identical-site dots expanded; group labels separated); distance-matrix files are reported rather than imported. All 44 sample .meg files parsed. (This reader has since been removed; see Removed under [Unreleased].)
PDB: each protein chain becomes its own document (chains were concatenated into one invented sequence); imported structures now store PDBText so the structure tab and source download work.
GFF/BED overlays skip features outside the sequence and report them instead of clamping them onto its ends.
Fixed — sample library scientific accuracy (validated against resources/)
Reference-matched samples: 142 sequences (viral genomes, human and Drosophila mtDNA, pUC19, yghJ, every alignment member) are verified identical to the reference sample export; a new sampleScientificAccuracy test suite locks this in.
Contig-summary genomes (23 bacterial, eukaryotic, human and plant chromosome records) no longer carry invented 2.4–3.6 kb placeholder bases or annotations squeezed onto them. They keep an empty sequence, features at true genomic coordinates, and open in a new genome-scale summary map (circular overview, zoomable linear track) instead of showing GC %, Tm, restriction sites and translations of non-existent bases. Arabidopsis ChrC/ChrM are now flagged as summaries too.
"Download Full Sequence" no longer fabricates data (it used to repeat a 66-bp motif and report success). It now fetches the accession from NCBI, accepts it only if its length equals the declared length, and otherwise leaves the record unchanged.
Joined features: NCBI join/order intervals become real feature segments, so HIV tat/rev/gag-pol, SARS/SARS-CoV-2 ORF1ab (ribosomal frameshift), Ebola GP (RNA editing), trans-spliced Arabidopsis nad2/nad5 and the origin-spanning human D-loop translate and draw correctly (linear and circular maps now draw one block/arc per interval).
pET-28a(+)-eGFP: eGFP, KanR, lacI (native GTG start), T7 promoter, lac operator, RBS, His-tag and T7 terminator moved to their verified positions; added f1 ori, pBR322 ori bounds, thrombin site, T7 tag and the translated His–T7–eGFP fusion ORF; primer sites corrected.
pUC19: lacZα corrected to complement(146..469); ori, lac promoter/operator and M13 reverse site corrected. The catalog "pUC19" sample (synthetic spacer DNA, not pUC19) was removed; catalog-built vectors are labelled as schematic reconstructions; M13 site coordinates fixed (off by one).
Fluorescent proteins: EYFP rebuilt with exactly S65G/V68L/S72A/T203Y (the old sequence lacked Tyr66 of the chromophore) and ECFP with Y66W/N146I/M153T/V163A; Sanger Y66H SNP annotation corrected (TAC→CAC, 199–201).
Other constructs: Klentaq1 restored to Taq residues 281–832 (5 residues were deleted) with correct D610/D785/O-helix annotations; IsPETase LIC clone regains the missing Arg codon; NanoLuc donor, PX459 Cas9, pYES2 URA3, luxA, SOE dCas9-NLS-3×HA-VP64 and pET28a-mCherry annotations now match their ORFs (truncated fragments are labelled as such and drawn linear; the SOE NLS is correctly named nucleoplasmin).
NGS read lists: reverse-strand Ion Torrent reads and paired-end read-2 mates are stored as sequenced (reverse complemented, FR orientation); the 24 embedded reads are labelled as simulated stand-ins for the SRR515927/SRR515928 datasets.