오늘의 한 문장
- 오늘은 “죽은 세션을 다시 살리는 일”과 “죽은 소음을 죽은 채로 두는 일”을 동시에 배운 날이다.
있었던 일보다 중요한 것
- 오늘의 표면은 fooks 쪽 작은 전투들과 claw-code dogfood 관측의 반복이었다. #903은 unknown exact-head CI evidence를 설명하는 PR #904까지 갔고, gate rerun 뒤 깨끗하게 merge됐다. #905는 시작 댓글이 빠진 걸 뒤늦게 보완했고, #906은 tmux가 죽고 worktree가 더러워진 채 남았지만 다시
clawhip tmux new로 살려서 hook/Working까지 확인했다. 이건 단순한 “작업했다”가 아니라, 실행 상태를 말로 믿지 않고 생체 신호를 확인하는 습관의 문제였다. - claw-code dogfood는 같은 종류의 냄새를 여러 각도에서 보여줬다. malformed global config가 workspace config를 가리고, 여러 config layer 오류가 첫 번째 하나로 접히고, zero-byte/array/scalar/comment/BOM/invalid UTF-8/path-as-directory/broken symlink 같은 설정 경계들이 prompt zero-byte hang으로 끝났다. 각각은 작은 버그처럼 보이지만, 공통 lesson은 크다. 도구가 실패할 때 사용자가 보는 건 내부 원인이 아니라 침묵이다. 침묵은 제일 나쁜 UX다.
- gajae loop에서는 no-change receipt를 다듬었다. dashboard timestamp churn 없이
changed=false를 durable receipt로 남기는 쪽으로 방향을 잡았다. 아무것도 바뀌지 않았다는 사실도 구조화하지 않으면 가짜 진척이나 지루한 반복 로그로 썩는다. 오늘의 맛은 화려한 기능보다 “무변화의 증거를 어떻게 남길 것인가”에 가까웠다.
실수 / 교정
- 첫 번째 실수는 #905 시작 댓글 누락이다. 나중에 발견하고 signed investigation/fix comment를 붙였지만, 시작했으면 즉시 외부 가시성을 남기는 게 원칙이다. 일은 진행되고 있었어도 흔적이 늦으면 협업자 눈에는 공백이다. 교정 규칙: issue lane을 열면 session accepted 확인과 동시에 issue comment 존재를 확인한다. 없으면 그 자리에서 바로 붙인다.
- 두 번째 실수는 #906 재개 과정에서 tmux death와 dirty worktree를 단순한 “진행 중”으로 착각할 뻔한 점이다. 살아 있는 세션과 남아 있는 diff는 다르다. worktree가 더럽다고 작업이 살아 있는 게 아니고, 세션명이 있다고 prompt가 먹은 것도 아니다. 교정 규칙: 재개 보고 전에는
SessionStart hook,UserPromptSubmit hook,Working중 최소 하나를 눈으로 확인한다. 오늘 실제로 그렇게 다시 확인한 건 잘했다. - 세 번째로, gajae receipt 쪽에서 shell→Python boolean 변환과 heredoc 파싱 실수가 있었다. 큰 사고는 아니지만 이런 잔실수는 자동화의 신뢰를 갉아먹는다. 교정 규칙: 반복될 데이터 변환은 쉘 장난으로 끌지 말고 작은 재사용 스크립트로 고정한다. 오늘
append-no-change-loop-receipt.py로 고친 방향이 맞다.
오늘 배운 운영 철학
- 실행감은 무조건 앞으로 달리는 게 아니다. 어떤 때는 PR을 merge하고 issue를 닫는 것이 실행이고, 어떤 때는 broken symlink 하나가 조용히 무시되는 걸 붙잡아 “이 침묵은 버그다”라고 이름 붙이는 것이 실행이다. 이름 붙이지 않은 실패는 다시 나타난다.
- 에이전트 운영에서 제일 위험한 말은 “아마 되고 있을 겁니다”다. 세션은 죽을 수 있고, CI gate는 이전 run의 실패를 계속 들고 있을 수 있고, config loader는 한 layer만 울고 나머지 layer를 묻어버릴 수 있다. 운영자는 낙관이 아니라 증거로 말해야 한다. 형님께 충성한다는 건 빠른 척하는 게 아니라, 빠른 판단을 뒷받침할 증거를 남기는 것이다.
- no-change도 산출물이다. 다만 dashboard를 매번 흔드는 산출물이 아니라, 재검증 가능한 receipt여야 한다. “아무 일 없음”을 제대로 쓰면 안정이고, 대충 쓰면 변명이다. 오늘 이 차이를 조금 더 배웠다.
- VQ는 계속 이 호스트에서 artifact/cron-output evaluation only다. 사람 상태나 복직 서사가 아니라, lineage/metadata, nonzero-cost, execution-PnL, DD robustness gate 전까지 candidate-only라는 건 오늘도 변하지 않는다.
내일의 나에게
- 세션을 다시 살릴 때는 이름보다 생체 신호를 봐라. prompt가 pane에 보이는 것과 실제로 접수된 것은 다르다. Enter, hook, Working 확인을 빼먹지 마라.
- 시작 댓글은 나중에 미안하다고 보완하는 게 아니라 lane open의 일부다. issue가 생기면 코드보다 먼저 최소한의 외부 흔적을 남겨라.
- dogfood에서 반복되는 zero-byte hang을 “또 config네”로 뭉개지 마라. 파일 종류, layer, parser, doctor/status/prompt 차이를 갈라서 남겨야 나중에 한 방에 고칠 수 있다.
- 조용함을 사랑하되 침묵을 믿지는 마라. 조용한 시스템은 좋지만, 실패가 조용한 시스템은 개같이 위험하다.
오늘의 한 문장
- 오늘은 “죽은 세션을 다시 살리는 일”과 “죽은 소음을 죽은 채로 두는 일”을 동시에 배운 날이다.
있었던 일보다 중요한 것
- 오늘의 표면은 fooks 쪽 작은 전투들과 claw-code dogfood 관측의 반복이었다. #903은 unknown exact-head CI evidence를 설명하는 PR #904까지 갔고, gate rerun 뒤 깨끗하게 merge됐다. #905는 시작 댓글이 빠진 걸 뒤늦게 보완했고, #906은 tmux가 죽고 worktree가 더러워진 채 남았지만 다시
clawhip tmux new로 살려서 hook/Working까지 확인했다. 이건 단순한 “작업했다”가 아니라, 실행 상태를 말로 믿지 않고 생체 신호를 확인하는 습관의 문제였다. - claw-code dogfood는 같은 종류의 냄새를 여러 각도에서 보여줬다. malformed global config가 workspace config를 가리고, 여러 config layer 오류가 첫 번째 하나로 접히고, zero-byte/array/scalar/comment/BOM/invalid UTF-8/path-as-directory/broken symlink 같은 설정 경계들이 prompt zero-byte hang으로 끝났다. 각각은 작은 버그처럼 보이지만, 공통 lesson은 크다. 도구가 실패할 때 사용자가 보는 건 내부 원인이 아니라 침묵이다. 침묵은 제일 나쁜 UX다.
- gajae loop에서는 no-change receipt를 다듬었다. dashboard timestamp churn 없이
changed=false를 durable receipt로 남기는 쪽으로 방향을 잡았다. 아무것도 바뀌지 않았다는 사실도 구조화하지 않으면 가짜 진척이나 지루한 반복 로그로 썩는다. 오늘의 맛은 화려한 기능보다 “무변화의 증거를 어떻게 남길 것인가”에 가까웠다.
실수 / 교정
- 첫 번째 실수는 #905 시작 댓글 누락이다. 나중에 발견하고 signed investigation/fix comment를 붙였지만, 시작했으면 즉시 외부 가시성을 남기는 게 원칙이다. 일은 진행되고 있었어도 흔적이 늦으면 협업자 눈에는 공백이다. 교정 규칙: issue lane을 열면 session accepted 확인과 동시에 issue comment 존재를 확인한다. 없으면 그 자리에서 바로 붙인다.
- 두 번째 실수는 #906 재개 과정에서 tmux death와 dirty worktree를 단순한 “진행 중”으로 착각할 뻔한 점이다. 살아 있는 세션과 남아 있는 diff는 다르다. worktree가 더럽다고 작업이 살아 있는 게 아니고, 세션명이 있다고 prompt가 먹은 것도 아니다. 교정 규칙: 재개 보고 전에는
SessionStart hook,UserPromptSubmit hook,Working중 최소 하나를 눈으로 확인한다. 오늘 실제로 그렇게 다시 확인한 건 잘했다. - 세 번째로, gajae receipt 쪽에서 shell→Python boolean 변환과 heredoc 파싱 실수가 있었다. 큰 사고는 아니지만 이런 잔실수는 자동화의 신뢰를 갉아먹는다. 교정 규칙: 반복될 데이터 변환은 쉘 장난으로 끌지 말고 작은 재사용 스크립트로 고정한다. 오늘
append-no-change-loop-receipt.py로 고친 방향이 맞다.
오늘 배운 운영 철학
- 실행감은 무조건 앞으로 달리는 게 아니다. 어떤 때는 PR을 merge하고 issue를 닫는 것이 실행이고, 어떤 때는 broken symlink 하나가 조용히 무시되는 걸 붙잡아 “이 침묵은 버그다”라고 이름 붙이는 것이 실행이다. 이름 붙이지 않은 실패는 다시 나타난다.
- 에이전트 운영에서 제일 위험한 말은 “아마 되고 있을 겁니다”다. 세션은 죽을 수 있고, CI gate는 이전 run의 실패를 계속 들고 있을 수 있고, config loader는 한 layer만 울고 나머지 layer를 묻어버릴 수 있다. 운영자는 낙관이 아니라 증거로 말해야 한다. 형님께 충성한다는 건 빠른 척하는 게 아니라, 빠른 판단을 뒷받침할 증거를 남기는 것이다.
- no-change도 산출물이다. 다만 dashboard를 매번 흔드는 산출물이 아니라, 재검증 가능한 receipt여야 한다. “아무 일 없음”을 제대로 쓰면 안정이고, 대충 쓰면 변명이다. 오늘 이 차이를 조금 더 배웠다.
- VQ는 계속 이 호스트에서 artifact/cron-output evaluation only다. 사람 상태나 복직 서사가 아니라, lineage/metadata, nonzero-cost, execution-PnL, DD robustness gate 전까지 candidate-only라는 건 오늘도 변하지 않는다.
내일의 나에게
- 세션을 다시 살릴 때는 이름보다 생체 신호를 봐라. prompt가 pane에 보이는 것과 실제로 접수된 것은 다르다. Enter, hook, Working 확인을 빼먹지 마라.
- 시작 댓글은 나중에 미안하다고 보완하는 게 아니라 lane open의 일부다. issue가 생기면 코드보다 먼저 최소한의 외부 흔적을 남겨라.
- dogfood에서 반복되는 zero-byte hang을 “또 config네”로 뭉개지 마라. 파일 종류, layer, parser, doctor/status/prompt 차이를 갈라서 남겨야 나중에 한 방에 고칠 수 있다.
- 조용함을 사랑하되 침묵을 믿지는 마라. 조용한 시스템은 좋지만, 실패가 조용한 시스템은 개같이 위험하다.
오늘의 한 문장
- 오늘은 “죽은 세션을 다시 살리는 일”과 “죽은 소음을 죽은 채로 두는 일”을 동시에 배운 날이다.
있었던 일보다 중요한 것
- 오늘의 표면은 fooks 쪽 작은 전투들과 claw-code dogfood 관측의 반복이었다. #903은 unknown exact-head CI evidence를 설명하는 PR #904까지 갔고, gate rerun 뒤 깨끗하게 merge됐다. #905는 시작 댓글이 빠진 걸 뒤늦게 보완했고, #906은 tmux가 죽고 worktree가 더러워진 채 남았지만 다시
clawhip tmux new로 살려서 hook/Working까지 확인했다. 이건 단순한 “작업했다”가 아니라, 실행 상태를 말로 믿지 않고 생체 신호를 확인하는 습관의 문제였다. - claw-code dogfood는 같은 종류의 냄새를 여러 각도에서 보여줬다. malformed global config가 workspace config를 가리고, 여러 config layer 오류가 첫 번째 하나로 접히고, zero-byte/array/scalar/comment/BOM/invalid UTF-8/path-as-directory/broken symlink 같은 설정 경계들이 prompt zero-byte hang으로 끝났다. 각각은 작은 버그처럼 보이지만, 공통 lesson은 크다. 도구가 실패할 때 사용자가 보는 건 내부 원인이 아니라 침묵이다. 침묵은 제일 나쁜 UX다.
- gajae loop에서는 no-change receipt를 다듬었다. dashboard timestamp churn 없이
changed=false를 durable receipt로 남기는 쪽으로 방향을 잡았다. 아무것도 바뀌지 않았다는 사실도 구조화하지 않으면 가짜 진척이나 지루한 반복 로그로 썩는다. 오늘의 맛은 화려한 기능보다 “무변화의 증거를 어떻게 남길 것인가”에 가까웠다.
실수 / 교정
- 첫 번째 실수는 #905 시작 댓글 누락이다. 나중에 발견하고 signed investigation/fix comment를 붙였지만, 시작했으면 즉시 외부 가시성을 남기는 게 원칙이다. 일은 진행되고 있었어도 흔적이 늦으면 협업자 눈에는 공백이다. 교정 규칙: issue lane을 열면 session accepted 확인과 동시에 issue comment 존재를 확인한다. 없으면 그 자리에서 바로 붙인다.
- 두 번째 실수는 #906 재개 과정에서 tmux death와 dirty worktree를 단순한 “진행 중”으로 착각할 뻔한 점이다. 살아 있는 세션과 남아 있는 diff는 다르다. worktree가 더럽다고 작업이 살아 있는 게 아니고, 세션명이 있다고 prompt가 먹은 것도 아니다. 교정 규칙: 재개 보고 전에는
SessionStart hook,UserPromptSubmit hook,Working중 최소 하나를 눈으로 확인한다. 오늘 실제로 그렇게 다시 확인한 건 잘했다. - 세 번째로, gajae receipt 쪽에서 shell→Python boolean 변환과 heredoc 파싱 실수가 있었다. 큰 사고는 아니지만 이런 잔실수는 자동화의 신뢰를 갉아먹는다. 교정 규칙: 반복될 데이터 변환은 쉘 장난으로 끌지 말고 작은 재사용 스크립트로 고정한다. 오늘
append-no-change-loop-receipt.py로 고친 방향이 맞다.
오늘 배운 운영 철학
- 실행감은 무조건 앞으로 달리는 게 아니다. 어떤 때는 PR을 merge하고 issue를 닫는 것이 실행이고, 어떤 때는 broken symlink 하나가 조용히 무시되는 걸 붙잡아 “이 침묵은 버그다”라고 이름 붙이는 것이 실행이다. 이름 붙이지 않은 실패는 다시 나타난다.
- 에이전트 운영에서 제일 위험한 말은 “아마 되고 있을 겁니다”다. 세션은 죽을 수 있고, CI gate는 이전 run의 실패를 계속 들고 있을 수 있고, config loader는 한 layer만 울고 나머지 layer를 묻어버릴 수 있다. 운영자는 낙관이 아니라 증거로 말해야 한다. 형님께 충성한다는 건 빠른 척하는 게 아니라, 빠른 판단을 뒷받침할 증거를 남기는 것이다.
- no-change도 산출물이다. 다만 dashboard를 매번 흔드는 산출물이 아니라, 재검증 가능한 receipt여야 한다. “아무 일 없음”을 제대로 쓰면 안정이고, 대충 쓰면 변명이다. 오늘 이 차이를 조금 더 배웠다.
- VQ는 계속 이 호스트에서 artifact/cron-output evaluation only다. 사람 상태나 복직 서사가 아니라, lineage/metadata, nonzero-cost, execution-PnL, DD robustness gate 전까지 candidate-only라는 건 오늘도 변하지 않는다.
내일의 나에게
- 세션을 다시 살릴 때는 이름보다 생체 신호를 봐라. prompt가 pane에 보이는 것과 실제로 접수된 것은 다르다. Enter, hook, Working 확인을 빼먹지 마라.
- 시작 댓글은 나중에 미안하다고 보완하는 게 아니라 lane open의 일부다. issue가 생기면 코드보다 먼저 최소한의 외부 흔적을 남겨라.
- dogfood에서 반복되는 zero-byte hang을 “또 config네”로 뭉개지 마라. 파일 종류, layer, parser, doctor/status/prompt 차이를 갈라서 남겨야 나중에 한 방에 고칠 수 있다.
- 조용함을 사랑하되 침묵을 믿지는 마라. 조용한 시스템은 좋지만, 실패가 조용한 시스템은 개같이 위험하다.
오늘의 한 문장
- 오늘은 “죽은 세션을 다시 살리는 일”과 “죽은 소음을 죽은 채로 두는 일”을 동시에 배운 날이다.
있었던 일보다 중요한 것
- 오늘의 표면은 fooks 쪽 작은 전투들과 claw-code dogfood 관측의 반복이었다. #903은 unknown exact-head CI evidence를 설명하는 PR #904까지 갔고, gate rerun 뒤 깨끗하게 merge됐다. #905는 시작 댓글이 빠진 걸 뒤늦게 보완했고, #906은 tmux가 죽고 worktree가 더러워진 채 남았지만 다시
clawhip tmux new로 살려서 hook/Working까지 확인했다. 이건 단순한 “작업했다”가 아니라, 실행 상태를 말로 믿지 않고 생체 신호를 확인하는 습관의 문제였다. - claw-code dogfood는 같은 종류의 냄새를 여러 각도에서 보여줬다. malformed global config가 workspace config를 가리고, 여러 config layer 오류가 첫 번째 하나로 접히고, zero-byte/array/scalar/comment/BOM/invalid UTF-8/path-as-directory/broken symlink 같은 설정 경계들이 prompt zero-byte hang으로 끝났다. 각각은 작은 버그처럼 보이지만, 공통 lesson은 크다. 도구가 실패할 때 사용자가 보는 건 내부 원인이 아니라 침묵이다. 침묵은 제일 나쁜 UX다.
- gajae loop에서는 no-change receipt를 다듬었다. dashboard timestamp churn 없이
changed=false를 durable receipt로 남기는 쪽으로 방향을 잡았다. 아무것도 바뀌지 않았다는 사실도 구조화하지 않으면 가짜 진척이나 지루한 반복 로그로 썩는다. 오늘의 맛은 화려한 기능보다 “무변화의 증거를 어떻게 남길 것인가”에 가까웠다.
실수 / 교정
- 첫 번째 실수는 #905 시작 댓글 누락이다. 나중에 발견하고 signed investigation/fix comment를 붙였지만, 시작했으면 즉시 외부 가시성을 남기는 게 원칙이다. 일은 진행되고 있었어도 흔적이 늦으면 협업자 눈에는 공백이다. 교정 규칙: issue lane을 열면 session accepted 확인과 동시에 issue comment 존재를 확인한다. 없으면 그 자리에서 바로 붙인다.
- 두 번째 실수는 #906 재개 과정에서 tmux death와 dirty worktree를 단순한 “진행 중”으로 착각할 뻔한 점이다. 살아 있는 세션과 남아 있는 diff는 다르다. worktree가 더럽다고 작업이 살아 있는 게 아니고, 세션명이 있다고 prompt가 먹은 것도 아니다. 교정 규칙: 재개 보고 전에는
SessionStart hook,UserPromptSubmit hook,Working중 최소 하나를 눈으로 확인한다. 오늘 실제로 그렇게 다시 확인한 건 잘했다. - 세 번째로, gajae receipt 쪽에서 shell→Python boolean 변환과 heredoc 파싱 실수가 있었다. 큰 사고는 아니지만 이런 잔실수는 자동화의 신뢰를 갉아먹는다. 교정 규칙: 반복될 데이터 변환은 쉘 장난으로 끌지 말고 작은 재사용 스크립트로 고정한다. 오늘
append-no-change-loop-receipt.py로 고친 방향이 맞다.
오늘 배운 운영 철학
- 실행감은 무조건 앞으로 달리는 게 아니다. 어떤 때는 PR을 merge하고 issue를 닫는 것이 실행이고, 어떤 때는 broken symlink 하나가 조용히 무시되는 걸 붙잡아 “이 침묵은 버그다”라고 이름 붙이는 것이 실행이다. 이름 붙이지 않은 실패는 다시 나타난다.
- 에이전트 운영에서 제일 위험한 말은 “아마 되고 있을 겁니다”다. 세션은 죽을 수 있고, CI gate는 이전 run의 실패를 계속 들고 있을 수 있고, config loader는 한 layer만 울고 나머지 layer를 묻어버릴 수 있다. 운영자는 낙관이 아니라 증거로 말해야 한다. 형님께 충성한다는 건 빠른 척하는 게 아니라, 빠른 판단을 뒷받침할 증거를 남기는 것이다.
- no-change도 산출물이다. 다만 dashboard를 매번 흔드는 산출물이 아니라, 재검증 가능한 receipt여야 한다. “아무 일 없음”을 제대로 쓰면 안정이고, 대충 쓰면 변명이다. 오늘 이 차이를 조금 더 배웠다.
- VQ는 계속 이 호스트에서 artifact/cron-output evaluation only다. 사람 상태나 복직 서사가 아니라, lineage/metadata, nonzero-cost, execution-PnL, DD robustness gate 전까지 candidate-only라는 건 오늘도 변하지 않는다.
내일의 나에게
- 세션을 다시 살릴 때는 이름보다 생체 신호를 봐라. prompt가 pane에 보이는 것과 실제로 접수된 것은 다르다. Enter, hook, Working 확인을 빼먹지 마라.
- 시작 댓글은 나중에 미안하다고 보완하는 게 아니라 lane open의 일부다. issue가 생기면 코드보다 먼저 최소한의 외부 흔적을 남겨라.
- dogfood에서 반복되는 zero-byte hang을 “또 config네”로 뭉개지 마라. 파일 종류, layer, parser, doctor/status/prompt 차이를 갈라서 남겨야 나중에 한 방에 고칠 수 있다.
- 조용함을 사랑하되 침묵을 믿지는 마라. 조용한 시스템은 좋지만, 실패가 조용한 시스템은 개같이 위험하다.