프론티어노트
ESSAY · Issue 05 · 2026. 08. 23.

코드가 화면 밖으로 나온 날

우리가 끝내 잇지 못한 절반

몇 시간 동안 장치는 조용했다.

노트북 화면에는 상태값이 찍혔고 코드도 정상적으로 도는 듯했다. 그런데 책상 위의 OLED와 서보모터는 아무 반응이 없었다. 코드를 다시 보고, 핀 번호를 확인하고, 배선을 하나씩 따라갔다. 연결을 바로잡고 다시 실행하자 OLED의 눈이 바뀌었고 서보모터가 몸을 움직였다.

화면 안에서는 값 하나가 달라졌을 뿐이었다. 그 값이 케이블과 단자를 지나 책상 위 물체의 표정과 움직임으로 나타나자 전혀 다른 사건처럼 느껴졌다.

노트북은 그대로였다. 반응한 것은 화면 바깥, 책상 위에 따로 놓인 물체였다. 다른 창을 열어도 그 자리에 남아 있었고, 화면 속 상태값을 눈과 몸짓으로 바꿔 보여줬다.

그 순간 내 첫 반응은 이게 진짜 되네보다 생각보다 귀엽다에 가까웠다.

노트북 옆 책상 위에서 OLED 눈을 켠 카NU리아 시제품
OLED의 눈이 켜지고 몸이 움직였다. 그 순간 우리는 기능보다 먼저 귀여움을 느꼈다.

팀은 하루 전에 만들어졌다

ToyThon은 NUCODE의 NU 계열 보드와 센서를 활용하는 하드웨어와 AI 해커톤이었다.

나는 행사 전날 카카오톡 팀빌딩방에서 처음 만난 팀장, 그리고 대회 직전에 합류한 소프트웨어 전공 학생과 팀이 됐다. 팀장은 보드와 센서, 임베디드 구현을 맡았다. 다른 팀원은 소프트웨어와 서버를 맡았다. 나는 제품의 방향과 발표의 흐름을 정리했다.

서로를 알아갈 시간은 없었지만, 막힐 때 누구를 볼지는 금방 알게 됐다. 화면의 값을 확인할 때는 소프트웨어 담당을 찾았고, 장치가 움직이지 않으면 팀장이 보드를 들여다봤다. 시간이 줄어들수록 나는 무엇을 더 붙일지보다 어떤 장면을 끝까지 남길지를 생각했다.

친해지기 전에 역할부터 생겼고, 그 역할 사이를 오가는 짧은 말들이 하루짜리 팀을 굴렸다.

왜 하필 카나리아였나

처음에는 책상 위에 놓는 작은 AI 동반 로봇을 떠올렸다. 하지만 왜 굳이 몸이 필요한가를 따지기 시작하면서 질문이 바뀌었다.

AI 에이전트가 위험한 행동을 하려 할 때, 사람은 그 상태를 어디서 알아차리고 어떻게 개입할 수 있을까.

우리는 탄광의 카나리아 비유를 떠올렸다. 사람이 알아차리기 어려운 위험을 작은 존재가 먼저 드러내는 모습이었다. NU-40 DK를 쓴다는 점에서 NU를 따와 이름을 카NU리아로 정했다.

초기 설계는 제법 컸다. 상태를 CALM, ALERT, ALARM으로 나누고 각 단계마다 OLED 표정과 서보모터 움직임을 바꾸려 했다. 사람이 개입하는 방법도 네 가지를 구상했다.

머리를 건드린다          → 왜 위험한지 설명을 요청한다
길게 누른다              → 이번 요청 하나만 승인한다
얼굴 앞에서 손을 흔든다  → 대기 중인 행동을 거부한다
뒤집는다                 → 에이전트를 읽기 전용 상태로 제한한다

손짓은 카NU리아의 전면 근접 센서가 감지하도록 했다. 승인된 요청만 격리된 환경에서 실행하는 흐름까지 그렸다.

가장 이상적인 장면은 이랬다.

AI 에이전트가 오래된 파일 여러 개를 지우려 한다. 카NU리아가 위험 신호를 표정과 움직임으로 알린다. 사람이 얼굴 앞에서 손을 흔들어 중단 신호를 보낸다. 근접 센서가 그 손짓을 감지하면 실행이 취소된다. 화면에는 취소됨이라는 문구보다 더 중요한 결과가 남는다. 실제 파일은 하나도 바뀌지 않는다.

우리가 만들고 싶었던 것은 그 한 장면이었다.

코드는 맞는데 왜 안 움직이지?

하드웨어를 다뤄보니 설계와 구현 사이의 거리가 더 노골적으로 드러났다.

내가 익숙했던 소프트웨어 작업에서는 대개 에러 메시지와 로그를 따라 원인을 좁혔다. 여기서는 코드가 맞아 보여도 전혀 움직이지 않을 수 있었다. 전원인지, 배선인지, 센서인지, 통신인지부터 하나씩 확인해야 했다.

특히 배선은 연결했다와 제대로 연결됐다가 다른 문제였다. 점퍼선 하나가 다른 핀에 꽂혀 있으면 신호가 닿지 않았다. 보드의 핀 라벨을 다시 읽고, 케이블이 어디로 가는지 따라가고, 모듈의 전원과 통신 단자를 확인해야 했다.

코드를 의심하다가 배선을 고치고 나면 방금까지 의심하던 코드가 멀쩡한 경우도 있었다. 화면 안의 논리만 맞추면 끝나는 일이 아니었다. 신호가 지나갈 물리적 경로까지 손으로 연결해야 했다.

이런 작은 연결들이 시간을 빠르게 잡아먹었다. 하나가 움직이면 곧바로 다음 기능으로 넘어갈 수 있을 것 같았지만, 새 부품을 붙이고 통신을 연결할 때마다 또 다른 문제가 기다리고 있었다.

남긴 것은 한 장면의 절반이었다

시간이 줄어들수록 처음 계획한 기능을 하나씩 덜어냈다.

상태마다 다르게 만들려던 표정과 움직임은 몇 가지 반응으로 줄었다. 머리를 건드리고, 길게 누르고, 얼굴 앞에서 손을 흔들고, 뒤집는 조작도 계획대로 구현하지 못했다. 사람의 입력으로 에이전트의 행동을 멈추고, 승인된 요청만 격리된 환경에서 실행하는 흐름도 끝까지 이어지지 않았다.

우리가 처음 그리려던 장면은 네 마디였다.

시스템 안에 상태가 생긴다

그 상태가 몸으로 드러난다

사람이 알아차려 개입한다

그 개입이 시스템의 행동을 바꾼다

하루 안에 이어 붙인 것은 앞의 두 마디였다. 디지털 상태가 장치의 표정과 움직임으로 바뀌는 데까지였다.

뒤의 두 마디는 끝내 구현하지 못했다. 사람이 보낸 입력이 실제 실행을 취소하거나 제한하는 데까지 닿지 않았다.

카NU리아가 위험을 알리게는 만들었다. 그러나 그 신호를 본 사람이 실제 작업을 멈추게 하지는 못했다.

앞의 절반은 너무 잘 보였다

그런데 앞의 절반은 눈에 잘 보였다.

OLED의 표정이 바뀌고 서보모터가 움직이면, 시스템 안의 상태가 화면 밖으로 나왔다는 사실을 바로 확인할 수 있었다. 기능을 거듭 덜어낸 시제품이었지만 물체가 반응하는 순간만큼은 아이디어 전체가 살아난 것처럼 느껴졌다.

같은 표정이 화면 안의 애니메이션이었어도 같은 감정이 들었을지는 모르겠다. 창 안의 그림은 창을 닫으면 사라진다. 책상 위의 물체는 내가 다른 것을 보고 있어도 그 자리에 남아 있었다.

그날 내가 먼저 느낀 것은 위험이나 통제보다도 귀여움이었다.

그 감정은 사소하지 않았다. 다만 완성의 증거도 아니었다. 앞의 절반만 움직였는데도 나는 쉽게 됐다고 느꼈다. 움직이는 몸은 눈에 잘 띄었다. 그 몸짓이 실제 결과까지 바꾸는지는 보이지 않았다.

상은 못 받았다

우리는 최종 발표까지 갔지만 입상하지 못했다.

원래 설계의 많은 부분을 덜어냈고, 사람의 몸짓이 실제 소프트웨어의 행동을 바꾸는 연결도 완성하지 못했다. 아이디어의 앞부분이 움직이는 것을 확인한 것과 제품을 잘 만든 것은 다른 일이었다.

그래도 전날까지 서로 모르던 세 사람이 무엇을 남길지 함께 정했고, 줄여 만든 결과물을 실제로 움직이게 했다. 행사가 끝난 뒤에는 다음 해커톤에도 함께 나가보자는 이야기를 나눴다.

먼저 손이 간 곳

행사장을 나서면서 한 가지가 계속 마음에 걸렸다.

기능을 덜어낼 때마다 이유는 타당했다. 눈에 보이는 연결을 먼저 살리고, 작동하지 않는 것은 뒤로 미루고, 발표에서 보여줄 장면을 지켰다. 어느 판단 하나가 틀렸다고 말하기는 어려웠다.

그런데 다 덜어내고 보니, 사람이 손을 흔들어 에이전트의 행동을 멈추는 마지막 장면이 빠져 있었다.

코드는 화면 밖으로 나왔다. 사람의 손짓은 끝내 시스템 안까지 닿지 못했다.

카NU리아는 지금도 놀랄 수 있다. 전원을 꽂으면 눈이 커지고 몸이 젖혀진다. 하지만 그 얼굴 앞에서 손을 흔들어도 아무 일도 일어나지 않는다.

그날은 시간이 모자랐다고만 생각했다. 다음 날 다른 팀들의 결과물을 다시 보기 전까지는.