재환님에게 전달할 내용. 2026-08-24 기준.
결론부터: 리뷰 주신 건은 전부 반영·머지 끝났고, 확인이 필요한 게 두 개 남았습니다 — 보안(#368)과 dev 관측(#5180).
UGC 광고 영상 대본을 만드는 도구(ugc-director)에서 두 가지가 겹쳐 있었습니다.
(a) 대본이 제품을 모른 채 동작을 지어냈다 — 원두 봉지를 기울이니 액체 커피가 쏟아지는 영상이 나왔습니다. 조합의 어려운 부분(장면 이음새·카메라·타임라인)을 매번 런타임 LLM이 새로 지어내다 보니 생긴 일입니다.
(b) 글자 수 검사가 너무 빡빡해서 대본을 계속 다시 쓰게 만들었다 — 15초 클립 기준으로 절반이 재작성 6라운드를 다 태우고도 지적을 단 채 통과했습니다. 3.57자/초와 3.60자/초 사이엔 결과물 차이가 없는데 그 경계에서 실패시키고 있었습니다.
(a) 골격 라이브러리 — 감사를 통과한 조합은 손글씨 SPEC으로 박제하고, 런타임 LLM은 제품 종속 빈칸(대사 + 물성)만 채웁니다. 채움은 코드가 합니다.
→ 실측: 동일 30조합 적대 감사에서 화면이 틀리게 나오는 FAIL 13/30 → 1/30
(b) 게이트를 3층으로 분리 — 지시는 안쪽으로 당기고, 판정은 여유를 줬습니다.
| 층 | 15초 한국어 기준 | 어긋나면 |
|---|---|---|
| 지시 (작성기에게 주는 목표) | 58~74자 | — |
| 권고 | 54~78자 | 경고만, 재작성 없음 |
| 판정 | 48~87자 | 여기서만 재작성 |
short_ratio(문장 길이 균질성)는 하드 → soft로 내렸습니다. 하드 지적 1위였는데 발화 물리가 아니라 문체 취향이고, 문장당 글자 예산과 논리적으로도 충돌했습니다.
하드로 남긴 것은 결과물이 실제로 깨지는 것만입니다 — 3자 미만 문장(발음 깨짐), 28자 초과 문장(립싱크 드리프트), 문장 수 2~6 밖, 판정창 밖 총 글자수.
재환님이 19-에이전트 적대 리뷰로 잡아주신 것들입니다. 전부 고쳤고, 확인해 주신 뒤 머지됐습니다.
| 지적 | 처리 |
|---|---|
[major] 소진 경로가 {{LINE_N}} 잔여를 안 잡는다 |
residualSlots 헬퍼로 뽑아 두 return 경로가 같은 검사를 공유 |
[minor] hangul-integrity.ts에 raw NUL 바이트 (git이 바이너리 취급) |
공백 구분자로 교체, 재발 방지 주석 |
[배포 위생] exp8-tmp.ts가 커밋에 딸려옴 |
삭제 + .gitignore에 exp*-tmp.* |
[minor] typicalSyl 이중출처 |
SPEC.typical_syl로 승격 |
| [nit] totalLo/Hi 반올림 불일치 | totalSylWindow 단일화 + ceil/floor — ko 7초 안내가 거짓말하던 잠복 버그까지 잡힘 |
| [minor] Budget ↔ short_ratio 상충 | 짧은 문장 상한을 코드가 계산 (s ≤ r(n-1)L/(n-r)) |
[nit] 소진 판 inputInsufficient 미복제 |
상수로 승격해 양쪽 공유 |
| [minor] KSX1001 밖 정상 음절 오탐 | 별건 이관 — #362 (아래 참조) |
warn vs throw: 줄수 미달에 하드 단언 대신 warn 로그를 택했습니다. 이 파일 계약이 fail-open이라 throw를 걸면 작성기가 지속 미달할 때 여정 자체가 죽습니다. 재환님도 "warn 유지가 맞다"고 확인해 주셨습니다.
머지·배포 상태
- pion-bot #5174, #5180 → main 머지 (2026-08-18)
- dev/alpha 재동기 #5205, #5206 → 두 배포 브랜치 모두 UGC_DIRECTOR_REV 확인
- 관련 이슈 종결: creagen-space #289(원두 봉지) · #338 · #339 · #352 · #351(러너 잔여물)
상황. CI 보안 스캐너가 pion-bot 저장소 전체 커밋 이력에서 실제로 인증되는 자격증명을 잡았습니다. CI는 숫자만 주길래 같은 스캐너를 로컬에서 다시 돌려 44건 전수 목록을 뽑아 이슈에 올려뒀습니다. (자격증명 값은 이슈에 옮기지 않았습니다.)
| 종류 | 건수 | 대상 |
|---|---|---|
| Postgres (Neon) | 25 | 엔드포인트 2개 |
| GCP 서비스 계정 | 5 | apps/agent/.env.* |
| Gemini API 키 | 4 | apps/agent/.env.* |
| Slack | 5 | pion-copilot 등 |
| Pipedrive / Intercom | 4 | pion-copilot |
| GitHub 토큰 | 1 | agent-ontology |
핵심 두 가지
1. 현재 코드엔 하나도 없습니다. 지금도 tracked인 파일은 apps/agent/.env.test 하나인데, 그 파일의 현재 내용은 재스캔에서 0건입니다. 나머지는 삭제된 파일의 옛 커밋입니다.
2. 그런데 그 값들이 오늘도 살아 있습니다. 스캐너의 "verified"는 실제 접속에 성공했다는 뜻입니다. 반년 전 지운 값으로 지금 붙습니다. 게다가 Neon Postgres는 사내망 밖(개인 노트북)에서 인증됐습니다 — 값 폐기와 별개로 네트워크 노출도 볼 문제로 보입니다.
확인 부탁: 이력 정리(filter-repo)보다 값 폐기(rotate)가 먼저라고 정리해 뒀습니다. 우선순위(Neon → GCP/Gemini → Slack/GitHub → Pipedrive/Intercom)와 재현 명령까지 이슈에 적어놨으니, 누가 언제 돌릴지만 같이 정하면 될 것 같습니다. 실제 폐기는 서비스 영향 판단이 필요해서 임의로 진행하지 않았습니다.
재환님이 짚어주신 것. 게이트를 완화하면서 상단이 열렸으니(74~87자 ≈ 5.0~5.82자/초), 그 구간이 실제 seedance 출력에서 버티는지 보라고 하셨습니다. density_tol 12%가 실측이 아니라 튜닝값이라, 그게 이 완화의 유일한 미검 지점이라는 지적 — 맞습니다.
막힌 지점 3개. 8/21에 #5180에 적어뒀습니다.
1. 립싱크 드리프트는 영상을 봐야 판정됩니다 — 코드가 셀 수 있는 값이 아닙니다.
2. dev DB 조회 경로가 없습니다 — 이 머신에 aws CLI가 없어 SSM 자격증명을 못 받습니다.
3. 원장만으로는 부족합니다 — creagen_review_cases payload가 script·language·round만 싣고 durationSec·gate.density를 안 실어서(review-ledger.ts:62), 상단 밴드에 떨어진 판을 골라낼 수 없습니다. mastra_messages의 도구 결과를 같이 봐야 합니다.
둘 중 하나만 정해주면 진행합니다
- (a) dev 조회 결과를 주시면 대상 클립을 추려서 보겠습니다.
조건: rev='2026-08-18.gate-tolerance' ∧ 도구 결과 gate.density > 5.2, 8/18 07:15Z(재동기 배포) 이후
- (b) 원장 payload에 durationSec·gate.density·rev를 추가하는 PR을 올리겠습니다.
→ 이후 판은 원장 한 테이블로 밴드 필터가 서고 관측이 반복 가능해집니다 (기존 판은 소급 안 됨)
한글 무결성 검출기가 KS X 1001 밖의 정상 현대 음절(똠·펲·샾 등)을 손상으로 오탐할 수 있는 건입니다.
지금 안 고치는 이유: fail-open이라 경로를 막지 않고, 현재 판정 기준은 코퍼스 421판 전수 대조에서 거짓양성 0·거짓음성 0으로 세운 것입니다. 재측정 없이 검출 범위를 좁히면 진짜 손상을 놓칩니다. 사용자 유래 음절은 이미 allow 집합으로 면제되고 있어서, 오탐 표면은 "입력에 없는데 작성기가 새로 쓴 KSX 밖 음절"뿐입니다.
재측정 트리거(오탐 실관측 / 코퍼스 재실행 시)를 이슈 본문에 적어뒀습니다. 이 판단에 이견 있으면 말씀 주세요.
나머지(리뷰 반영 8건, 배포, 이슈 종결)는 끝났습니다. #362는 조건부 파킹 상태입니다.