#53スコア 4/5医療・ヘルスケア

AI に与薬・3点認証を作らせてみた — 倉庫用に作ったスキャンが、患者安全に効いた(やってみた #53)

ルート: /medication
デスクトップ表示
モバイル表示

375px のビューポートで撮影。縦長のページはフレーム内をスクロールします。

解説記事

AI に与薬・3点認証を作らせてみた — 倉庫用に作ったスキャンが、患者安全に効いた(やってみた #53)

やってみたシリーズ: 自作のデザインシステム @gunjo/ui群青)を、文脈ゼロの cold な AI に実 UI で作らせる連載。新業界・医療1枚目——与薬 / 配薬・3点認証(患者バナー × アレルギー警告 × 患者→薬剤→指示の3点認証 × ハイアラート薬のダブルチェック × 与薬記録)。

物流を6枚やり切って、全く別の業界=医療へ。1枚目は与薬(ベッドサイドで看護師が薬を渡す画面)。医療安全の核心——3点認証(患者リストバンド→薬剤→指示の照合)で「正しい患者・薬剤・時間」を機械的に保証する作法。

結果 — 4/5

tsc/build 緑・console 0・375px(ベッドサイドのハンディ想定)・患者バナー+アレルギー警告・3点認証(患者→薬剤→照合)・患者不一致/指示に無い薬剤/中止済/時刻外のブロック・ハイアラート薬のダブルチェック・与薬記録・h1 1個。

今回の主役 — 倉庫用に作った ScanGate が、患者安全に越境した

この連載の最大の問いは「作った primitive が、全く別のドメインでも発見・採用されるか」。#47-52 で物流の倉庫ピッキング用に作った ScanGate(段階スキャン)を、医療の cold AI が 3点認証に自力で採用した:

ScanGate CROSSED from logistics to clinical (used, not abandoned). The flow engine fit the patient→drug→verify shape exactly: ctx.values[stageId] carried the confirmed patient into the drug stage for the cross-check, onScan → {ok,message,advance,value} drove all four block types(患者不一致 / 指示に無い薬剤 / 中止済 / 時刻外), the imperative reset() handled 認証やり直し, and the ① 患者 → ② 薬剤 step indicator is exactly right.

倉庫の棚→商品を確認する仕組みが、患者→薬剤を確認する患者安全に、そのまま効いた。ドメインは倉庫と病棟で正反対なのに、「scan して確定→次が確定値を読んで照合」という抽象が同一だった。これが primitive の汎用性の最強の証拠——業界どころか、作業の種類(物流オペ vs 医療安全)すら越えた

src で直した穴 — 越境して初めて見えた ScanGate の2つの欠陥

別ドメインで使われたことで、ScanGate の設計の穴が2つ露呈した(#237PR #240):

  • 🟠 終端フローの context が消える: ScanGate の最終 stage が advance:"next"(ok の既定)で stage 0 に wrap+context クリア——倉庫の「次の商品へ」ループには正しいが、3点認証のような"1回照合して終わり"のゲートでは認証済み state を黙って消した。→ advance:"done" を追加(最終 stage で停止・context 保持・onComplete(ctx) 発火)。循環フロー(梱包)は wrap のまま、終端フロー(照合→実施)はちゃんと終われるように。
  • 🟠 安全ブロックが polite: ScanInput の読み上げが aria-live="polite" 固定——患者安全のブロック(アレルギー・不一致)は割り込むべき。→ assertive prop を追加role="alert"aria-live="assertive"、ScanGate から forward)。

倉庫では出なかった穴が、医療で出た——「可能な限り違う業界」を回す意味そのもの。同じ部品でも、安全クリティカルなドメインは違う要求を突きつける。

複利も確認

  • Badge(#51 で span 修正) — 全状態バッジで「inline <span><p> 内でも hydration 警告ゼロ」。前回の fix が医療画面でも効いた。
  • Alert(assertive)・Checkbox/Switch/Select/NumberInput(バイタル)・DialogStatisticButton(実施/保留/中止に success/warning/destructive)・CardTitle as も。

起票だけした穴(医療特有・1回目→3回ルール待ち)

医療はライブラリが育った商業/金融/物流とは違う安全特化の作法を持つので、新しい穴が出た:

  • 🟠 SafetyBanner / 承認可能なクリティカルアラート#238・1回目)。患者バナー+アレルギー警告は恒久・assertive・承認必須が要る——Bannerrole=status/固定 h-10/単行 truncate で構造的に不可、Alert は承認契約が無い。requireAck/onAcknowledge 付きの安全バナーが理想。
  • 🟠 CoSignField / 2人認証(ダブルチェック)#239・1回目)。ハイアラート薬は第2看護師の照合が必須——第2者ID+確認チェック+"主担当と別人"ガード。金融承認/規制物質/maker-checker でも再出現しそう。

学び — 「違う業界」は、同じ部品に違う要求を突きつける

物流6枚: ScanGate を作った(倉庫の段階確認)
医療1枚: ScanGate が患者安全に越境 → だが終端 context 消失/polite 安全ブロックの穴が露呈

primitive の真の頑健性は、作ったドメインの外で使われて初めて分かる。ScanGate は物流では完璧に見えたが、医療の"1回照合して終わる安全ゲート"という新しい使われ方が、終端フローの欠陥を炙り出した。業界を散らして回すのは、複利を観測するためだけでなく、部品を未知の要求に晒して鍛えるためでもある。医療はまだ1枚目——安全バナー/ダブルチェックという医療特有 primitive の芽も出た。

次回予告(やってみた #54)

  • 医療をもう数枚(バイタル/温度板・電子カルテ/SOAP・検査結果+基準値・処方/相互作用 など)。医療は業界特有UIが濃いので5枚に縛らず深掘り。SafetyBanner#238・CoSignField#239 の2回目を狙う。

試す

まだ alpha。倉庫用に作ったスキャンが患者安全に越境し、その越境で初めて終端フローの穴が見えた回。


<!-- 公開前: 相互URL差込/スクショ確定/EN(dev.to)ミラー -->

使用した @gunjo/ui コンポーネント

この画面のソースが直接 import している部品です。

cold AI が組み上げた実コード

ファイル名をクリックでソースを展開できます。