[Agent] 태스크 응답에 previewCreated 를 내고 previewUrl 을 폐기 예정으로 표시한다 [ #392 ] - #399
Merged
Merged
Conversation
…392 ] #391 은 증상(승인 메시지의 죽는 링크)을 고쳤다. 뿌리는 같은 previewUrl 이름이 세 응답에 있고 계약이 서로 다른 것이다. POST /preview-sessions/{id}/access 최신 · 열린다 (쿠키 동시 발급) GET /projects/{id}/preview-session 최신 · 쿠키를 이미 들고 있을 때만 → 401 GET /agent/tasks/{taskId} 낡은 스냅샷 · 안 열린다 → 404 "하나만 유효"가 아니라 "같은 이름, 서로 다른 계약 셋"이고 실패 코드도 갈린다. 이 커밋은 호환을 깨지 않는 1단계다. 태스크 응답에 previewCreated(boolean)를 추가하고 previewUrl 은 그대로 둔다. FE 는 main 머지가 곧 프로덕션이라 옮길 시점을 자기 쪽에서 정해야 하므로, 둘 다 나가는 기간을 먼저 만든다. previewReady 가 아니라 previewCreated 인 이유 근거 컬럼 agent_run.preview_url 은 updateProgress·markDone 에서만 쓰이고 지우는 코드가 없다 — 프리뷰가 회수돼도 값이 남는다. 그래서 "ready" 는 거짓말이 된다. 컬럼이 실제로 말하는 것은 "이 작업에 프리뷰가 만들어졌다" 까지다. 지금 상태는 GET /projects/{id}/preview-session 의 status 가 말하고, 열 주소는 access 가 준다. 공백 문자열을 false 로 보는 것도 의도다. 옛 FE 가 previewUrl?.trim() 으로 공백을 걸러내던 판단을 서버가 대신한다 — 공백이 true 로 새면 FE 는 프리뷰가 생겼다고 믿고 폴링을 멈춘 뒤 아무것도 못 연다. 검증 전체 1765건 통과(직전 1762 + 신규 3), 실패 0. 역검증 2건 — blank 처리를 지우면 공백 테스트가, 항상 false 로 만들면 정상 케이스 테스트가 각각 실패한다. 문서 FRONTEND_API_GUIDE.md — 341행 표, 태스크 응답 경고에 previewCreated 안내와 previewReady 가 아닌 이유, 세션 응답 previewUrl 의 실제 계약(낡지 않지만 쿠키 없이는 401)과 dev 가 require-access-cookie=false 라 거짓 통과한다는 경고 api.md — 결과 필드에 같은 내용 남은 단계: ② FE 가 previewCreated 로 이전(시점은 FE 쪽 판단) ③ BE 가 옛 previewUrl 제거 + 세션 응답의 previewUrl 도 제거(FE 가 읽지 않는 것을 확인했다) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013y8USoCXTsRTATAhy88M93
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#391은 증상(승인 메시지의 죽는 링크)을 고쳤다. 이 PR 은 뿌리를 향한 3단계 중 1단계다.DB 마이그레이션 없음. 호환 깨는 변경 없음 — 필드 하나를 추가하고 기존 필드는 그대로 둔다.
뿌리 — 같은 이름에 계약이 셋이다
POST /preview-sessions/{id}/accessGET /projects/{id}/preview-sessionGET /agent/tasks/{taskId}"하나만 유효"가 아니다. 셋의 계약이 다르고 실패 코드까지 갈린다.
근거:
grantAccess가session.rotateAccess(token, resolver.publicUrl(...))+save를 한다(PreviewSessionService:244) — 회전이 저장된publicUrl을 갱신하므로 세션 응답은 낡을 수가 없다(ProjectPreviewSessionResult:34).agent_run.preview_url컬럼이다(AgentRunEntity:52) — 이것만 낡는다.isAuthorized, Issue AG: [Preview] 게이트웨이 인가 공백 — 소유권 미검증 capability URL·토큰 회전 부재 #77 G2 / [Preview] sandbox 불투명 오리진에서 서브리소스가 쿠키·CORS에 막혀 프리뷰가 백지로 뜸 #108).1단계로 한 것
태스크 응답에
previewCreated(boolean) 를 추가한다.previewUrl은 그대로 두고@Deprecated+@Schema(deprecated = true)로 표시한다.FE 는
main머지가 곧 프로덕션이라 옮길 시점을 자기 쪽에서 정해야 한다. 그래서 둘 다 나가는 기간을 먼저 만든다 — FE 가 기다릴 이유가 없어진다.왜
previewReady가 아니라previewCreated인가근거 컬럼을 확인했다.
updateProgress·markDone에서만 쓰이고 지우는 코드가 없다.즉 프리뷰가 회수돼도 값이 남는다.
ready라고 부르면 거짓말이 된다 — 그게 바로 이 이슈가 고치려는 종류의 잘못이다. 컬럼이 실제로 말하는 것은 "이 작업에 프리뷰가 만들어졌다"까지고, 지금 상태는GET /projects/{id}/preview-session의status가, 열 주소는access가 말한다.공백을
false로 보는 것도 의도다옛 FE 가
task.previewUrl?.trim()으로 공백을 걸러내던 판단을 서버가 대신한다. 공백이true로 새면 FE 는 프리뷰가 생겼다고 믿고 폴링을 멈춘 뒤 아무것도 못 연다.검증
전체 1765건 통과(직전 1762 + 신규 3), 실패 0.
역검증 2건:
isBlank()처리 제거 (공백이 true 로 새게)getTaskStatusTreatsABlankPreviewUrlAsNoPreviewpreviewCreated를 항상false로getTaskStatusReportsPreviewCreatedWhenTheTaskHasAPreviewUrl문서
docs/FRONTEND_API_GUIDE.mdpreviewCreated안내와previewReady가 아닌 이유previewUrl의 실제 계약 — 낡지는 않지만 쿠키 없이는 401. 그리고require-access-cookie가 devfalse/ 운영true라 dev 에서 시험하면 반드시 통과한다는 경고.notion/api.md— 결과 필드에 같은 내용남은 단계
previewCreated로 이전 — 스키마 필드명 + 불리언 한 줄. 착수 시점은 FE 쪽 사용자 판단previewUrl제거 + 세션 응답의previewUrl도 제거 (FE 가 읽지 않는 것을 확인했다)🤖 Generated with Claude Code
https://claude.ai/code/session_013y8USoCXTsRTATAhy88M93