금월도 2고 1차 실행 — 문제 보고서

검색 그라운딩 씨드 production 승격 · 2026-07-28 ~ 07-30 · 막힌 지점 20건의 원인과 조치 (18건 해결 · 1건 미해결 · 1건 오탐) · 최종 결과 최종 샷 237/237 · form_reference 10/10 · seed 25/25

프로젝트475e5694-7c25-4f3f-8dec-910412a1761d
에피소드18f15068-4349-4818-82a9-3b9b173110e0
대본금월도_2ndDraft.pdf · 80p · 1.3MB
실행 범위분석 전 구간 → 검색·선택 → 씨드 (64스텝)
커밋307339c2 (구현) · 228c8ebe (문서)
검색 필수 대상10 그룹 (lane plan 36그룹 중 structure_plate 바인딩)
최종 결과64/64 스텝 완료 · form_reference 10/10 · seed 25/25 (실패 0)
검색 라운드3회 (팩 v1 → v2 → v2+좁힘 재검색)

요약

#지점귀속결과
1text_cleanup 빈 응답시스템분할 재시도 추가 · 통과
2scene_detail 계약 위반시스템샷 단위 재저작 · 통과
3redo checkpoint_sync시스템catalog import · 통과
4is_primary 타입내 버그수정 · 스모크 검증
5그룹 격리 실패내 버그rollback 추가
6created_at 누락내 버그수정 · 스모크 검증
7스테일 락내 판단 착오resume 대기로 전환
8SSRF 가드 오탐 의심가드가 옳았음 · 무수정
9선택 판정 팩 v1 과엄격내 설계 결함팩 v2 발행 · 3그룹 사망 → 실패 이동
10검색어 분산내 설계 결함주 구조물 좁힘 재검색 · 10/10 통과

상세

1. text_cleanup — LLM 빈 응답으로 대본 추출이 죽었다시스템

발생
1차 실행, 2번째 스텝
증상
TypeError: object of type 'NoneType' has no len() (text_cleaner.py:77)
원인
80페이지를 40페이지씩 나눠 추출하는데 한 덩어리에서 message.contentNone 으로 왔다. finish_reason='length' — 출력 상한에 걸린 것으로 보인다.
조치
쉬운 길을 택하지 않았다. len(text or "") 로 막으면 대본 40페이지가 조용히 사라진 채 하류 전체가 오염된다. 대신 ①빈 응답을 EmptyExtraction 예외로 세우고 finish_reason 을 기록 ②페이지 범위를 반으로 쪼개 재시도(최대 5단계) ③1페이지까지 좁혀도 비면 세운다. 40페이지 이하 단일 호출 경로에도 같은 재시도를 붙였다.
근거
재실행에서 cleaned_text 61,705자 정상 추출, 분할 재시도 로그 0건 — 간헐적 사건이었으나 안전망은 남았다.

2. scene_detail — 237샷 중 1샷 계약 위반으로 파이프라인 정지시스템

발생
50/64 지점
증상
[VERIFY-EXIT] step=scene_detail failed → partial:
  ['1 owned contract_violation: [(59, 12)]']
Step scene_detail partial and allow_partial_downstream=False
  — stopping pipeline
원인
인물 소유 소품은 앞서 확정된 서술을 이어써야 한다는 owned-object 계약을 1샷이 어겼다. 게이트가 전부-아니면-전무라 1건에 전체가 멈춘다 — 하류 오염 방지 설계이므로 옳은 동작이다.
조치
내가 여기서 두 번 헛발질했다. 전체 재실행을 두 번 했는데, 재실행은 237샷을 새로 쓰므로 매번 다른 1샷이 걸린다((59,12) → (102,16) 실측). 복권 뽑기라 수렴하지 않는데 회당 40분을 태웠다. 해법은 이미 코드베이스에 있었다 — scene_detail_redo_service.redo_scene_detail_shot 으로 걸린 샷 하나만 재저작. 그 서비스 docstring 에 내가 빠진 함정이 문자 그대로 적혀 있었다.
근거
redo 후 위반 [] / manifest status: completed / promoted=True. 40분 대신 수분.

3. redo 의 checkpoint_sync 가 헤드리스에서 실패시스템

발생
위 2번 조치 중
증상
Foreign key associated with column 'entity_canon.project_id' could not find table 'project_registry'
원인
헤드리스 프로세스에서 SQLAlchemy 매퍼가 configure 되지 않았다.
조치
from app.models import catalog 명시 import. 설계 문서에 이미 적어둔 함정이 실제로 재현됐다.
근거
import 추가 후 step_run_promoted=True.

4. is_primary 에 bool 을 넣었다내 버그

발생
검색 스텝 첫 진입
증상
column "is_primary" is of type integer but expression is of type boolean
원인
ImageAsset.is_primaryColumn(Integer) 인데 Python False 를 넣었다. Postgres 가 거부한다.
조치
is_primary=0.
근거
스모크 테스트로 실제 INSERT·조회까지 확인 후 재개.

5. 한 그룹 실패가 나머지 9개를 죽였다내 버그

발생
위 4번과 동시
증상
첫 그룹 실패 후 나머지 전부 transaction has been rolled back due to a previous exception
원인
flush 실패로 세션이 롤백 상태가 됐는데 다음 그룹이 같은 세션을 계속 썼다. 설계에 '그룹 단위 fail-closed' 라고 써놓고 구현에서 빠뜨렸다.
조치
그룹 예외 처리에 db.rollback() 추가.
근거
검색·다운로드·VLM 선택 체인 자체는 10그룹 전부 정상이었다 — 후보 PNG 105장이 디스크에 남아 있었고 실패는 DB 쓰기뿐이었다.

6. created_at 을 안 넣었다내 버그

발생
4번 수정 후 재개
증상
NotNullViolation: null value in column "created_at"
원인
created_at 은 NOT NULL 이고 서버 기본값이 없다. 기존 _upsert_seed_asset 은 넣고 있었는데 내가 빠뜨렸다.
조치
created_at=datetime.now(timezone.utc) + annotate_generated_asset 계보 주석 배선.
근거
같은 자리에서 세 번 틀리지 않으려고, 재개 전에 실제 후보 파일로 INSERT 스모크 테스트를 먼저 돌려 통과를 확인했다.

7. 스테일 락 — force 가 resume 보다 강할 거라 넘겨짚었다내 버그

발생
62/64 지점, 약 2시간 소모
증상
Step outdoor_structure_form_reference error: 이미 다른 worker 에서 실행 중
  decision=force_explicit, is_stale_steal=False
원인
러너를 kill 하면 step_run.status='running' 이 남는다. 만료 판정은 started_at 기준 3600초이고, 락 회수(STALE_RUNNING_RECOVERY)는 resume 경로에서만 계산된다. mode='force' 는 그 경로를 아예 타지 않아 영원히 못 뺏는다.
조치
resume 모드로 1회 실행. 더 나쁜 것은 실패한 시도가 started_at 을 갱신한다는 점이다 — 2분 간격으로 25회 두드렸더니 경과가 3577s → 425s 로 리셋됐다. 두드릴수록 멀어진다. 올바른 대응은 아무것도 하지 않고 3600초를 넘긴 뒤 resume 1회.
근거
step_runner.py:700~735(만료 판정), 1025~1036(force 는 steal 불가).

8. SSRF 가드가 CDN 을 막은 줄 알았으나, 아니었다정상 동작

발생
검색 단계
증상
search_grounded_ref: 비공인 호스트 거부 d2k5miyk6y5zf0.cloudfront.net
원인
처음엔 내 SSRF 가드가 정상 CDN 을 오탐한 줄 알았다.
조치
확인해보니 그 호스트는 DNS 해석 자체가 안 된다(만료된 CloudFront 배포). 가드가 옳게 막았고 내 의심이 틀렸다. 코드를 고치지 않았다.
근거
getaddrinfonodename nor servname provided. 대조로 commons.wikimedia.org 는 정상 해석·통과.

9. 선택 판정 팩 v1 이 과엄격 — 웹에 있을 수 없는 사진을 요구했다내 설계 결함

발생
검색 스텝 1라운드 (팩 1.202607281800)
증상
10그룹 중 3그룹쓸 만한 후보 없음 (VLM 선택 0) 으로 사망 — bg_forest_ritual_clearing · bg_natural_cave · bg_police_patrol_boat.
“성인 키의 3~4배에 달하는 거대한 자연 바위와 그 바로 앞에 고정된 중앙 제단이 결합된 형태를 보여주는 사진이 없습니다”
“자연 동굴 입구와 그 주위에 고정된 나무 기둥 지지대 구조가 함께 온전히 포함된 레퍼런스는 없습니다”
“순찰정의 전체적인 종단 배치를 종합적으로 파악할 수 있는 이미지가 없습니다”
원인
내가 쓴 pick_system장면 구성의 완전성을 요구했다. 그런데 판정 대상은 이 작품이 지어낸 장소다 — 그 구성 그대로를 찍은 사진은 웹에 존재할 수 없다. 형태 참조의 목적은 그 종류의 시설 하나의 구조·재질·비례를 읽는 것인데, 계약이 그 목적과 어긋나 있었다.
조치
팩을 새 버전 디렉터리 2.202607291130 으로 발행하고 REF_PACK_VERSION_MAP·selector 까지 같은 단위로 배선했다(팩 덮어쓰기 금지 · 미배선 팩 발행 금지). 명문화한 것 — ①서술의 요소가 한 장에 다 나올 필요 없음 ②나머지 요소의 부재·배치 차이는 탈락 사유가 아님 ③완전 일치보다 읽히는 예시 우선 ④chosen_index=0 은 “주 시설 종류가 아예 없을 때”로 한정.
근거
이 수정만으로는 낫지 않았다. 2라운드에서도 3그룹이 죽었고 죽는 그룹이 바뀌었다(goat_pen·main_pier·natural_cave). 실패가 옮겨간 덕분에 두 번째 원인(10번)이 드러났다.

10. 검색어 분산 — 복합 서술이 질의를 하위 요소로 흩었다내 설계 결함

발생
검색 스텝 2라운드 (팩 v2 적용 후에도 3그룹 사망)
증상
회수 결과가 주제 자체를 벗어났다.
bg_natural_cave  → “실내 전시관에 복원된 목조 구조물과 돌무더기 유구” / “지하로 파고든 방형의 목조 우물 또는 수혈 유구”
bg_forest_goat_pen → “방역을 위한 양돈장 철제 출입문” / “현대식 축사(우사)의 측면 구조” / “소들이 수용된 현대식 우사”
원인
structure_desc복합 서술이다(“동굴 입구 + 덧댄 나무 기둥 + 목재 받침”, “염소 우리 + 가축 출입문”). 그 전체를 그대로 질의에 실으면 검색 엔진이 하위 요소의 지배적 주제를 밀어올린다 — 목재 지보는 고고학 유구로, 가축 출입문은 소 외양간으로 샜다. 회수가 빗나가 있으니 판정을 아무리 완화해도 고를 것이 없다.
조치
팩에 narrow_retry_hint.md 를 추가하고, 스텝에 선택이 0 이면 주 구조물 하나로 좁혀 1회 재검색하는 경로를 배선했다. 판정 완화(9번)와 으로만 작동한다 — 좁혀 다시 받아도 판정이 구성 완전성을 요구하면 또 0 이 된다.
근거
3라운드 10/10 통과. 재검색이 실제로 돌았다는 흔적 — bg_natural_cave 검색 8라운드·질의 16건·회수 26장 → 선택 성공, bg_forest_goat_pen 2라운드·질의 6건·회수 6장 → 선택 성공. 좁히지 않은 그룹(bg_multifamily_residence)은 1라운드로 끝났다.

11. 검색 대상이 25개 중 10개뿐 — 주유소·편의점 등 15개가 순수 T2I 로 남았다미해결

발생
2026-07-30 사용자 지적으로 발견 (“모든 배경 씨드에 검색 들어가야 하는데? 왜 정유소는 안되 있어? bg_roadside_gas_station”)
증상
체크포인트 실측 — outdoor_structure_form_reference 10 그룹 vs outdoor_structure_seed 25 그룹. 차이 15개가 검색 참조 없이 생성됐다.
인공 구조물 7 — bg_roadside_gas_station(주유소) · bg_convenience_store(편의점) · bg_police_station(파출소) ·
  bg_forest_slaughterhouse(도축장) · bg_harbor_restaurant_deck(식당데크) ·
  bg_reed_field_wooden_shed(목조창고) · bg_village_speaker_tower(스피커탑)
자연 지형 8 — coastal_cliff · coastal_rock_path · dream_forest_path · forest_entrance ·
  forest_stone_markers · pine_forest_trail · wave_battered_rocks · winter_reed_field
원인
내 설계 결함이다. 검색 대상을 lane plan 의 structure_plate 바인딩 그룹과 exact parity 로 잡았다(설계 §8 B-1). 그래서 mandatory_group_ids 가 그 10개로 고정됐고, structure_plate 에 묶이지 않은 그룹은 조용히 대상 밖으로 빠졌다. 사용자 지시는 “야외 등 모든 요소 배경이 참조”였는데 프록시를 잘못 고른 것이다. 결함의 성격이 9·10번과 다르다 — 그 둘은 검색이 돌았는데 결과가 나빴던 것이고, 이건 검색이 아예 돌지 않았다.
조치
고친 코드는 이미 있으나 아직 적용하지 못했다. 팩 v3(3.202607291430 + scope_system.md), search_grounded_ref.pyload_scope_system/build_scope_schema/validate_scope_output, 스텝의 _judge_scope/_group_fingerprint/_reusable 와 합집합 대상까지 구현돼 있다. 적용을 미룬 이유는 두 가지다 — ①적용 시 config_hash drift → force → clear_checkpoint 로 form_reference manifest 를 날린 사고가 07-29 에 있었다 ②15개 씨드를 다시 만들면 그 씨드를 쓴 배경, 그 배경을 쓴 최종 샷까지 연쇄해 사실상 전면 재실행이라 마감(07-30 14:00)을 지킬 수 없다.
근거
미해결 — 최종 샷 완주 후 수정 예정. 사용자 결정(2026-07-30): 이번 제출은 현 상태로 내고, 완주 후 ①이 결함을 수정하고 ②지금까지의 모든 결함을 전수 재리뷰한 뒤 ③그 결과를 이 문서에 다시 보고한다. 이번 산출물의 15개 배경은 검색 참조 없는 상태임을 육안 판정 시 감안해야 한다.

12. 콘티 실패 3샷을 무콘티로 보내는 데 게이트가 3개였다내 설계 결함

발생
최종 샷 단계 진입 직전 (07-30 01:40~10:25)
증상
shot_conti_lightpartial(91 적용 / 88 성공 / 3 실패). S1sh7·S41sh2·S65sh4 가 레인 마커 맵 시야각 쐐기 작화로 3라운드(17:35·23:16·01:05) 모두 실패했다. 사용자가 “무콘티로 진행”을 택했는데, 그 하나를 위해 서로 다른 층의 게이트 3개를 차례로 만났다.
① _require_cp_data — 매니페스트 status=='completed' 요구
② 샷별 lane 게이트 — lane_conti[tag] 있는데 status!='ok' 면 실패
③ BGFIRST2 — 정책 대상 샷의 콘티 결손은 legacy 하강 금지
원인
세 게이트 모두 개별로는 옳다(조용한 degrade 차단). 문제는 운영자가 명시적으로 결정한 예외를 표현할 방법이 어디에도 없다는 것이다. 그래서 ①②는 체크포인트 매니페스트를 직접 편집해 우회할 수밖에 없었다 — 코드가 아니라 데이터를 고치는 방식이라 재현성이 없다.
조치
③에 대해서만 정식 경로를 신설했다 — 설정 bgfirst_no_conti_exempt_tags(쉼표 구분 샷 태그). 빈 값(기본)이면 기존과 byte-identical 이고, 선언된 태그에만 적용되며 적용 시 WARNING 을 남긴다. ①②는 이번에 manifest_operator_no_conti_backup_20260730_015226.json 으로 원본을 아카이브한 뒤 실패 엔트리를 data.lane_conti_operator_skipped 로 옮기고 operator_override 블록을 기록하는 방식으로 처리했다. failed_count=3 과 DB partial 은 지우지 않았다(정직한 기록).
근거
표적 재저작에서 운영자 선언 무콘티 예외 — BGFIRST 대상 제외, 기존 경로로 생성 로그와 함께 통과, scene_image_pipeline completed 7/7 실패 0. ★재리뷰 정정(07-30) — 예외를 실제로 소비한 샷은 S1sh7·S65sh4 둘뿐이다. S41sh2 는 콘티는 실패했지만 스틸 단계에서 BGFIRST 정책 대상이 아니어서 본 실행에서 그냥 생성됐다. 즉 세 게이트를 다 만나는 샷과 그렇지 않은 샷이 섞여 있었고, 나는 처음에 셋을 같은 문제로 묶어 봤다. 대상 판정은 샷별로 다르다. 남은 과제 — ①의 operator override 를 코드로 정식화하는 일은 아직 안 했다. 지금은 매니페스트 편집이 유일한 길이다.

13. 속도를 사느라 결함 수정 단계를 224샷에서 버렸다트레이드오프

발생
07-30 02:42 (마감 4시간 전 판단)
증상
샷당 3.66분 페이스로는 완주가 16:09 — 마감 14:00 을 2시간 넘긴다. 산출물 타임스탬프를 해부해 시간 구조를 실측했다.
__bgfirst_bg 배경 재투영  2.0~2.1분  (씬 첫 샷에만)
롤 _a/_b/_c            0.2~0.3분  (이미 병렬 — 줄일 여지 없음)
_fix 결함 수정 i2i      평균 1.58분 (매 샷)
_sel 선정              평균 0.80분
LLM 호출 실시간은 벽시계의 24%뿐이었다.
원인
유일하게 큰 레버가 still_recipe_critique_enabled(결함 검사 → 수정본 i2i)였다. 끄면 샷당 약 1.9분이 빠진다.
조치
사용자 승인 후 OFF 로 재기동. 락 만료(02:53:47)를 기다렸다가 resume 1회로 회수 — 완료분 13샷 손실 0. 실측 결과 샷당 2.01분(예측 2.2분), 완주 10:22 로 약 5시간 50분을 회수했다.
근거
대가는 실재한다_fix 산출 13샷 / 237. 즉 224샷은 결함 검사·수정을 거치지 않았다. 게다가 still_recipe_critique_enabled_config_hash_base 페이로드에 들어 있어(image_steps.py:632) critique 를 켠 표적 재저작은 불가능하다 — base hash 가 달라져 표적 drift 로 분류되지 못하고 BLOCK+force 요구가 되는데, force 는 표적과 병용 금지다(교착). 육안 판정 시 이 224샷은 선정 3롤 중 최선이지 수정본이 아니라는 점을 감안해야 한다.

14. 표적 재저작의 비파괴 경로가 설계대로 작동했다정상 동작

발생
07-30 10:23·10:26 (무콘티 3샷 / S61sh1 재시도)
증상
SCENE_IMAGE_TARGET_SCENES 를 바꾸면 config_hash 가 달라져 mismatch 가 난다. 이미 구운 234샷이 무효화될 위험.
원인
표적 목록은 _config_hash 에 접히지만 _config_hash_base 에는 접히지 않는다 — 그 차이가 ‘표적만 바뀐 drift’를 식별하는 기준이다.
조치
설계대로 _evaluate_contract_driftRERUN_SELF(cleanup/invalidate/clear 없음)로 분류.
근거
[RECOVERY] allowlist contract_drift cycle=1: target-scope drift only (base hash 동일) — 비파괴 resume 재실행
이미 구운 샷은 하나도 다시 굽지 않았고, 표적 7샷만 처리됐다.

15. Gemini 콘텐츠 검열 40건 — 재시도로 전부 회복시스템

발생
최종 샷 단계 전 구간
증상
ModerationError: Content moderation blocked: text_refusal:STOP. sanitize 재시도 로그 40건(본 실행 37 · S61sh1 재시도 3).
원인
시대극 폭력 묘사(총격·유혈)가 이미지 모델 정책에 걸린다. 샷 내용 자체의 문제이지 파이프라인 결함이 아니다.
조치
기존 sanitize 재시도 경로가 대부분 흡수했다. S61sh1 하나만 본 실행에서 3회를 소진해 실패했고, 표적 재시도(159초)에서 다시 3회 sanitize 를 거쳐 통과했다.
근거
최종 237/237 전량 생성 · 미생성 0. 검열로 영구 소실된 샷은 없다.

16. 제출용 갤러리에 문제 보고서가 함께 노출되고 있었다내 버그

발생
07-30 10:10 사용자 지적으로 발견
증상
제출용 갤러리 빌더가 이 보고서 파일을 imports7 문제 보고서 탭으로 렌더하고 있었다. 사용자: “문제보고서는 노출되면 큰일나니 합치지 말고”.
원인
같은 내용을 두 번 쓰지 않으려고 재사용한 것인데, 수신자가 다른 문서라는 점을 고려하지 않았다. 내부 회고용 문서와 제출물의 경계를 코드가 지우고 있었다.
조치
STAGES 에서 s7 제거. tab_incident() 함수는 남겨두되 호출하지 않는다.
근거
재빌드 후 고유 문자열 7종(문제 보고서·내 버그·text_cleanup·contract_violation·내 설계 결함·막힌 지점·헛발질) 전부 0건. 서빙 중인 페이지에서도 0건 재확인.

17. 갤러리 “유실 185” 와 image_generated=false — 둘 다 결함이 아니었다오탐

발생
07-30 07:05 / 10:23 내가 결함으로 의심한 두 건
증상
①갤러리 재빌드 로그가 매번 유실 185 를 찍는다 ②이미지 237장을 만들었는데 scene_still.image_generated 가 237건 전부 false / pending.
원인
①의 185건은 전부 overwritten 상태이고 단계는 round1(98) + round2(87) — 즉 이전 라운드 검색 후보가 나중 라운드에 덮어써져 sha 가 달라진 것이다. 현재 산출 단계(검색·씨드·배경·콘티·최종샷)의 유실은 0. ②는 파이프라인이 쓰는 값이 아니라 백엔드 startup 이 backfill 하는 self-healing 플래그다(database.py:140). 헤드리스 러너로만 돌려 갱신 기회가 없었을 뿐이다.
조치
①은 라벨이 오해를 부르므로 표기 개선이 필요하다(기능 문제 아님). ②는 앱이 startup 에 실행하는 것과 동일한 idempotent UPDATE 를 적용했다.
근거
②적용 후 image_generated=t 237건. 교훈 — 이상 신호를 발견하면 결함으로 단정하기 전에 그 값을 누가 쓰는지부터 확인할 것. 나는 두 건 다 “제출물에 구멍”으로 먼저 의심했고, 둘 다 아니었다.

18. 최종 샷 237장을 다 만들고도 갤러리에는 0장으로 보였다내 버그

발생
07-30 10:37 사용자 지적 (“왜 샷이미지는 0 개야?”)
증상
제작 과정 갤러리의 5. 최종 샷 이미지 탭이 미실행 으로 표시. 실제로는 237장이 디스크에도 DB 에도 있었다.
원인
갤러리가 scene_image_pipeline 체크포인트의 data.shots / data.scenes 를 읽고 있었는데 그런 키가 애초에 없다. 실측한 data{scene_total, primary_count} 두 개뿐이다. 게다가 표적 재실행 뒤에는 그 3샷만 반영해 개수의 정본으로도 쓸 수 없다. ‘있을 법한 키’를 확인 없이 가정한 내 잘못이다.
조치
SOT 를 DB(scene_still ⋈ image_asset)로 옮겼다. 관람용 빌더(DB 접근 가능)가 shots_index.json 을 저작하고, 제작 과정 갤러리(표준 python3, DB 미접근)가 그것을 읽는다.
근거
재빌드 후 최종 샷 237장이 110개 장면별로 표시. 자산 복사 429 → 666건으로 증가.

19. 실행이 끝난 콘티 단계가 “진행 중”으로 표시됐다내 버그

발생
07-30 10:45 (18번 수정 중 발견)
증상
콘티 탭이 진행 중 · 91. 러너는 이미 종료했고 88/91 로 끝난 상태였다.
원인
두 겹의 문제였다. ①상태를 파일 개수로 판정했는데 실패한 3샷도 마커 맵 파일은 남아 있어 91을 채운다 ②무콘티 진행을 위해 내가 매니페스트 statuscompleted 로 override 해 둔 것을 그대로 읽었다. 즉 내 override 가 실패 사실을 가리고 있었다.
조치
판정 근거를 failed_count / operator_override 로 바꿨다. override 를 ‘완료’로 미화하지 않는다. 이때 override 하면서 failed_count=3 을 지우지 않고 남겨둔 것이 근거가 됐다 — 정직한 기록을 남긴 것이 나중에 실제로 쓰였다.
근거
일부 실패 · 3샷 실패(S1sh7·S41sh2·S65sh4 — 레인 마커 맵 시야각 작화) 로 사실대로 표시.

20. 제출용 갤러리에 LAN IP 가 하드코딩돼 있었다내 버그

발생
07-30 10:50 서버 이관 점검 중
증상
01 갤러리 푸터의 ‘제작 과정 페이지’ 링크가 http://192.168.35.42:8935/. 외부 서버로 옮기면 사내망 주소라 열리지 않는다.
원인
로컬 포트로 확인하며 만들다가 그대로 굳었다. 산출물이 다른 곳으로 옮겨질 것을 전제하지 않은 작성.
조치
형제 폴더 상대경로 ../04_process/ 로 교체. 서버 배치 시 폴더명을 ASCII 로 올리므로 그 사본에만 이름을 맞췄다(공개 URL 에서 한글 퍼센트 인코딩이 메신저·메일에서 깨지는 것을 피하려는 것 — 한글 경로 자체는 200 으로 동작 확인).
근거
이관 후 https://jedi.team/g2/01_gallery/ 에서 링크 이동 정상. 전 페이지 외부 이미지·CSS·JS 0개로 자기완결 확인. 같은 점검에서 ZIP 안 랜딩이 웹 랜딩보다 구버전인 것도 잡아 ZIP 전용 랜딩(다운로드 카드 제거)으로 분리했다.

다음 세션이 반복하지 말아야 할 것

그럼에도 확인된 것

설계의 핵심 판단이 실측으로 지지됐다확인

대상 집합
lane plan 36그룹 중 structure_plate 바인딩은 10개, all_groups25개동치가 아님이 실측으로 확인됐다. 초안대로 LLM 이 검색 대상을 한 번 더 걸렀다면 어선·경비정·선착장 같은 구조물이 조용히 순수 T2I 로 남았을 것이다(Codex BLOCKING-1 수용의 실효).
검색 체인
10그룹 전부에서 검색어 저작 → 웹 이미지 검색 → 안전 다운로드 → VLM 비교선택이 작동했다. 최종 라운드 기준 회수 160장 중 판정 후보 100장(6그룹이 상한 12장을 채움) → 선택 10 · 탈락 90.
씨드
25그룹 전부 멀티롤 3장 → VLM 채점 → 결함 검사 → i2i 수정까지 완주했다(롤 75장, 수정본 23장). 검색 대상 10그룹은 선택 실사를 형태 참조로 물린 i2i 로, 나머지 15그룹은 기존 T2I 로 생성됐다.
안전 경계
http · loopback · 클라우드 메타데이터 엔드포인트 · 해석 불가 호스트를 전부 거부하고 공인 호스트만 통과시켰다.

이 문서는 다음 세션이 같은 함정에 다시 빠지지 않는 것을 목적으로 하며, 내가 틀렸던 판단(4·5·6·7·9·10)과 의심이 빗나갔던 건(8)을 그대로 기록했다. 각 라운드의 후보 사진과 반려 사유 원문은 제출 갤러리의 “이전 라운드 감사 이력” 절에 있다.