검증: 출하 게이트와 SHACL
📍 현재 위치: 제6부 · 검증 — 모델이 책임을 지게 되는 수명주기 단계입니다. SAMOD의 테스트 우선 루프와 NeOn의 평가 시나리오를 따라, 이 장은 출하 규격, 완료 기준, 세포 은행 요건, 그리고 상위 척추의 disjointness를 그래프가 강제하는 닫힌 세계 게이트로 바꾸고 — 세포 은행 이후 계속 쌓여 온 캠페인에 대해 그것을 실행합니다.
단일클론항체 캠페인은 단 하나의 결정을 향해 몇 달을 수렴해 갑니다. 이 mAb-A 로트가 환자의 정맥으로 들어가도 되는가? 이 책이 모델링한 모든 것이 그 결정으로 모입니다. DS-001의 SEC 단량체 순도(monomer purity)는 로트의 얼마만큼이 단편이나 응집체가 아니라 온전한 항체인지를 말합니다. HMW 응집체(HMW aggregate) 수준은 얼마만큼이 면역원성을 유발하는 고분자량 화학종으로 뭉쳤는지를 말합니다 — 응집된 항체는 환자에게서 항약물항체를 일으킬 수 있으므로, 이는 미관 문제가 아니라 안전성 속성입니다. CEX 주 피크(CEX main peak)는 전하 프로파일이 얼마나 균질한지를, 즉 효능을 바꾸는 번역 후 변형의 대리 지표를 말합니다. 숙주세포 단백질(host-cell protein) 수치는 얼마만큼의 CHO 세포 잔해가 정제를 통과해 남았는지를 말합니다. 그리고 직교하는 하류 단계들에 걸쳐 합산된 바이러스 제거(viral clearance)는 로트가 외래 인자로부터 안전함을 말합니다. 검증(validation)은 온톨로지가 이 속성들을 기술하기를 멈추고 그것들에 대해 결정하기 시작하는 지점입니다. 상위 척추와 공리 장에서 확립한 사실은 OWL과 SHACL이 서로 다른 일을 한다는 것입니다. OWL은 열린 세계에서 추론(reasons in an open world)하여, 누락된 필수 결과는 그저 "알 수 없음"일 뿐입니다. SHACL은 닫힌 세계에서 검증(validates in a closed world)하여, 누락된 필수 결과는 지금 당장의 실패입니다. 출하 결정은 "알 수 없음"을 용납할 수 없습니다 — 누락된 무균 시험은 미결 질문이 아니라 실패한 로트입니다 — 그래서 출하 규격은 자연스럽게 SHACL 형상(shapes)의 집합이 됩니다. 로트의 데이터가 출하를 주장하려면 통과해야 하는 게이트입니다 [1].
비행기가 이륙하기 전, 체크리스트는 완전해야 합니다 — 모든 항목이 존재하고, 확인되고, 서명이 되어 있어야 합니다. 빈칸 하나나 누락된 서명 하나면, 비행기가 아무리 멀쩡해 보여도 비행이 멈춥니다. 추론기는 새로운 사실을 연역할 수 있지만 빈 줄에는 어깨를 으쓱하는 엔지니어입니다("괜찮을지도, 따로 듣지 못했으니까"). SHACL은 체크리스트를 든 검사관으로, 모든 줄이 진짜로 채워지기 전에는 비행 허가를 거부합니다. 이 장은 항체 로트를 위한 그 검사관을 만듭니다 — 출하 게이트, 완료 게이트, 세포 은행 게이트, 그리고 불가능한 유형을 잡아내는 두 가드 — 그리고 완전한 체크리스트가 좋은 비행과 같지는 않다는 사실에 정직합니다.
질문에서 출발하라
이 장은 규격 장에서 정의한, 이 책의 닫힌 세계(closed-world) 역량 질문들이 머무는 곳이며, 각각은 QC 그룹이 모든 배치에 던지는 실제 출하 질문입니다. CQ-08은 출하된 원료의약품 로트가 모든 필수 CQA — 단량체, HMW, CEX-주, HCP, 단백질 농도 — 에 대해 규격 내 값을 정확히 하나씩 지니는지를 묻습니다. DS-001이 자신이 주장하는 그 항체가 맞는지를 결정하는 패널입니다. CQ-09는 출하된 로트가 통제된 집합에서 가져온 상태로 귀속 가능하게 서명되었는지를 묻습니다. GMP 하에서 서명 없는 출하는 출하가 아니기 때문입니다. CQ-10은 완제의약품 로트가 벌크에는 없던 완료 고유 기준 — 무균성, 외관, 충전량 — 을 충족하는지를 묻습니다. CQ-11은 규격 이탈 로트가 정확히 실패한 경로에서만, 그 외 어디에서도 아니게 표시되어, 조사가 진짜 결함을 겨냥하도록 하는지를 묻습니다. 그리고 CQ-17은 워킹 세포 은행 WCB-CHO-001 — 전체 계보의 뿌리 — 이 단 하나의 시드 배양이 그것으로부터 자라기 전에 완전히 특성 규명되었는지를 묻습니다. 이 다섯은 어떤 SPARQL SELECT로도 표현할 수 없는 형상을 공유합니다. "필수 시험이 누락되었는가?"는 존재하는 트리플에 관한 질문이 아니라, 존재해야 하는데 존재하지 않는 트리플에 관한 질문이기 때문입니다. 그것이 바로 SHACL의 존재 이유입니다 [1].
출하 게이트: 규격은 형상이고, 출하는 적합성이다
출하 규격(release specification)은 원료의약품과 완제의약품에 대해 필수 시험과 그 합격 기준 — 단량체 순도, 응집체 수준, 전하 변이체 주 피크, 숙주세포 단백질, 단백질 농도 — 을 나열하며, 생명공학 제품에 대한 ICH Q6B 같은 지침에 따라 구조화됩니다 [2]. 각 한계는 실제 mAb 위험을 부호화합니다. 95 % 단량체는 그 분율 미만의 단편과 응집체가 분해된 제품을 신호하기 때문이고, 2.0 % HMW 상한은 그 이상의 응집체가 면역원성 위험을 높이기 때문이며, 60–80 % CEX-주 창은 그 밖으로 표류한 전하 프로파일이 항체의 변형이 더 이상 검증된 것이 아님을 뜻하기 때문이고, 100 ppm HCP 상한은 잔류 CHO 단백질 자체가 면역원이기 때문입니다. 모델링하면, 그 규격은 곧 bp:ReleaseShape이며, shapes.ttl의 실제 형상으로, 두 로트 수준 출하 물질 — 벌크 원료의약품과 충전된 완제의약품 — 을 한꺼번에 표적합니다:
# shapes.ttl — the release gate (excerpt): every released lot's full CQA panel, complete and in spec.
bp:ReleaseShape a sh:NodeShape ;
sh:targetClass bp:DrugSubstance , bp:DrugProduct ;
# Exactly one monomer result, a float, at or above the spec floor.
sh:property [
sh:path bp:monomerPct ;
sh:name "SEC %monomer" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 95.0 ;
sh:message "Monomer purity is missing, duplicated, or below the 95.0 % release limit." ] ;
# HMW aggregate at or below its upper limit — the criterion DS-004/DP-004 trip.
sh:property [
sh:path bp:hmwPct ;
sh:name "SEC %HMW aggregate" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:maxInclusive 2.0 ;
sh:message "HMW aggregate is missing or above the 2.0 % release limit." ] ;
# CEX main charge-variant peak within its window.
sh:property [
sh:path bp:cexMainPct ;
sh:name "CEX %main (charge variant)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 60.0 ; sh:maxInclusive 80.0 ;
sh:message "CEX main peak is missing or outside the 60.0-80.0 % window." ] ;
# Host-cell protein at or below its upper limit.
sh:property [
sh:path bp:hcpPpm ;
sh:name "host-cell protein (ppm)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:maxInclusive 100.0 ;
sh:message "HCP is missing or above the 100 ppm release limit." ] ;
# Protein concentration within the formulation window.
sh:property [
sh:path bp:proteinConcMgPerMl ;
sh:name "protein concentration (mg/mL)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 45.0 ; sh:maxInclusive 55.0 ;
sh:message "Protein concentration is missing or outside the 45-55 mg/mL window." ] ;
# Release status drawn from a controlled set.
sh:property [
sh:path bp:releaseStatus ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:in ( "PASS" "OOS" "PENDING" ) ] ;
# An attributable signature (21 CFR Part 11 / Annex 11).
sh:property [
sh:path bp:approvedBy ;
sh:minCount 1 ;
sh:message "Release record is unsigned." ] .
체크리스트를 실행 가능하게 만든 것으로 읽으면, 이것이 두 역량 질문을 한꺼번에 답한다는 점을 알 수 있습니다. CQ-08은 패널 행들입니다. 로트는 바닥값 이상(minInclusive 95.0)의 단량체 결과를 정확히 하나(minCount/maxCount — 분석을 두 번 돌렸을 때 유리한 반복을 골라 담는 일을 금합니다) 지녀야 하고, 자기 한계 이하(maxInclusive 2.0)의 HMW 결과를, 그리고 CEX-주, HCP, 단백질 농도를 각각 선언된 창 안에 지녀야 합니다. 같은 bp:ReleaseShape이 bp:DrugSubstance와 bp:DrugProduct 둘 다를 표적하는 것은 편의상의 우연이 아닙니다. 패널 속성은 계보를 따라 상속됩니다. 출하 monomerPct는 원료의약품 로트 DS-001 — 상류 계통의 열한 조상이 만나는 수렴 노드 — 위에 자리하고, 거기서 충전된 완제의약품 로트들은 같은 항체를 단지 바이알에 담은 것이므로 같은 패널을 지닙니다. CQ-09는 마지막 두 행입니다. releaseStatus는 통제된 집합 ("PASS" "OOS" "PENDING")에서 가져와야 하고 — 작업자가 "released?"라고 입력할 수 있는 자유 텍스트 플래그가 아니며 — 로트는 귀속 가능한 approvedBy 서명, 즉 21 CFR Part 11과 EU Annex 11의 전자 기록 요건을 지녀야 합니다 [3]. 게이트는 사람이 적용하기를 기억해야 하는 SOP 속 산문이 아닙니다. 그것은 그래프가 모든 로트에 자동으로, 동일하게 강제하는 규칙입니다 — 몇 달에 걸친 품질 실타래가 기록이 아니라 통제가 되는 지점입니다.
완료 게이트: 벌크 원료의약품이 지니지 않는 완제의약품 기준
원료의약품은 농도로 측정되는 벌크 액체이고, 완제의약품은 무균으로 충전·밀봉되어 세는 단위이며, 그 종류의 변화는 벌크에는 없던 기준을 가져옵니다. 충전-완료는 DS-001을 가져와 부형제 — 폴리소르베이트 80, 히스티딘 완충액, 수크로스, 묻혀 있는 레시피가 아니라 추적 가능한 구조가 되도록 실제 bp:hasComponent 간선으로 모델링됨 — 와 결합하고, 무균 조건에서 바이알-마개-밀봉 용기-마개 시스템(container-closure system) CCS-001에 충전합니다. 그 용기-마개는 제품에 부수된 포장이 아니라 제품 동일성의 일부입니다. 용기-마개 완전성은 유효기간 전반에 걸쳐 무균성과 안정성을 보호하는 quality이기 때문입니다. 무균성 자체는 충전-완료 프로세스에 의해 가능해집니다. 보관 탱크 안의 벌크에게는 충전 단위 의미에서 무균인지를 묻지 않지만, 밀봉된 바이알에게는 반드시 묻습니다. 그래서 그 기준들은 bp:DrugProduct만 표적하는 별도 형상 bp:DrugProductFinishShape에 속하며 — 모델이 CQ-10에 답하는 방식입니다 [3]:
# shapes.ttl — the finish gate: drug-product-specific criteria the bulk substance does not carry.
bp:DrugProductFinishShape a sh:NodeShape ;
sh:targetClass bp:DrugProduct ;
sh:property [
sh:path bp:sterilityResult ;
sh:name "sterility" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:in ( "STERILE" ) ;
sh:message "Sterility result is missing or not STERILE." ] ;
sh:property [
sh:path bp:appearance ;
sh:name "appearance" ;
sh:minCount 1 ;
sh:message "Appearance description is missing." ] ;
sh:property [
sh:path bp:fillVolumeMl ;
sh:name "fill volume (mL)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 0.1 ;
sh:message "Fill volume is missing or implausibly low." ] .
게이트를 나누는 것이 모델링의 요점이며, 이는 continuant/occurrent 구분과 벌크 대 이산 구분을 강제 가능하게 만든 것입니다. 모든 bp:DrugProduct는 bp:ReleaseShape(공유된 항체 패널)와 bp:DrugProductFinishShape(완료 기준)을 둘 다 통과해야 하지만, bp:DrugSubstance는 패널에만 묶입니다. 완제의약품 로트 DP-001은 sterilityResult "STERILE", 외관 문자열 — "clear, colourless, essentially free of visible particles" — 그리고 fillVolumeMl "1.0"을 지니므로 완료 게이트를 통과합니다. 벌크 DS-001은 형상이 그것을 표적하지 않으므로 무균 결과를 결코 요구받지 않습니다. 두 형상, 하나의 제품, 모순 없음. 완료 게이트가 아직 확인하지 않는 것에 주목하십시오. 개별 바이알의 동일성입니다. 하나의 로트는 수만 개의 바이알이며, 출하 시 우리는 품목이 아니라 로트를 모델링합니다 — 로트 대 품목의 개체화 긴장은 실재하며, 모델은 직렬화(serialization)가 나중에 재구축 없이 품목 동일성을 끼워 넣을 수 있도록 의도적으로 설계되었지만, 출하 게이트에서 검증 단위는 충전된 로트입니다.
게이트로서의 출하: 로트의 CQA 패널과 서명이 SHACL 형상으로 표현된 규격 — 공유된
ReleaseShape과 제품 전용 완료 게이트 — 에 대해 점검되고, 위반은 조사와 공동 운명 영향 질의로 경로를 잡는 구조화된 보고서를 내보냅니다.
저자가 AI의 도움을 받아 직접 제작한 그림입니다.
두 개의 닫힌 세계 게이트 더: 세포 은행과 disjointness 가드
같은 닫힌 세계 규율이 계보의 뿌리를, 그것이 가장 중요한 곳에서 게이트로 막습니다. 워킹 세포 은행은 모든 하류 로트가 전이적으로 유래하는 단일 물질이므로, 거기서의 오류는 모든 배치로 완전한 확신을 갖고 전파됩니다 — 그리고 세포주는 분열하면서 표류하는, 살아 있고 돌연변이하는 배양이며, 그 동일성을 IRI는 종이 위에서 안정시킬 수 있지만 생물학은 결코 완전히 고정하지 못하는 유일한 노드입니다. 바로 그래서 규제 당국은 워킹 은행이 사용 전에 특성 규명(characterized)되기를 기대합니다. WCB-CHO-001은 네 가지 특성 규명 결과 — 동일성(이것이 정말 mAb-A CHO 세포주이고 교차 오염물이 아닌가?), 무균성/마이코플라스마, 외래 인자 바이러스 안전성, 유전적 안정성 — 를 지니며, 각각은 verdict "PASS"인 bp:CharacterizationResult이고, ValidatedPassageLimit 40에 대해 passageNumber 8입니다. 계대 수는 배양이 얼마나 오래 분열했는지를, 따라서 그 생산성과 산물 품질이 얼마나 표류했을 수 있는지를 한정하기 때문입니다. bp:WorkingCellBank에 대한 OWL 최소 cardinality 제약은 워킹 은행이 특성 규명을 지닌다고 열린 세계로 진술합니다. bp:CellBankShape은 그것을, 없으면 실패로, 닫힌 세계로 강제합니다 — 모델이 CQ-17에 답하는 방식입니다 [4]:
# shapes.ttl — the cell-bank gate (WCB-CHO-001 conforms: 4 characterizations + passage 8).
bp:CellBankShape a sh:NodeShape ;
sh:targetClass bp:WorkingCellBank ;
sh:property [
sh:path bp:hasCharacterization ;
sh:minCount 1 ;
sh:message "A working cell bank must carry at least one characterization result." ] ;
sh:property [
sh:path bp:passageNumber ;
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:integer ;
sh:message "A working cell bank must record exactly one passage count." ] .
특성 규명이 기록되지 않은 워킹 은행은 모순적인 것이 아니라 불완전합니다 — 열린 세계 추론기는 이의를 제기할 거리가 없습니다. OWL에게 부재는 거짓이 아니기 때문입니다. 그러나 제조 뿌리 노드에서 "우리에게는 동일성 시험 기록이 없다"는 출하해서는 안 될 최악의 상태입니다. 그것은 일단 계보의 열한 층을 전이적으로 전파하고 나면 어떤 하류 시험으로도 잡을 수 없는 바로 그 오인입니다. 세포 은행 게이트는 증거가 진짜로 존재하기 전에는 은행을 사용 가능하다고 부르기를 거부하여, 규제 기대(세포 기질의 ICH Q5D 특성 규명)를 그래프가 강제하는 규칙으로 바꿉니다.
그리고 두 개의 disjointness 가드가 열린 세계 추론기가 사물의 종류 수준에서 남기는 틈을 닫습니다. BFO에 근거한 척추 전체는 continuant(시간에 걸쳐 지속하며 quality를 지니는 항체 배치)를 occurrent(일어났다가 끝나는 발효)에서 갈라내는 데 기댑니다. bioproc.ttl은 bp:Batch owl:disjointWith bp:CellCultureProcess(continuant는 결코 occurrent가 아니다)와 bp:Material owl:disjointWith bp:Equipment(항체 배치는 결코 그것을 담은 스테인리스 용기가 아니다)를 단언합니다 — 이는 탁상공론이 아닙니다. 생물반응기 BR-101을 배치 물질 BATCH-2026-001로 착각하는 로더는 계보를 붕괴시켜, 연간 수백 배치를 처리하는 용기에 출하 사실을 붙이고 그것을 지나는 모든 계통 추적을 깨뜨릴 것입니다. 그러나 실행 가능한 검증기가 쓰는 OWL-RL 프로파일은 owl:disjointWith에 대해 작동하지 않으므로, 심어진 혼동은 조용히 통과합니다. 실제로 그것을 잡는 것은 SHACL 형상입니다:
# shapes.ttl — the continuant/occurrent and material/equipment guards (closed-world).
bp:BatchNotProcessShape a sh:NodeShape ;
sh:targetClass bp:Batch ;
sh:not [ sh:class bp:CellCultureProcess ] ;
sh:message "A Batch (material/continuant) must not also be a CellCultureProcess (occurrent)." .
bp:MaterialNotEquipmentShape a sh:NodeShape ;
sh:targetClass bp:Material ;
sh:not [ sh:class bp:Equipment ] ;
sh:message "A Material (batch/lot/pool) must not also be Equipment (a persisting vessel)." .
이것이 책 전체가 의지하는 분업입니다. OWL 공리는 추론기가 추론에 사용할 필요조건을 진술하고, SHACL 형상은 같은 조건을 우리가 실제로 보유한 데이터에 대한 게이트로 강제합니다. 깨끗한 캠페인에서는 두 가드 모두 침묵을 지킵니다. 출처 조정(provenance reconciliation)이 의도적으로 용기 BR-101을 배치 물질 BATCH-2026-001과 별개의 노드로 유지하기 때문입니다 — 장비 안으로 한 번도 횡단하지 않고 배치 계보를 걸을 수 있게 해 주는 continuant/occurrent 분리입니다. 둘을 융합하는 두 번째 rdf:type을 심으면, MaterialNotEquipmentShape이 발화합니다 — disjointness 가드 CQ가 약속한 그대로입니다.
검증: 현실적인 규격 이탈 모드, 한 경로로 고립되다
validate.py는 bioproc.ttl + align.ttl + instances.ttl을 파싱하고, OWL-RL 폐포를 적용하며(2120 트리플이 7137로 닫힘), 모든 형상을 실행합니다. 진행 중인 예시의 정직한 세부는 출하가 노출하는 실패가 어떤 종류인가입니다 — 그리고 그것은 실제로 항체 캠페인을 괴롭히는 실패 모드입니다. 원료의약품 로트 DS-004와 그것에서 충전된 완제의약품 DP-004는 둘 다 단량체 순도 98.687 %로, 95.0 % 바닥값을 넉넉히 넘기므로 monomerPct를 통과합니다. 그들의 CEX-주, HCP, 단백질 농도도 모두 규격 내입니다. 게이트를 걸리게 하는 것은 2.0 % 한계를 넘는 그들의 HMW 응집체 2.41 %입니다. 이것이 현실적인 이유는 바로 단량체 순도와 응집체 수준이 같은 측정이 아니기 때문입니다. 로트는 압도적으로 온전한 항체이면서도, 실패하기에 딱 충분한 고분자량 덩어리 — 면역원성 위험 — 를 지닐 수 있습니다. 그 응집체는 어디서 왔을까요? 그래프는 인과를 증명할 수 없습니다. 단량체 순도는 전체 정제 사슬의 누적적 속성으로, 포획·바이러스 불활화·폴리싱·UF/DF에서 조금씩 정련되며 어떤 단일 단계도 소유하지 않습니다. 출하 게이트는 응집체가 어디서 생겼는지 알 필요가 없습니다. 그저 로트를 거부하기만 하면 됩니다. 그래서 실패는 sh:resultPath bp:hmwPct에서의 단일 sh:MaxInclusiveConstraintComponent 위반입니다. 다음은 전체 그래프 검증에 대한 실제 pySHACL 보고서입니다 — CQ-11이 구체화된 것으로, 두 개의 결과, OOS 로트당 하나씩, 둘 다 같은 경로에서 그 외 어디에서도 아닙니다:
Validation Report
Conforms: False
Results (2):
Constraint Violation in MaxInclusiveConstraintComponent (http://www.w3.org/ns/shacl#MaxInclusiveConstraintComponent):
Severity: sh:Violation
Source Shape: [ sh:datatype xsd:float ; sh:maxCount Literal("1", datatype=xsd:integer) ; sh:maxInclusive Literal("2.0", datatype=xsd:decimal) ; sh:message Literal("HMW aggregate is missing or above the 2.0 % release limit.") ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:name Literal("SEC %HMW aggregate") ; sh:path bp:hmwPct ]
Focus Node: bp:DP-004
Value Node: Literal("2.41", datatype=xsd:float)
Result Path: bp:hmwPct
Message: HMW aggregate is missing or above the 2.0 % release limit.
Constraint Violation in MaxInclusiveConstraintComponent (http://www.w3.org/ns/shacl#MaxInclusiveConstraintComponent):
Severity: sh:Violation
Source Shape: [ sh:datatype xsd:float ; sh:maxCount Literal("1", datatype=xsd:integer) ; sh:maxInclusive Literal("2.0", datatype=xsd:decimal) ; sh:message Literal("HMW aggregate is missing or above the 2.0 % release limit.") ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:name Literal("SEC %HMW aggregate") ; sh:path bp:hmwPct ]
Focus Node: bp:DS-004
Value Node: Literal("2.41", datatype=xsd:float)
Result Path: bp:hmwPct
Message: HMW aggregate is missing or above the 2.0 % release limit.
로트는 한 기준으로는 순수하면서도 응집체에서 실패할 수 있고, 실패는 진짜로 범위를 벗어난 정확히 그 한 경로에만 고립된 채 머뭅니다 — 모두 통과하는 다른 패널 값들로 가짜 연쇄가 번지지 않습니다. 보고서는 조사의 끝이 아니라 시작이며, 조사를 다루기 쉽게 만드는 것은 계보의 구조입니다. 보고서 자체가 RDF 그래프이므로, 실패는 다른 어떤 사실과도 같이 질의 가능하고, 정방향 DS-대-DP 분기가 계산 가능하게 만드는 공동 운명 영향 분석(shared-fate impact analysis)으로 곧장 이어집니다. 충전-완료는 DS-001을 형제 완제의약품 로트 DP-001과 DP-002로 정방향 분기했습니다(bp:DS-001 bp:fillsInto bp:DP-001 , bp:DP-002). OOS인 DP-004는 대신 별개의 원료의약품 로트 DS-004에서 유래하지만, 두 분기는 모두 워킹 세포 은행 WCB-CHO-001을 공유합니다. 그래서 DP-004가 실패하면, 영향 질의는 그 계통을 위로 걸어 공유 조상에 이르고 다시 아래로 그것에서 도달 가능한 모든 완제의약품으로 내려갑니다 — 전체 부지를 격리하는 대신 횡단으로 답한 CQ-04입니다:
# queries/CQ-04.rq — when DP-004 fails, which drug products share its fate via the shared cell bank?
PREFIX bp: <https://example.org/bioproc#>
SELECT DISTINCT ?affected WHERE {
bp:DP-004 (bp:derivedFrom)+ ?shared . # an ancestor of the failed lot
?affected (bp:derivedFrom)+ ?shared . # anything else derived from it
?affected a bp:DrugProduct .
FILTER(?affected != bp:DP-004)
} ORDER BY ?affected
# -> DP-001, DP-002 (the siblings tracing to the same WCB-CHO-001)
리콜의 범위를 정하는 그 동일한 역방향 걷기가 원료의약품 장이 만든 열한 조상 계통입니다. DS-001에서 POLpool-001, VFpool-001, VIpool-001, PApool-001, CLAR-001, BATCH-2026-001, SEED-001, SEEDFLASK-001을 거쳐, 세포 은행 단계 WCB-CHO-001, MCB-CHO-001, RCB-CHO-001까지 올라갑니다. bp:derivedFrom의 OWL owl:TransitiveProperty가 공짜로 계산하는 계보가, 한 바이알-로트에 대한 SHACL 실패를 정확히 두 형제에 대한 정밀하게 범위 잡힌 질문으로 바꾸는 것입니다. CQ-09, 즉 서명-및-상태 점검도 카탈로그가 실행하는 SPARQL 쌍둥이를 가집니다 — DS-001이 approvedBy 서명자와 통제된 집합에서 가져온 releaseStatus를 지니는지를 묻는 ASK — 그리고 ReleaseShape은 모든 출하 로트에 같은 조건을 닫힌 세계로 강제합니다:
# queries/CQ-09.rq — a released lot is attributably SIGNED, status from the controlled set (returns true).
PREFIX bp: <https://example.org/bioproc#>
ASK {
bp:DS-001 bp:approvedBy ?signer .
bp:DS-001 bp:releaseStatus ?status .
FILTER(?status IN ("PASS", "OOS", "PENDING"))
}
미해결 과제: SHACL은 정확성이 아니라 완전성을 점검한다
여기 가장 중요한 한계가 있으며, 이는 공리 장의 일관된 것이 옳은 것은 아니다라는 경고를 일반화합니다. SHACL 게이트는 로트의 기록이 완전하고, 잘 형성되고, 범위 내이며, 서명되었는지 — 모든 필수 시험이 수행되고, 한 번 기록되고, 올바르게 유형이 정해지고, 한계 안에 있는지 — 를 검증합니다. 그것은 기록이 참인지는 검증할 수 없습니다. 자신 있게 오기된 결과 — 엉뚱한 바이알에 입력된 HMW 값, 합격 로트의 SEC 트레이스가 실패 로트의 IRI 아래 철해진 시료 혼동, 우연히 2.4 % 대신 1.9 %에 떨어진 전사 오류 — 는 모든 구조적 규칙이 충족되므로 게이트를 깨끗이 통과합니다. "완전하다"는 모든 필수 시험이 기록에 나타난다는 뜻일 뿐입니다. 올바른 시료가 올바른 날에 적격 장비로 시험되었는지는 오직 상류의 데이터 무결성만이 보증할 수 있습니다. SHACL은 흔한 실패(누락된 무균 시험, 범위 밖 응집체, 서명 없는 출하, 중복된 단량체 결과)에 대한 강력한 가드이며, 그것이 대부분입니다. 그러나 그럴듯한, 범위 내 거짓에는 눈이 멉니다. 게이트는 체크리스트가 채워졌음을 증명할 뿐, 그 점검이 정직했음을 증명하지는 않습니다.
이것은 또한 실타래가, 디지털 스레드에 대해 우리가 경고했듯, 한 공장 안에서는 철벽이지만 그 너머에서는 취약한 이유이기도 합니다. 게이트는 한 공장이 보유한 트리플에 대한 완전성을 강제하지만, 기록이 결코 이 그래프에 들어오지 않은 자매 부지에 대해서는 아무 말도 하지 않습니다. 그래서 출하는, 현실에서, 결코 게이트만이 아닙니다. SHACL 통과는 자동화가 지치지 않고 동일하게 강제할 수 있는 필요 전제조건 — 마감에 쫓겨 항체 로트의 종이 체크리스트를 사람이 다시 점검하는 것에 대한 진정한 진보 — 이지만, 출하 결정은 여전히 QC 판단, 일탈 검토, 그리고 게이트가 기록하지만 대체하지는 않는 적격자 승인에 기댑니다. "SHACL 게이트를 통과함"을 "좋은 배치임"과 혼동하는 그래프는, 이 책이 매 단계에서 경고하는 바로 그 과신을 범하는 것입니다. 정직한 기준은 이렇습니다. 완전성과 범위가 기계적으로 보장되고 조사가 경로 잡히도록 규격을 SHACL로 모델링하되, 정확성 — 각 결과가 정말로 이 mAb-A 로트를 기술하는지 — 은 상류의 데이터 무결성과, 모델이 대체가 아니라 뒷받침하는 인간 판단에 달려 있음을 분명히 하십시오.
왜 중요한가
검증은 온톨로지가 제값을 하는 수명주기 단계이며, 항체의 출하 규격을 SHACL로 모델링하는 것은 기억해서 수동으로 적용하던 체크리스트를 강제되고 감사 가능한 게이트로 바꿉니다. 이 책이 모델링한 모든 CQA — 단량체 순도, HMW 응집체, 전하 변이체 균질성, 숙주세포 단백질, 충전-완료가 가능하게 한 무균성과 충전, 그리고 이 분자에 어떤 속성이 결정적인지를 정의한 설계 공간으로 거슬러 — 가 로트가 충족해야 할 형상으로 여기에 수렴하고, 실패는 어떤 형제 로트가 실패한 은행을 공유하는지 범위를 정하는 영향 분석으로 곧장 경로를 잡습니다. 다섯 개의 닫힌 세계 게이트(출하, 완료, 세포 은행, 그리고 두 disjointness 가드)는 어떤 SPARQL 질의로도 다룰 수 없는 것을 다룹니다. 있어야 하는데 없는 것들, 그리고 추론기가 그냥 통과시키는 유형 혼동 — 용기와 융합된 배치, 그것을 만든 프로세스와 융합된 continuant — 입니다. 여기가 품질 실타래가 기록이 아니라 통제가 되는 곳이고, 리콜이 추측이 아니라 질의가 되는 곳이며, 모델의 정직한 한계, 즉 정확성이 아닌 완전성이 온톨로지가 무엇을 위한 것인지를 가장 분명히 말하는 곳입니다.
현실 세계에서는
규격에 대해 항체 로트를 출하하는 것은, 21 CFR Part 11과 Annex 11 하의 서명된 기록과 함께, GMP 제조의 법적 구속력 있는 현실이며, 생명공학 규격의 구조는 ICH Q6B에 오래전부터 성문화되어 있습니다 [2][3]. SHACL은 정착된 W3C 표준이고, 오픈소스 책은 바로 이런 종류의 BatchShape 게이트를 검증된 코드에서 실행합니다 — focus node와 제약을 명명하는 검증 결과와 함께 sh:conforms false — 이는 그 메커니즘이 가설이 아님을 증명합니다 [1]. 세포 은행 게이트는 ICH Q5D가 모든 세포 기질에 기대하는 특성 규명 — 검증된 한계에 대해 계대 이력이 추적되는 CHO 세포주의 동일성, 무균성, 바이러스 안전성, 유전적 안정성 — 을 그대로 반영합니다 [4]. 출하된 원료의약품 노드는 또한 두 번째 규제된 동일성을 지닙니다 — 게이트가 검증한 바로 그 DS-001에 매달린 ISO 11238 / IDMP 물질 식별자(UNII, MPID) — 그래서 로트는 규제 당국이 처음부터 다시 기술하는 대신 다시 점검하는 동일성을 지닌 채 PQ-CMC / eCTD 제출로 넘어갑니다. 해결된 기술 현실이 아니라 인간적·조직적 현실로 남는 것은, 게이트가 볼 수 없는 모든 것입니다. 일탈 조사, 데이터 무결성 문화, 그리고 그래프가 구조적으로 검증할 수는 있어도 보증할 수는 없는 출하 뒤에 서 있는 적격자 판단입니다. 규제 시맨틱스 장은 FDA의 KASA 플랫폼이 CMC 데이터에 규칙 기반 구조화 점검을 적용하는 것을 보여 줍니다 — 같은 닫힌 세계 발상이, GxP 검증 체제가 살아 있는 추론기를 현장에서 멀리 떼어 놓는 와중에도, 제출 경계에서 의무화된 것입니다.
핵심 용어
- 열린 세계 대 닫힌 세계(Open world vs. closed world) — OWL은 누락된 사실을 알 수 없음으로 취급합니다(그래서 부재한 무균 시험으로 로트를 실패시킬 수 없습니다). SHACL은 누락된 필수 사실을 위반으로 취급합니다. 출하에는 닫힌 세계 쪽이 필요합니다.
- 출하 게이트(
bp:ReleaseShape) —bp:DrugSubstance와bp:DrugProduct를 모두 표적하며, CQA마다 범위 내 값을 정확히 하나(단량체 ≥ 95 %, HMW ≤ 2 %, CEX-주 60–80 %, HCP ≤ 100 ppm, 단백질 45–55 mg/mL)와 통제된 상태 및 서명을 요구하는 형상. CQ-08과 CQ-09에 답합니다. - 완료 게이트(
bp:DrugProductFinishShape) — 무균성·외관·충전량을 더하는 제품 전용 형상 — 충전-완료가 용기-마개 시스템으로 가능하게 한 기준. 제품은 두 게이트를, 원료는 패널만 통과해야 합니다. CQ-10에 답합니다. - 세포 은행 게이트(
bp:CellBankShape) — 워킹 은행 OWL 제약의 닫힌 세계 쌍둥이로, 네 가지 특성 규명(동일성, 무균성, 바이러스, 유전)과 계보 뿌리 노드의 계대 수 정확히 하나를 요구합니다. CQ-17에 답합니다. - Disjointness 가드 —
BatchNotProcessShape과MaterialNotEquipmentShape으로, OWL-RL 프로파일이 잡지 못한 채 두는 continuant/occurrent(배치 대 발효)와 material/equipment(배치 대 용기) 혼동을 잡아냅니다. - 공동 운명 영향 분석(CQ-04) — 실패한 로트의
derivedFrom계통을 공유WCB-CHO-001까지 위로, 그리고 그 형제들까지 아래로 횡단하여, 추측이 아니라 질의로 리콜을DP-001/DP-002로 범위 잡는 것입니다. - 검증 보고서(Validation report) — SHACL이 실패 시 반환하는 질의 가능한 RDF 그래프(focus node, result path, 제약, 값, 심각도, 메시지)로, 조사를 경로 잡는 데 쓰입니다. CQ-11은 그것이
DS-004/DP-004에 대해 정확히hmwPct에서 발화함을 확인합니다. - 완전성 대 정확성(Completeness versus correctness) — SHACL은 기록이 완전하고, 잘 형성되고, 범위 내임을 보장할 뿐, 참임을 보장하지는 않습니다. 그럴듯한 범위 내 거짓 — 엉뚱한 바이알에 올바른 숫자 — 은 통과하므로, 게이트는 인간 출하 판단을 뒷받침할 뿐 대체하지 않습니다.
이것이 이어지는 곳
이제 모델은 책임을 집니다. 게이트들이 실제 mAb-A 캠페인에 대해 실행되고, HMW 응집체 규격 이탈 모드가 한 경로로 고립되며, 세포 은행 뿌리가 특성 규명되었음이 증명되고, disjointness 가드가 추론기가 통과시키는 것을 잡아냅니다. 그러나 검증된 온톨로지가 완성된 온톨로지는 아닙니다 — 분자의 지식이 깊어지면서 규격은 바뀌고, 용어는 폐기되며, 새 출하 기준은 그래프에 이미 있는 모든 로트를 깨뜨리지 않고 추가되어야 할 수 있습니다. 다음 장 유지보수: 거버넌스, 버전 관리, 변경은 모델을 그 운영 수명으로 따라갑니다. 공들인, 변경 통제된 폐기가 옛 별칭을 조용히 덮어쓰지 않고 어떻게 퇴역시키는지, 버전 관리가 책 간 참조를 어떻게 유효하게 유지하는지, 그리고 실행 가능한 역량 질문 모음이 어떻게 모든 미래 변경이 여전히 통과해야 하는 회귀 시험이 되는지를 다룹니다.