動作
Bug #452
進行中
SC
緊急票C 同病人跨就診誤填修復:帶回身分鎖定開窗綁定就診,兩殼雙層攔截(exit 11)+回歸紅轉綠(v0.9.2/殼0.10.1)
Bug #452:
緊急票C 同病人跨就診誤填修復:帶回身分鎖定開窗綁定就診,兩殼雙層攔截(exit 11)+回歸紅轉綠(v0.9.2/殼0.10.1)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-08-14
完成日期:
完成比例:
0%
預估工時:
概述
背景¶
協調者【緊急票 C|高嚴重度】(2026-08-14 M1 負面測試實證):HIS 開就診 A(11147072)→ 按鈕開 ER
撰寫 → HIS 切同病人就診 B(10910328)→ 按帶回 → A 的內容(SOAP 1093 字+診斷 2 筆)被填入 B,
TraumaPrefill 核對通過(比對的是 B vs B)。內容未存檔、無資料落地,過渡防護=現場軟停外傷預填。
根因(代碼級確認):殼的送出前再核對段有一行
reg_seq = as_reg_seq(ctx.get("regSeq")) or reg_seq ——
以「按下帶回當下」的畫面 regSeq 覆蓋開窗綁定值 → payload 恆等於畫面現值 →
TraumaPrefill 的「payload vs 畫面」核對永遠相等=形同虛設。開窗綁定本身是對的,炸點只在覆蓋。
原意是「開窗時未取號、帶回時補」,未考慮同病人切換就診。
C# 新殼以行為對照為目標忠實複製了同一缺陷(對照表 F4 還把它載明為契約)——兩殼同洞。
跨病人經查擋得住(三層獨立防禦:payload vs 視窗→13、視窗 vs 畫面→11 硬擋、TraumaPrefill 自比),
漏洞範圍僅同病人跨就診。協調者裁定:維持高優先、修正方案全數核可、此票優先於日 C。
變更內容¶
兩殼同步修正(邏輯相同)¶
-
his_plugin/shell/ernote_plugin.py(Python 殼)+his_plugin/shell_cs/Bridge.cs(C# 殼):
-
送出前不再覆蓋:已綁定 → 畫面就診 ≠ 綁定值 → 殼端即回 exit 11,訊息含雙方序號
+「請在醫令切回原就診,或關窗重新由按鈕開啟本視窗」;並記 log「帶回攔截」(不含病歷號) -
payload 一律帶開窗綁定值(encounterSeqNo=綁定)→ TraumaPrefill 既有核對自然成為
獨立第二層——單點失效變雙層攔截 - adopt-once 邊角:開窗時未能綁定(TraumaFill 不可用/未取號)→ 首次送出一次性綁定後鎖死
- sentinel(-1)/0 視為無法辨識:不比、不綁,交由 TraumaPrefill 層判定
前端配套(v0.9.2)¶
-
frontend/src/lib/plugin-session.tsx:exit 11 訊息含「就診」→ 獨立文案
「醫令畫面的就診與本視窗開啟時綁定的就診不同(可能切換了同病人的另一次就診)…」——
原主文案「切換病人」在此情境會誤導醫師去切病人(病人是對的) -
frontend/src/lib/version.ts:APP_VERSION 0.9.2 + CHANGELOG
測試先行(紅轉綠才交付)¶
-
his_plugin/shell/mock_traumafill.py:ER 側測試擴充(標明非官方行為)MOCK_STATE_FILE——
每次呼叫重讀狀態檔,可在殼開窗後改檔模擬「醫師切換就診/病人」(env 對 GUI 行程凍結,原機制模擬不了) -
his_plugin/shell/test_contract_v11.py:新增票 C 回歸 5 項(18~18d):
跨就診攔截/切回放行/未綁定 adopt-once/綁定後鎖死/sentinel 交由第二層 → 46/46 PASS - C# 殼 GUI 實測(mock 狀態檔重演 M1 實證情境):開窗綁 A → 切 B → 帶回 → 11 攔截(新文案+雙序號)
→ 切回 A → 帶回成功;plugin.log 留「帶回攔截」兩筆
對照表與版本¶
-
BEHAVIOR_PARITY.md:F4 修訂( 原「ctx.regSeq 更新本視窗」為票 C 實證缺陷,不得回復)+
新增 N6 票 C 負面測試=日 C 必過 gate(照協調者裁定)+ N5 補秒錶兩組量測法 -
ER_note_NG.csproj:C# 殼 0.10.1
驗收標準¶
-
test_contract_v11.py46/46(含新 5 項紅轉綠)、test_startup.py69/69 - C# 殼 GUI 重演 M1 實證情境:跨就診 11 攔截、切回放行、log 留痕
- smoke test 59/59 PASS(backend 未動;前端文案為加項)
- 日 C 現場:N6 負面測試必過(HIS 真切就診 → ERROR[11],不得填入)
- 協調者要求之交付物雜湊(SHA256):
- C# 殼 v0.10.1 exe:
4F99767FA6EA6B8CF4683EB77AFFDD5D83E16EC0EF05E4C932175C789D5551F2(manifestBF3D9EBC…F176F12) - Python 修正版 onedir exe:
6D859BB8FAA058B0670EEBD43DE2F0D176EED4BFDAD1F54E80B49F7231893557(2026-08-14 15:55 重建)
部署語意(協調者裁定照辦)¶
- 修正版 C# 殼(0.10.1)隨日 C 交付包;日 C gate 含 N6 負面測試
- Python 修正版 onedir=日 C 之後唯一回退目標;機上現存舊殼降級為「已知含缺陷版本」,
僅供日 C 前緊急回滾,日 C 後不得回退至它 - 修正版部署前,M1 過渡防護維持(軟停外傷預填、離機保持停用)
- 前端 0.9.2 併 M2 例行更新(與 0.9.1 同批或後續皆可)
沒有任何資料可供顯示
動作