Skip to content

[Agent] 태스크 응답에 previewCreated 를 내고 previewUrl 을 폐기 예정으로 표시한다 [ #392 ] - #399

Merged
dldnsgkr merged 1 commit into
developfrom
unhak/preview-url-contract-step1
Sep 25, 2026
Merged

dldnsgkr merged 1 commit into
developfrom
unhak/preview-url-contract-step1

Conversation

@dldnsgkr

Copy link
Copy Markdown
Collaborator

#391 은 증상(승인 메시지의 죽는 링크)을 고쳤다. 이 PR 은 뿌리를 향한 3단계 중 1단계다.

DB 마이그레이션 없음. 호환 깨는 변경 없음 — 필드 하나를 추가하고 기존 필드는 그대로 둔다.


뿌리 — 같은 이름에 계약이 셋이다

응답 값의 신선도 그 값으로 열리나 실패
POST /preview-sessions/{id}/access 최신 열린다 — 쿠키를 같이 발급 —
GET /projects/{id}/preview-session 항상 최신 이미 쿠키를 들고 있을 때만 401
GET /agent/tasks/{taskId} 낡은 스냅샷 안 열린다 404

"하나만 유효"가 아니다. 셋의 계약이 다르고 실패 코드까지 갈린다.

근거:

1단계로 한 것

태스크 응답에 previewCreated(boolean) 를 추가한다. previewUrl 은 그대로 두고 @Deprecated + @Schema(deprecated = true) 로 표시한다.

FE 는 main 머지가 곧 프로덕션이라 옮길 시점을 자기 쪽에서 정해야 한다. 그래서 둘 다 나가는 기간을 먼저 만든다 — FE 가 기다릴 이유가 없어진다.

왜 previewReady 가 아니라 previewCreated 인가

근거 컬럼을 확인했다. updateProgress·markDone 에서만 쓰이고 지우는 코드가 없다.

grep "previewUrl = null|clearPreview"  →  (없음)

즉 프리뷰가 회수돼도 값이 남는다. ready 라고 부르면 거짓말이 된다 — 그게 바로 이 이슈가 고치려는 종류의 잘못이다. 컬럼이 실제로 말하는 것은 "이 작업에 프리뷰가 만들어졌다"까지고, 지금 상태는 GET /projects/{id}/preview-session 의 status 가, 열 주소는 access 가 말한다.

공백을 false 로 보는 것도 의도다

옛 FE 가 task.previewUrl?.trim() 으로 공백을 걸러내던 판단을 서버가 대신한다. 공백이 true 로 새면 FE 는 프리뷰가 생겼다고 믿고 폴링을 멈춘 뒤 아무것도 못 연다.

검증

전체 1765건 통과(직전 1762 + 신규 3), 실패 0.

역검증 2건:

되돌린 것 실패
isBlank() 처리 제거 (공백이 true 로 새게) getTaskStatusTreatsABlankPreviewUrlAsNoPreview
previewCreated 를 항상 false 로 getTaskStatusReportsPreviewCreatedWhenTheTaskHasAPreviewUrl

문서

docs/FRONTEND_API_GUIDE.md

  • 341행 응답 필드 표
  • 태스크 응답 경고에 previewCreated 안내와 previewReady 가 아닌 이유
  • 세션 응답 previewUrl 의 실제 계약 — 낡지는 않지만 쿠키 없이는 401. 그리고 require-access-cookie 가 dev false / 운영 true 라 dev 에서 시험하면 반드시 통과한다는 경고

.notion/api.md — 결과 필드에 같은 내용

남은 단계

누가 무엇
② FE previewCreated 로 이전 — 스키마 필드명 + 불리언 한 줄. 착수 시점은 FE 쪽 사용자 판단
③ BE 옛 previewUrl 제거 + 세션 응답의 previewUrl 도 제거 (FE 가 읽지 않는 것을 확인했다)

🤖 Generated with Claude Code

https://claude.ai/code/session_013y8USoCXTsRTATAhy88M93

…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
@dldnsgkr
dldnsgkr merged commit cc26333 into develop Sep 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant