Releases: NicholasEhsanRoy/NUDGE
Release list
v0.4.2 — dynamic model ingestion (model_path / model_code)
Added
- Dynamic model ingestion for the
identifiabilityandoedMCP tools (NUDGE-LIM-030). Both tools now acceptmodel_path(an absolute path to a user model file) ormodel_code(inline Python source) in addition to a registrymodelname — precedencemodel_code>model_path>model— loading a user's OWN differentiable model via the newnudge.inference.model_loader. The file exposesnudge_identifiability/nudge_oedbuilders and needs nonudgeimport; the loaded model reproduces the equivalent registered model to machine precision (verified: ×259 OED, the NUDGE-LIM-029 rank-deficiency guard, and the NLME arrowhead all reproduce throughmodel_path). This makes the with-vs-without-NUDGE demo symmetric — both arms analyze the same user model file. Ships standalone JAX model filesscripts/demo_ab/ad_qsp_model.py+ad_qsp_nlme_model.py. - Security (
NUDGE-LIM-030): dynamic ingestion executes arbitrary user Python in the server process — a local, trusted-input convenience, not for untrusted / multi-tenant use.
Changed
- GitHub README PyPI-version badge pinned to the released version (static) — the live
shields.io/pypi/vbadge chronically lagged several releases behind through shields' own cache and GitHub's Camo image cache.
Full detail in CHANGELOG.md.
v0.4.1 — OED rank-deficient-naive guard
Fixed
oedno longer emits a false-precise improvement factor on a rank-deficient naive design (NUDGE-LIM-029). When the naive baseline's Fisher information is singular in the target direction (smallest eigenvalue at the guarded-ridge floor — e.g. a literal baseline+end[0, 12]plaque schedule where plaque ≈ 0 at t=0 zeroes both sensitivities), the true CRLB is infinite, so a finitecrlb_improvementwas a Tikhonov-ridge artifact (~10⁷). The tool now flagsnaive_rank_deficient/naive_target_identifiable=Falseand reports the improvement as a LOWER BOUND — the honest abstention a careful analyst makes by hand. The finite gain on informative designs is unchanged: the defaultad_qspschedule still reportscrlb_improvement ≈ 259byte-for-byte (curvature-grounded ridge-floor test, not a magic threshold — so it does not over-abstain).- Removed the redundant PyPI-version badge from
PYPI_README.md(it permanently lagged one release on the PyPI project page; PyPI's header shows the true version; the GitHub README keeps the live badge).
Full detail in CHANGELOG.md.
v0.4.0 — NLME coupled scale-wall + demo honesty fixes
Added
ad_qsp_nlme— a hierarchical / nonlinear-mixed-effects AD QSP population model with a genuinely COUPLED (arrowhead) joint Fisher-Information Matrix (NUDGE-LIM-028). Shared population hyperparameters (μ,φ, optionalω) couple every subject, so the joint FIM is not block-decomposable like the independent-subjects cohort. MEASURED (scripts/demo_nlme_scale.py): densejacfwdOOM-kills at N≥300 under a 2.5 GB cap while the matrix-freejvp∘vjppath stays ~0.56→0.89 GB across N=100→2500 (≈linear in cohort state, not flat) with the sameunidentifiableverdict; theNUDGE-LIM-023fail-safe is preserved. Arrowhead is in-principle Schur-decomposable, so the claim is the measured dense-vs-matrix-free contrast, not impossibility.- A self-contained NumPy WITHOUT-arm for the coupled model (
scripts/demo_ab/ad_qsp_nlme_forward.py+cohort_nlme.npz). - The 3-minute demo/pitch video shooting script (
design/DEMO_VIDEO_SCRIPT.md).
Changed
- Corrected the AD QSP confound attribution to be design-dependent (honesty, caught by a Claude Science reviewer): the 2-biomarker/8-visit cohort confounds the microglial pair
k_gl⇄k_ga(k_onis well-identified there); thek_on⇄k_glconfound belongs to the single-biomarker (amyloid-PET, baseline+end) OED design.
Full detail in CHANGELOG.md.
nudge-bio 0.3.0 — identifiability + oed MCP tools
NUDGE 0.3.0 — exposes two of NUDGE's core capabilities as general-purpose MCP tools, so an agent (e.g. Claude Science) can run rigorous identifiability + experimental-design analysis on any differentiable ODE model — in plain language, with the results returned as provenance-carrying artifacts.
Highlights
identifiabilityMCP tool — "which parameters of this ODE model are identifiable vs sloppy vs unidentifiable, from data?" Matrix-free Fisher-information analysis that scales past the dense-Jacobian OOM wall; returns the calibrated verdict, the named null directions, and the honest smallest-eigenvalue fail-safe (NUDGE-LIM-023).oedMCP tool — "design the experiment that best resolves a confounded parameter." Gradient-optimal measurement design; returns the schedule, the measured CRLB improvement, and the local-OED caveat (NUDGE-LIM-024).- General, not a demo cheat — both tools operate over a model registry (
nudge.inference.model_registry) shipping ≥3 models per tool across domains (ecology, kinetics, clinical pharmacology, population dynamics, canonical toys), withregister_modelfor extension. Each takes a model reference, runs the real analysis, and returns whatever it measures — including abstentions. A standing decoy battery locks it (a well-constrained model must not be flagged sloppy; a rank-deficient one must abstain).NUDGE-LIM-027documents the registry scope. - Artifacts + provenance — figures/GIFs come back inline (
NUDGE_ENV=cloud) with their regeneratingfig.py+ data sidecar, so a client can display them and preserve the exact reproduction code. Both tools run through the asyncjob_submit/job_statuspattern.
Frozen core (fit.py / core/) untouched. Full gate green: ruff, pyright (0 errors), 5 doc checkers, 396 tests passed.
Install
pip install "nudge-bio[mcp,viz]"
Python ≥ 3.10; jax==0.5.1 pinned. See the CHANGELOG for the full [0.3.0] notes.
nudge-bio 0.2.0 — Claude integration hardening + the animation battery
NUDGE 0.2.0 — hardens the Claude integration and grows the honest figure layer, on top of the 0.1.0 first release. Mechanism attribution for perturbation screens that abstains when it can't tell — a confident-wrong is the only hard failure.
Highlights
- Claude Science connector, hardened (MCP).
render_figurereturns figures as inline base64 (NUDGE_ENV=cloud) with the provenance sidecar inline — the only transport that survives the connector's read-only sandbox — and heavy fits run through an asyncjob_submit/job_statuspattern so real compute isn't killed by the ~60 s per-call cap. Verified end-to-end against the live harness; seedocs/user_guide/claude_science.md. - The animation battery — the
nudge.vizfigure layer gains 10 honesty-preserving GIFs (OED ellipse-collapse, robustness fold-approach, the amyloid gauge orbit, temporal/gLV, multi-reporter, identifiability, design, dose-response, constitutive-flip, …), each frame stamping its own abstention overlay — a figure can never draw a confident call the fit didn't make. - Red-team round P7 — a confident-wrong found and closed (
NUDGE-LIM-025). The multi-operating-point gain⇄threshold breaker could confidently mis-call a large-gain perturbation asthreshold; a measured identifiability gate (runner-up contamination, calibrated separator) now abstains instead, and a monostable circuit degrades gracefully tounresolvedrather than crashing. Found → reproduced → fixed → independently audited (PASS). - New front page — an instructional README (logo, badges, quickstart, capability map) that complements the guided
JUDGES_GUIDE.md.
Frozen core (fit.py / core/) untouched. Full gate green: ruff, pyright, 5 doc checkers, 379 tests passed.
Install
pip install nudge-bio # or: pip install "nudge-bio[viz,mcp]"
Python ≥ 3.10; jax==0.5.1 pinned. See the CHANGELOG for the full [0.2.0] notes.
nudge-bio 0.1.0 — first release
NUDGE (nudge-bio) — Node/edge Ultrasensitivity Diagnostic for Gene-regulatory Effects — the first public release.
NUDGE is a mechanism-attribution tool for perturbation (Perturb-seq) screens: it fits a compositional, differentiable circuit model to single-cell count data and calls whether a knockdown moves a switch's threshold (K), gain (n), or ceiling (v_max) — and abstains when the data can't identify the mechanism rather than emit a confident guess. A confident-wrong call is the only hard failure.
Gene circuits were the initial target; the same core (a differentiable ODE + a calibrated abstention gate) already reaches microbial community dynamics, protein aggregation kinetics, and differentiable experimental design.
Highlights
- 14 mechanism/attribution capabilities (
NUDGE-METHOD-001..014): dose-response, cross-modality, synergy/epistasis, robustness dial, inverse design, multi-reporter, hidden-node abstention, differential, constitutive control, temporal/Lotka–Volterra, fibrillization kinetics, and gradient-based optimal experimental design. - Honesty is measured, not asserted — 0% misclassification across hundreds of synthetic datasets, adversarially red-teamed across seven rounds; every found hole was reproduced then closed or locked as a regression decoy, with a final full re-scan finding 0 holes.
nudge.viz— an opt-in, provenance-carrying figure layer with a renderer per result type; abstentions render as abstentions.nudgeCLI + a Claude MCP server — drivable from a terminal and by Claude in plain language.
Built for the Built with Claude: Life Sciences hackathon (July 2026), and itself an experiment in Claude-assisted development.
Install
pip install nudge-bio
Python ≥ 3.10; pulls maddening[ift]>=0.3.1, jax==0.5.1 (pinned). Optional extras: [bio] (real-data loaders), [viz] (figures), [mcp] (Claude server).
See the CHANGELOG for the full [0.1.0] notes.