一分鐘版本
這套系統要解決的問題是:從 bulk 長讀長資料建立可審核的局部突變狀態候選結構,並標出哪些證據仍不足以確認細胞譜系。
傳統做法用短讀長測序,只能看到每個位點各自的變異頻率;若只靠 per-locus marginal VAF、且沒有 linkage 或額外模型假設,此逆問題不可識別。
本系統改用 ONT 長讀長:一條 DNA 分子動輒數萬鹼基,可以同時跨過好幾個突變位點,
於是「這兩個突變在不在同一條實驗取樣到的物理分子上」成為直接觀測;它們是否來自同一細胞群、以及譜系關係,仍是受模型與輔助資料限制的推論。
系統由 兩支 C++ 主程式(InterSubMod、LongLineage)+ 一層上游工具鏈 + 一層 Python 分析與 HTML 呈現組成。
其中只有一部分現在真的跑得動 —— 下面的狀態表會誠實標出來。
本系統最值得注意的設計
它在機器欄位的層級把「技術跑通」和「科學可用」分開:canonical cohort_receipt.json
承載 technical_all_pass = true,而 summary/all7_summary.json 承載
validation_evidence_eligible = false。Frozen cohort receipts 的具名 checks 對其引用的 frozen artifacts
通過;這不是 current-source certification,也不是 production/release gate PASS,因此這批結果還不能當作驗證證據。
這種「不確定就明講不確定」的紀律,貫穿整份設計。
01全景圖 — 資料從哪裡進來,經過誰,變成什麼
由下而上共五層。方框顏色 = 現在的可用狀態:
綠 可跑
黃 有限制
紅 被鎖住。
圖 1 · 五層全景與資料流
怎麼讀這張圖:由下往上是資料流方向。InterSubMod 從 BAM aux tags 讀 HP/PS;
exact-PS/LongLineage 使用 sidecar。兩者是 commit-scoped 平行 provenance contracts,
不是兩支引擎直接串接的執行期介面;tagged-BAM writer 另依 feature/preview commit 判讀。
數字出處:292 GB tumor BAM 與 40,859,727 列 sidecar 皆為具名歷史量測。2026-08-13 另盤點
14 個 PRE-FIX canonical tagged BAM(7 paired_full+7 paired_pileup)合計
3,709,322,840,333 bytes。7 個 paired_full 的 exact paths/bytes/mtimes 合計
1,840,983,466,353 bytes(1.6743647 TiB),且 2026-08-13 重播 2026-07-11 首/中/尾 1 MiB sampled-identity receipt 為 7/7 MATCH。
但未計算 full-file SHA-256,也未證明與現行 7 sidecar 的 producer revision/內容等價,因此仍是 PARTIAL/NON_FINAL。
exact stat bytes quotient 為 294.2669×,只可稱跨世代 storage-footprint comparison;不是因果壓縮率或 frozen authority,舊 287× 無效。
02兩支程式是什麼關係?(和直覺不同)
最容易誤會的一點:LongLineage 不是 InterSubMod 的新版本,也不是它的分支。
| InterSubMod(ISM) | LongLineage(LL) |
| 定位 | 研究原型:C++ 核心 + 大量 Python 探索腳本 | PRIVATE research-preview candidate:truth-isolated、fail-closed;source-origin/license/dependency audit pending |
| git 起源 | 71ce312e | 7a8f75e8 — 完全不同的根 commit |
| 血緣 | — | ORIGIN.md 記錄 21 條 source mapping 與 17 條 authority;在 origin/license gate 完成前,不把 clean-room/可公開來源當成已驗證結論 |
| 輸出粒度 | per-region(每個 SNV 位點一包) | per-read(每條 read 一列) |
| 單倍型來源 | 直接從 BAM 的 aux tag 讀 | 明文禁止讀 BAM tag,只認 sidecar TSV |
| 對「甲基化能不能參與重建」的立場 | 絕不參與 只做事後關聯描述 | 是必要關卡 甲基化分不出群的位點不會有拓撲解 |
● 兩系統的科學立場直接衝突
ISM 的既有結論是「甲基化絕不進入重建的 likelihood」,因為會產生循環論證(見下方 §4)。
但 LL 現行程式碼把「甲基化有沒有分出群」當成拓撲單元的前置關卡。
後果:在 LL 裡,甲基化沒分出群的位點永遠不會有拓撲解 —— 這是一個選擇性偏誤來源。
任何跨系統的比較都必須明講這點,否則會得出與 ISM 既有結論矛盾的敘述。
03現在到底哪些能跑?—— 誠實狀態表
這張表是本頁最實用的部分。所有狀態都是本輪實際執行過或讀原始碼確認的結果,不是文件宣稱。
| 部件 | 狀態 | 實測依據與限制 |
inter_sub_mod ISM 主程式 |
可跑 |
build output 不入版控;fresh clone 必須從 exact checkout 在 clean build directory 建置。具名 internal fixture 曾有單次 2.9 秒、exit 0 receipt,僅限該硬體/commit/輸入,不是讀者 runtime promise;含 normal BAM+LOH BED 的 internal receipt 亦不可替代 clean-clone 驗收。 |
| longlineage preflight |
可跑 |
驗證 8 個角色的 manifest 完整性。 |
| longlineage dataset-gate |
限制 |
在 b9aaa12 candidate 的 frozen HCC1395 receipt 中,這是唯一觀察到能產生 research artifacts 的介面,該次產出 8 個 artifact。
● 但 樣本名稱硬寫死在原始碼裡 —— 換一個樣本就會失敗,必須改 C++ 重新編譯。 |
| longlineage run / probe |
被鎖 |
run/probe 仍無條件回 KernelBlocked (exit 6)。
release_attestation.json 的 P3/P4/P5 與 phase ledger/public-safety receipt 的 P7/P8 具名 gates 尚未通過,涵蓋 parity/validation、source-origin、license、dependency 與 release-safety。
部分 M1/M2/topology kernels 曾由具名 dataset-gate 執行,不等於全部核心、production entry 或公開資格完成;整體仍為 NOT_READY/non-production。 |
| longlineage 的 topology 產出 |
目前為 0 |
b9aaa12 candidate 的 frozen HCC1395 dataset-gate receipt:79,687 個位點 → 通過甲基化關卡的只剩 5 個 → mutation-state candidate topology units 0 個。
134,278 個配對中有 134,276 個被標記為不合格;此單一 receipt 不可外推其他 revision、dataset 或 run。 |
| longlineage-query / export-legacy |
未實作 |
仍是 fail-closed 的空殼。 |
research exact-PS candidate solver 獨立 Python + C++ 路徑;不是 inter_sub_mod |
可跑 |
這是產出 frozen exact-PS candidate funnel 的路徑;已覆蓋 7 個 technical datasets/6 個 biological IDs(見下方 §5)。它不把 model-selected candidate shape 升格成細胞譜系。 |
| 7 個 technical datasets 的 sidecar 資料 |
齊全 |
實測 run_status.tsv 顯示 7/7 全部 PASS,可立即使用。 |
| 輸出帶標籤的 BAM |
版本相依 |
InterSubMod 沒有寫 BAM 的能力。LongLineage private baseline/main snapshot 5daf50f 也沒有;private public-preview candidate b9aaa12 已含 longlineage-tag-bam。
這只是 revision-scoped、尚未發布的 NOT_READY 能力;不可寫成公開或 production 可用。 |
| 兩支程式串起來跑 |
無 |
沒有任何腳本同時執行兩個 binary(雙向搜尋皆無命中)。目前是兩條各自獨立的線。 |
給教授看的三句重點
- 可作本次研究交接重現的主線,是 InterSubMod + 獨立 research solver;LongLineage 仍是 PRIVATE/NOT_READY preview candidate。兩者的數字與 receipt 不可混用。
- LongLineage 的
P3/P4/P5/P7/P8 具名 gates 尚未通過:部分 kernels 的具名 dataset-gate receipt 不能取代 parity/validation、source-origin/license/dependency 與 release-safety。
- 沒有一條打通兩支程式的路。零件很齊、契約很嚴,但接縫還沒建。
04為什麼甲基化不能拿來重建譜系?
這是整套方法論最核心、也最常被外部讀者質疑的設計決定,值得單獨解釋。
直覺上會想:既然甲基化模式在不同細胞群之間有差異,那用甲基化把 read 分群,不就能找出亞群了嗎?
不行 —— 因為會產生循環論證。
圖 2 · cis-ASM 循環:為什麼「用甲基化確認亞群」證明不了東西
這個設計的代價與收穫:代價是甲基化這個資訊量很大的軸被降級成輔助;
收穫是避免「用甲基定義群、再用甲基驗證群」這一項可預見的循環論證批評;這不代表已通過外部同儕審查。
實際數字上,在 frozen formal family 中,甲基化輔助層共 1,045 個正式單元、811 個可評估、
最終只有 3 個(0.37%)達到該定義下的 robust pattern-conditioned association。這是現行設計不把該 formal family 當骨幹的一個理由,不是所有 methylation signal/backbone design 的總檢定。
05實際跑出來長什麼樣?—— 7 technical datasets/6 biological IDs funnel
這是目前的 canonical 結果(2026-08-01 凍結,7 個 technical datasets/6 個 biological IDs、chr1–22)。
每一層的數字都能在 denominator_registry.tsv 或 all7_summary.json 裡查到。
469,849
sSNV dataset records(7 technical datasets)
66.5219%
170,131/255,752 k=1 strict components;非 dataset-record 比例
71,955
可由 frozen read-AF model 排序的 candidate units
圖 3 · 從 469,849 筆 dataset records 到 63,506 筆 model-assigned candidate-shape records
算術自洽性已驗證:39,648 + 23,858 = 63,506;+ 8,449 = 71,955;+ 3,224 + 45 = 75,224;
+ 10,717 = 85,941;+ 13,014 = 98,955。每一層加總都對得起來。
● 最常被誤引的數字就是 88.2579%。它的正確讀法是:
「在已經可排序的 71,955 個 candidate units 中,frozen model 對 63,506 個(88.2579%)指派單一 rooted-unlabeled candidate-shape signature」——
這是 model-conditional 的圖形統計,不是「腫瘤裡 88% 的演化關係已經解出來了」。
分母不是全部突變。圖中的 170,131 個 k=1 是 170,131 / 255,752 strict read-linked components = 66.5219%;component census 無法推得 isolated dataset-record percentage,不能改除以最上游 469,849 dataset records。後續另有 12.47% 的資源上限放棄。
● 排序器同時也是篩選器 — 一個容易被忽略的細節
read-AF 不只用來「排序」候選樹,它在同分的候選集合裡取最大值並丟掉其餘,
因此它實際上也改變了候選集合本身(實測丟棄 30.03%)。
後果:純 parsimony(不靠 AF)的單一 candidate-shape 比率只能說是一個區間,不能報單一數字。
⚠ 本輪查證發現:該區間的上界 88.2579% 有 registry 佐證,
但下界 64.89% 在本 repo 內未 grep 到原始出處,僅存在於工作記憶索引 ——
對外引用前必須先補上出處。
06能回答什麼、不能回答什麼
這節直接取自 authority_manifest.json 的 claim_boundary 欄位 —— 是機器可讀的宣稱邊界,不是散文。
✔ 可以主張 permitted
- 嚴格 read-linked 的局部區域結構
- 家族完整時,完整的最小 read-相容突變狀態候選家族
- 允許遞迴的 Hamming-1 父子樹候選
- 未經 CN/LOH 校正的 deterministic read-AF 排序
- 全域 AF-best 數學樹的 exact rooted-unlabeled 拓撲普查
- pattern-conditioned 的區域甲基化關聯(非因果)
✘ 明文禁止主張 forbidden
- confirmed 細胞層級的 clone / subclone
- CN/LOH 校正過的 CCF
- 校準過的 likelihood 或 posterior
- 把 read cluster 當成 cell clone
- 用甲基化差異重排拓撲
- 把 HCC1395 與其 DORADO 重跑當成生物學重複
已測為 negative/blocked 的方向(新假說須重新稽核)
| 方向 | 為什麼不行 |
| 對整棵樹做機率排序 |
候選樹在 likelihood 下等機率,posterior 只會吐 P=1/N。
換成連續 posterior「只是換個記法,變不出 reads 裡不存在的資訊」。 |
| 用甲基化排序拓撲 |
三個理由全否:cis 構造對稱、四配子最常見成因是拷貝數多重性而非二次突變、
等機率區沒有遺傳真值可校驗(等於拿甲基驗甲基)。 |
| 甲基化非監督分群確認亞群 |
單一位點的四種成因不可拆(見 §4),屬已判 NEGATIVE 的 tumor-only double-dip。 |
| 甲基化當變異 TP/FP 過濾器 |
已測 formulation concluded negative;重開須 materially new hypothesis + pre-decision audit。 |
| 用舊的 50 kb 鄰近取代嚴格 read linkage |
幾何鄰近不等於同分子連鎖。已被 read-linked 方法取代。 |
證據等級的天花板
在目前單一 bulk observation/model 且未整合 CN/LOH 的條件下,不能確認 cellular
subclone 或 linear ancestry,因此目前封頂 ★3。single-cell、multi-region、orthogonal
CN/purity 等額外獨立證據可能提高識別性;不宣稱只有某一種 assay 可行。Steiner 節點會被
誠實標成 inferred。
07接下來看哪一頁
依你的目的挑一頁進去。
ISM 部件與輸入輸出 可跑
ddd8909a 的釘選 29-option census(branch-scoped)、內部 8 個處理階段、每個輸出檔的真實欄位與範例行。
吃 → tumor BAM + reference + somatic VCF
吐 → methylation.csv · distance_matrix · tree.nwk
進入 ISM 分冊 →
LongLineage 部件與契約 部分可跑
Private candidate b9aaa12 的 4 個子命令狀態、frozen HCC1395 M1→M2→candidate-topology 鏈、artifact schema 與 read_id 算法。
吃 → 8 角色 manifest
吐 → site_reads · cooccurrence_* · topology_unit
進入 LL 分冊 →
上游工具鏈與資料 齊全
sSNV / HP-PS / 甲基化 / CN 各自從哪個工具來、7 個 technical datasets(6 biological IDs)的實體資料在哪。
Dorado · ClairS · LongPhase-S · SAVANA · sidecar TSV
進入上游分冊 →
Python 分析層與 HTML 呈現層
主力腳本各自做什麼、工作站 HTML 怎麼生成、這層目前的碎片化問題。
分析腳本 → workstation spec → standalone HTML
進入呈現層分冊 →
怎麼跑 — 操作手冊 可複製指令
從編譯到跑出第一個結果的完整步驟,每條指令都已實際執行驗證過。
build → 最小跑法 → 完整跑法 → 看結果
進入操作手冊 →
科學方法細節 既有頁面
名詞定義、ISM 方法本體、甲基化讀取與篩選、chr2:18M 真實案例逐步拆解。
解釋中心第 01–10 頁
回 INDEX 選頁 →