Number 8Oct 2026

KAIROS는 사람이 자율 비행체를 감독하면서 AI의 권고를 승인하거나 거절하는 콘솔을 위한 디자인 시스템이다. 시간에 쫓기며 결정하는 경우가 많다. 객체부터 정의하고, 컴포넌트는 거기서 따라 나오게 지었다. 문법이 어떻게 잡혔고 화면에서 무엇이 바뀌었는지 적었다. 2026년 10월 기준.

Devon Kim 객체지향 디자인 시스템 만들기

객체지향 디자인 시스템 만들기


조건

  • 컴포넌트는 생김새가 아니라 객체와 값 다섯 개로 정의한다
  • 같은 객체는 어느 화면에서나 같은 ID와 상태로 보인다
  • 규칙은 스타일 가이드가 아니라 검사로 지킨다
  • 디자인 결정은 모두 번호를 붙여 기록한다(D1–D73)
객체비행체 · HERON 2ID UAV-02 · 상태 Unreliable그 경보 · 그 결정이것도 객체, 각자 ID표면 다섯 개지도 표지어디에 있나목록 행무엇이 나를 부르나인스펙터그 객체의 전부타임라인 항목언제 무슨 일칩문장 안에서 이름으로어느 표면이든 같은 ID와 같은 상태. 어디서 고르든 모든 곳이 따라온다.
그림 1객체 하나, 표면 다섯 개, 어디서나 같은 ID와 상태

컴포넌트만으로는 부족했던 이유

컴포넌트 라이브러리는 버튼, 카드, 배지가 어떻게 생겼는지 알려 준다. 그 안에 든 것이 무엇인지는 알려 주지 않는다.

운용 콘솔에서는 이 빈자리가 곧 문제다. 운용자는 화면의 숫자마다 같은 질문을 한다. 센서가 잰 값인가, AI가 짐작한 값인가? 이미 실행 중인가, 제안일 뿐인가? 혼자 실행해도 되나, 다른 사람이 서명해야 하나? 카드 컴포넌트에는 답이 없다. 그래서 화면마다 답하는 방식이 달라지고, 운용자는 그걸 하나하나 익혀야 한다.

그래서 다른 데서 시작했다. 컴포넌트를 만들기 전에 운용자가 다루는 객체를 적고, 모든 객체가 밝혀야 하는 속성 몇 가지를 정했다.

객체부터 시작한다

객체가 먼저다. 비행체, 경보, 권고, 결정, 해상 접촉물, 수색 구조 건. 객체마다 ID와 상태가 있고, 한 객체가 여러 곳에 나타난다.

화면은 이 객체들을 비춘 것이다. 같은 비행체가 지도에서는 표지, 목록에서는 행, 인스펙터에서는 한 페이지, 이벤트 타임라인에서는 항목, 문장 안에서는 칩이 된다. 어디서나 지키는 규칙은 두 가지다.

  1. 01같은 정체 — 어느 표면이든 같은 ID와 같은 상태 표시
  2. 02공유 선택 — 어디서 고르든 모든 표면이 따라온다

당연해 보이지만 일부러 규칙으로 정했다. 목록과 지도가 서로 다른 말을 하고 운용자가 머릿속에서 맞추는 화면은 의도하지 않아도 쉽게 만들어진다.

축 다섯 개

모든 컴포넌트는 값 다섯 개의 함수다.

render(object, projection, epistemic, attention, authority)

  1. 01Object — 무엇인가: 비행체, 경보, 권고, 결정
  2. 02Projection — 어디에 보이나: 표지, 행, 인스펙터, 타임라인, 칩
  3. 03Epistemic — 어떻게 알게 됐나: 관측, 파생, 추론, 제안, 승인, 실행
  4. 04Attention — 얼마나 크게 알려도 되나: 배경, 인지, 주의, 인터럽트
  5. 05Authority — 누가 실행할 수 있나: 센서, 시스템, AI, 운용자

Epistemic 축에는 알려진 결함이 있다. 질문 두 개에 한꺼번에 답한다. 정보가 어디서 왔는가(관측, 파생, 추론)와 행동이 어디까지 진행됐는가(제안, 승인, 실행)다. 한 항목이 AI가 추론한 것이면서 운용자가 승인한 것일 수 있고, 전송됐지만 실행은 확인되지 않았을 수도 있다. 값 하나로는 둘을 함께 말할 수 없다. 다음 버전에서는 출처(source)와 단계(stage)로 나눈다.

생김새는 이 값에서 나온다. 누구도 "빨간 걸로", "점선 테두리로"를 손으로 고르지 않는다. 두 컴포넌트가 같은 인식 단계를 보여 주면 보여 주는 방식도 같다. 단계가 입력이기 때문이다.

호버나 포커스 같은 상호작용 상태도 그대로 있다. 바탕일 뿐 핵심은 아니다.

render(object, projection, epistemic, attention, authority)OBJECT무엇인가비행체경보권고결정접촉물PROJECTION어디에 보이나markerrowinspectortimelinechipEPISTEMIC어떻게 알게 됐나observedderivedinferredproposedauthorizedexecutedATTENTION얼마나 크게ambientawareattentioninterrupt · max 1AUTHORITY누가 실행하나SENSORSYSTEMAIOPERATOR · L1–L3컴포넌트는 값 다섯 개의 함수다. 생김새는 거기서 나오고, 손으로 스타일을 고르지 않는다.
그림 2

본 것, 추론한 것, 제안한 것

다섯 축 가운데 인식 단계가 가장 중요했다. KAIROS의 AI는 틀릴 수 있고, 운용자는 센서가 본 것과 AI가 결론 낸 것을 한눈에 구분해야 한다.

규칙

  1. 01관측과 추론은 한 영역 안에서 같은 스타일을 쓰지 않는다
  2. 02제안은 이미 승인된 것처럼 보이지 않는다
  3. 03추론한 것에는 누가 언제 만들었는지 붙인다
  4. 04확신도는 범주와 근거 개수로 보여 준다. 퍼센트 숫자 하나로 보여 주지 않는다

중간에 규칙 하나를 바꿨다. 처음에는 추론 블록에 사선 빗금을 넣었다. 눈에 띄었지만 잡음으로 읽혔다. 지금은 단계를 글자로 쓰고("inferred", "not executed", "AUTHORIZED") 색은 그걸 거들기만 한다. 스크린 리더도, 보라와 파랑을 구분하기 어려운 사람도 같은 정보를 받는다.

본 것AI의 것사람의 것observed센서가 보고기본 · 데이터 나이derived그걸로 계산∆ 표시inferredAI의 가설보라 · 이탤릭 · “inferred”proposedAI의 제안“not executed”authorized사람이 서명채움 · 서명자 IDexecuted실행 중단계 · 결과단계는 글자로 말한다. 색과 바탕은 거들기만 한다.관측과 추론은 스타일을 나누지 않는다. 제안은 승인된 것처럼 보이지 않는다.
그림 3

인터럽트는 하나, 실행 권한은 결과에 따라

주의는 예산이다. 화면에서 인터럽트는 최대 하나, 주의 요청은 최대 셋이다. 한꺼번에 일이 터지면 빨간 배너를 하나 더 띄우지 않고 묶는다.

무엇을 위급으로 볼지는 잡는 데 시간이 걸렸다. 첫 버전은 마감이 있으면 전부 올렸고, 한 시나리오의 모의 한 시간 동안 위급 인터럽트가 27번 나왔다. 지금 규칙은 더 좁다. 위급은 마감이 있고 기본값이 해로운 것, 즉 아무것도 안 하면 상황이 나빠지는 것이다. 같은 한 시간에 세 번 나온다.

실행 권한은 결과의 무게에 따라 나뉜다.

  1. 01L1 — 되돌릴 수 있는 것, 예를 들어 제자리 대기. 운용자 혼자 결정
  2. 02L2 — 경로가 바뀌는 것. Mission Lead의 동의가 필요
  3. 03L3 — 임무가 끝나는 것. 동의에 더해 사유를 적어야 한다

승인 버튼은 운용자가 결과를 미리 본 다음에만 나온다. 동의를 기다릴 시간이 없으면 운용자 혼자 실행할 수 있고, 그 결정은 사후 검토 대상으로 표시된다. 미리보기부터 결과까지 모든 단계는 상태 변화와 같은 동작 안에서 감사 기록을 하나씩 남긴다. 기록을 건너뛰는 경로는 없다.

결과의 무게에 따라L1되돌릴 수 있음 · 예: 대기결과 미리보기승인L2경로가 바뀜결과 미리보기요청Lead 동의L3임무가 끝남결과 미리보기사유요청Lead 동의감사단계마다 하나긴급 단독 권한남은 시간 < 예상 동의 시간 · 사후 검토승인은 미리보기 다음에만 나온다. 기본값은 안전한 쪽이다.
그림 4

의미로 이름 붙인 토큰

토큰도 같은 생각을 따른다. DTCG 형식이고 세 층으로 나뉜다.

  1. 01Primitive — 원재료 팔레트와 단위. 컴포넌트는 직접 쓰지 않는다
  2. 02Semantic — 축 이름으로 부른다: epistemic.inferred.fill, severity.critical.fg, authority.ai.fg
  3. 03Component — 컴포넌트에 꼭 필요할 때만

이름은 색이 어떻게 생겼는지가 아니라 무엇을 뜻하는지 말한다. purple-dashed 같은 토큰은 없고 inferred 토큰만 있다.

규칙은 믿지 않고 빌드에서 검사한다. 글자 대비는 4.5:1 이상이어야 하고, 경고와 위급은 서로 다른 색이어야 한다(주황과 빨강. 위급에는 카운트다운과 배너 위치도 붙는다). 스타일시트에 날 rgb() 그림자나 px 반경이 있으면 빌드가 실패한다. 같은 원본에서 QML 테마도 만들어서, 문법이 웹에 묶이지 않는다.

PRIMITIVEpalette.violet.darkpalette.red.darkspace.3radius.panel컴포넌트가 직접 쓰지 않음SEMANTIC · 축 이름epistemic.inferred.fillseverity.critical.fgauthority.ai.fgsalience.interrupt.motion생김새가 아니라 의미로COMPONENTAiCardCriticalBannerAssetRowAuthorityZonesemantic 토큰만 읽음빌드마다 검사글자 대비 ≥ 4.5:1날 rgb()·px 금지위급 빨강 = 경고 빨강DTCG 원본 → CSS 변수와 QML 테마. 검사가 실패하면 빌드도 실패한다.
그림 5

비평을 받고 다시 설계했다

문법은 감탄하기는 쉽고 쓰기는 어렵다. 그래서 human factors 관점에서 두 번 비평을 받았다. 두 번째 비평에서 문제 26개가 나왔다. 대부분은 정직함에 관한 것이었다. 콘솔이 알 수 있는 것보다 더 많이 약속하거나, 상황과 상관없는 이유로 한쪽 선택을 더 쉽게 만들어 둔 곳들이었다.

가장 큰 재설계는 그다음에 왔고, 새 기능이 아니라 위계에 관한 것이었다. 위급 경보 하나가 다섯 곳에 나오고 카운트다운은 세 번 보였다. 인스펙터는 높이가 1,658 px였고 결정은 맨 아래에 있었다.

바뀐 것

  1. 01반복은 한 곳만 — 큰 카운트다운은 배너에만 둔다
  2. 02탭 — 결정, 텔레메트리, 기록. 결정 탭은 아무도 결정하지 않으면 무슨 일이 생기는지 한 줄로 시작한다
  3. 03AI 카드 하나 — 제안, 결정에 필요한 숫자, 이유, 가장 강한 반대 근거
  4. 04조용한 것은 접는다 — 정상 비행은 한 줄, 이벤트 기록도 한 줄

결정 탭은 이제 626 px이고 1440×900 화면에서 스크롤 없이 다 보인다.

이 화면으로 사람이 더 잘 결정하는지는 검사가 알려 주지 못한다. 다음은 사용자 테스트다. 참가자 12명, 조건 여섯 개, 그중 절반은 AI가 틀린 경우다. 탐색 단계의 테스트다. 사람이 콘솔을 어디서 잘못 읽는지는 찾을 수 있지만 안전하다는 걸 입증하지는 못한다. AI가 틀렸을 때 놓친 오류뿐 아니라, AI가 맞았는데 괜히 거절한 경우도 함께 센다.


출처