방법론
이 페이지는 이 연구 프로젝트가 무엇을 만들었고, 어떻게 확인했고, 무엇을 아직 확인하지 못했는지를 프로젝트 문서에 기록된 범위 안에서 정리한 것이다. 기록되지 않은 내용은 쓰지 않았다. 숫자와 단위는 원문 그대로 인용했으며, 이 페이지가 새로운 과학적 주장이나 검증 주장을 더하는 것은 아니다.
이 방법론 페이지는 Claude Sonnet 5.5가 저장소 문서와 데모 산출물을 바탕으로 초안을 쓰고, Codex gpt-6.1-terra가 숫자·방정식·인용·링크를 원문과 대조했으며(지적 6건 반영), 통합 담당(Hermes, Claude Opus 5.5)이 지적 사항을 원문으로 다시 확인해 고쳤다. 페이지의 모든 사실 서술은 링크된 원문 문서가 기준이다.
수식 표기: 2장의 방정식은 KaTeX로 조판했다. Codex gpt-6-luna가 원문 텍스트 수식을 LaTeX로 옮기고, Claude Sonnet 5.5가 원문 문서와 하나씩 대조해 표기 모호성 10곳을 고쳤다(예: V0, dp를 곱으로 오해할 수 있는 표기). 각 수식 묶음 아래에서 원문 텍스트 수식을 펼쳐 비교할 수 있다.
1. 이 사이트는 무엇인가
Phase 1 문서는 이 소프트웨어를 “Experimental Phase 1 research software”로, 수치 시뮬레이션은 결정적(deterministic)이며 설치 후에는 LLM이나 네트워크 연결이 필요 없다고 기록한다. 기본 설정(baseline)은 압력이 높은 계산용 기준선이며 건강한 성인의 기준값으로 기술해서는 안 된다고 명시되어 있다.
이 사이트에 공개된 것
- 온톨로지 그래프 뷰어 (../graph/): 기존 기록을 읽기 전용으로 투영한 그래프. 새로운 매핑 검증이 아니다.
- 데모 결과 페이지 3종: Phase 1 (6-compartment), four-chamber M1, applied LA–mitral–LV sidecar. 각각 해당 실행 명령으로 생성한 합성 데모 출력이다.
- 이 방법론 페이지.
- 저장소 문서 원문: 위 목차의 문서들이
docs/<이름>.html로 변환되어 그대로 제공된다.
관련 원문: research_report · physiology · decisions
2. 모델
세 가지 모델 계층이 있다. 세 모델 모두 파라미터 값은 탐색용(exploratory)·합성이며 문헌 값에 맞추어 보정(fitted)되지 않았다. 아래 방정식은 문서에 기록된 것을 그대로 옮긴 것이다.
2.1 Phase 1: 6-compartment 폐회로 모델
선언된 범위는 “실행 가능한 폐회로 교육/연구용 프로토타입”이며 임상 모델이 아니고 환자별 예측이 아니며 Smith et al. (2004)의 복제(replication)도 아니다. 구조 방정식은 검토한 출처에서 착안했으나 단순화되어 있고, 게시된 기준 궤적을 재현하지 않는다고 기록되어 있다.
상태 변수
상태 순서 COMPARTMENTS = (lv, sa, sv, rv, pa, pv): 좌심실, 체동맥, 체정맥, 우심실, 폐동맥, 폐정맥. 여섯 상태는 모두 총 구획 부피(mL)이며, 압력과 유량은 대수적 관측량이다. 순환은 방향이 있는 고리이다.
LV --aortic--> SA --systemic--> SV --tricuspid--> RV
RV --pulmonary_valve--> PA --pulmonary--> PV --mitral--> LV
지배 방정식
원문 텍스트 수식 보기 (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_mitral여기서 s는 systolic_fraction이다. 각 유량이 정확히 한 번씩 반대 부호로 나타나므로 여섯 도함수의 기호적 합은 0이다. 수치적 보존은 별도로 시험하며, 부피를 재정규화하거나 압력·부피를 clipping하여 통과시키지 않는다(유량만 밸브의 구성 법칙에 따라 clipping). 내부 단위는 s, mL, mmHg이다. 밸브는 4개의 대수적 일방향 저항 밸브(이상적 다이오드)이고, 체순환·폐순환 혈관상(vascular bed)은 부호가 있는 저항이다.
파라미터의 지위
문서는 모든 기본값이 “exploratory, author-selected, unfitted, not clinically validated”이며 문헌 측정 출처를 주장하지 않는다고 기록한다. 문헌 인용은 방정식 구조를 뒷받침할 뿐 이 값들을 뒷받침하지 않는다.
| 필드 | 기본값 | 단위 |
|---|---|---|
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 (각각) | 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 (같은 순서) | (140, 850, 3200, 140, 180, 490) | mL (합계 5000 mL) |
초기 부피 분포는 주기 해가 아니라 탐색용 시작 조건이다.
시나리오
세 시나리오(baseline, reduced_contractility, partial_contractility_restoration)는 동일한 초기 부피에서 시작하는 별개의 실행이며 시간 순서가 있는 치료 경과가 아니다. reduced_contractility는 emax_lv만 2.5 → 1.25 mmHg/mL로 바꾸고(factor 0.5), partial_contractility_restoration은 그 값에 1.5배(→ 1.875 mmHg/mL)를 적용한다. 변경은 시간 0에 적용되며 약물 용량 모델이 아니다.
실제 사용된 solver 설정 (summary.json)
| 항목 | 값 |
|---|---|
| 방법 | 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 |
이 주기성 기준(마지막/직전 박동 파형의 여섯 부피 최대 차이 0.1 mL)은 “modest software milestone gate”이며 검증 프로토콜의 더 엄격한 다중 박동 기준(1e-4 mL)이 아니다. 이 실행의 세 시나리오는 모두 periodic_within_declared_gate 상태로 기록되었다.
구현 세부
밸브 전이마다 고정된 밸브 영역(regime) 안에서 적분하고, 압력 차 종단 이벤트(terminal pressure-gap event)로 첫 개폐 시점을 찾는다. 이벤트 이후의 연속 외삽은 해를 찾는 동안에만 쓰이고 보존되지 않는다. 수축기/이완기 경계와 활성화 펄스의 정점에서도 적분을 재시작한다. 선택 옵션 cumulative_flows=True는 유량의 적분 상태 여섯 개를 추가한다.
모델링하지 않은 것
별도의 심방, 중격·심낭 상호작용, 밸브 관성, 비선형 수동 심실 역학, 반사(reflex), 신장 조절, 호흡, 산소 수송, 약리학. 선형 압력 법칙은 일부 파라미터/초기 상태에서 비물리적인 음압을 허용하며 숨기지 않는다. 폐정맥 압력은 집중 저장소(lumped reservoir) 압력이며 측정된 심방 압력이나 폐부종의 증거가 아니다.
관련 원문: physiology · research_report · decisions
2.2 four-chamber M1: 수동 심방 스냅샷
MODEL_ID="four_chamber_m1", 버전 1.0.0. 합성/탐색용이며 임상 검증을 받지 않았고 게시된 four-chamber 재현이 아니다. 기존 6-compartment 방정식과 정체성은 그대로 독립적으로 남아 있다.
상태 변수
상태 순서 (lv, sa, sv, ra, rv, pa, pv, la), 8개의 총 혈액 부피(mL, stressed volume 아님) + 8개의 보조 유량 적분. 유량/관성 상태는 없다. 총 부피는 호출자가 선언한 여덟 초기 부피의 합이며 정규화하지 않는다.
간선과 방정식
| 간선 | 출발 | 도착 | 법칙 |
|---|---|---|---|
| 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 |
원문 텍스트 수식 보기 (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) du압력 기준은 문서가 정확히 이렇게 선언한다: “model gauge pressure relative to one common fixed external pressure of 0 mmHg; no intrathoracic/pericardial pressure”. 이는 수학적 gauge 선언이며 대기압/절대압에 대한 주장이 아니다. 음의 gauge 압력도 허용되고 clipping이나 보존 투영은 없다.
파라미터의 지위
파라미터에는 기본값이 없다(호출자가 모두 제공). 데모용 synthetic_fixture()는 기존 탐색용 심실/혈관 스칼라 값을 복사하고, 새 값 E_la=.15, E_ra=.10 mmHg/mL, R_venous_return=.05, R_pulmonary_venous=.05 mmHg s/mL을 “explicit fixture choices”로 둔다. 상태 순서의 V0=(10,700,2500,20,10,100,400,20) mL, V_initial=(140,850,3200,60,140,180,490,60) mL이며 호출자가 선언한 총량은 5120 mL이다. 모두 “test design choices, not fitted, literature-derived or normal physiology”이다. 심방 탄성도, 정맥 유입 저항, 심방 비응력 부피를 보정하는 출처는 없다고 기록되어 있다.
실제 사용된 solver 설정 (summary.json)
| 항목 | 값 |
|---|---|
| method | DOP853 |
| cycles | 30 |
| samples_per_cycle | 400 |
| rtol | 1e-09 |
| atol | 1e-10 mL |
| max_step | 0.004 s |
이 실행의 periodicity 최대 차이는 0.0007067402634675091 mL(가장 큰 구획: sv)로 기록되었다. 문서는 고정 박동 수가 정상 상태를 증명하지 않으며 자동 수렴 게이트도 없다고 명시한다. 보존 보고: 총 부피 드리프트 1.0913936421275139e-11 mL, 국소 균형 잔차 1.7280399333685637e-11 mL(후자는 배선과 반올림만 확인하며 적분 정확도를 독립적으로 입증하지 않는다).
모델링하지 않은 것
능동 심방 수축, AV 지연, 관성(inertance), 폐쇄 역류, FSI, 신장/약물/반사 모델, 임상 검증. 4개의 이상적 대수 다이오드는 동적 밸브 거동을 주장할 수 없다. Smith/four-chamber 기준 재현이 아니며, 6-compartment 모델과의 무조건적 R→0 동등성도 주장하거나 게이트로 사용하지 않는다.
관련 원문: physiology_four_chamber_m1 · anatomy_nodes_v2 · decisions
2.3 applied LA–mitral–LV 설명용 sidecar
이 sidecar는 four_chamber_m1@1.0.0의 얇은 메타데이터 층이며 LA, 승모판 수송, LV로 한정된다. M1 manifest를 읽기만 하고 방정식, 파라미터, 단위, 출력, 기존 registry를 건드리지 않는다. 새로운 생리 모델이나 해부학적 온톨로지 동등성을 만들지 않으며 환자·CT·마스크·측정·관측 자료는 일절 받지 않는다.
상태 변수와 방정식
sidecar는 M1의 선택된 계약을 그대로 복사해 가리킨다: V_la, V_lv(상태, mL), P_la, P_lv(대수적 관측량, mmHg, 공통 gauge), Q_mitral(mL/s, LA→LV, 비음수), Q_cum_mitral(mL, 실행 누적). 방정식은 새로 만들지 않고 M1 방정식(활성화, E_v(t), P_v, P_a, ideal-diode q_e, 누적 적분)을 문서 줄 번호로 참조한다. E_lv(t)는 매니페스트 변수가 아니라 별도의 구성 법칙 노드이다. 입력은 heart_rate와 systolic_fraction이다.
파라미터의 지위
필수 파라미터 참조: 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). 값은 해부학에서 얻지 않으며 데모는 M1과 같은 합성 fixture를 사용한다.
실제 사용된 데모 설정 (run_receipt.json)
| 항목 | 값 |
|---|---|
| 실행 횟수 | 동일 설정 2회 (sidecar 구축·검증 전/후) |
| cycles | 2 |
| samples_per_cycle | 50 |
| method / rtol / atol | DOP853 / 1e-09 / 1e-10 mL |
| max_step | 0.004 s |
| 배열 형태 | time (101,), 나머지 (101, 8) |
두 실행의 전체 time/volume/pressure/flow/cumulative 배열 해시가 일치했고 manifest 해시도 전후 동일(9393e36f…3506)했다. 이는 짧은 실행에서의 수치 불변성 점검이며 정상 상태나 생리적 검증이 아니다.
모델링하지 않은 것
M1의 이상적 다이오드는 출처 인터페이스가 허용하는 부호 있는/역류 수송에 대한 제한된 “no-reverse-flow” 근사이다. 역류, 유효 오리피스 면적(EOA는 NOT_REPRESENTED), 환자 기하, 밸브 역학은 모델링하지 않는다. 우심 변경, 신체 전체 적용, M2/M3 변경도 없다.
3. 온톨로지와 의미 계층
3.1 변수 주석과 개념 IRI
physiosim.ontology는 완전히 오프라인인 34개 변수의 registry와 RDFLib named-graph 내보내기를 제공한다. 물리적 속성, 해부학적 맥락, 물리적 보유자(bearer), 시간적 의미, 단위, 유량 방향, 방정식, 의존성, 출처 맥락을 구분한다. 문서는 이것이 “프로젝트 주석 계층이며 가져온 참조 온톨로지나 임상 추론 시스템이 아니다”라고 기록한다.
- 외부 개념(검증된 레이블). OPB v1.07(SemBioProcess가 번들한 스냅샷이며 최신 릴리스라는 주장 아님)의
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). 해부학은 Uberon을 식별자로 하고 대응하는 FMA 용어를 노드에 보존한다(예: bloodUBERON:0000178, FMA:9670). GO 과정 맥락GO_0008015(blood circulation),GO_0060047(heart contraction). Disease Ontology의DOID_6000(congestive heart failure)은 어휘 맥락일 뿐 baseline이 그 질환이라는 주장이 아니다. - 로컬 확장. 네임스페이스
https://example.org/physiosim/는 의도적으로 프로젝트 로컬 개념을 식별하며 해석 가능한 외부 온톨로지로 광고되지 않는다(Concept.local로 표시). 집중된 체·폐 동맥/정맥 구획, 6-구획 순환 전체, 여섯 유량 경로, 부피 compliance, 심박출량(CO), 1회 박출량(SV)은 로컬 개념이다. 문서는 적합한 외부 매핑을 이 제한된 연구에서 확립하지 못했을 뿐 외부 용어가 없다는 뜻은 아니라고 적는다. - 관계. 표준 BioModels.net 생물학 한정자 두 개만 사용한다: 혈액과 v2 심실강의
bqbiol:isPartOf, 밸브 유량과 밸브의bqbiol:occursIn. 그 외 관계는 프로젝트 로컬이며, 한정자 어휘 전체에 대한 적합성이나 CellML/SemSim/OMEX 적합성은 주장하지 않는다.owl:sameAs,owl:equivalentClass,rdfs:subClassOf, 질병 진단, 온톨로지 유도 인과 간선은 만들지 않는다. - RDF 그래프 3개.
verified-labels(검증된 외부 레이블·출처 링크·FMA 교차참조),model-assertions(프로젝트 변수 주석·bearer·로컬 개념·방정식·의존성),provenance(그래프 상태와 비진단 노트).
3.2 SHACL 검증 계층
증거 검토 문서에 따르면 SHACL 모양(shapes)은 OMEX v1.2 composite annotation용 일반 규칙 11개와 Smith 전용 규칙 7개로 작성되었고, 양성/음성 대조 fixture가 정확히 기대 결과를 낸다. 워크스페이스 267의 SemSim 주석을 OMEX 형태로 번역해 실행하면 22 Violations, 7 Warnings, 46 Info가 나온다. SHACL은 구조 규칙을 강제할 수 있지만 생리적 타당성이나 수치 일치를 검사하지 못하며, 주석이 없는 데이터에는 공허하게 통과할 수 있다는 한계도 기록되어 있다. 별도 깨끗한 작업 트리에서 새 가상환경으로 재현했을 때 같은 출력이 나왔으나(대조군 0 / 13 / 12), 이는 재현 시험이지 shapes가 옳다는 확인이 아니다.
3.3 증거 검토와 해부학 노드 v2 카탈로그
증거 검토(2026-11-01)는 OWL 생성 이전의 검토이며 어떤 매핑도 채택하지 않는다. 후보는 근거 위치와 함께 제안되고, 출처가 결정하지 못하는 점은 UNKNOWN으로 남긴다. 초록만 읽은 출처는 관계 방향이나 매핑을 확정하는 데 쓰지 않았다. Smith 2004 CellML의 76개 변수와 32개 방정식 사전, 거절된 연결 사례(R1–R13), 미해결 충돌(C1–C11)이 여기 정리되어 있다.
해부학 노드 사양 v2는 31개 노드 목록이다: 27개는 Uberon 기본 식별자, 혈관 내강 4개는 FMA 기본 식별자이고 모든 노드에 다른 쪽 식별자를 교차참조로 기록한다. 노드 클래스는 modelled / lumped part / catalogue / reference이다. 카탈로그 노드(예: 상·하대정맥, 관상정맥동, 소형 밸브 3종)는 식별자만 있고 Smith 그래프에서의 주장은 없다. 문서는 이 식별자 규칙이 SPARC, SCKAN, HRA 관행에 기반하며 COMBINE 문서가 Uberon을 공식 권고한 것은 아님을 명시한다.
3.4 그래프 뷰어의 세 가지 보기
| 보기 | 무엇을 보여주는가 | 무엇이 아닌가 |
|---|---|---|
| 원본 주장 (source claims) | 실선 화살표: 원본 sourceTemplate → targetTemplate 주장과 원본 predicate. | 원본 ACCEPT/REVIEW는 대상 매핑 승인이 아니다. |
| 모델 참조 (model references) | 점선: 모델 역할, 포트 참조, 의존성(의존성은 on → dependent). | 해부학 관계나 수치 연결로 해석하지 않는다. role_in_smith는 참조 모델 역할이며 M1 고유 기능의 증거가 아니다. |
| 카탈로그 (catalogue) | 31개 항목을 node_class별로 묶은 목록. 구조 간선 없음. | 전체 Uberon/FMA나 OWL 추론 결과가 아니다. |
레이아웃은 화면 정렬용 계층 배치일 뿐 새로운 관계나 순서를 뜻하지 않는다. 간선 레이블은 predicate IRI의 마지막 부분을 그대로 쓰며(예: BFO_0000050), 프로젝트 문서가 RO_0002572를 해석 없이 IRI로 유지하므로 사람이 읽는 이름을 덧붙이지 않았다. 이 뷰어는 3D 형상, 시뮬레이션, 추론 검증을 제공하지 않는다.
3.5 서로 독립인 상태 축
sidecar 문서와 뷰어는 아래 축들을 합치지 않고 따로 보존한다. 한 축의 값이 다른 축의 값을 함의하지 않는다.
| 축 | 기록된 상태 | 의미 |
|---|---|---|
| 원본 주장 결정 (source) | ACCEPT / REVIEW | 이번 실행의 gate_report.json에서 주장 12건 중 11건 ACCEPT, 1건 REVIEW. 12건 모두 NOT_INDEPENDENTLY_EXPERT_REVIEWED. ACCEPT는 설명용 맥락만 뒷받침한다. |
| 대상 crosswalk | PROPOSED | 제안 상태이며 승인이 아니다. |
| 외부 수치 사용 권한 | NONE | 수치 연결 권한 없음. |
| G3 (외부 수치 binding) | CLOSED | request_numeric_binding은 ACCEPT 또는 승인 주장이 있어도 항상 PermissionError를 던진다. |
C5 part_of 어댑터 | deferred (USER_DECISION_RUNTIME_DEFERRED, applied false) | 사용자 결정은 기록되었으나 런타임 적용은 보류. 원본 located_in, M1 blood_contained_in과 서로 구분되어 남는다. |
| 기계적 bearer | 미선택 (unselected) | LV/LA 벽 대 심근 후보 중 선택되지 않음. |
| 승모판 경계·고리 | mitral_orifice_boundary_equivalence=REVIEW, mitral_annulus_complete_fibrous_ring_interpretation=REVISE, 경계 정의 DRAFT_MODEL_CONVENTION | REVIEW, REVISE, DRAFT는 가려지지 않고 유지되며 소유자 검토나 수치 허가를 뜻하지 않는다. |
| 기준 스냅샷 / 상속된 M1 검토 | UNREVIEWED | M1 batch-TDD 이력은 미해결이며 sidecar가 이를 승인하지 않는다. |
sidecar의 G1(고정된 표현과 정확한 모델 계약 검사)은 PASS, G2(합성 실행)는 executed가 true일 때만 PASS로 보고된다(이번 실행은 true / PASS). 이 게이트들은 설명용 메타데이터 계약과 수치 불변성에 대한 것이며 의미 승인이 아니다. “법칙/버전 계약 선언은 수치 무결성 증명이 아니다”라고 뷰어 문서가 명시한다.
관련 원문: ontology · evidence_review · anatomy_nodes_v2 · applied_la_mitral_lv · decisions
4. 검증 방법
4.1 시험의 종류
- 수치: 구성 법칙, 4개 다이오드, 6-상태 질량 균형, 교차 solver(DOP853 대 Radau), 허용오차 정련, 큰 단계 펄스, 동시 전이, 영 유량 평형, 샘플링 독립성.
- 차원: Pint 기반 단위·차원 검사, 단위 공변성(unit covariance) 점검. 단위 문자열이 달라도 명시적
UnitConversion없이는 연결할 수 없다. - 의미: 해부학·속성·기준·시간 맥락·bearer·방향 불일치를 거절하는 연결 검사와 12-fixture 합성 오류 주입 벤치마크.
- 실패 경로: 잘못된 입력과 비수렴은 명시적으로 실패하며 조용한 보정은 없다.
4.2 보존·주기성 감사
총 부피 보존은 점검 항목이며 재정규화나 clipping으로 통과시키지 않는다. research_report(저장소에 커밋된 이전 결과 기준)는 세 정식 실행에서 총 부피 드리프트 최대 3.18323e-11 mL(런타임 게이트 1e-6 mL), 마지막/직전 박동 여섯 부피 파형 최대 차이 2.29051e-05 mL(정식 게이트 0.1 mL)를 기록했다. 이 사이트의 Phase 1 데모(demos/phase1/summary.json)는 baseline / reduced_contractility / partial_contractility_restoration 순으로 volume_drift_ml 1.0913936421275139e-11 / 1.000444171950221e-11 / 4.3655745685100555e-11 mL, final_beat_max_volume_difference_ml 3.880984422721667e-11 / 1.48929757415317e-11 / 2.9103830456733704e-11 mL를 기록했다. 두 값 집합은 서로 다른 실행의 산출물이다. 이 게이트는 소프트웨어 이정표 기준이며 전향적 프로토콜의 “연속 세 박동 1e-4 mL” 기준이 아니다. 독립 검토에서 tight baseline은 마지막 세 박동 잔차가 2.33e-4, 7.37e-5, 2.29e-5 mL로 1e-4 mL 기준을 통과하지 못했고, 더 정밀한 설정(rtol 1e-11, atol 1e-12, T/400)에서는 두 시나리오 모두 통과했다. 문서는 이를 한계로 기록하며 기준을 완화하지 않았다.
또한 기록된 한계: 기본 설정 대 tight 설정의 전체 궤적 최대 부피 차이 0.3153 mL(체동맥 구획, t=28.856 s)는 기계 정밀도 일치로 서술해서는 안 된다. 같은 해를 400 대 1600 샘플/박동으로 재표본하면 전방 SV가 약 0.057–0.059% 달라진다. 전체 실행의 solver 고유 적응형 노드에서 수행한 사다리꼴 적분의 국소 균형 잔차는 가장 정밀한 설정에서도 약 6.76 mL(baseline), 4.47 mL(reduced)로, 상태 부피의 거의 정확한 전역 보존과 공존한다. 이 때문에 강한 누적 유량 주장은 보류된다.
4.3 재현성
- 동일 호스트 재생(same-host replay): 설치된 wheel을 격리 Python 모드로 두 번 호출해 CSV 바이트 동일성과 요약 동일성(
summary_equal=True)을 확인했다. 세 정식 CSV 궤적이 모두 동일 바이트였다. 문서는 이것이 동일 호스트·동일 의존성에서의 결정성이며 플랫폼 간 비트 동일성이 아니라고 명시한다. - 깨끗한 wheel 설치(clean wheel install): wheel을 빌드해 별도 가상환경에
requirements.lock과 함께 설치하고, 소스 체크아웃이 아니라site-packages에서 import되는지 확인한다. python -I: 격리 모드로 pytest와 의존 환경 출력을 실행한다. 설치된 wheel 시험은 소스 경로 재지정 없이python -I -m pytest로 실행된다.- RDF 직렬화 순서는 수치 재현성 기준으로 쓰지 않는다. 출력 디렉터리 파일에는 타임스탬프나 경로가 들어가지 않는다(applied/M1 데모).
4.4 CI 행렬
워크플로 “Synthetic research checks”는 pull request, main 브랜치 push, 수동 실행에서 돌며 ubuntu-24.04 러너에서 Python 3.12.3과 3.12 두 버전의 행렬(fail-fast 꺼짐, 제한시간 25분)을 실행한다. 환경 변수는 MPLBACKEND=Agg, PYTHONHASHSEED=0, 단일 스레드 BLAS/OpenMP, 그리고 API 키는 빈 문자열로, AWS EC2 메타데이터 접근은 비활성화로 설정한다. 단계: 잠금 의존성과 깨끗한 wheel 설치 → python -I -m pytest → scripts/verify_reproducibility.py → scripts/verify_independent.py → 증거를 7일 보관 비공개 artifact로 업로드. 로컬에서는 macOS ARM64의 Python 3.11.15로 실행했다고 README가 기록한다.
4.5 독립 검증
독립 검토자는 구현의 도함수·지표 루틴을 유일한 기준으로 쓰지 않고 별도 오라클(명시적 부호 있는 incidence 행렬, 대체 활성화식 sin(pi*phase/systolic_fraction)**2, 80개 시드 무작위 상태)을 구성했다. 독립 시험은 12 passed, 최종 설치 wheel의 전체 시험은 64 passed, 5 RDFLib 경고(RDFLib 내부 deprecation)로 기록되었다. 서로 다른 스냅샷의 숫자이며 일치하지 않는 것이 아니다. 독립 검토 이후 소유자는 두 개의 빈 메타데이터 오류(참조/해부학 식별자 누락 쌍이 수락됨)를 실패하는 회귀 시험으로 재현한 뒤 수정했다. 원래 검토 스냅샷은 보존되고 재실행 증거는 별도로 쓰였다. 방정식이 바뀌어도 메타데이터가 같으면 수락되는 점, 자유 텍스트 출처 맥락은 검사하지 않는 점은 남아 있다.
전체 전향적 프로토콜은 완료되지 않았다(인간 사용성 연구, 사건 해상도 밸브 타이밍, 자동 주기성 종료, 다중 수준 수축력 스윕, 플랫폼 간 재현성, 환자/기준 데이터 검증 등).
4.6 Smith 2004 / OpenCOR 참조 재현 작업 (기록된 그대로, report-only)
Smith 2004의 정식(canonical) CellML을 OpenCOR v0.8.3에서 실행한 참조 작업이 별도로 기록되어 있다. 이는 프로젝트의 시뮬레이션 엔진이 기준 궤적을 재현했다는 뜻이 아니다(엔진은 기준 궤적을 재현하지 않았다고 기록됨).
- 기본 실행은
std::runtime_error: the maximum number of iterations was reached before convergence오류로 실패했다. 어느 solver가 실패했는지는 UNKNOWN이다(이전 문장의 KINSOL 귀속은 추론이었다고 정정 기록). - 사용자 승인 하에 OpenCOR의 고정 단계 4차 Runge-Kutta(RK4)가 CVODE만 대체했고 KINSOL, 모델, 파라미터, 단위는 그대로이다. 결과에는 “OpenCOR RK4”라는 라벨을 붙이며, CVODE 실패의 원인을 설명하지 않는다.
- 적분 단계 1e-5 s(A), 5e-6 s(B), 2.5e-6 s(C). 출력 간격은 모두 0.001 s, 각 1,501행. A·B·C는 같은 출력 인덱스로 비교한다. 시간 일치 허용: |dt| ≤ N_steps · eps(2.22e-16) · t_max (3.0e5 단계, 1.5 s에서 약 1.0e-10 s).
- 비교는 report-only이며 pass/fail 선이 없다. 문헌(Pathmanathan & Gray, Erdemir, Santiago, Mulugeta 등)이 검증 절차는 규정하지만 보편적 수치 허용 기준은 규정하지 않고, 수준은 사용 맥락에 따라 정해진다고 판단했다. 통과 결과라도 과학적 타당성을 입증하지 않는다.
- 기록된 보고(최대 노름 기준 관측 차수): 0.964, 0.960, 1.000. RK4의 형식 차수는 4이며 더 낮은 차수의 원인은 확립되지 않았다. 박동당 1회 박출량(A/B/C): 65.8474 / 65.8479 / 65.8481 mL 및 65.7768 / 65.7769 / 65.7770 mL.
- 닫힌 밸브 구간의 음의 Q_av는 CellML 인코딩의 수치적 인공물로 보는 것과 일관되지만, 원인은 확립되지 않은 관찰로 기록된다. 게시된 파형(Figure 7)과의 일치는 아직 확인하지 않았다.
- CellML의 kPa 표기는 오표기로 간주하고 mmHg 기반으로 읽는 사용자 결정(C1)이 있으며 환산 계수는 적용하지 않는다. 개별 수치의 단위를 저자가 명시하지 않는다는 불확실성이 남는다.
4.7 “통과”가 의미하는 것과 의미하지 않는 것
의미하는 것: 시험한 조건에서 구현 결과가 선언된 방정식과 독립 오라클 및 해당 소프트웨어 허용 기준에 부합한다는 점, 총 부피가 보존된다는 점, 선언된 소프트웨어 허용 기준을 만족했다는 점, 같은 환경에서 재실행하면 같은 결과가 나온다는 점.
의미하지 않는 것: 생물학적 타당성, 정상 범위, 진단 정확도, 환자별 예측, 임상 적합성, 게시된 기준 모델의 재현. 프로젝트 문서는 “Passing these checks is not biological validation”이라고 명시한다. 오류 주입 벤치마크는 일부러 거짓 수락 1건을 남긴다(올바른 것처럼 보이는 LV 메타데이터가 붙은 실제 RV 압력, 의도한 LV 압력 대비 최대 오차 129.793 mmHg). 메타데이터 검증은 수치 출처 검증이 아니다. 벤치마크는 hand-assigned 정답을 쓰는 12개 fixture의 합성 실험이며 사용자 연구가 아니다.
| 조건 | 올바른 수락 | 올바른 거절 | 안전하지 않은 수락 | 잘못된 거절 |
|---|---|---|---|---|
| manual | 3 | 0 | 9 | 0 |
| units_only | 3 | 3 | 6 | 0 |
| semantic | 3 | 8 | 1 | 0 |
관련 원문: verification_protocol · independent_verification · research_report · decisions · orchestration_state · evidence_review
5. AI 보조 개발과 검토 절차
이 프로젝트의 작업은 AI 코딩 에이전트를 사용해 진행되며, 아래는 docs/orchestration_state.md, docs/decisions.md, 그리고 그래프 뷰어 README가 기록한 범위만 옮긴 것이다. 같은 문서의 용어로 상태 어휘는 엄격하다: PROPOSED < IMPLEMENTED < TESTED < SCIENTIFICALLY VALIDATED. 이 프로젝트에서 외부 생리 데이터에 대해 과학적으로 검증된 것은 없다.
다중 모델 라우팅 정책
작업은 위험도와 복잡도에 따라 Claude 또는 Codex 모델 계층(tier)으로 배정된다. 기록된 유효 계층:
| 계층 | Claude | Codex |
|---|---|---|
| LIGHT | claude-haiku-5-5 | gpt-5.6-terra |
| STANDARD | claude-sonnet-5-5 | gpt-5.6-sol (사용할 수 없는 gpt-6.1-sol의 대체) |
| DEEP | claude-opus-5-5 | gpt-6-astra |
일부 Codex 모델 ID는 이 계정에서 model_not_found로 거절되었고, 하나는 HTTP 429로 미확인 상태이다. 이런 이유로 모델은 항상 명시적으로 지정한다고 기록되어 있다.
구현과 검토의 분리
- 제공자 분리. 한 제공자가 구현하고 다른 제공자가 독립 검토한다. 기록된 예: T1(선택적 누적 유량 상태)은 Codex gpt-5.6-sol이 구현했고(IMPLEMENTED, TESTED), R1(T1의 독립 교차 검토)은 Claude opus-5-5가 읽기 전용(편집 도구 없음)으로 수행해 “ACCEPT WITH CHANGES”, 주요 지적 3건(두 허용오차가 각각 87배/8000배 느슨함, 문서화되지 않은 dense-output 언더슈트, 느슨한 부피 오차 제어)을 냈다.
- 통합자의 수치 재실행. 통합자(integrator)가 R1의 모든 숫자를 다시 실행한 뒤 허용오차를 측정값의 약 4배/8배로 조이고 한계를 문서화했다(T1-fix). T2(엄격한 다중 박동
periodicity_report, Claude haiku-5-5)의 검토(T2-rev)는 통합자의 diff 검토와 이전에 문서화된 독립 잔차와의 교차 대조(정확히 재현)로 수행되어 변경 없이 수락되었다. 확대(escalation)나 재시도는 없었다. - 격리. 작업자는 git으로 기준선을 잡은 스크래치 복사본과 자체 가상환경에서 실행하고, 통합자가 검토된 diff를 적용했다.
- 역할 분리(Phase 1). Agent A 모델/방정식 구현, Agent B 의미 구현, Agent C 독립 과학적 출처 검토 후 독립 코드 검증, 상위(parent)는 통합과 재현성. 앞선 서술에서 “어느 제공자가 어떤 역할을 했는지”는 위 표의 기록만을 근거로 한다.
- 소유자 결정. 범위·기준·정정 사항은 “user decision / user-approved” 항목으로
decisions.md에 날짜와 근거와 함께 기록된다. 예: 비교 허용치를 어시스턴트가 임의로 정했다고 인정하고 도출된 경계로 교체한 항목, 사전에 고정하지 않은 항목을 결과 확인 뒤에 추가하지 않은 항목. - 그래프 뷰어. 초안은 이전 리비전의 입력으로 만들어졌고, 이후 한 PR이 입력 파일의
status문장을 고치자 현재 원본 리비전에서 세 입력 파일이 다시 생성되었다(바뀐 것은 그 문장과 해시뿐). 뷰어는 기존 기록의 읽기 전용 투영이다. - 외부 UI 저장소의 샘플 값은 모든 연구 증거와 계산에서 제외하며, 실제 결과가 연결될 때 샘플과 실제 출력을 구분해 표시하고 누락된 데이터를 샘플로 채우지 않는다는 결정이 기록되어 있다.
관련 원문: orchestration_state · decisions · independent_verification
6. 결정과 미결 사항
기록된 소유자(사용자) 결정 요약
- C5 bearer 형식 (2026-11-01): 기관 단위 해부학 대신
Portion of blood part_of cavity/lumen채택. 프로젝트 결정이며 새 과학적 발견이나 집중 구획과 명명된 내강의 물리적 동등성 주장이 아니다. 당시 registry 구현은 보류되었으나, 이후 "Node specification v2 applied to the registry" 결정에서 V_lv, P_lv, V_rv, P_rv가 심실강에bqbiol:isPartOf인 혈액의 속성으로 registry에 적용되었다. applied sidecar의 C5 런타임 어댑터는 별도로 보류(USER_DECISION_RUNTIME_DEFERRED) 상태다. - 압력 기준 (2026-11-01): 에너지 차이의 sink로 표현. 공통 접지가 대기압과 같은지는 CellML에서 UNKNOWN. 문서만 변경하고 registry 문자열은 그대로.
- C1 단위 (2026-11-01): CellML의 kPa 표기는 오표기로 보고 mmHg 기반으로 읽으며 환산 계수를 적용하지 않는다. 이로써 CellML과의 수치 비교 차단이 풀렸고 비교는 report-only로 유지.
- 해부학 구조를 노드로 (2026-11-01): 네 밸브를
bqbiol:occursIn으로, 심방을 별도 노드로 두고 정맥 구획을bqbiol:hasPart합성으로 표현. 노드 사양 v2를 SHACL과 registry에 적용(“A1–A9만 먼저”, “표준 bqbiol 사용”). - M1 수동 심방 (2026-11-01): 소유자 승인 소프트웨어 이정표로서
four_chamber_m1추가. 능동 심방, AV 지연, 관성, FSI, 역류, 보정, 임상 검증 주장 없음. - Smith 2004 참조 실행: RK4 대체, 시간 일치 허용 규칙, 세 번째 단계 크기(2.5e-6 s), 스칼라 정의, report-only(pass/fail 없음).
- Phase 1 정식 실험: 60 cycles, DOP853 rtol=1e-9, atol=1e-10 mL, max step T/200, 400 샘플/cycle. 이정표 주기성 게이트 ≤0.1 mL이며 더 엄격한 전향적 1e-4 mL을 조용히 대체하거나 완료로 주장하지 않는다. 신장 되먹임과 임상 치료 모델은 심혈관 핵심이 검증을 통과할 때까지 보류.
아직 열려 있는 것
- 온톨로지 결정 (PR #5의 sidecar와 registry 관련): (G1) 로컬
sa,sv,pa,pv가 v2 혈관 내강 노드에 대응하는지; (G2) 정맥 구획이 심방을 포함하는지(독립 검증 문서와 충돌); (G3) E_lv/E_rv와 혈관 compliance를 어느 노드에 둘지; (G4) 밸브 저항의 위치; (G5) 체·폐 혈관상 유량·저항 및 V_total은 v2 노드가 없어 로컬 유지; (G6) 압력reference문자열과 공통 접지가 대기압인지(UNKNOWN). 또한 C5part_of의 런타임 적용 보류, 기계적 bearer(벽 대 심근) 미선택, 승모판 오리피스 경계 REVIEW와 고리 REVISE, 경계 인터페이스 DRAFT, v2의 LA(Smith 집중 정맥 역할)와 M1의 별도 LA 상태 사이의 해석 차이. - 생리적 타당성: 외부 생리 데이터에 대해 검증된 것이 없다. 심방 탄성도·정맥 유입 저항·심방 비응력 부피를 보정하는 출처가 없고, 신뢰구간·식별가능성 분석·모수 추정도 없다. 게시된 파형(Figure 7)과 CellML 출력의 일치는 확인하지 않았다. 출처가 없는 CellML 요소(말초 P_th 항, 폐쇄 루프 구동 지연, 유입 밸브 관성)의 기원은 UNKNOWN이다.
- 상속된 M1 batch-TDD 이력: UNREVIEWED이며 미해결이다. sidecar가 이를 승인하지 않는다. PR #5 이식성 수리 때의 첫 wheel 증거는 두 실패를 재현했으나, 보고된 CI 실패 30건 전체에 대한 증거는 아니다.
- 그 밖의 미결: 정식 CellML을 이용한 허가된 기준 모델 재현, 파라미터 민감도 분석, 러너가
periodicity_report와 누적 유량 SV를summary.json에 보고할지(정식 출력 변경이므로 승인 필요), 누적 상태를 오차 제어에서 제외할지, 열린 OPB/FMA/OMEX 항목(UNKNOWN 목록).
관련 원문: decisions · orchestration_state · evidence_review · applied_la_mitral_lv
7. 한계
- 모든 결과는 합성 값이며 환자 데이터는 없다. 모든 생리 파라미터는 탐색용·미보정이다. baseline은 압력이 높은 기준선이며 건강 성인 기준이 아니다. 양의 파라미터 값 확인은 수학적 정의역 점검일 뿐 검증된 생리 범위가 아니다.
- Smith 2004를 복제하지 않았고 기준 궤적을 재현하지 않았으며 원 모델 코드를 실행하지 않았다(참조 OpenCOR 실행은 별도 작업). 외부 시뮬레이션 코드는 수치 엔진에 포함되지 않았다.
- 모델링하지 않음: Phase 1은 별도 심방, 중격·심낭 상호작용, 밸브 관성, 비선형 수동 심실 역학, 반사, 신장 조절, 호흡, 산소 수송, 약리학. M1은 능동 심방 수축, AV 지연, 관성, 역류, FSI. 약물 용량이나 PK/PD 모델은 없고, GFR·나트륨 균형·RAAS도 구현되지 않았다.
- 밸브 전환은 비평활이므로 허용오차와 출력 샘플링에 수렴 점검이 필요하며, 샘플링도 기본 solver 설정도 밸브 개방 시점의 정확도를 보장하지 않는다. 고정된 박동 수는 정상 상태를 증명하지 않는다.
- 전체 전향적 검증 프로토콜은 완료되지 않았다. 의미 벤치마크는 손으로 설계한 작은 합성 오류 주입 실험이며 인간 생산성 연구가 아니다. 사람의 통합 노력은 측정되지 않았다. 일반적인 의미 연결 정확도와 자동 해부학적 동등성은 확립되지 않았다. “온톨로지 기반 신뢰할 수 있는 모델 합성”은 연구 가설로 남아 있다.
- 의미 계층은 변수 매핑이나 방정식이 권위 있는 온톨로지 함의라는 것을 보증하지 않는다. 추론기, 하위 클래스 폐포, 동의어 동등성, 방정식 파싱이 없다. 올바른 것처럼 보이는 메타데이터가 잘못된 수치 데이터에 붙는 실패를 의도적으로 보여준다.
- ontology.md 기준: 이미 커밋된 일부 내보내기(
results/phase1/등)는 v2 이전 registry를 반영하여 v1 FMA 식별자를 보여줄 수 있다고 기록되어 있다(재생성 필요). - sidecar의 원본 소스 자료는 소유자가 허가한 내부 연구용 사용이며 재라이선스·재배포 권리를 주장하지 않는다.
관련 원문: research_report · physiology · ontology · independent_verification · applied_la_mitral_lv
8. 출처와 저작자 표시
Smith et al. (2004) 및 CellML 모델
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.
Physiome Model Repository(PMR)는 공개 접근 가능한 저장소 내용 전체가 CC BY 3.0 Unported로 라이선스된다고 밝힌다. 재배포에는 CellML 저자(Geoffrey Nunns, Auckland Bioengineering Institute), 원 논문(PMID 15036180), 출처 URL과 다운로드 시각, PMR 인용(Lloyd et al., Bioinformatics 2008;24(18):2122–2123)을 표기해야 한다고 docs/physiology.md가 기록한다. 이 라이선스는 CellML 인코딩에 적용되며 저널 논문의 본문이나 그림에는 적용되지 않는다. 이는 기술적 실사이며 법률 자문이 아니다. 이 프로젝트의 수치 엔진에는 CellML이나 그 코드가 통합되지 않았고, 구조 방정식 설계에 참고했다.
온톨로지와 어휘
- Uberon(릴리스 2026-10-01, CC BY 3.0, 활발히 릴리스됨)과 FMA(5.1.0, 2026-05-15, CC BY 4.0, OBO Foundry에서 “inactive”로 표시): 해부학 노드 식별자와 교차참조. sidecar 출처의 고지는 RO를 CC0으로 기록한다. 외부 용어 레이블은 EBI OLS4 검색 결과에서 확인했다.
- OPB v1.07(SemBioProcess/SemGen이 번들한 스냅샷), GO, Disease Ontology(레이블 맥락만), CellML Metadata 1.0(사양), BioModels.net qualifiers 1.1(
bqbiol:isPartOf,occursIn,hasPart). - BFO / RO 계열 IRI: 그래프 뷰어가 원본 predicate를 IRI 그대로 표시한다(예:
BFO_0000050,RO_0002572,RO_0001025). 문서는 이 중RO_0002572를 새 해석 없이 IRI로 보존한다고 기록한다. - OMEX metadata 사양(v1.0, v1.2)은 초록만 읽었다. SemGen 주석 프로토콜, W3C SHACL 및 PROV-O 권고안은 읽었다고 기록되어 있다.
문헌 (문서에 인용된 범위)
- 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 (값 비교 방식의 근거).
- Shi et al. 2011, 0D/1D 혈류 모델 리뷰 (PMC3103466); Burkhoff & Tyberg 1993 (PubMed 8238596); Neal et al. 2015, semantic cardiomyocyte composition (PLoS ONE, doi 10.1371/journal.pone.0145621 링크 기준).
- Paeme 2011, Revie 2013, Pironet 2013 (증거 검토 문서의 S17–S19, 정확한 서지는 해당 문서 참조). 증거 카드에는 전문 보존 시의 라이선스(CC BY 등)와 저작권 때문에 인용만 보존한 출처가 구분되어 있다.
이 페이지는 위 서지 정보를 문서에서 복사한 것이며, 문서에 적히지 않은 저자·연도·DOI는 추가하지 않았다. 프로젝트가 인용한 논문·사양 전체 목록과 DOI·PMID 링크는 참고 문헌 페이지에 있다.
사용한 오픈소스 소프트웨어 (GitHub 링크)
버전은 프로젝트 잠금 파일(requirements.lock, docs/evidence_review/shacl/requirements-shacl.txt)과 실행 기록에 적힌 값이다. 라이선스는 2026-11-02 GitHub API의 저장소 라이선스 필드로 확인했고, GitHub가 판정하지 못한 NumPy·Matplotlib·Pint는 설치된 패키지 메타데이터의 값을 적었다. 각 프로젝트의 저작권은 해당 저작자에게 있다.
| 프로젝트 | 버전 | 라이선스 | 이 프로젝트에서의 쓰임 |
|---|---|---|---|
| 계산·검증에 실제로 실행한 소프트웨어 | |||
| OpenCOR | 0.8.3 | GPL-3.0 | Smith 2004 정식 CellML 참조 실행(A/B/C, RK4). 수치 엔진에 코드를 넣지 않은 별도 도구로만 실행. GitHub 저장소는 현재 보관(archived) 상태. |
| pySHACL | 0.26.0 | Apache-2.0 | SHACL 의미 검증(run_shacl.py) |
| RDFLib | 7.6.0 | BSD-3-Clause | RDF/TriG 내보내기, SHACL 그래프 처리 |
| SciPy | 1.17.1 | BSD-3-Clause | ODE 적분(solve_ivp, DOP853) |
| NumPy | 2.4.6 | BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 (패키지 메타데이터) | 배열 연산 |
| Matplotlib | 3.11.2 | Matplotlib License (PSF 기반, 패키지 메타데이터) | 데모 그림 생성 |
| Pint | 0.25.3 | BSD (패키지 메타데이터) | 단위 변환·차원 검사 |
| pytest | 9.2.0 | MIT | 테스트 실행 |
| GitHub에서 가져와 참조한 사양·데이터 | |||
| SemGen (SemBioProcess) | OPB v1.07 OWL | README: 비상업 목적(연구·개인·교육)에 한해 재배포·사용 허용, 전체 고지 포함 조건 | 저장소에 번들된 OPB v1.07을 물리적 속성 IRI의 출처로 참조. SemGen 소프트웨어를 실행한 기록은 문서에 없음. |
| COMBINE specifications | OMEX metadata v1.0, v1.2 | 저장소에 라이선스 명시 없음 | SHACL shape와 압력 기준 결정의 근거 사양으로 인용 |
| 검토만 하고 포함하지 않은 프로젝트 | |||
| CardioLab (cardiac-simulator) | 커밋 b3f4374 | MIT (해부학 자료는 CC BY 4.0) | 구조와 검증 아이디어를 검토했으며, 엔진을 실행하거나 코드를 가져오지 않음(ecosystem). |
| 개발·문서·배포 도구 | |||
| Hermes Agent | v0.22.5 | MIT | AI 작업 조율: 모델 라우팅, 통합, 검증 재실행, 이 사이트 빌드 |
| Codex CLI | 0.166.0 (이전 작업은 0.153.4) | Apache-2.0 | 구현·교차 검토 작업자 실행 |
| Python-Markdown | 3.7 | BSD-3-Clause | 저장소 문서를 HTML로 렌더링 |
| Wrangler (cloudflare/workers-sdk) | 4.156.1 | Apache-2.0 | Cloudflare Pages 배포 |
| KaTeX | 0.19.1 | MIT | 방법론 페이지의 수식 조판. CDN 없이 사이트 안(/assets/katex/, LICENSE 포함)에 직접 넣어 사용 |
함께 쓴 Claude Code(Anthropic)는 오픈소스가 아니므로 위 목록에 넣지 않았다. 그래프 뷰어는 외부 라이브러리 없이 작성했다. 사이트 메뉴(왼쪽 위)도 외부 라이브러리 없이 작성했다.
관련 원문: physiology · ontology · evidence_review · anatomy_nodes_v2 · verification_protocol · applied_la_mitral_lv
9. 재현 정보
소스 커밋: e3d560ed2bad14958b6ff35dff135782468441ca (약식 e3d560e, 브랜치 codex/ontology-graph-view). 이 커밋은 PR #5의 코드(680bd29)와 그래프 뷰어를 포함한다. 그래프 뷰어 README는 프로젝트 원본 리비전을 680bd29650d97957256dd05fd3281ee8403f6aed로 기록한다. 데모 출력은 이 커밋에서 2026-11-02에 생성되었다.
데모 생성 명령
| 데모 | 명령 |
|---|---|
| Phase 1 | python -m physiosim --config experiments/phase1.json --output <출력 디렉터리> |
| four-chamber M1 | python scripts/run_four_chamber_m1.py --output <출력 디렉터리> |
| applied LA–mitral–LV | python scripts/run_applied_la_mitral_lv.py --output <출력 디렉터리> |
| 그래프 뷰어 | tools/ontology_graph_view/build_graph.py (README 예: python build_graph.py --input-dir inputs --output-dir site, 표준 라이브러리만 필요) |
- 출력 디렉터리는 새로 만들어지거나 비어 있어야 하며, 기존 파일은 덮어쓰지 않는다(M1, applied). 파일 모드는 600, 디렉터리는 700으로 기록된다.
- Phase 1 종료 상태 0 = 모든 시나리오가 런타임 보존/양수성/밸브 감사와 선언된 표본 주기성 게이트를 통과, 2 = 출력은 보존되나 최소 한 시나리오가 과도/비주기, 1 = 실행·설정 오류.
- 그래프 입력:
anatomy_nodes_v2.json(저장소 번들 복사본),applied_sidecar.json(build_applied_sidecar()결과),m1_manifest.json(M1 실행 출력).m1_manifest.json의run부분은 실행 환경의 의존성 버전과 출력 해시를 담아 실행한 컴퓨터마다 다르다. 그래프가 쓰는semantic_contract는 같은 리비전에서 결정적으로 생성된다. - 의존성은
requirements.lock으로 고정된다. 문서에 기록된 환경 예: Python 3.11.15, macOS ARM64(로컬), CI는 위 4.4 참조.
출처 해시
생성된 모든 파일의 해시를 담은 /provenance.json을 통합 담당이 작성해 이 사이트에 게시한다. Phase 1과 M1의 manifest.json에는 설정·소스 해시와 출력 체크섬이, applied의 run_receipt.json에는 배열·manifest 해시와 출력 체크섬이 들어 있다(각 영수증은 자기 자신의 체크섬을 제외한다). 해시는 무결성과 출처를 나타낼 뿐 과학적 타당성이나 수치 사용 허가를 의미하지 않는다.
관련 원문: physiology · physiology_four_chamber_m1 · applied_la_mitral_lv · research_report