專案

一般

配置概況

動作

Bug #452

進行中
SC

緊急票C 同病人跨就診誤填修復:帶回身分鎖定開窗綁定就診,兩殼雙層攔截(exit 11)+回歸紅轉綠(v0.9.2/殼0.10.1)

Bug #452: 緊急票C 同病人跨就診誤填修復:帶回身分鎖定開窗綁定就診,兩殼雙層攔截(exit 11)+回歸紅轉綠(v0.9.2/殼0.10.1)

是由 Sashiba Chou 於 約 2 個月 前加入.

狀態:
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# 殼):
  1. 送出前不再覆蓋:已綁定 → 畫面就診 ≠ 綁定值 → 殼端即回 exit 11,訊息含雙方序號
    +「請在醫令切回原就診,或關窗重新由按鈕開啟本視窗」;並記 log「帶回攔截」(不含病歷號)
  2. payload 一律帶開窗綁定值(encounterSeqNo=綁定)→ TraumaPrefill 既有核對自然成為
    獨立第二層——單點失效變雙層攔截
  3. adopt-once 邊角:開窗時未能綁定(TraumaFill 不可用/未取號)→ 首次送出一次性綁定後鎖死
  4. 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.py 46/46(含新 5 項紅轉綠)、test_startup.py 69/69
  • C# 殼 GUI 重演 M1 實證情境:跨就診 11 攔截、切回放行、log 留痕
  • smoke test 59/59 PASS(backend 未動;前端文案為加項)
  • 日 C 現場:N6 負面測試必過(HIS 真切就診 → ERROR[11],不得填入)
  • 協調者要求之交付物雜湊(SHA256):
  • C# 殼 v0.10.1 exe:4F99767FA6EA6B8CF4683EB77AFFDD5D83E16EC0EF05E4C932175C789D5551F2(manifest BF3D9EBC…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 同批或後續皆可)

沒有任何資料可供顯示

動作

匯出至 PDF Atom