Changelog
0.54.0
- Claims: Starplast now generates knowledge about genes nobody has labelled and tests it by evidence
measured to be independent of the inference that produced it (
starplast/claims.py,instructions/open/63_claims_generate_and_verify.md,notebooks/claims_2026_10_04.ipynb). Every number is measured on held-out genes: a strategy's support becomes a certainty (isotonic, calibration error 0.014-0.032 on Toxoplasma compartment); leakage is quantified, not assumed -- the shared-mistake ratio says how often a verifier repeats the generator's wrong calls beyond independence (physical partners 1.1-1.3x, coexpression ~2x, a random forest 3.5x), and each evidence family's recovery alone is compared with all evidence together; certainty and independent verdicts combine into a verified certainty fit on held-out genes (claims at 0.9 or more were right 90-96% of the time). Each label gets the generator that independent evidence can test -- stacking, the strongest single predictor, absorbs every kind of evidence and so cannot be tested by anything separate. Claims say whether they were tested, untested, or outside the range certainty was measured on (42% of unlabelled Toxoplasma genes on compartment, mostly genes LOPIT could not detect), and carry their class's prior and the lift over it. Uncalibrated recipes make no claims: the binary screen phenotypes would otherwise have offered thousands of "confident" claims that were the base rate of "no phenotype". 19,641 claims ship (scripts/build_claims.py); 43 Toxoplasma and 680 Plasmodium discoveries are tested, at least 80% confident and at least twice their prior. - The gene card opens with What Starplast claims; each claim clicks to how it was made, how it was tested and what the recipe was worth on held-out genes. A new Discoveries tab lists claims with visible, loosenable filters and saves them as a table; a "claims" colour mode draws measured labels in full and claimed ones faded toward grey by uncertainty; Start here leads to Discoveries.
0.53.0
- The track record now holds every biological label, not only each organism's default: for
Toxoplasma compartment, LOPIT, membrane topology, any-screen phenotype, cell-cycle phase and the
actin, apicoplast, egress and replication screen phenotypes; for P. falciparum localization,
the transferred P. berghei phenotype and export (12 labels, 1,038,372 rows, 7.0 MB). Columns
that say where a label came from are left out, and so are
_derivedlabels: the stage label is the argmax of the expression columns. The first build "recovered" it at 91-100% because the record's own runner walked label diffusion's default layer, coexpression, which the strategy itself refuses for that label; the runner now applies the same ban (no recorded label changed). Every view names one label and defaults to the organism's first; a gene card opens its other labels at once from the record and computes only what the record lacks. The build takes--workers(about an hour on four) and no longer skips set hold-outs for slow strategies, which had made the file depend on how busy the machine was. - The category page of the track record also lists every strategy with two measures, right overall and right per class averaged so small classes count equally, beside what guessing the commonest class scores on the same genes (Tg compartment: 20% and 4%).
- Every gene-list setting in the Strategies tab has Test these: the same hold-out as Start here's Test on my genes, for whatever list is in the box.
0.52.0
- The track record: every labelled gene held out once, for every one of the 14 strategies that
call labels, in five folds that never split an orthogroup (
starplast/track_record.py). Genes are also hidden together -- each class at once, and random sets of 1, 5, 20, 100 and 500 -- so a strategy that only works when a gene's neighbours are known shows it. Abstaining is counted apart from being wrong, rates carry a Wilson 95% interval and are not printed from fewer than five answered genes. The record for each organism's default label ships asstarplast/data/track_record.parquet(190,624 rows, 1.4 MB, built byscripts/build_track_record.py) and is read four ways, each a click from the next: a gene card's If this gene were unknown section, a class page reached from it (per strategy: right, rate, what it was called instead), up again to the whole category (every class, its best strategy and rate, and the classes nothing recovers), and a line on each strategy card naming where it is weakest, which links to that category page.track_record.my_listhides a pasted list of your own genes together and asks every strategy.track_record.alonehides one gene with its orthogroup for any label, not only the shipped one, asks the five fast strategies (about 10 s on the Toxoplasma table) and caches the answer; the gene card links each of the gene's other labels to it, run as a background job. Start here's recommendations quote the record for the label in hand, beside what always naming the commonest class would score. Judged on two measures, accuracy and the mean of per-class recall, because strategies trade one for the other: label diffusion seeds every class with the same mass, and so is right on 15% of held-out Toxoplasma compartments (the commonest-class guess: 18%) while averaging 23% per class (chance: 4%) -- seeding each gene equally gives 25% and 18% instead. It says so. Only a strategy below the guess on both is listed last.notebooks/track_record_2026_10_03.ipynb(written byscripts/notebook_track_record.py) states what the record says.instructions/open/62_holdout_track_record.md. - Start here: with a gene list given, the results page offers Test on my genes. The list's labels
are hidden together, the five fast strategies are asked for them back on a background job, and the
evidence panel shows a line per strategy (right of answered, where it placed them) above a gene by
strategy grid of ✓ ✗ ·, each gene linking to its card (
track_record.list_html).
0.51.0
- Tutorial videos: six silent screen captures of the real application, recorded by the new
scripts/tutorial_video.py, which drives the realWindowoffscreen, grabs each frame withQWidget.grab(), paints a synthetic pointer, a highlight on the control about to be used and a burned-in caption over it, and encodes the frames with/usr/bin/ffmpegto H.264 / yuv420p at 12 fps. Each clip is 60-65 seconds and uses a different entry point: the find box and the evidence panel, the guided Start-here tab end to end, a strategy card and its hold-out test, the pregenerated map gallery sorted by how well a label maps, the star map walked from one gene to a neighbour, and question 13 ofinstructions/open/59_biological_questions.mdrun live from the question to the genes it names. Nothing is staged: every number and table on screen was computed by the shipped code while the clip was recorded. The clips and their posters are written todocs/tutorial/video/(6.1 MB in all), linked from each written tutorial and fromdocs/tutorial/index.htmlas posters that play on click, and copied into the site byscripts/build_docs.py, which also gains a Tutorials link in its navigation -- the written tutorials were previously built but never published.scripts/build_tutorials.pyrelinks them after its own run. They are documentation, not package data, and the wheel is unchanged.notebooks/tutorial_videos_2026_10_03.ipynbrecords what they came to and checks that the genes named in the sixth clip are the genes the recorded run of question 13 produced.instructions/done/61_tutorial_videos.md.
0.50.0
- Add
instructions/open/59_biological_questions.md: one hundred biological questions about Toxoplasma gondii and Plasmodium falciparum that the shipped data can answer, each with its organism, entry point (Start here, Strategies, Analysis, maps, star map), strategy, exact settings, what a good answer looks like, and a literature anchor resolved through Europe PMC and NCBI (no identifier typed from memory; every query recorded).scripts/run_biological_questions.pyruns the executed subset and writesresults/questions_2026_09_30/andnotebooks/biological_questions_2026_09_30.ipynb;docs/questions.mdlists the questions that yielded a result, each reproducible as a panel path or a one-line API call. No strategy, calibration number, shipped table or UI behaviour changed. - Fix the blank panel: with Background = blobs, switching between the tabbed right-hand docks --
Evidence, Analysis, Maps, Strategies, star map, start here -- left the panel switched back to
painted as nothing but the drifting background, and it stayed that way until the program was
restarted. Qt lowers the dock it switches away from, which put it under the background; the
background is an ordinary child of the window, so it then covered a panel that was laid out,
correctly sized and repainting the whole time.
AmbientWidget.keep_behindputs the field back at the bottom of the stack, called on every tab switch and on each frame, so no reordering can bury a panel. Held down by a regression test that compares the pixels over the panel before and after a round trip rather than asking whether it is visible, which it always was. - Fix: the maps panel's score table only changed for the first map chosen.
refreshfiltered the table by the view and the label alone, so in the panel's default view ("One label, every map" — whose rows are the maps) picking a second map moved nothing: no marked row, no selected row, no change to the sentence underneath. Both views now follow the current map. The label view marks the map on screen with ▶, selects and scrolls to its row, and the line under the list names it with its recipe and structure score; the map view is filtered as before. Choosing a map from the list, from the map combo (which previously refreshed only when its index actually moved) or by double-clicking a row all take the same path. The regression test picks map A, then B, then A again in both views and compares every cell's text. - Many more pregenerated maps per organism, in six groups instead of three kinds: all measurements at n_neighbors 10 / 25 / 60; all but one family for every substantial family, not only localization; one map per evidence family; one map per individual experiment block with at least 3 columns (each screen, each expression atlas, each proteomics set, structure, sequence); and curated pairs and triples of families, each carrying the biological question it asks — expression end to end, fitness + proteomics, sequence + localization, the whole transcript-to-protein cascade, a structure-first map with no expression in it at all. A gene is placed at the strictest coverage threshold that still places enough genes, so dense and sparse evidence are both buildable.
- The maps are tuned for structure, without labels. Every map except the three fixed reference
maps is searched over six UMAP settings × six HDBSCAN settings and the combination with the best
umap_gallery.structureships. That score is the geometric mean ofsearch.map_quality's score (the partition: share of genes clustered × evenness, zero on a degenerate clustering) and the mean silhouette of the clustered points rescaled to 0–1 (the geometry) — either alone is gameable, so a map has to be good at both. The search is successive halving assearch.tune_umapdoes it: every UMAP setting ranked on a 1,500-gene sample, only the best two rebuilt in full. No label is read, so the labels are still scored honestly afterwards. Every setting tried, with its score, is recorded in the manifest beside the map that won.search.map_qualityitself is unchanged. - The maps panel is navigable at that size: a tree grouped by what each map was built from, a filter box, a sort box (gallery order, structure score, how well the chosen label maps, genes placed) and a Group checkbox that flattens it into one best-first list. Every row states the map's size, cluster count, structure score and the chosen label's skill, and its tooltip has the full recipe and how many settings were searched. Thumbnails are drawn lazily per expanded heading and subsampled, since they are painted point by point. Every control has a tooltip.
- The gallery build is checkpointed one map at a time into
results/umap_gallery_checkpoint, so a stopped or frozen run resumes instead of starting over, and--outwrites a gallery outside the package.docs/guide.mddocuments the groups, the structure score, the navigation and the command for building a larger gallery locally. - The star map no longer twitches when a gene is hovered. The hover text went into a
word-wrapping label in the same layout as the view, so a longer line made the label taller, the
view shorter and the resize handler re-framed the whole graph: moving the pointer moved the map.
The hover box and the headline now have fixed heights and a size policy that ignores their text;
the view re-frames only when it really changed size;
fituses the rectangle the layout fixed instead ofscene.itemsBoundingRect(), which answers differently while an item is hovered; a hovered link changes its colour and no longer its pen width, and its bounding rectangle has a fixed margin; and hover text is rebuilt on a 40 ms timer rather than on every mouse-move event. Positions are cached per centre, mode and connection rules, so the same picture is laid out once. A test hovers every visible gene and link in turn and requires the transform, the visible scene rectangle, the scene bounds and every item position to be identical, to the bit, throughout. - Two larger views of the network, chosen beside the gene box. neighbourhood grows outwards
from the centre gene for up to four hops, strongest links first, up to 2,000 genes. whole
network lays out everything the connection rules leave, up to 3,000 genes and 30,000 links, with
the twelve largest clusters coloured (label propagation, deterministic). Both degrade by keeping
the strongest links and the best-linked genes, and say on screen what they left out. Drag to pan,
scroll to zoom around the pointer, click a gene to re-centre, double-click to select it on the 3D
map, Fit to re-frame, and a minimap in the corner shows where the view is and jumps on click.
They are drawn by a new canvas that builds one
QPainterPathper source and strength bucket once and paints it into a cached pixmap: panning, zooming and hovering rebuild nothing, and the spring layout never runs from a paint handler. - The user defines what counts as a link. Per-source toggles (each measured layer, each
strategy, your own runs) as before, plus a minimum-strength slider, a maximum-links-per-gene cap
and an "at least N different sources must agree" rule. The resulting network is counted live --
"4,812 links between 3,104 genes from 3 sources" -- with what each rule removed. A definition can
be saved and reloaded by name and is kept with the user's other state
(
star_edges/star_definitions.jsonunderpaths.user_cache_dir()), so "crosslink + co-expression, 2+ sources" comes back next session. Every control has a tooltip saying what it does and why. starplast.star_edgesgains the Qt-free half of all of this:Definition,apply_definition,counts_text,DefinitionStore,adjacency,neighbourhood,overview,clustersandlayout, each with a named bound, and all of it testable without a display.
0.49.0
- Add a start here tab beside Strategies, which is unchanged: a guided path from what a user
has to the strategies worth running. One question per screen -- what do you have (a gene, a gene
list, your own measurement, a label, nothing yet), which organism, the gene / gene set / label /
measurement itself, and the goal (more genes like mine, predict it, explain it, partners,
compare two conditions, is it learnable) -- with a clickable trail of the answers to go back to
any of them. Label and measurement choices show their coverage, so an almost-empty column is not
picked blind. It ends at three to six recommended strategies, each shown with the Strategies
tab's own card summary (name, method, grade, the four
scorecard.HEADLINEbars), one line on why it is recommended, the settings the answers decided, and Run it here / Open in Strategies; the map gallery and the star map are offered where they answer the goal better. Ranking prefers what the goal is for, then a matching scorecard task, then the calibration grade for that organism, and says plainly when nothing better than weak exists. The question tree and the ranking are Qt-free instarplast/guided.py, the view isstarplast/guided_panel.py, and both are reachable from the help search. - Add a maps tab beside Analysis with pregenerated 3D UMAPs for each organism. There are three
maps of all measurements (n_neighbors 10, 25 and 60), one of all measurements except
localization, and one per evidence family (12 maps for T. gondii, 14 for P. falciparum).
Maps are built from measurements only and clustered with HDBSCAN. Clicking a map shows it in
the central view with its clusters. A sortable table scores every categorical label on every
map, read by label or by map. It reports categories → clusters (size-weighted best-cluster F1,
precision and recall) and the best single category, scored on the F1 of Wilson 95% lower
bounds so a 2-gene category cannot score 1. Both scores come with a shuffled-label chance level
and skill, plus coverage and a circularity flag from the leakage closure. Color by label is
one click. Score map on screen runs the same scoring on a map built in the app.
starplast.umap_gallery,scripts/build_umap_gallery.py,notebooks/umap_gallery_2026_09_29.ipynb; about 2 MB of data. - Add the star map tab (
starplast/star_map.py): a navigable network centred on one gene, with its linked genes on rings around it. Edges are coloured by source (each measured layer, each strategy, your own runs), solid when measured and dashed when inferred, and as wide as their strength. Hover shows the gene or the link's layer, strategy, run, setting and score. Click to re-centre, Back to return, depth 1-2 hops, per-source toggles and link counts, and selection follows the rest of the application and can be sent to the 3D map. - Add
starplast/star_edges.py, one store of gene-gene links with provenance. Measured links are read from each space's graph. Strategy links are bounded: modules link each member to its 3 nearest co-members, set expansions link each hit to its 3 nearest seeds, neighbour and partner calls link to the genes that made them, and no run adds more than 20,000 links. Shipsdata/star_edges.parquet, the links of the default-setting runs of 13 strategies on both shipped tables, built byscripts/build_star_edges.pyand recorded innotebooks/star_edges_2026_09_29.ipynb. Strategy runs made in the application are kept under the user cache (star_edges/) and appear in the map at once. - Add the Lourido lab's parasite-density CRISPR screen (Giuliano et al., Cell 2026, PMID 42580337) as the Toxoplasma slot "fitness · parasite density". It has five columns: fitness at low (MOI 0.3) and high (MOI 3) density, the authors' high-versus-low contrast (negative means needed at high density), its Bonferroni p, and the paper's 31 density-inhibited mutants. The arms cover 7,461 genes and the contrast 5,291. Table S1 reproduces the paper's numbers: r = 0.995 between the arms, 31 hits, and the 12 high-confidence hits from the stated rule. The arms are held out with fibroblast fitness. The contrast is its own leakage family, and the leakage audit finds 0 gaps and 0 residual leaks (instruction 56).
0.48.0
- The Strategies tab opens each strategy on a card instead of prose. The card shows the name, method, task and calibration grade, one line saying what the strategy answers, and four painted bars in the same places for every strategy: Better than chance (skill), Reach (coverage, or its task's stated analogue) and two task metrics in plain words (for example "Right calls" and "Fair across classes" for label calls). Each bar shows its 95% interval from the shipped calibration, a marker at chance, the technical name in small type, and a plain sentence on hover. Run, Test and Details ▸ sit under the bars. The Guide, Settings and Results tabs keep all their controls and move behind Details. A test started from the card shows its result on the card in the same four bars.
- Add
scorecard.HEADLINE,REACH,headline()andheadline_bars(), which define the four headline bars for each task once, including where their chance levels come from. - Add an "About this test" box for all 39 strategies (
starplast/strategy_explainers.py). It has four short fields: what the strategy does, how it is evaluated, what failure looks like and why, and what success looks like and why. Each field was written from the strategy's own explanation and test description. The box is collapsed to one line per field and opens on click. - Add worked examples: one real failure and one real success per strategy and organism
(
starplast/data/strategy_examples.json). They are chosen from the 7,640 calibration runs byscripts/build_strategy_examples.pyand recorded innotebooks/strategy_examples_2026_09_28.ipynb. Each failure explains its failure mode from its own numbers. Each success is re-run once and lists its top five calls for genes without a known label. Where a strategy never failed on real data, the failure shown is its self-test on the noise table, and the card labels it as such. - Add
docs/strategy_cards.md, which renders the same cards, explainers and examples for the docs. Help search now opens a strategy on its card, and the Guide, Settings and Results entries open Details. Tutorial captions now name the moved controls; the tutorials have not been rebuilt.
0.47.0
Add
NEXT_SESSION.md, the handoff for resuming work: current state, working rules, the prioritised plan for the per-organism spaces and the traps already met.HANDOFF.mdpoints to it.Rebuild the Pf display from its own feature slots: 118 resolved features now place all 5,720 genes, instead of the 20-feature legacy fallback. Display recipes are separate from the shipped calibration's inference recipe. Seventeen strategy groupings and both compatibility input matrices were checked unchanged; edges, node tables, Tg coordinates and calibration values were preserved.
Add versioned data packs with SHA256 manifests, per-column license declarations, checked HTTPS downloads and atomic activation. A shared space builder refuses lost identifiers, columns or measured cells and validates graph order and indices. Pack paths resolve from the user's cache; organism builders and published download URLs remain pending.
Publishing a calibration sweep now merges by organism and strategy, preserving unswept results and their original provenance. Writes are atomic; malformed existing files are refused. Generated calibration pages include every published space and distinguish the latest sweep from older results.
Split host protein references into separate human and mouse tables, retaining all 36,579 identifiers, names and measurements. Resolve the 54 identity-only rows from local UniProt and bridge records; keep the migration and source checksums in an executed notebook and manifest.
- Require an explicit organism for every dataset and distinguish human/mouse deposits. Provenance queries for one species no longer fall back to another. Host loaders, merges, slot coverage and the slot audit now read separate species tables; merges refuse lost values even when new rows keep the total coverage unchanged.
0.46.0
- Name each strategy's method. Every strategy's name now ends with the method it runs in brackets, for example "Hold out a category and search for a map that finds it (UMAP + HDBSCAN)" or "Diffuse a label across one measured network (random walk with restart)". The label is taken from the code each strategy calls, not from its prose. The name appears in the Strategies tab, its Guide, the README calibration table, the strategy and calibration pages and the tutorials. The tab's filter matches it, so typing "HDBSCAN" or "logistic" lists every strategy that uses that method.
- Add
Strategy.methodandStrategy.name. A strategy that does not name its method is refused at registration.strategies.overview()now hasnameandmethodcolumns in place oftitle. - Give every strategy a scorecard. Each strategy declares one of six tasks: label calls, ranking, set retrieval, cluster recovery, values or replication. Its self-test reports that task's standard metrics, in a fixed order, on the same hidden genes as its verdict. Label calls report accuracy, coverage, precision of calls, macro precision, macro recall (balanced accuracy), macro F1, weighted F1, Cohen's kappa, MCC, and macro AUROC and AUPRC. Rankings report AUROC, AUPRC and its lift over prevalence, partial AUROC, R-precision, precision and enrichment at the top 1%, recall at the top 10%, best F1 and nDCG. Values report Spearman, Pearson, Kendall, R-squared, normalised RMSE, MAE and top- and bottom-decile recall. Cluster recovery reports weighted F1, precision and recall, ARI, NMI, homogeneity, completeness and the unclustered share. Every metric is checked against scikit-learn and defined once in
starplast.scorecard, with its range, its chance level and how to read it. The Strategies tab shows the card after every test, with each metric explained on hover. Calibration records every card, and the README and docs/scorecards.md give each metric's mean and 95% interval for every strategy. - Explain every technique. Each strategy lists the techniques its method is built from, and
starplast.techniquesexplains each: what it does and why a strategy uses it. The Guide shows them under the strategy's name.strategies.metrics(),strategies.techniques(),Strategy.techniques_table(),Strategy.scorecard_table(),TestResult.card()andTestResult.skillexpose the same from Python. - Add five strategies (35-39) in a ninth family, Advanced models.
- Conformal label calls call a gene only where its conformal prediction set holds one label, with a stated error rate that the self-test checks on hidden genes. They also list the genes whose data leaves two labels possible.
- Graph convolution lets a logistic regression learn from each gene's network neighbourhood as well as its own measurements, and reports how much weight it puts on each.
- Random forest ranks measurements by permutation importance on held-out orthogroups.
- Stacking learns out of fold how far to trust measurement neighbours, a linear model and the networks, for each label and class.
- Conformal values wraps a predicted measurement in an interval that holds for a stated share of new genes, and lists the measured genes outside theirs.
- Label-calling strategies now pass their per-class scores to the scorecard (k-nearest neighbours, network vote, random walk, logistic regression, weighted vote, triangulation, map neighbours, cluster guilt), so macro AUROC and AUPRC are measured rather than missing.
- Document the strategies API in docs/API.md: overview, run, test, card, calibration, tuned settings, contexts, and scoring predictions made outside Starplast.
- Add
starplast.organisms, one declaration per species space: code, reference, id pattern, tables, partner, life stages, calibration targets and record links. It declares T. gondii and P. falciparum today, and tests hold it to every literal it will replace. The slot tables, the window's species list and record links, the strategy contexts, the calibration targets and the slot generator's life stages now read it. This is the first step towards separate host and vector spaces (instruction 53). import starplastnow reaches the main modules as attributes (starplast.strategies,starplast.scorecard,starplast.techniques,starplast.calibration, ...), each loaded on first use. Importing the strategies no longer imports Qt: theStoppedexception moved tostarplast.stopping, andjobs.Stoppedis the same class.- Search Starplast from beside the Help menu, as in spaCR. The box to the right of Help (Ctrl+Shift+H, or Help → Search Starplast…) finds every menu command, panel and tab, strategy (by number, name, method, family or question), setting in the analysis panel and Preferences, information slot of both organisms, registered dataset, heading of the guide and tutorial section, and goes to the exact place: the command runs, the panel is raised on its tab, the strategy is selected in the Strategies tab, the setting is scrolled to and outlined, the slot is selected in the slot tree, the guide opens at the heading. The index is built from the menus, panels and registries themselves (
starplast.help_index, testable without a display); the field isstarplast.help_search. Help → Keyboard shortcuts lists every key the menus bind, and every menu command now carries a tooltip and a status tip. - Keep the glass style installed once per application, keyed on the Qt application rather than on a Python wrapper that can be collected and remade. The test suite now shares one application for the whole session and closes each module's windows. It had been destroying and rebuilding the application between modules, which left the second one styled with freed memory and segfaulted full runs.
- Format the menus like spaCR's, and draw everything that floats as translucent black glass. The menu bar is flat and its words light up when pointed at; menus, tooltips and drop-down lists are rounded panes of translucent black (white on a light theme) with rounded item pills, in spaCR's Open Sans. Preferences, the guided workflows, the slot tree, the import and export dialogs and the explanations are rounded glass cards without a title bar: drag the background to move them, an edge to resize, ✕ or Esc to close. The explanations and About no longer freeze the map behind a modal box. Without a compositor (X11) the same panes are opaque near-black with their corners cut;
STARPLAST_TRANSLUCENT=0/1overrides the check (starplast.glass). Text typed into fields is now light on the dark field grey in the light themes, where it could not be read. - Add six verified Plasmodium deposits, and the questions they answer that nothing could ask before. The P. falciparum table goes from 146 to 168 columns and slot coverage from 169/215 to 180/221. It now has a subcellular localization for the first time -- 1,646 of 3,000 schizont proteins in 24 niches from hyperLOPIT, with RAP1, MAHRP1, ACP, EXP2 and GAPDH each where they belong -- plus protein abundance in the asexual blood stage and under Hsp90 inhibition, mRNA synthesis and decay rates from hourly 4-thiouracil labelling, RNA dependence of complexes (898 of 3,671 proteins), the sexually committed proteome, field and between-species variation, and an in vitro evolution resistome whose classified top is PfATP4, PfMDR1, the prodrug esterase, cytochrome b, CARL and PI4K. Five empty slots are answered and six new ones exist because the catalogue could not express these measurements. Every headline number is reproduced from the raw deposit in
notebooks/derive_deposits_2026_09.ipynb; five further candidates were refused, one of them because the paper's own count of 29 drug-sensitive mutants came back as 40. The audit, with every refusal and its evidence, is instruction 52. - Carry LABEL columns through the deposit merge: a compartment has no mean, so where two accessions resolve to one gene the label survives only if they agree. Before this,
parasite_columnsdropped any non-numeric column in silence. - Declare seven more same-quantity families for the leakage closure and re-run the audit with eight new held-out targets: 0 closure gaps and 0 residual leaks on both tables.
0.45.0
- Calibrate every strategy. Each strategy's self-test was run over a grid of its settings, several held-out known labels and five seeds: 5,940 tests in all. The README table gives every strategy's skill at its defaults and at its best setting, with 95% intervals and pass rates. Skill puts every metric on one scale, from 0 for the same procedure on shuffled data to 1 for perfect. The best setting is chosen on seeds 1-3 and reported on seeds 4-5, so the table does not report the luckiest of many settings. Intervals resample held-out targets, then runs within each target, because runs on one label are not independent. On T. gondii 26 strategies are reliable, 7 weak and 1 untestable. On P. falciparum 20 are reliable, 8 weak, 3 work only when tuned, 2 are untestable and 1 has no skill. Every number, per target and per setting.
- Show the calibration in the Strategies tab: each strategy's grade in the list, a calibration paragraph in its Guide, and a Use tuned settings button.
strategies.overview(),strategies.calibration(key)andstrategies.tuned(key)expose the same from Python. - Correct three self-tests that flattered themselves. Strategies 01, 04 and 15 were judged against a second search on shuffled labels. That search picks the largest cluster for every label, which scores an F1 near twice the label's share on size alone, and it beat the real labels on four targets of eight. The null now permutes the hidden genes' labels over the same chosen clusters, so a large cluster earns nothing. Strategy 01, the founding question, passes its T. gondii self-test under the fair null (0.132 against 0.039), though across all targets and seeds its calibration grades it weak.
- Stop strategy 16 reporting AUROC 0.99 for arithmetic. Held-out edges are now scored against degree-matched non-pairs, not random ones. The layer's own source measurements leave its similarity feature. Layers that cannot honestly be held out are refused as targets: derived layers, annotation cliques, literature, and correlation layers whose visible edges determine their hidden ones. On held-out crosslinks it now reads 0.78.
- Make strategies 01 and 02 walk the settings they are given (genes per map, feature sets, grids). Calibrating over settings the test ignored measured nothing.
- Add strategies 33 and 34 and
starplast.graphspace: one integrated neighbour space from every permitted layer, with per-edge evidence, and a model trained to rank the edges the networks miss. Every number is reported against random, degree-matched and configuration-model non-pairs, with the gap between the first two as its own quantity. A learned embedding was tried and did not beat the interpretable baseline, so the baseline ships. The measured comparison. - Correct a citation. The four in vivo CRISPR columns are Giuliano et al. 2024 (PMID 38977907), not the 2019 platform paper: they match that supplement to 5e-8. Re-reading it adds heart and brain fitness and 65 genes.
- Add 21 verified deposits through
starplast.deposits, each re-derived by an executed notebook (notebooks/derive_deposits_2026_09.ipynb). T. gondii goes from 402 to 438 columns, P. falciparum from 123 to 146, and the host table from 34,630 to 36,579 proteins. Slot coverage rises from 156/204 to 169/215. The audit, with every refusal and its evidence, is instruction 50. - Measure the slot grouping for leakage instead of asserting it (
scripts/leakage_audit.py,starplast.leakage). The audit found and closed two leaks: the P. berghei transfers predicted one another at 0.58, and withdrawing a nutrient predicted fibroblast fitness at 0.76. Afterwards there are 0 closure gaps and 0 residual leaks, and the closure's threshold sits at the 99th percentile of what unrelated columns reach. - Add five tutorials, each as a GUI walkthrough and a notebook, and a complete guide to every feature (docs/tutorial). All are built from the running application by
scripts/build_tutorials.py. - Schedule the calibration sweep against measured memory. Each chunk of work runs in a fresh process that reports its peak, and a chunk starts only when it fits under both a job and a system budget. The pooled version grew to 106 GB and took the machine down.
- Fix a chi-squared crash in strategy 05 when filtering a contingency table left a zero margin.
0.44.0
- Add a Strategies tab to the right of Evidence and Analysis: 32 named ways of using the combined data for inference, grouped into eight families, each with a tooltip, an explanation, a walkthrough, settings that explain themselves, and Run / Test / Stop.
- Give every strategy a self-test that hides known information -- labels, gene-set members, edges or values -- asks for it back, and compares the answer with the same procedure on shuffled labels, random sets or permuted identities. A strategy passes only above its null's 95th percentile by a stated margin.
- Include the two founding questions as strategies 01 and 02: hold out a category and search maps for the structure that recovers it, and find the map where a gene list forms one cluster with high precision and recall.
- Measure every strategy on the shipped tables and show the verdict beside it: 26 pass, 5 fail and 1 is inconclusive on T. gondii; 24, 5 and 3 on P. falciparum. The strategy catalogue and
results/strategies_2026-09-25/record every number, failures included. - Add
starplast.strategies(context, leakage guard, five holdout test patterns, a planted organism for testing) andstarplast.strategy_catalog; strategies run headless as well as from the tab. - Add a
join="louvain"option tomethods.multiplex_communities: joining agreed pairs by connected components chains every gene into one community when layers agree about different genes. - Group evidence into families by the slot catalogue's axis, so knockout screens named for a second background or a genetic interaction count as fitness.
0.43.0
- Add a 40-slide introduction and practical guide, presented like spaCR's deck: README cover, linked GitHub slide pages, web viewer, PDF and editable PowerPoint.
- Add guided Explore a gene, Predict a trait and Compare a screen workflows with settings help and full run exports.
- Evaluate feature, linear, boosted, PCA, UMAP, masked-factor and weighted-network predictions with grouped folds, target exclusions, calibration and unsupported-call abstention.
- Add classification, regression and multi-label APIs; preserve unknown outcomes and report fixed-class metrics.
- Include 320 frozen ESM-2 sequence features for 8,064 proteins and nine local AF3 summaries for 1,210 exactly mapped genes. Add model-indexing and sequence-encoding commands.
- Publish 29 reproducible localization and abundance comparisons, source ablations, shuffled controls and uncertainty estimates in the benchmark report.
- Use one balanced embedding builder for packaged and interactive maps; record actual algorithms, input hashes and ordered gene identities.
- Add source-level observation records, reviewed literature assertions, candidate explanations and an explicitly heuristic budget API.
- Restore the Plasmodium evidence ledger and prevent fixture builds from overwriting packaged data.
- Share OpenGL resources between organism windows so switching species retains valid shader programs.
- Expand CI to the complete non-slow test suite, repair documentation and display regressions, and declare numerical thread-control dependencies.
- Repair download badges, retain the linked 130-source catalogue and publish forty additional monochrome logo proposals; keep the approved logo active.
0.42.1
- Use the GitHub README as the PyPI project description.
- Use full URLs for README artwork, the rotating gene map, and documentation links.
0.42.0
- Simplify the map to individual genes; remove Galaxy and Orthogroup summary modes.
- Adopt the Toxoplasma constellation logo, SVG wordmarks, and window icon.
- Rewrite the README and add a user guide and Python API guide.
- Publish generated API documentation through GitHub Pages.
- Add settings help and document application callbacks.
- Fix importing screen tables whose identifier column is already named
gene_id. - Fix Plasmodium gene selection and link its evidence panel to PlasmoDB.
- Publish the application and bundled data as one PyPI project,
starplast. - Make CUDA dependencies optional through
starplast[gpu]. - Include SVG artwork and compressed sequence tables in wheels; exclude saved embeddings.
- Add synchronized version bumps, build checks, and automatic PyPI publishing.
- Develop on
nightly; publish version increases onmainto PyPI and GitHub Releases. - Link all 128 registered datasets and computed layers to their sources.
- Show a 1440×1080, 30 fps gene-map rotation with selected-gene lighting in the README.
0.41.0
Existing development baseline before the packaging and documentation overhaul. Earlier changes are recorded in HANDOFF.md and the Git history.