Methodology
This page summarizes what this research project built, how it was checked, and what it has not yet been able to check, within the scope recorded in the project documents. Content that was not recorded is not written here. Numbers and units are quoted as they appear in the source documents, and this page does not add any new scientific or validation claim.
This methodology page was drafted by Claude Sonnet 5.5 from the repository documents and demo outputs; Codex gpt-6.1-terra checked the numbers, equations, citations and links against the source documents (6 findings incorporated); and the integration lead (Hermes, Claude Opus 5.5) re-checked the findings against the sources and corrected them. Every factual statement on this page is governed by the linked source documents.
Equation notation: the equations in Section 2 are typeset with KaTeX. Codex gpt-6-luna transcribed the source text equations into LaTeX, and Claude Sonnet 5.5 checked them one by one against the source documents and corrected 10 notation ambiguities (for example, V0, dp: notation that could be misread as a product). Under each group of equations you can expand the source text equations to compare.
This English page was translated from the Korean original by Claude Sonnet 5.5. Codex gpt-6.1-terra checked the translation against the Korean and found 4 meaning-level fixes, which were re-verified against the source documents and applied. The Korean original is at /ko/methodology/.
1. What this site is
The Phase 1 document records this software as “Experimental Phase 1 research software,” and records that the numerical simulation is deterministic and, after installation, needs no LLM or network connection. It states explicitly that the default configuration (baseline) is a computational reference with elevated pressures and must not be described as a reference value for a healthy adult.
What is published on this site
- Ontology graph viewer (../graph/): a read-only projection of existing records. It is not a new mapping verification.
- 3 demo result pages: Phase 1 (6-compartment), four-chamber M1, applied LA–mitral–LV sidecar. Each is synthetic demo output generated with the corresponding run command.
- This methodology page.
- Source repository documents as they are: the documents in the table of contents above are converted to
docs/<name>.htmland provided unchanged.
Related source documents: research_report · physiology · decisions
2. Models
There are three model layers. In all three models the parameter values are exploratory and synthetic, and have not been fitted to literature values. The equations below are transcribed as recorded in the documents.
2.1 Phase 1: 6-compartment closed-loop model
The declared scope is an “executable closed-loop educational/research prototype”; it is not a clinical model, not a patient-specific prediction, and not a replication of Smith et al. (2004). It is recorded that the structural equations were inspired by the reviewed sources but are simplified, and that they do not reproduce the published reference trajectories.
State variables
State order COMPARTMENTS = (lv, sa, sv, rv, pa, pv): left ventricle, systemic artery, systemic vein, right ventricle, pulmonary artery, pulmonary vein. All six states are total compartment volumes (mL); pressures and flows are algebraic observables. The circulation is a directed loop.
LV --aortic--> SA --systemic--> SV --tricuspid--> RV
RV --pulmonary_valve--> PA --pulmonary--> PV --mitral--> LV
Governing equations
Show source text equations (for comparison with physiology)
T = 60 / heart_rate [s; HR in beats/min]
phi = (t modulo T) / T [dimensionless]
a(phi) = (1 - cos(2*pi*phi/s))/2 if 0 <= phi < s
= 0 otherwise
E_lv(t) = emin_lv + (emax_lv - emin_lv)*a(phi)
E_rv(t) = emin_rv + (emax_rv - emin_rv)*a(phi)
P_lv = E_lv(t)*(V_lv - V0_lv)
P_rv = E_rv(t)*(V_rv - V0_rv)
P_i = (V_i - V0_i)/C_i for i = sa, sv, pa, pv
Q_valve = max((P_upstream-P_downstream)/R_valve, 0)
Q_bed = (P_upstream-P_downstream)/R_bed
dV_lv/dt = Q_mitral - Q_aortic
dV_sa/dt = Q_aortic - Q_systemic
dV_sv/dt = Q_systemic - Q_tricuspid
dV_rv/dt = Q_tricuspid - Q_pulmonary_valve
dV_pa/dt = Q_pulmonary_valve - Q_pulmonary
dV_pv/dt = Q_pulmonary - Q_mitralHere s is systolic_fraction. The symbolic sum of the six derivatives is 0 because each flow appears exactly once with each sign. Numerical conservation is tested separately, and it is not made to pass by renormalizing volumes or by clipping pressures or volumes (only flows are clipped, according to the constitutive law of the valve). Internal units are s, mL, mmHg. The valves are 4 algebraic one-way resistive valves (ideal diodes), and the systemic and pulmonary vascular beds are signed resistances.
Status of the parameters
The document records that all default values are “exploratory, author-selected, unfitted, not clinically validated” and that it claims no literature measurement source. Literature citations support the equation structure, not these values.
| Field | Default | Unit |
|---|---|---|
heart_rate | 75 | beat/min |
emin_lv / emax_lv | 0.06 / 2.5 | mmHg/mL |
emin_rv / emax_rv | 0.03 / 0.8 | mmHg/mL |
systolic_fraction | 0.4 | 1 |
compliance_sa / sv / pa / pv | 1.5 / 100 / 5 / 20 | mL/mmHg |
resistance_aortic / tricuspid / pulmonary_valve / mitral | 0.01 (each) | mmHg s/mL |
resistance_systemic / resistance_pulmonary | 1 / 0.1 | mmHg s/mL |
unstressed_volumes (lv, sa, sv, rv, pa, pv) | (10, 700, 2500, 10, 100, 400) | mL |
initial_volumes (same order) | (140, 850, 3200, 140, 180, 490) | mL (total 5000 mL) |
The initial volume distribution is an exploratory starting condition, not a periodic solution.
Scenarios
The three scenarios (baseline, reduced_contractility, partial_contractility_restoration) are separate runs that start from the same initial volumes; they are not a time-ordered treatment course. reduced_contractility changes only emax_lv, from 2.5 → 1.25 mmHg/mL (factor 0.5), and partial_contractility_restoration applies a factor of 1.5 to that value (→ 1.875 mmHg/mL). The changes are applied at time 0 and this is not a drug dose model.
Solver settings actually used (summary.json)
| Item | Value |
|---|---|
| Method | DOP853 |
| cycles | 60 |
| samples_per_cycle | 400 |
| rtol | 1e-09 |
| atol | 1e-10 mL |
| max_step_fraction | 0.005 (= T/200) |
| periodicity_tolerance_ml | 0.1 mL |
This periodicity criterion (a maximum difference of 0.1 mL across the six volumes between the waveforms of the last and the preceding beat) is a “modest software milestone gate” and not the stricter multi-beat criterion of the verification protocol (1e-4 mL). All three scenarios in this run were recorded with the status periodic_within_declared_gate.
Implementation details
Integration is performed within fixed valve regimes at each valve transition, and the first opening/closing time is found with a terminal pressure-gap event. The continuous extrapolation after an event is used only while finding the solution and is not retained. Integration is also restarted at the systolic/diastolic boundary and at the peak of the activation pulse. The optional cumulative_flows=True adds six integrated flow states.
What is not modelled
Separate atria, septal/pericardial interaction, valve inertia, nonlinear passive ventricular mechanics, reflexes, renal regulation, respiration, oxygen transport, pharmacology. The linear pressure law permits non-physical negative pressures for some parameters/initial states, and this is not hidden. Pulmonary venous pressure is a lumped reservoir pressure and is not evidence of measured atrial pressure or pulmonary edema.
Related source documents: physiology · research_report · decisions
2.2 four-chamber M1: passive atrial snapshot
MODEL_ID="four_chamber_m1", version 1.0.0. Synthetic/exploratory, not clinically validated, and not a published four-chamber reproduction. The existing 6-compartment equations and identity remain unchanged and independent.
State variables
State order (lv, sa, sv, ra, rv, pa, pv, la): 8 total blood volumes (mL, not stressed volume) + 8 auxiliary flow integrals. There are no flow/inertia states. The total volume is the sum of the eight initial volumes declared by the caller and is not normalized.
Edges and equations
| Edge | Source | Target | Law |
|---|---|---|---|
| aortic | lv | sa | ideal diode |
| systemic | sa | sv | signed resistor |
| venous_return | sv | ra | signed resistor |
| tricuspid | ra | rv | ideal diode |
| pulmonary_valve | rv | pa | ideal diode |
| pulmonary | pa | pv | signed resistor |
| pulmonary_venous | pv | la | signed resistor |
| mitral | la | lv | ideal diode |
Show source text equations (for comparison with physiology_four_chamber_m1)
B[source,e] = -1, B[target,e] = +1, other entries 0
dV/dt = B q, 1^T B = 0, d(sum V)/dt = 0
T = 60/HR s, phi = (t mod T)/T, s = systolic_fraction
a(phi) = (1-cos(2*pi*phi/s))/2, if phi < s; 0 otherwise
E_v(t) = Emin_v + (Emax_v-Emin_v)*a(phi), v in {lv,rv}
P_v = E_v(t)*(V_v-V0_v), v in {lv,rv}
P_a = E_a*(V_a-V0_a), a in {la,ra}, constant positive E_a
P_i = (V_i-V0_i)/C_i, i in {sa,sv,pa,pv}
dp_e = P_source(e)-P_target(e)
q_e = max(dp_e/R_e,0), for the four ideal diodes
q_e = dp_e/R_e, for the four signed resistors
Cumulative_e(t) = integral from 0 to t of q_e(u) duThe document declares the pressure reference exactly as follows: “model gauge pressure relative to one common fixed external pressure of 0 mmHg; no intrathoracic/pericardial pressure”. This is a mathematical gauge declaration, not a claim about atmospheric/absolute pressure. Negative gauge pressures are also permitted, and there is no clipping or conservation projection.
Status of the parameters
The parameters have no default values (the caller supplies all of them). The demo synthetic_fixture() copies the existing exploratory ventricular/vascular scalar values and sets the new values E_la=.15, E_ra=.10 mmHg/mL, R_venous_return=.05, R_pulmonary_venous=.05 mmHg s/mL as “explicit fixture choices”. In state order, V0=(10,700,2500,20,10,100,400,20) mL and V_initial=(140,850,3200,60,140,180,490,60) mL, and the total declared by the caller is 5120 mL. All are “test design choices, not fitted, literature-derived or normal physiology”. It is recorded that there is no source calibrating atrial elastance, venous inflow resistance, or atrial unstressed volume.
Solver settings actually used (summary.json)
| Item | Value |
|---|---|
| method | DOP853 |
| cycles | 30 |
| samples_per_cycle | 400 |
| rtol | 1e-09 |
| atol | 1e-10 mL |
| max_step | 0.004 s |
The maximum periodicity difference in this run was recorded as 0.0007067402634675091 mL (largest compartment: sv). The document states that a fixed number of beats does not prove a steady state and that there is no automatic convergence gate. Conservation report: total volume drift 1.0913936421275139e-11 mL, local balance residual 1.7280399333685637e-11 mL (the latter checks only wiring and rounding and does not independently establish integration accuracy).
What is not modelled
Active atrial contraction, AV delay, inertance, closed-valve regurgitation, FSI, renal/drug/reflex models, clinical validation. The 4 ideal algebraic diodes cannot claim dynamic valve behavior. It is not a reproduction of a Smith/four-chamber reference, and the unconditional equivalence to the 6-compartment model as R→0 is neither claimed nor used as a gate.
Related source documents: physiology_four_chamber_m1 · anatomy_nodes_v2 · decisions
2.3 applied LA–mitral–LV explanatory sidecar
This sidecar is a thin metadata layer on four_chamber_m1@1.0.0, limited to the LA, mitral transport, and the LV. It only reads the M1 manifest and does not touch the equations, parameters, units, outputs, or the existing registry. It creates neither a new physiological model nor an anatomical ontology equivalence, and it accepts no patient, CT, mask, measurement, or observational data whatsoever.
State variables and equations
The sidecar copies and points to M1's selected contract as it is: V_la, V_lv (states, mL), P_la, P_lv (algebraic observables, mmHg, common gauge), Q_mitral (mL/s, LA→LV, non-negative), Q_cum_mitral (mL, running cumulative). It does not create equations; it references the M1 equations (activation, E_v(t), P_v, P_a, ideal-diode q_e, cumulative integral) by document line numbers. E_lv(t) is not a manifest variable but a separate constitutive-law node. The inputs are heart_rate and systolic_fraction.
Status of the parameters
Required parameter references: elastance_la, emin_lv, emax_lv (mmHg/mL), resistance_mitral (mmHg*s/mL), heart_rate (1/min), systolic_fraction (dimensionless), unstressed_volumes, initial_volumes (mL). Values are not obtained from anatomy, and the demo and M1 use the same synthetic fixture.
Demo settings actually used (run_receipt.json)
| Item | Value |
|---|---|
| Number of runs | 2 runs with identical settings (before/after sidecar construction and verification) |
| cycles | 2 |
| samples_per_cycle | 50 |
| method / rtol / atol | DOP853 / 1e-09 / 1e-10 mL |
| max_step | 0.004 s |
| Array shapes | time (101,), the rest (101, 8) |
The hashes of the full time/volume/pressure/flow/cumulative arrays of the two runs matched, and the manifest hash was also identical before and after (9393e36f…3506). This is a numerical invariance check on a short run and is not steady-state or physiological validation.
What is not modelled
M1's ideal diode is a limited “no-reverse-flow” approximation of the signed/regurgitant transport that the source interface allows. Regurgitation, effective orifice area (EOA is NOT_REPRESENTED), patient geometry, and valve mechanics are not modelled. There is also no change to the right heart, no whole-body application, and no M2/M3 change.
Related source documents: applied_la_mitral_lv · physiology_four_chamber_m1
3. Ontology and semantic layer
3.1 Variable annotations and concept IRIs
physiosim.ontology provides a fully offline registry of 34 variables and an RDFLib named-graph export. It distinguishes physical property, anatomical context, physical bearer, temporal semantics, units, flow direction, equations, dependencies, and provenance context. The document records that this is “a project annotation layer and not an imported reference ontology or a clinical reasoning system”.
- External concepts (verified labels). From OPB v1.07 (a snapshot bundled by SemBioProcess; this is not a claim that it is the latest release):
Fluid pressure(OPB_00509),Fluid volume(OPB_00154),Fluid flow rate(OPB_00299),Fluid flow resistance(OPB_00160),Fluid volumetric elastance(OPB_00076),Event frequency(OPB_01212). Anatomy uses Uberon as the identifier and keeps the corresponding FMA term on the node (e.g., bloodUBERON:0000178, FMA:9670). GO process contextGO_0008015(blood circulation),GO_0060047(heart contraction). The Disease Ontology termDOID_6000(congestive heart failure) is vocabulary context only and does not claim that the baseline is that disease. - Local extensions. The namespace
https://example.org/physiosim/intentionally identifies project-local concepts and is not advertised as a resolvable external ontology (marked withConcept.local). The lumped systemic/pulmonary arterial/venous compartments, the whole 6-compartment circulation, the six flow paths, volume compliance, cardiac output (CO), and stroke volume per 1 beat (SV) are local concepts. The document states that a suitable external mapping was not established in this limited study, not that no external term exists. - Relations. Only two standard BioModels.net biological qualifiers are used:
bqbiol:isPartOffor blood and the v2 ventricular cavity, andbqbiol:occursInfor valve flow and the valve. All other relations are project-local, and conformance to the full qualifier vocabulary or to CellML/SemSim/OMEX is not claimed.owl:sameAs,owl:equivalentClass,rdfs:subClassOf, disease diagnoses, and ontology-derived causal edges are not created. - 3 RDF graphs.
verified-labels(verified external labels, source links, FMA cross-references),model-assertions(project variable annotations, bearers, local concepts, equations, dependencies),provenance(graph status and non-diagnostic notes).
3.2 SHACL validation layer
According to the evidence review document, the SHACL shapes were written for OMEX v1.2 composite annotations as 11 general rules and 7 Smith-specific rules, and the positive/negative control fixtures produce exactly the expected results. Translating the SemSim annotations of workspace 267 into OMEX form and running them yields 22 Violations, 7 Warnings, and 46 Info. It is also recorded that SHACL can enforce structural rules but cannot check physiological plausibility or numerical agreement, and that it can pass vacuously on data without annotations. Reproducing it in a new virtual environment from a separate clean working tree gave the same output (controls 0 / 13 / 12), but this is a reproduction test and not confirmation that the shapes are correct.
3.3 Evidence review and anatomy node v2 catalogue
The evidence review (2026-11-01) is a review prior to OWL generation and adopts no mapping. Candidates are proposed together with their grounding locations, and what the sources cannot decide is left as UNKNOWN. Sources of which only the abstract was read were not used to fix relation directions or mappings. It organizes here the Smith 2004 CellML's dictionary of 76 variables and 32 equations, the rejected linkage cases (R1–R13), and the unresolved conflicts (C1–C11).
Anatomy node specification v2 is a list of 31 nodes: 27 use Uberon as the primary identifier, the 4 vascular lumens use FMA as the primary identifier, and every node records the other identifier as a cross-reference. The node classes are modelled / lumped part / catalogue / reference. Catalogue nodes (e.g., the superior/inferior vena cava, coronary sinus, 3 small valves) have identifiers only and make no assertion in the Smith graph. The document states that this identifier rule is based on SPARC, SCKAN, and HRA practice, and that it is not an official recommendation of Uberon by a COMBINE document.
3.4 The three views of the graph viewer
| View | What it shows | What it is not |
|---|---|---|
| Source claims | Solid arrows: the original sourceTemplate → targetTemplate claim and the original predicate. | The original ACCEPT/REVIEW is not approval of the target mapping. |
| Model references | Dotted lines: model roles, port references, dependencies (a dependency runs on → dependent). | Not to be interpreted as anatomical relations or numerical connections. role_in_smith is a reference-model role and is not evidence of M1-specific functionality. |
| Catalogue | A list grouping the 31 entries by node_class. No structural edges. | It is not the full Uberon/FMA or OWL reasoning output. |
The layout is merely a hierarchical arrangement for screen alignment and implies no new relation or order. Edge labels use the last part of the predicate IRI as it is (e.g., BFO_0000050), and since the project document keeps RO_0002572 as an IRI without interpretation, no human-readable name was added. This viewer provides no 3D geometry, simulation, or inference verification.
3.5 Mutually independent status axes
The sidecar document and the viewer preserve the axes below separately without merging them. The value on one axis does not imply the value on another axis.
| Axis | Recorded status | Meaning |
|---|---|---|
| Source claim decision (source) | ACCEPT / REVIEW | In this run's gate_report.json, of 12 claims, 11 are ACCEPT and 1 is REVIEW. All 12 are NOT_INDEPENDENTLY_EXPERT_REVIEWED. ACCEPT supports explanatory context only. |
| Target crosswalk | PROPOSED | Proposed status, not approval. |
| External numerical use permission | NONE | No permission for numerical connection. |
| G3 (external numerical binding) | CLOSED | request_numeric_binding always raises PermissionError, even if an ACCEPT or approved claim exists. |
C5 part_of adapter | deferred (USER_DECISION_RUNTIME_DEFERRED, applied false) | The user decision is recorded but runtime application is deferred. It remains distinct from the original located_in and M1's blood_contained_in. |
| Mechanical bearer | unselected | Not selected between the LV/LA wall and myocardium candidates. |
| Mitral boundary/annulus | mitral_orifice_boundary_equivalence=REVIEW, mitral_annulus_complete_fibrous_ring_interpretation=REVISE, boundary definition DRAFT_MODEL_CONVENTION | REVIEW, REVISE, and DRAFT are not hidden but retained, and do not imply owner review or numerical permission. |
| Reference snapshot / inherited M1 review | UNREVIEWED | The M1 batch-TDD history is unresolved, and the sidecar does not approve it. |
For the sidecar, G1 (pinned representation and exact model-contract check) is reported as PASS, and G2 (synthetic run) is reported as PASS only when executed is true (in this run true / PASS). These gates concern the explanatory metadata contract and numerical invariance, and are not semantic approval. The viewer document states that “a declaration of the law/version contract is not proof of numerical integrity.”
Related source documents: ontology · evidence_review · anatomy_nodes_v2 · applied_la_mitral_lv · decisions
4. Verification methods
4.1 Kinds of tests
- Numerical: constitutive laws, 4 diodes, 6-state mass balance, cross-solver (DOP853 vs Radau), tolerance refinement, large-step pulse, simultaneous transitions, zero-flow equilibrium, sampling independence.
- Dimensional: Pint-based unit and dimension checks, unit covariance checks. Even if unit strings differ, they cannot be connected without an explicit
UnitConversion. - Semantic: connection checks that reject anatomy, property, reference, temporal-context, bearer, and direction mismatches, and a 12-fixture synthetic error-injection benchmark.
- Failure paths: invalid inputs and non-convergence fail explicitly, with no silent correction.
4.2 Conservation and periodicity audit
Total volume conservation is a checked item and is not made to pass by renormalization or clipping. The research_report (based on earlier results committed to the repository) recorded, for the three canonical runs, a maximum total volume drift of 3.18323e-11 mL (runtime gate 1e-6 mL) and a maximum difference of 2.29051e-05 mL between the six-volume waveforms of the last and the preceding beat (canonical gate 0.1 mL). This site's Phase 1 demo (demos/phase1/summary.json) recorded, in the order baseline / reduced_contractility / partial_contractility_restoration, volume_drift_ml 1.0913936421275139e-11 / 1.000444171950221e-11 / 4.3655745685100555e-11 mL, and final_beat_max_volume_difference_ml 3.880984422721667e-11 / 1.48929757415317e-11 / 2.9103830456733704e-11 mL. The two sets of values are outputs of different runs. This gate is a software milestone criterion and is not the prospective protocol's “three consecutive beats 1e-4 mL” criterion. In the independent review, for the tight baseline the residuals of the last three beats were 2.33e-4, 7.37e-5, 2.29e-5 mL, which did not meet the 1e-4 mL criterion, and with a more precise setting (rtol 1e-11, atol 1e-12, T/400) both scenarios passed. The document records this as a limitation and did not relax the criterion.
Also recorded as limitations: the maximum volume difference of the entire trajectory between the default setting and the tight setting, 0.3153 mL (systemic artery compartment, t=28.856 s), must not be described as agreement to machine precision. When the same solution is resampled at 400 vs 1600 samples/beat, the forward SV differs by about 0.057–0.059%. The local balance residual of the trapezoidal integration performed on the solver's own adaptive nodes over the full run is about 6.76 mL (baseline) and 4.47 mL (reduced) even in the most precise setting, which coexists with nearly exact global conservation of the state volumes. For this reason, strong cumulative-flow claims are withheld.
4.3 Reproducibility
- Same-host replay: the installed wheel was invoked twice in isolated Python mode, confirming byte identity of the CSVs and identity of the summaries (
summary_equal=True). All three canonical CSV trajectories were byte-identical. The document states that this is determinism on the same host with the same dependencies and not bit identity across platforms. - Clean wheel install: the wheel is built and installed together with
requirements.lockin a separate virtual environment, and it is checked that it is imported fromsite-packagesand not from a source checkout. python -I: pytest and the dependency-environment output are run in isolated mode. Installed-wheel tests are run aspython -I -m pytestwithout source path redirection.- RDF serialization order is not used as a criterion for numerical reproducibility. The files in the output directory contain no timestamps or paths (applied/M1 demos).
4.4 CI matrix
The workflow “Synthetic research checks” runs on pull requests, pushes to the main branch, and manual dispatch, and runs, on the ubuntu-24.04 runner, a matrix of the two Python versions 3.12.3 and 3.12 (fail-fast off, timeout 25 minutes). The environment variables are set to MPLBACKEND=Agg, PYTHONHASHSEED=0, single-threaded BLAS/OpenMP, API keys as empty strings, and AWS EC2 metadata access disabled. Steps: locked dependencies and clean wheel install → python -I -m pytest → scripts/verify_reproducibility.py → scripts/verify_independent.py → upload the evidence as a private artifact retained for 7 days. The README records that, locally, it was run on macOS ARM64 with Python 3.11.15 (as recorded in the README).
4.5 Independent verification
The independent reviewer did not use the implementation's derivative and metric routines as the sole reference, and instead built separate oracles (an explicit signed incidence matrix, the alternative activation formula sin(pi*phase/systolic_fraction)**2, and random states from 80 seeds). The independent tests were recorded as 12 passed, and the full test suite on the final installed wheel as 64 passed, 5 RDFLib warnings (RDFLib-internal deprecations). These are numbers from different snapshots and are not inconsistent. After the independent review, the owner reproduced two empty-metadata errors (pairs with missing reference/anatomy identifiers were accepted) with failing regression tests and then fixed them. The original review snapshot is preserved, and the re-run evidence was written separately. It remains the case that something is accepted even if the equations change as long as the metadata is the same, and that free-text provenance context is not checked.
The full prospective protocol is not complete (human usability study, event-resolved valve timing, automatic periodicity termination, multi-level contractility sweep, cross-platform reproducibility, patient/reference data validation, etc.).
4.6 Smith 2004 / OpenCOR reference reproduction work (as recorded, report-only)
A reference task that ran the canonical CellML of Smith 2004 in OpenCOR v0.8.3 is recorded separately. This does not mean that the project's simulation engine reproduced the reference trajectories (the engine is recorded as not reproducing the reference trajectories).
- The default run failed with the error
std::runtime_error: the maximum number of iterations was reached before convergence. Which solver failed is UNKNOWN (it is recorded as a correction that the KINSOL attribution in the previous sentence was an inference). - With user approval, OpenCOR's fixed-step 4th-order Runge-Kutta (RK4) replaced only CVODE, and KINSOL, the model, the parameters, and the units are unchanged. The results are labelled “OpenCOR RK4”, and this does not explain the cause of the CVODE failure.
- Integration steps 1e-5 s (A), 5e-6 s (B), 2.5e-6 s (C). The output interval is 0.001 s in all cases, with 1,501 rows each. A, B, and C are compared at the same output indices. Time agreement tolerance: |dt| ≤ N_steps · eps(2.22e-16) · t_max (3.0e5 steps; at 1.5 s, about 1.0e-10 s).
- The comparison is report-only and there is no pass/fail line. The literature (Pathmanathan & Gray, Erdemir, Santiago, Mulugeta, etc.) was judged to prescribe verification procedures but not universal numerical tolerance criteria, with the level set by the context of use. Even a passing result would not establish scientific validity.
- Recorded report (observed order based on the max norm): 0.964, 0.960, 1.000. RK4 has a formal order of 4; the cause of the lower order has not been established. Stroke volume per 1 beat (A/B/C): 65.8474 / 65.8479 / 65.8481 mL and 65.7768 / 65.7769 / 65.7770 mL.
- The negative Q_av during the closed-valve interval is consistent with a numerical artifact of the CellML encoding, but it is recorded as an observation whose cause has not been established. Agreement with the published waveform (Figure 7) has not yet been confirmed.
- The kPa notation in the CellML is regarded as a mislabel, and there is a user decision (C1) to read it on an mmHg basis; no conversion factor is applied. Uncertainty remains because the authors do not state the units of individual values.
4.7 What “passing” means and does not mean
What it means: that, under the conditions tested, the implementation results conform to the declared equations, the independent oracle, and the applicable software tolerance criteria; that the total volume is conserved; that the declared software tolerance criteria were met; and that re-running in the same environment gives the same results.
What it does not mean: biological validity, normal ranges, diagnostic accuracy, patient-specific prediction, clinical suitability, reproduction of a published reference model. The project documents state “Passing these checks is not biological validation”. The error-injection benchmark deliberately leaves 1 false acceptance (an actual RV pressure carrying seemingly correct LV metadata, with a maximum error of 129.793 mmHg relative to the intended LV pressure). Metadata verification is not numerical provenance verification. The benchmark is a synthetic experiment of 12 fixtures using hand-assigned ground truth and is not a user study.
| Condition | Correct accept | Correct reject | Unsafe accept | False reject |
|---|---|---|---|---|
| manual | 3 | 0 | 9 | 0 |
| units_only | 3 | 3 | 6 | 0 |
| semantic | 3 | 8 | 1 | 0 |
Related source documents: verification_protocol · independent_verification · research_report · decisions · orchestration_state · evidence_review
5. AI-assisted development and review procedure
The work of this project is carried out using AI coding agents, and what follows transcribes only the scope recorded in docs/orchestration_state.md, docs/decisions.md, and the graph viewer README. In the terms of the same documents, the status vocabulary is strict: PROPOSED < IMPLEMENTED < TESTED < SCIENTIFICALLY VALIDATED. In this project, nothing has been scientifically validated against external physiological data.
Multi-model routing policy
Work is assigned to Claude or Codex model tiers according to risk and complexity. The effective tiers recorded:
| Tier | Claude | Codex |
|---|---|---|
| LIGHT | claude-haiku-5-5 | gpt-5.6-terra |
| STANDARD | claude-sonnet-5-5 | gpt-5.6-sol (substitute for the unavailable gpt-6.1-sol) |
| DEEP | claude-opus-5-5 | gpt-6-astra |
Some Codex model IDs were rejected with model_not_found on this account, and one remains unconfirmed owing to an HTTP 429 response. For this reason it is recorded that the model is always specified explicitly.
Separation of implementation and review
- Provider separation. One provider implements and another provider reviews independently. Recorded example: T1 (optional cumulative flow state) was implemented by Codex gpt-5.6-sol (IMPLEMENTED, TESTED), and R1 (independent cross-review of T1) was performed by Claude opus-5-5 read-only (no editing tools), giving “ACCEPT WITH CHANGES” with 3 major findings (two tolerances looser by 87× and 8000× respectively, an undocumented dense-output undershoot, and loose volume error control).
- Integrator's numerical re-run. The integrator re-ran all numbers of R1 and then tightened the tolerances to about 4× / 8× the measured values and documented the limits (T1-fix). The review of T2 (strict multi-beat
periodicity_report, Claude haiku-5-5) (T2-rev) was performed by the integrator's diff review and cross-checking against the previously documented independent residuals (exactly reproduced), and was accepted without changes. There was no escalation or retry. - Isolation. Workers run in a scratch copy baselined with git and in their own virtual environment, and the integrator applied the reviewed diff.
- Role separation (Phase 1). Agent A implemented the model/equations, Agent B the semantics, and Agent C did an independent scientific source review followed by independent code verification, with the parent responsible for integration and reproducibility. “Which provider played which role” in the preceding description is based solely on the records in the table above.
- Owner decisions. Scope, criteria, and corrections are recorded in
decisions.mdas “user decision / user-approved” items, with dates and rationale. Examples: an item acknowledging that the assistant had set a comparison tolerance arbitrarily and replacing it with a derived bound, and an item where items not fixed in advance were not added after seeing the results. - Graph viewer. The draft was made from inputs of an earlier revision; later, when a PR corrected a
statussentence in an input file, the three input files were regenerated from the current source revision (only that sentence and the hashes changed). The viewer is a read-only projection of existing records. - A decision is recorded that sample values from the external UI repository are excluded from all research evidence and calculations, that samples are distinguished from actual outputs when actual results are connected, and that missing data are not filled with samples.
Related source documents: orchestration_state · decisions · independent_verification
6. Decisions and open items
Summary of recorded owner (user) decisions
- C5 bearer format (2026-11-01): adopted
Portion of blood part_of cavity/lumeninstead of organ-level anatomy. This is a project decision and neither a new scientific finding nor a claim of physical equivalence between a lumped compartment and a named lumen. Implementation in the registry was deferred at the time, but a later "Node specification v2 applied to the registry" decision applied V_lv, P_lv, V_rv, and P_rv in the registry as properties of blood that isbqbiol:isPartOfthe ventricular cavity. The C5 runtime adapter of the applied sidecar is separately deferred (USER_DECISION_RUNTIME_DEFERRED). - Pressure reference (2026-11-01): expressed as the sink of the energy difference. Whether the common ground equals atmospheric pressure is UNKNOWN in the CellML. Only the documentation is changed; the registry string is left as it is.
- C1 units (2026-11-01): the kPa notation in the CellML is regarded as a mislabel and read on an mmHg basis, and no conversion factor is applied. This lifted the block on numerical comparison with the CellML, and the comparison remains report-only.
- Anatomical structures as nodes (2026-11-01): the four valves are expressed with
bqbiol:occursIn, the atria as separate nodes, and venous compartments asbqbiol:hasPartcomposites. Node specification v2 was applied to SHACL and the registry (“A1–A9 only first”, “use standard bqbiol”). - M1 passive atria (2026-11-01): added
four_chamber_m1as an owner-approved software milestone. No claims of active atria, AV delay, inertance, FSI, regurgitation, calibration, or clinical validation. - Smith 2004 reference run: RK4 substitution, the time-agreement tolerance rule, the third step size (2.5e-6 s), scalar definitions, report-only (no pass/fail).
- Phase 1 canonical experiment: 60 cycles, DOP853 rtol=1e-9, atol=1e-10 mL, max step T/200, 400 samples/cycle. The milestone periodicity gate is ≤0.1 mL, and it does not silently replace the stricter prospective 1e-4 mL or claim it as complete. Renal feedback and clinical treatment models are deferred until the cardiovascular core passes verification.
What is still open
- Ontology decisions (concerning the sidecar and registry of PR #5): (G1) whether the local
sa,sv,pa,pvcorrespond to the v2 vascular lumen nodes; (G2) whether the venous compartments include the atria (in conflict with the independent verification document); (G3) which nodes E_lv/E_rv and vascular compliance should be placed on; (G4) the location of valve resistance; (G5) systemic/pulmonary vascular-bed flows and resistances and V_total remain local because the v2 nodes do not exist; (G6) whether the pressurereferencestring and the common ground are atmospheric pressure (UNKNOWN). Also: the runtime application of the C5part_ofremains deferred, the mechanical bearer (wall vs myocardium) is unselected, the mitral orifice boundary is REVIEW and the annulus REVISE, the boundary interface is DRAFT, and there is an interpretation gap between v2's LA (Smith lumped venous role) and M1's separate LA state. - Physiological validity: nothing has been validated against external physiological data. There is no source calibrating atrial elastance, venous inflow resistance, or atrial unstressed volume, and there are also no confidence intervals, identifiability analysis, or parameter estimation. Agreement between the published waveform (Figure 7) and the CellML output has not been confirmed. The origin of CellML elements that have no source (the peripheral P_th term, the closed-loop drive delay, inflow valve inertia) is UNKNOWN.
- Inherited M1 batch-TDD history: UNREVIEWED and unresolved. The sidecar does not approve it. The first wheel evidence during the PR #5 portability fix reproduced two failures, but it is not evidence for all 30 reported CI failures.
- Other open items: reproduction of a permitted reference model using the canonical CellML, parameter sensitivity analysis, whether the runner should report
periodicity_reportand cumulative-flow SV insummary.json(approval is needed because it changes the canonical output), whether to exclude cumulative states from error control, and open OPB/FMA/OMEX items (the UNKNOWN list).
Related source documents: decisions · orchestration_state · evidence_review · applied_la_mitral_lv
7. Limitations
- All results are synthetic values and there is no patient data. All physiological parameters are exploratory and uncalibrated. The baseline is a reference with elevated pressures and is not a healthy-adult reference. Checking that parameter values are positive is only a check of the mathematical domain and is not a validated physiological range.
- Smith 2004 was not replicated, the reference trajectories were not reproduced, and the original model code was not run (the reference OpenCOR run is a separate task). No external simulation code is included in the numerical engine.
- Not modelled — Phase 1: separate atria, septal/pericardial interaction, valve inertia, nonlinear passive ventricular mechanics, reflexes, renal regulation, respiration, oxygen transport, pharmacology; M1: active atrial contraction, AV delay, inertance, regurgitation, FSI. There are no drug dose or PK/PD models, and GFR, sodium balance, and RAAS are also not implemented.
- Valve switching is non-smooth, so convergence checks are needed for tolerances and output sampling, and neither sampling nor the default solver settings guarantee accuracy at valve opening times. A fixed number of beats does not prove a steady state.
- The full prospective verification protocol is not complete. The semantic benchmark is a small, hand-designed synthetic error-injection experiment and is not a human productivity study. Human integration effort was not measured. General semantic-connection accuracy and automatic anatomical equivalence have not been established. “Ontology-based trustworthy model composition” remains a research hypothesis.
- The semantic layer does not guarantee that a variable mapping or an equation is an authoritative ontological implication. There is no reasoner, subclass closure, synonym equivalence, or equation parsing. It deliberately demonstrates the failure in which seemingly correct metadata is attached to wrong numerical data.
- Per ontology.md: it is recorded that some already-committed exports (
results/phase1/, etc.) reflect the pre-v2 registry and may show v1 FMA identifiers (regeneration needed). - The original source material of the sidecar is for internal research use permitted by the owner, and no right of relicensing or redistribution is claimed.
Related source documents: research_report · physiology · ontology · independent_verification · applied_la_mitral_lv
8. Sources and attribution
Smith et al. (2004) and the CellML model
Smith BW, Chase JG, Nokes RI, Shaw GM, Wake G. Minimal haemodynamic system model including ventricular interaction and valve dynamics. Medical Engineering & Physics 26 (2004), 131–139, PMID 15036180.
The Physiome Model Repository (PMR) states that all publicly accessible repository content is licensed under CC BY 3.0 Unported. docs/physiology.md records that redistribution requires attribution of the CellML author (Geoffrey Nunns, Auckland Bioengineering Institute), the original paper (PMID 15036180), the source URL and download time, and the PMR citation (Lloyd et al., Bioinformatics 2008;24(18):2122–2123). This license applies to the CellML encoding and not to the text or figures of the journal paper. This is technical due diligence and not legal advice. CellML and its code are not integrated into this project's numerical engine; it was consulted in designing the structural equations.
Ontologies and vocabularies
- Uberon (release 2026-10-01, CC BY 3.0, actively released) and FMA (5.1.0, 2026-05-15, CC BY 4.0, marked “inactive” at the OBO Foundry): anatomy node identifiers and cross-references. The notice in the sidecar source records RO as CC0; external term labels were confirmed from EBI OLS4 search results.
- OPB v1.07 (a snapshot bundled by SemBioProcess/SemGen), GO, Disease Ontology (label context only), CellML Metadata 1.0 (specification), BioModels.net qualifiers 1.1 (
bqbiol:isPartOf,occursIn,hasPart). - BFO / RO family IRIs: the graph viewer displays the original predicates as IRIs (e.g.,
BFO_0000050,RO_0002572,RO_0001025). The document records that of these,RO_0002572is preserved as an IRI without new interpretation. - For the OMEX metadata specifications (v1.0, v1.2) only the abstracts were read. It is recorded that the SemGen annotation protocol and the W3C SHACL and PROV-O recommendations were read.
Literature (to the extent cited in the documents)
- Pathmanathan & Gray 2013, doi 10.3389/fphys.2013.00358; Pathmanathan & Gray 2014, 10.1002/cnm.2615; Erdemir 2020, 10.1186/s12967-020-02540-4; Mulugeta 2018, 10.3389/fninf.2018.00018; Santiago 2022, 10.1371/journal.pcbi.1010141 (basis for the value-comparison approach).
- Shi et al. 2011, review of 0D/1D blood flow models (PMC3103466); Burkhoff & Tyberg 1993 (PubMed 8238596); Neal et al. 2015, semantic cardiomyocyte composition (PLoS ONE, based on the link for doi 10.1371/journal.pone.0145621).
- Paeme 2011, Revie 2013, Pironet 2013 (S17–S19, in the evidence review document; for exact bibliographic details see that document). The evidence cards distinguish sources whose full text was retained, with licenses (CC BY, etc.), from sources for which only quotations were retained because of copyright.
This page copies the above bibliographic information from the documents and adds no author, year, or DOI that is not written in the documents. The full list of papers and specifications cited by the project, with DOI and PMID links, is on the references page.
Open-source software used (GitHub links)
Versions are the values written in the project lock files (requirements.lock, docs/evidence_review/shacl/requirements-shacl.txt) and run records. Licenses were confirmed from the repository license field of the GitHub API on 2026-11-02; for NumPy, Matplotlib, and Pint, which GitHub could not determine, the values from the installed package metadata are given. The copyright of each project belongs to its respective authors.
| Project | Version | License | Use in this project |
|---|---|---|---|
| Software actually run for computation and verification | |||
| OpenCOR | 0.8.3 | GPL-3.0 | Reference run of the Smith 2004 canonical CellML (A/B/C, RK4). Run only as a separate tool whose code was not put into the numerical engine. The GitHub repository is currently archived. |
| pySHACL | 0.26.0 | Apache-2.0 | SHACL semantic validation (run_shacl.py) |
| RDFLib | 7.6.0 | BSD-3-Clause | RDF/TriG export, SHACL graph handling |
| SciPy | 1.17.1 | BSD-3-Clause | ODE integration (solve_ivp, DOP853) |
| NumPy | 2.4.6 | BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 (package metadata) | Array operations |
| Matplotlib | 3.11.2 | Matplotlib License (PSF-based, package metadata) | Demo figure generation |
| Pint | 0.25.3 | BSD (package metadata) | Unit conversion and dimension checks |
| pytest | 9.2.0 | MIT | Test execution |
| Specifications and data fetched from GitHub and referenced | |||
| SemGen (SemBioProcess) | OPB v1.07 OWL | README: redistribution and use permitted only for non-commercial purposes (research, personal, educational), on condition that the full notice is included | Refers to the OPB v1.07 bundled in the repository as the source of physical-property IRIs. The documents contain no record of running the SemGen software. |
| COMBINE specifications | OMEX metadata v1.0, v1.2 | No license stated in the repository | Cited as the basis specification for the SHACL shapes and the pressure-reference decision |
| Projects reviewed only and not included | |||
| CardioLab (cardiac-simulator) | commit b3f4374 | MIT (anatomy materials CC BY 4.0) | Its structure and verification ideas were reviewed; the engine was not run and no code was taken (ecosystem). |
| Development, documentation, and deployment tools | |||
| Hermes Agent | v0.22.5 | MIT | AI work orchestration: model routing, integration, verification re-runs, building this site |
| Codex CLI | 0.166.0 (earlier work used 0.153.4) | Apache-2.0 | Implementation and cross-review worker runs |
| Python-Markdown | 3.7 | BSD-3-Clause | Renders the repository documents to HTML |
| Wrangler (cloudflare/workers-sdk) | 4.156.1 | Apache-2.0 | Cloudflare Pages deployment |
| KaTeX | 0.19.1 | MIT | Typesetting of the equations on the methodology page. Included directly within the site (/assets/katex/, including LICENSE) with no CDN |
Claude Code (Anthropic), which was used alongside, is not open source and so is not included in the list above. The graph viewer was written without external libraries. The site menu (top left) was also written without external libraries.
Related source documents: physiology · ontology · evidence_review · anatomy_nodes_v2 · verification_protocol · applied_la_mitral_lv
9. Reproduction information
Source commit: e3d560ed2bad14958b6ff35dff135782468441ca (short e3d560e, branch codex/ontology-graph-view). This commit includes the code of PR #5 (680bd29) and the graph viewer. The graph viewer README records the project's original revision as 680bd29650d97957256dd05fd3281ee8403f6aed. The demo outputs were generated on 2026-11-02 from this commit.
Demo generation commands
| Demo | Command |
|---|---|
| Phase 1 | python -m physiosim --config experiments/phase1.json --output <output directory> |
| four-chamber M1 | python scripts/run_four_chamber_m1.py --output <output directory> |
| applied LA–mitral–LV | python scripts/run_applied_la_mitral_lv.py --output <output directory> |
| Graph viewer | tools/ontology_graph_view/build_graph.py (README example: python build_graph.py --input-dir inputs --output-dir site, requires only the standard library) |
- The output directory must be newly created or empty, and existing files are not overwritten (M1, applied). File mode 600, directory mode 700 are recorded.
- Phase 1 exit status 0 = all scenarios passed the runtime conservation/positivity/valve audit and the declared sample periodicity gate; 2 = outputs are preserved but at least one scenario is transient/non-periodic; 1 = run/configuration error.
- Graph inputs:
anatomy_nodes_v2.json(repository-bundled copy),applied_sidecar.json(result ofbuild_applied_sidecar()),m1_manifest.json(M1 run output). Therunpart ofm1_manifest.jsonholds the dependency versions of the execution environment and the output hashes, so it differs per computer that ran it. Thesemantic_contractthat the graph uses is generated deterministically from the same revision. - Dependencies are pinned in
requirements.lock. Environments recorded in the documents, for example: Python 3.11.15, macOS ARM64 (local); for CI see 4.4 above.
Provenance hashes
The integration lead writes /provenance.json, which contains the hashes of all generated files, and publishes it on this site. The manifest.json of Phase 1 and M1 contains the configuration and source hashes and output checksums, and the run_receipt.json of applied contains the array and manifest hashes and output checksums (each receipt excludes its own checksum). Hashes indicate integrity and provenance only and do not imply scientific validity or permission for numerical use.
Related source documents: physiology · physiology_four_chamber_m1 · applied_la_mitral_lv · research_report