먼저 두 가지를 밝힌다.
첫째, 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