Skip to content

Repository files navigation

ChannelScope

Standardized, provenance-tracked context-graph objects for multi-omic biology —
the groundwork that purpose-specific "omic" models need.

A validated proof of concept: variant-to-structure-and-function interpretation for RYR1,
the calcium-release channel behind malignant hyperthermia.

License: MIT Python 3.10+ 199 tests passing Genes instantiated: RYR1 and RYR2 Built with Claude Code and Claude Science

The RyR1 tetramer with the R614C malignant-hyperthermia variant (orange) mapped against its grounded functional elements — the Ca²⁺ activation site, ATP/caffeine and dantrolene pockets, the gate, and the inter-protomer interfaces — on the open-state cryo-EM template, assembled from cross-species experimental evidence and not de-novo predicted.

R614C (orange) placed on the assembled RyR1 tetramer, with every grounded functional element painted. Each coordinate traces to a flagged cross-species template: this is assembled evidence, not a folded prediction. · More renders & animations · Interactive R614C report — download & open in a browser.

Jump to: The problem · How it works · The object · See it · Validation · Using it · Quick start · What's in the repo · Roadmap · How it was built

Thesis. Using context graphs to build standardized, multi-modal / multi-omic data objects for purpose-specific "omic" foundation models — demonstrated on RYR1.

Multi-omic biology is hard to learn from because the data arrives unstandardized, unlinked, and unprovenanced. ChannelScope assembles it into a standardized, gene-agnostic, provenance-tracked context-graph object: one portable schema in which every modality (structure, sequence, population genetics, energetics, function, clinical evidence) attaches to shared, typed entities such as a variant, a residue, or a conformational state. Every entity carries a provenance record: the identifier and the call behind a database claim, the graft flag and species behind a cross-species coordinate. Standardization is what makes these objects compose across omic layers, across data sources, and across proteins.

flowchart LR
    subgraph IN [Disparate multi-omic data]
        direction TB
        S1["Structure<br/>cryo-EM · PDB"]
        S2["Sequence<br/>UniProt · transcript"]
        S3["Population genetics<br/>ClinVar · gnomAD"]
        S4["Energetics<br/>ΔΔG ensemble"]
        S5["Function &amp; clinical<br/>literature · phenotype"]
    end

    OBJ{{"Standardized context-graph object<br/>typed entities linked · provenance +<br/>confidence on every node and edge"}}

    S1 --> OBJ
    S2 --> OBJ
    S3 --> OBJ
    S4 --> OBJ
    S5 --> OBJ

    subgraph OUT [Composes and ports into]
        direction TB
        U1["Report + interactive 3D viewer"]
        U2["New proteins = config nodes<br/>not a rewrite"]
        U3["Cross-protein / -omic transfer"]
        U4["Purpose-specific 'omic' models"]
    end

    OBJ --> U1
    OBJ --> U2
    OBJ -.-> U3
    OBJ -.-> U4

    classDef hero stroke-width:3px,font-weight:bold
    classDef road stroke-dasharray:5 5
    class OBJ hero
    class U3,U4 road
Loading

Many disparate inputs converge into one standardized object, and that standardization is what lets it fan back out: to a report and an interactive 3D viewer, and, because the design is gene-agnostic, to new proteins, each of which arrives as a config file (solid arrows). Dashed arrows are roadmap: cross-protein transfer and purpose-specific "omic" models. A citation and a confidence flag ride every node and edge.

We demonstrate this on a problem that is both important and unforgiving: variant-to-structure-and-function interpretation for RYR1, the ~2.2 MDa skeletal-muscle calcium-release channel behind malignant hyperthermia and the congenital myopathies. Give ChannelScope a gene and a variant and it assembles the best-available experimental and cross-species structural evidence, per domain and per conformational state, maps the variant onto it, and emits the object plus a human-readable briefing and a self-contained interactive 3D report. It assembles evidence; it does not fold de novo.

The RYR1 tool works today: 199 tests, and an 18-variant retrospective benchmark independently re-derived through a second code path. A second gene, RYR2, runs end to end on the same engine, and standing it up is what exposed the engine's remaining assumptions about its first one. What stays at proof-of-concept stage is the wider generalization, that the same object and the same discipline extend to other protein families and eventually feed purpose-specific "omic" models.

Status: research proof of concept, built during Built with Claude: Life Sciences (Jul 2026). APIs and outputs may change. Not a diagnostic device.


The problem

RYR1 is a ~2.2 MDa homotetramer of ~5,000-residue protomers that gates between closed, primed, and open states. That puts it beyond de-novo folding servers: AlphaFold3's server caps a job around a single ~5,000-residue protomer, far short of the four-protomer tetramer, and returns one state-agnostic model. Because there is no full-length human structure, the channel's 3D shape is known only through cross-species cryo-EM: every full-length map this pipeline uses is rabbit, captured in a specific state with specific ligands bound. Pig enters as a sequence ortholog for numbering, not as a source of coordinates.

RYR1 tetramer with hundreds of disease-associated variants mapped across it; slide titled 'Every variant has its own story' from Prof. Filip Van Petegem's talk
"Every variant has its own story" — hundreds of the 700+ disease-associated RYR1 variants mapped onto the channel. Figure from Prof. Filip Van Petegem's talk (~26:10).

Every one of those variants is different. Each sits in its own place in the channel, with its own mechanism for pushing it open or holding it shut. Plenty of evidence bears on whether a novel missense variant matters — family segregation, functional contracture testing, population frequency, an expert-panel ClinVar call — but none of it says where the residue sits or what it perturbs, and that is the axis this tool supplies. For Van Petegem's lab and for the RYR-1 Foundation's growing patient registry, these are the questions each new variant raises:

Which experimental structure and state is the right template? Where does the residue sit? What does it touch — a Ca²⁺ site, a subunit interface, a drug pocket? Is the effect state-dependent? Does it destabilize the fold? What does ClinVar/gnomAD already say — and how confident are we in each answer?

That structural picture matters because it is therapeutic. Dantrolene, the drug that halts a malignant-hyperthermia crisis, works by lodging in one small pocket to hold the channel shut. Seeing exactly where a patient's variant sits and what it perturbs is what lets a clinician reason about whether a known modulator, dantrolene or a rycal, should still fit, or whether the variant points to a new, patient-specific site worth targeting.

This is the tool we set out to build. From our hackathon application, which asked us to "be specific about the problem": one that tells a scientist, residue by residue, where a patient's RYR1 variant sits, what it touches, and what the current evidence says it does to the channel — with the standing of each answer attached, since a measured distance, a ΔΔG estimate and a mechanism inferred from the literature are three very different kinds of claim. ChannelScope automates that variant-to-structure interpretation, turning the questions above into a reproducible pipeline that captures every answer, with its provenance, in one standardized object.

Those answers are only ever as good as the evidence available when the run happens, and they will move. A newly deposited human structure changes the template; a ClinVar reclassification changes the clinical layer; a different ΔΔG predictor changes the energetics, and we can show how much — for RYR2, the choice of template alone flips one predictor's sign in the closed state. This is why the object stores fetch-pointers instead of frozen coordinates: re-running a briefing as the sources move is the intended use, not a caveat on it.


How it works

There are two ways in, and both end up at the same object.

gene + protein variant  →  normalize → assemble → map → energetics → annotate → brief → render

GRCh38 position or VCF  →  locus + vcf → the same object → track

Each stage is a deterministic function of public data, so the whole pipeline is reproducible and produces a portable context-graph object plus a self-contained interactive 3D report. One qualification worth making early: structures, sequences and population data are fetched live from public APIs at run time, while the ΔΔG layer reads a committed precomputation — the ensemble was run once on open-source predictors and ingested, so it reproduces by re-running those models rather than by an API call.

The seven stages of the protein route each answer one of the questions raised in the problem:

# Stage What it does → the object it builds Honesty guard
1 normalize reconcile isoform / transcript / species numbering Residue + derived numbering_map a non-constant cross-species offset, recomputed at every residue
2 assemble retrieve + rank experimental structures per state StructureTemplate (one per state) experimental > cross-species homolog > fragment, each confidence-flagged
3 map place the variant per state; measure proximity in the assembled tetramer StatePlacement + Proximity the measured distance, whatever it turns out to be
4 energetics a ΔΔG ensemble (ThermoMPNN + RaSP; DDGun3D cross-check) a DDG on each placement one noisy, class-dependent signal, weakest for gain-of-function; the spread is shown, and it stays evidence
5 annotate project ClinVar / gnomAD / literature onto the variant the five Omic layers + Evidence surfaces literature call ≠ current ClinVar label
6 brief compose stages 1–5 the populated ContextGraphObject coordinates stay fetch-pointers, so the object regenerates from source on demand
7 render compile the object → self-contained interactive 3D report (consumes the object) gaps render as gaps; cross-species flagged; provenance caption on every view

Read the "→ the object it builds" column top to bottom and you have watched the context-graph object get assembled, stage by stage.

Starting from a genome

A genome does not begin at a protein variant, so locus is the bridge. It resolves a GRCh38 coordinate onto the gene's MANE transcript and, where one exists, onto a residue. Just as importantly, it says plainly when no residue exists, which is true of most of the gene: RYR1 is 153,874 bp of transcript for 15,117 nt of coding sequence, so 90% of it encodes nothing. Every position comes back as exactly one of four honest verdicts — coding exonic with a real residue, non-coding exonic with none, intronic with none plus its splice context, or outside the transcript.

The transform is pure, needs no network, and knows nothing about RYR1: it reads whatever exon table a gene's config declares, and handles both strands. vcf sits on top of it and reads a real GRCh38 VCF into an individual's observed calls. Both were validated against a completely separate annotation path: 3,390 comparisons against Ensembl VEP across 1,507 annotated positions, with no mismatch, and, across two probands, 545 overlapping calls with no genotype or residue disagreements. track then draws that same object on its genomic axis, introns to scale, switchable back to the residue axis.

One limit: build_briefing itself still takes the variant as protein HGVS on one canonical frame, UniProt P21817 (sequence version 3) / RefSeq NM_000540.3, and the 18-variant benchmark lives entirely on that frame. locus is how you get from a coordinate to that input, not a second front door onto the briefing pipeline. Other assemblies (GRCh37 and older) and transcripts other than MANE are still roadmap.


The object

The seven stages all deposit into one shared object, and this section is that object.

The pipeline's product is a standardized, gene-agnostic, provenance-tracked context-graph object, whose schema is what/ontology.md. It is a graph because the biology is a graph: a variant maps to a residue, which sits in a region, placed in each conformational state via a specific experimental template, near specific functional elements, implicated in a mechanism, grounded in evidence.

First, what typed and shared actually mean — the two words the rest of this section rests on

Typed means each entity is a declared class with a fixed set of fields and controlled vocabularies, instead of whatever shape a given source happened to hand over. The R614C variant in the shipped object is not the string "R614C"; it is a Variant with a required form:

hgvs_p = 'p.Arg614Cys'   position = 614   ref_aa = 'R'   alt_aa = 'C'
consequence = 'missense'   maps_to = 614

consequence is drawn from a fixed list, so three tools that would otherwise emit missense, missense_variant and nonsynonymous SNV all land on one value. Conformational states are a controlled vocabulary too — closed · primed · open · dantrolene_inhibited — rather than free text lifted from a deposition title. The schema enforces this, so a malformed entity fails loudly instead of quietly entering the graph.

Shared means those entities are join targets. maps_to = 614 points at the Residue at position 614, and the structural placement, the ClinVar and gnomAD records, the ΔΔG and the conservation all attach to that same residue. For R614C, four omic layers hang off one variant.

Without it, structure calls the position Arg614, ClinVar calls it NM_000540.3(RYR1):c.1840C>T, and gnomAD calls it 19-38457545-C-T — three names for one thing, and joining any two of them takes glue written for that pair. Typing plus shared entities turns N×N glue into one adapter per source. That is the whole reason these objects compose, and why a new protein or a new omic layer is an addition instead of a rewrite.

Inside it are typed entitiesGene · Variant · Residue · StructuralRegion · ConformationalState · StructureTemplate · StatePlacement · FunctionalElement · Mechanism · Evidence — plus five omic layers hung on the variant and residue (structural, genetic-population, functional, clinical, pharmacological), and a Provenance record on every node and edge carrying the source, the identifier, the re-runnable API call, the cross-species graft flag and the verification status. The renderer is a pure function of this object, so the same object drives the report prose and every figure.

flowchart LR
    V(["Variant"]) --> R["Residue<br/>+ derived numbering"]
    R --> SP["State placement<br/>closed · primed · open · drug-bound"]
    SP --> T["Structure template<br/>PDB · species · resolution"]
    SP --> P["Proximity to<br/>functional elements"]
    V --> M["Mechanism"]
    V --> O["Omic layers<br/>structural · genetic · functional · clinical · pharmacological"]
    M --> EV[("Evidence —<br/>a citation per claim")]
    P --> EV
    SP --> EV
    O --> EV
Loading

A shared, versioned schema is the precondition for composition. Different omic layers attach to the same typed entities instead of living in silos; different data sources emit into the same shape with their provenance intact; and a new protein arrives as a node.yaml of identifiers, states, templates, regions and functional elements, which makes adding one a configuration job. That is also what makes cross-system transfer thinkable: the object shape that serves RYR1 today already serves RYR2, and extends to CACNA1S and beyond, so related channels can eventually cross-inform one another.

Those three properties — a shared versioned schema, open re-runnable access, and provenance on every edge — make the object Interoperable, Accessible and Reusable, three of the four FAIR principles (Findable · Accessible · Interoperable · Reusable; Wilkinson et al., Sci. Data 2016). We hold the object to them, and name the one where it falls short:

FAIR How the context-graph object embodies it Honest status
Findable a persistent identifier on every source (UniProt P21817 · RefSeq NM_000540.3 · PDB · ClinVar · gnomAD); rich typed metadata Partial — the emitted object has no minted PID / registry index yet
Accessible provenance rides every node and edge; database-sourced fields carry a logged, re-runnable public API call, and literature or derived values say which they are instead of borrowing one Strong
Interoperable a versioned ontology + machine-readable JSON Schema; shared typed entities; qualified cross-references Strong (roadmap: bind terms to community ontologies)
Reusable MIT-licensed; a Provenance record on every node and edge; domain conventions (HGVS · ClinVar · ACMG) Strong

The one partial, a registered persistent identifier for the emitted object (a DOI plus a repository deposit), is a gap we know about and intend to close.


See it in action

Every figure here and every interactive report is a render of the same standardized object, by way of its backend-neutral scene spec. Publication-style stills and the engine's own live 3D report therefore agree by construction, and each carries the same flag: assembled from cross-species templates, never folded.

R614C's engine-measured distance to every functional element in the open state; nearest is the N-terminal interface at 41.0 A.
The allosteric fingerprint. R614C's engine-measured distance to every functional element. The nearest is 41 Å, so it lines none of them: a pathogenic variant that acts at a distance. The report gives the measured distance and stops there.
The same functional elements on the closed apo state; the Ca2+ site is empty, the gate is shut, and unresolved density is ghosted.
State-dependence. The same sites on the closed apo state, with the Ca²⁺ site empty and the gate shut. Unresolved backbone-only density is ghosted, so a hole in the data looks like one.

The headline deliverable is the interactive R614C report (download and open in any browser): a confidence-encoded 3D viewer, the ΔΔG spread, and a provenance trail that links each database-sourced fact to the exact public API call behind it and labels the rest as literature or derived, plus a built-in key to the identifiers such as PDB, UniProt and ClinVar so it reads on its own.

Three more cases show the differentiators, all the same report on other variants: I4898T lines the pore and raises the ClinVar-vs-literature flag · T4826I is pathogenic yet ΔΔG-stabilizing · G2060C is a benign control with an honest gap and an honest ΔΔG skip.

A second gene, from the same engine

RYR2, the cardiac sibling, runs end to end on the same engine, and regenerating everything below takes no gene-specific code: one engine, two genes, the difference carried in the data. Getting there was less tidy, and the roadmap below says so — standing RYR2 up exposed seven places where the engine had quietly assumed RYR1's shape, all since fixed and regression-tested. The outputs come in exactly the same shapes, which is what makes the contrast legible. R176Q is a CPVT variant in the N-terminal domain whose nearest functional element, the NTD interface cluster, is 2.4 Å away, where R614C sits more than 40 Å from everything it could touch. Same engine, same measure, opposite answer. Its gene track draws the same genomic axis on chr1, where RYR2's gene body is 4.9× RYR1's and is still drawn to scale, and its object validates against the same schema as RYR1's.

Two-panel figure of RYR2 p.Arg176Gln in the open state on human structure 7U9Z: the two-protomer assembly, and the same contact cropped to 40 A around the contact residues.
The same treatment, a different gene. RYR2 R176Q in the open state on 7U9Z (H. sapiens, 3.29 Å). RYR2's full-length structures are human, so it needs no cross-species graft and no offset reconciliation. The flag every RYR1 figure carries is absent here because none is owed, and the legend states that outright.

Running a second gene is also what surfaced seven places where the engine had silently assumed the shape of its first one. All seven are fixed and regression-tested, and they are described in the roadmap below. That absence of a cross-species graft is itself a stated limit on the portability claim: RYR2 exercises the engine end to end, but it leaves RYR1's two hardest honesty mechanisms, the graft downgrade and the non-constant offset bridge, unexercised.

An individual's genome

The gene tracks are the genomic view of the same object, and they make the honest case visually.

  • NA20815 — a real individual from the 1000 Genomes panel, with 88 in-gene calls of which 80 encode no residue. Switch to the residue axis and they vanish, which is what a protein-centric view has been doing all along. Built with no network at all.
  • The same individual, read from a VCF — 89 authentic GRCh38 calls, plus R614C spiked in and labelled as synthetic in the object itself, drawn as a dashed mark with its own badge and banner. The panel filtered out every singleton before phasing, so no genuinely private variant can appear in this data at all, which is precisely why a labelled spike is necessary here.
  • R614C on the gene axis — the loop closed, with a working click-through from the track to the 3D report.

What we found

We ran a retrospective benchmark on 18 literature-documented RYR1 variants: malignant-hyperthermia and congenital-myopathy pathogenic variants against benign controls, drawn from ClinVar, gnomAD and the literature. It was independently re-derived through a second code path (Biopython alignment and Biotite distances) that does not trust the engine.

Read it as two tiers. For all 18 we reproduced the basic facts, meaning the right wild-type residue and the right cross-species residue number. For the 14 pathogenic variants, setting the 4 benign controls aside, we checked the interpretation: did the variant land in the right structural bucket (lines a site → abuts → domain-body → far-allosteric), and did the mechanism direction, gain- versus loss-of-function, match the literature. The benign controls correctly draw no mechanism call at all.

Check Result
Wild-type residue identity 18 / 18
Numbering across the non-constant human↔rabbit/pig offset 18 / 18
Pathogenic variants in the correct structural bucket 14 / 14
Mechanism direction vs. the literature 14 / 14
Independent proximity re-measure vs. the engine matches ≤ 0.1 Å

Why this beats a single score:

  • T4826I is pathogenic for MH, yet the ΔΔG ensemble calls it mildly stabilizing, so a stability-only or scalar tool miscalls it. ChannelScope surfaces the contradiction and points to gating and gain-of-function.
  • The hotspots resolve into a measured spectrum instead of one coarse bucket: I4898T at 0.0 Å of the pore's gate-and-filter element, since it is a filter residue · R163C 3.4 Å · G2434R 9.2 Å · Y522S 32.6 Å · R614C 41.0 Å. Read the units carefully, because we had to. Each distance is to the nearest residue of a functional element, and an "inter-protomer interface" element is the set of residues lining that interface on the variant's own protomer. Measured directly across the subunit boundary in 7M6A, no variant in this set contacts a neighbouring protomer: the closest, R163C, is 10.1 Å away, and R614C is 45.8 Å. We had described R163C as lining the contact, and that was wrong. The graded reading survives the correction and gets sharper — these variants act by abutting or destabilizing the domains that build the interface, and some are purely allosteric. No pathogenicity scalar (AlphaMissense) or regulatory model (AlphaGenome) expresses a structural reading like that. The cross-boundary figures above were measured for this check; having the engine emit them alongside element proximity is a logged change it has not made yet.

There is one more result, on a question we expected to answer the other way. Conservation is supposed to flag the residues that matter, so we measured it before building anything on top of it. In RYR1 an invariant position turns out not to be special: 3,240 of 5,038 residues, or 64%, are invariant, which makes invariance the gene's default state and a weak signal (likelihood ratio ≈ 1.4). The informative direction is the negative one. A position that is not conserved argues against functional importance about 1.5 times more strongly than conservation argues for it (≈ 2.1). We shipped the layer anyway, with that denominator attached to every value, because a conservation bin without the fraction of the gene that shares it is not evidence.

Curated, provenance-linked findings: how/deliverables/headline_findings.md.


Using it

  • Just use Claude Code. Point it at the repo and the agent orients itself. The built-in context layer, an operating guide plus a live-state file plus per-directory routing notes, lets it read the project, absorb the standards, and start contributing with no hand-holding. It is how this was built (see How it was built), and it is how we would suggest you explore, run or extend it.
  • Run it. pip install -e ., then the Quick start below to brief any variant on the canonical frame.
  • Extend it to a new protein. Copy how/templates/node_protein/ and fill in a node.yaml of identifiers, states, templates, regions and functional elements. The engine is gene-agnostic, and RYR2 is the worked example.
  • Just look, with no install. Browse the already-generated outputs in how/deliverables/briefings/: the interactive reports, the gene tracks, the text briefings and the standardized objects. This door shows you worked examples that are already computed; install it to run your own.

Quick start

pip install -e .          # small, MIT, cloud/API-only stack (Python ≥ 3.10)

# regenerate the headline interactive report (fetches public data, ~30 s)
python -m channelscope.render RYR1 p.Arg614Cys r614c.html

# or drive the whole pipeline from Python
python -c "import channelscope; print(channelscope.briefing_summary(channelscope.build_briefing('RYR1','p.Arg614Cys')))"

Full setup, regeneration, and how to re-run the validation: REPRODUCE.md.

What's in the repo

Path What is there
what/ontology.md the object schema, with what/ontology.schema.json as its machine-readable form
what/code/channelscope/ the engine
what/datasets/ the per-gene data: the RYR1 and RYR2 config nodes, structure templates, functional elements, conservation, cohort
how/deliverables/briefings/ generated reports, gene tracks, objects and text briefings
how/deliverables/renders/ the figures and animations
how/templates/node_protein/ the drop-in template for adding a protein
REPRODUCE.md setup, regeneration, and re-running the validation

Proven today, and the roadmap

What we shipped is a validated proof of concept of a generalizable method. Here is the honest split between what that proves and what it points to. The right column is spoken as roadmap, never as a shipped capability.

Proven today · checkable in this repo Roadmap · the aim
The object a schema-validated context-graph object with five omic layers on shared entities, for RYR1 and RYR2 variants more layers (transcriptomic / proteomic); AlphaMissense / AlphaGenome consumed as layers, not competed with
Generalization gene-agnostic engine, where adding a protein means writing one node.yaml. A second protein (RYR2) is instantiated end-to-end, and running it surfaced seven places the engine had silently assumed its first gene's shape: four fixed on discovery, two held on cost and fixed since, one latent until RYR2's conservation data arrived. All seven are fixed and regression-tested a third protein from outside the RyR family, where no paralog shortcut exists
Trust provenance on every entity, with cross-species grafts and template confidence flagged explicitly; independent second-code-path validation, 18/18 numbering and 14/14 mechanism retire the reserved numeric confidence field at the next schema version — a single calibrated scalar is the one thing this object declines to invent
Input GRCh38 coordinates and VCF files are read in-package (locus, vcf), agreeing with Ensembl VEP across 3,390 comparisons with no mismatch; the briefing pipeline itself takes protein HGVS on one canonical frame, and the whole benchmark lives on it other assemblies (GRCh37 and older) and transcripts other than MANE; a coordinate accepted directly at the briefing entry point
Purpose-specific "omic" models not built yet — the object is the groundwork such a model would build on train purpose-specific models on these objects; cross-protein / cross-omic transfer (RYR2 informing RYR1)

Maturity: ● delivered & validated today · ◑ core shipped, a named extension still on the roadmap · ○ not built yet.

The immediate expansion is more proteins of the same class: large, multi-domain, multi-conformation proteins with rich experimental and cross-species structural data and clinically actionable variants. That is exactly where single-shot folding fails and per-state experimental templating adds unique value.

Tier Targets Disease context
0 · now RYR1, RYR2 malignant hyperthermia, congenital myopathies · CPVT / arrhythmia
1 · immediate CACNA1S, ITPR1 periodic paralysis · cerebellar ataxia
2 · channelopathies SCN1A/4A/5A, CACNA1A/1C, KCNQ1 / KCNH2 epilepsy, arrhythmia, migraine
3 · large muscle proteins TTN (titin), DMD, NEB, DYSF cardiomyopathies, muscular dystrophies

The conformational-state axis is the differentiator, and the structure-to-therapy link that dantrolene makes concrete for RyR1 is general.

The best-known variant-effect models answer different questions, and ChannelScope is built to consume them. AlphaMissense returns one pathogenicity score with no where, no what it touches and no state; on the gain-of-function channel variants behind MH, a scalar shares the same blind spot as a folding ΔΔG, since both track fold stability, which gating variants barely change (evidence and citations). AlphaGenome reads regulation, meaning expression and splicing, not protein structure. Folding the mutant is no answer either: RYR1 is too large for a single-shot server, and a lone substitution barely moves a predicted backbone, so the wild-type and variant models come back near-identical (Buel & Walters 2022). ChannelScope supplies the missing axis, the 3D, conformational-state-aware, provenance-tracked structural mechanism, and then ingests the others as omic layers on the same object.

Adding proteins cheaply is the easy half of the claim. The harder half is a premise we have not yet tested: that related channels can cross-inform each other, because the biology is already coupled. The biology behind it is real and cited. RYR1's closest sibling RYR2 shares its architecture and its gain-of-function logic; RYR1 is itself physically coupled to the dihydropyridine receptor (CaV1.1 / CACNA1S, a Tier-1 target above), whose conformational change gates it; and RyR channels gate in unison with their neighbours, the "coupled gating" that Van Petegem 2012 describes.

What is missing before that becomes a claim, stated exactly: no variant has been transferred between the two genes and scored against an independent outcome here; the two genes are separate objects that share a schema, with no cross-gene edge in the ontology to carry such an inference; and RYR2 has no expert-panel curation to transfer to or from — the ClinGen RYR2 VCEP has published no specification, so RYR2 licenses no ACMG PM1 at any strength, against 25 ClinGen and 379 ClinVar expert-panel entries for RYR1. Until those are closed, a standardized object spanning coupled channels is a design that mirrors how the channels work, and the groundwork purpose-specific "omic" models could be built on. (Roadmap, stated as vision.)


How it was built

Two Claude surfaces with a deliberate division of labour, build (Claude Code) and ground-and-verify (Claude Science), sharing one repository so that every grounding result and figure is a reproducible, provenance-tracked artifact. That is how the project actually got built, and the shared repository is what made the split workable: the handoff between the two is a file with its provenance attached, which is the same discipline the object applies to data.

flowchart LR
    subgraph CC["Claude Code (Lumen)"]
        A["builds the engine, object model,<br/>199 tests, git, packaging"]
    end
    subgraph CS["Claude Science"]
        B["grounds the biology, runs the ΔΔG<br/>ensemble, renders, validates"]
    end
    A <-->|"one shared repo — async file handoff"| B
Loading

Claude Science's single most valuable contribution was adversarial. It re-derived the numbering and proximity through its own independent code path, Biopython plus Biotite, and confirmed a match to within 0.1 Å, which turned a demo into a benchmark.

The same discipline turned inward. An early standing rule over-broadly dismissed the ΔΔG signal as "just noise". Gathering the evidence, five sources each verified against the primary literature, refined that to class-dependent: a genuine signal for loss-of-function destabilization, weak and misleading for the gain-of-function gating class. That refinement is why the engine reports ΔΔG as one signal among several instead of a verdict — which is what lets T4826I, pathogenic yet stabilizing, surface as a contradiction to be explained instead of a benign call. The method caught and corrected its own over-claim, which is what a verification discipline is for.

The repo is also context-engineered for agents. It follows a documented knowledge-vault methodology, aDNA: a what/ how/ who/ triad with an operating guide, a live-state file, and per-directory routing notes, which together form a built-in, agent-navigable context layer. An agent can be dropped in and onboard itself before writing a line. The product is a context graph, and the repo that builds it is organized the same way. That is why Claude Code could build this, and how you can pick it up.


Disclaimer

Research and interpretation-support tool. Not a diagnostic device.

License

MIT. Data are retrieved live from public sources under their own terms; the one redistributed source snapshot (Van Petegem 2012) is CC-BY.

Acknowledgements

  • Built with Claude Code and Claude Science during Built with Claude: Life Sciences (Anthropic × Cerebral Valley, with Gladstone Institutes).
  • Motivated by the residue-by-residue structural variant-curation work in structural-biology labs studying RYR1 — exemplified by Prof. Filip Van Petegem's public talk on RyR1 structure, gating, and disease.
  • Built with the inspiration from the patients and researchers served by The RYR-1 Foundation (RYR-1-related diseases; its patient registry is a standing pipeline of variants to interpret) and the Wilhelm Foundation (global undiagnosed-disease advocacy).
  • Where we're taking it next: we intend to build on ChannelScope and put it to use at the 5th Undiagnosed Hackathon (Wilhelm Foundation · Singapore · Sep 17–20, 2026) — bringing structural variant interpretation to real undiagnosed rare-disease cases from the Asia-Pacific.
  • Organized on the aDNA (Agentic DNA) knowledge-vault methodology — the agent-navigable context layer that let Claude Code build this.

About

Standardized, provenance-tracked context-graph objects for multi-omic biology - the substrate purpose-specific 'omic' models need. Validated on RYR1 variant-to-structure-and-function interpretation (malignant hyperthermia). Built with Claude Code + Claude Science.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages