현장

읽지 않는 도구 — 진료 흐름에서 판단을 밖에 두는 법

작성: makemind · 2026년 7월 24일

먼저 두 가지를 밝힌다.

첫째, 2026년 4월에 이 매거진은 어느 의사가 진료 흐름 도구를 만든 이야기를 실었다. 이 현장은 특정 업체가 아니다. 실제로 그렇게 돌아가는 형태를 그대로 구성했고, 어느 곳인지는 밝히지 않는다. 아래는 그 형태대로 직접 만든 것이고, 절차와 수치는 지어낸 것이다.

둘째, 이 글은 의료 조언이 아니고, 여기 만든 것도 의료기기가 아니다. 이 시리즈는 임상 검증을 하지 않았고 할 위치에 있지도 않다. 다루는 것은 소프트웨어의 경계 하나다 — 판단을 도구 밖에 두는 일이 코드에서 어떻게 생겼는가.

말로 긋는 선은 지워진다

원 글에도 그 선이 있었다. "진단은 사람에게 남기고, 진료의 흐름만 화면으로 정리한다."

옳은 말이다. 문제는 그게 문장으로만 있었다는 것이다.

문장으로 있는 선은 지워진다. 특히 이런 식으로 지워진다 — 몇 달 뒤에 누군가 "요약 한 줄 있으면 편하겠는데"라며 필드를 하나 더한다. 그 필드에 대체로 정상 범위 같은 문자열이 들어간다. 아무도 그 순간을 눈치채지 못한다. 도구가 판정을 시작한 순간이다.

그래서 이번엔 코드에 그었다. 두 번.

첫 번째 선 — 그런 도구가 없다

tools offered: flow.state, flow.done, readings.list

셋뿐이다. 절차를 보여주고, 절차 하나를 완료로 표시하고, 계측값을 그대로 돌려준다. 판정·분류·해석을 하는 도구가 없다.

검증이 도구 이름부터 본다.

for W in diagnos assess triage interpret advise; do
  if grep -qi "tools offered:.*$W" captures/run.log; then
    echo "   a tool is named like it produces a judgement: $W"; exit 1
  fi
done

이건 앞선 편에서 확인한 원리의 적용이다. 도구 목록이 곧 표면이고, 목록에 없는 능력은 사람이 눌러서도 모델이 골라서도 닿지 않는다.

두 번째 선 — 판정처럼 들리면 예외가 난다

목록만으로는 부족하다. flow.state 가 돌려주는 문자열 안에 판정이 섞일 수 있기 때문이다.

/// Words that would turn a report into a verdict. Anything this server is
/// about to say is checked against them.
///
/// A list of words is a crude guard and it is meant to be. It cannot stop a
/// determined author, but it does stop the ordinary way this line gets
/// crossed: someone adds a helpful-sounding summary field months later and
/// nobody notices that the tool started diagnosing.
static const forbidden = [
  'diagnos', 'likely', 'suggests', 'consistent with', 'probable',
  'abnormal', 'normal', 'healthy', 'concerning', 'severe', 'mild',
  'recommend', 'should take', 'prescribe',
];

static String _guard(String s) {
  final lower = s.toLowerCase();
  for (final w in forbidden) {
    if (lower.contains(w)) {
      throw StateError('clinic_server tried to emit a judgement word: "$w"');
    }
  }
  return s;
}

서버가 내보내는 모든 문자열이 이 함수를 통과한다. normal 이 목록에 있는 것을 봐 달라 — 가장 무해해 보이는 단어이고, 가장 흔히 선을 넘는 단어다.

투박한 가드다. 작정한 사람은 못 막는다. 그런데 이 선이 실제로 지워지는 방식은 작정이 아니라 부주의이고, 부주의는 이 정도로도 막힌다.

그리고 검증이 실행 전체를 훑는다.

no judgement vocabulary in anything the server returned

이 콘텐츠는 개발자 이상이 필요합니다

로그인 후 플랜을 업그레이드하면 계속 읽을 수 있습니다.

플랜 보기
Twitter