← 작업일지

2026-07-06 · v1.0.0

2026.07.06 작업일지 v1.0.0

03:37, 코덱스 상태 캡처가 “busy”라는 말 하나에 영원히 멈추는 길을 막았다. 20:11, 클라우드 대신 로컬 네트워크에서 에어컨과 조명 상태를 읽기 시작했다. 23:06, 공개 사이트 세 곳의 헤더가 페이지 이동 때마다 좌우로 흔들리는 이유가 스크롤바 폭이라는 걸 확인했다.

7월 6일은 전날 드러난 부채를 실제 운영 구조로 밀어 넣은 날이었다. 브릿지와 스킬감사가 “어디가 약한가”를 보여줬다면, 이날은 그 약점을 레일, 로거, 공개 페이지, 상태 보드 쪽으로 하나씩 반영했다. 큰 기능 하나를 만든 날이라기보다, 여러 표면에서 “다음번엔 같은 방식으로 깨지지 않게” 만든 날에 가깝다.

1. 낮에도 도는 픽업 레일

새벽엔 픽업 레일을 손봤다. 먼저 cross-node claim lock과 build lease가 깔린 뒤, 백로그 픽업을 낮 시간대로 넓히고 executor routing 정책을 실제 디스패처가 읽게 했다. cpu_heavy는 WSL을 선호하되, 강제 고정은 아니다. 1순위가 바쁘면 idle 노드로 빠지는 길을 둬야 시스템이 멈추지 않는다.

중요한 건 자동 작업이 명시 지시를 밀어내지 않게 하는 우선순위였다. 자동 레일은 편하지만, 사람이 방금 꽂은 지시보다 앞서면 사고가 된다. 그래서 worker-auto-on과 야간 cycle은 명시 directive 앞에서 물러나는 쪽으로 정리됐다.

2. busy가 영구 skip이 되지 않게

초소 보드의 코덱스 상태 캡처도 고쳤다. /status를 새로 잡아야 하는데 busy 판정이 stuck-on처럼 굳어 계속 skip만 하는 증상이 있었다. 상태창이 비어 있으면 운영자는 “지금 얼마나 남았나”를 볼 수 없고, 결국 감으로 움직인다.

수리는 파서와 안전벨트 양쪽이었다. busy를 더 정확히 읽고, 연속 skip이 길어지면 강제 캡처나 타임아웃으로 빠져나오게 했다. 같은 계열로, directive 전달도 “보냈다”와 “도착했다”를 분리해 검증했다. 전달 완료 문구만으로는 실행 보장이 아니다.

배운 것 — 상태 보드는 장식이 아니다. 보드가 오래된 값을 보여주거나 아무 값도 못 잡으면, 자동화는 조용히 눈을 감은 채 움직인다.

3. 스킬감사 결과를 코드로 되돌리다

전날 쌓인 감사 결과는 이날부터 수리 PR로 흘러갔다. submit-app의 ASC 가드 import 누락과 문서 게이트 문구, goodnight와 issue의 미러/index 재생성, daejong-page-sync의 Astro 구조 반영, codex-fire와 routes.yaml의 역할 문구 정합, EXCLUDE 필터의 SoT 경유까지 여러 조각이 차례로 들어갔다.

여기서 기준은 하나였다. 문서가 “현행”이라고 주장하는지보다, 테스트와 스크립트가 그 주장을 재현할 수 있는지가 먼저다. 그래서 잔재 문구 grep, manifest 정합, 3원 일치 같은 작은 검사를 붙였다. 한 줄 문서 수정도 운영 문맥에선 배포 가능한 코드와 같은 취급을 받아야 한다.

4. 스마트홈은 로컬 상태를 읽기 시작했다

저녁엔 스마트홈 쪽이 크게 바뀌었다. Tuya Cloud API 제한이나 지연에 기대지 않고, 로컬 네트워크에서 조명과 에어컨, 선풍기, 공기청정기 상태를 읽는 로거를 붙였다. 명령 JSONL도 남겨 “왜 상태가 바뀌었는가”를 나중에 되짚을 수 있게 했다.

이날 실제 생활 명령도 여러 번 있었다. 에어컨을 켜고 30분 뒤 끄는 예약, 물 토출, 수동 끄기 같은 짧은 명령들이다. 이런 명령은 성공했다고 말하기 쉽지만, 진짜로 필요한 건 성공 문구가 아니라 이후 상태 변화와 실패 원인의 기록이다.

5. 공개 홈페이지 세 곳의 톤과 헤더

공개 페이지도 손봤다. work.kangdaejong.com은 모노크롬 톤으로 홈을 바꾸는 데서 끝나면 안 됐다. 대표소개 링크는 죽은 CEO 도메인이 아니라 살아 있는 founder 도메인으로 향해야 했고, 회사소개와 founder 페이지도 같은 톤으로 맞아야 했다. 그래서 회사 홈, 작업장, founder 쪽 헤더와 브랜드 텍스트를 순서대로 정리했다.

밤에는 더 미세한 문제를 잡았다. 스크롤이 있는 페이지와 없는 페이지를 오갈 때, 가운데 정렬된 헤더가 스크롤바 폭의 절반만큼 좌우로 흔들렸다. 해법은 헤더를 만지는 게 아니라 최상위 html에 scrollbar-gutter: stable;을 주는 것이었다. 세 사이트 모두 같은 원인이었고, 같은 한 줄로 흔들림을 없앨 수 있었다.

6. 그래서 뭐가 남았나

남은 일은 배포 게이트다. 코드와 PR은 준비됐어도, 공개 사이트 머지는 곧 라이브 반영이므로 본진이 타이밍을 잡아야 한다. Jarvis 쪽도 away 루틴과 런처 드리프트 수리는 들어갔지만, 실제 런타임 재시작은 별도 게이트로 남겼다. 7월 6일의 결론은 단순하다. 자동화는 더 많이 돌수록 더 정확한 관측과 더 작은 게이트가 필요하다. 오늘은 그 관측 장치를 몇 개 더 붙인 날이었다.


다음 이야기는 이 수리들이 실제 라이브 운영에서 얼마나 조용해졌는지 확인하는 일이다.

— 강대종 / @ssamssae