Skip to content

feat(frontend): 면접 '잠시 중단' — 이어하기를 실제로 도달 가능하게 - #190

Merged
i3months merged 1 commit into
devfrom
feature/pause-interview
Aug 20, 2026
Merged

feat(frontend): 면접 '잠시 중단' — 이어하기를 실제로 도달 가능하게#190
i3months merged 1 commit into
devfrom
feature/pause-interview

Conversation

@i3months

Copy link
Copy Markdown
Member

점검에서 나온 것

useSessionLifecycleinterrupt 뮤테이션이 정의돼 있는데 어디서도 호출되지 않는다. 라이브 화면의 유일한 이탈 경로는 '종료'(COMPLETED, 되돌릴 수 없음, 즉시 피드백 생성)뿐이었다.

왜 중요한가 — 어제 만든 #180 이 사실상 닿지 않았다

SessionTimeoutService 의 방치 세션 처리:

SessionStatus target = hasAnswer ? SessionStatus.COMPLETED : SessionStatus.INTERRUPTED;

즉 INTERRUPTED 는 답변이 하나도 없는 세션에만 붙는다. UI 에서 중단할 방법도 없으니, 어제 만든 '이어서 진행하기'(#180)가 닿는 범위는 아무것도 답하지 않고 떠난 면접뿐이었다.

정작 이어하고 싶은 상황 — 2개 답하고 전화를 받아 자리를 비운 경우 — 는 hasAnswer=trueCOMPLETED 로 굳고 부분 면접에 대한 피드백까지 만들어진다. 되돌릴 수 없다.

수정

헤더에 '잠시 중단' 을 추가하고 확인 후 interrupt 를 호출한다. 직후 화면이 종료 패널로 바뀌고, 거기 이미 있는 '이어서 진행하기'(#180) 로 바로 복귀할 수 있다. 히스토리 카드도 이미 '이어하기 →' 로 되어 있다(#175).

즉 새 화면을 만들지 않고 이미 만들어 둔 경로에 진입점만 열었다.

확인 문구에서 종료와의 차이를 분명히 한다:

지금까지 주고받은 대화는 그대로 남습니다. 바로 다음 화면에서 이어서 진행할 수 있고, 나중에 히스토리에서도 다시 들어올 수 있어요. 피드백은 아직 만들어지지 않습니다.

테스트

InterviewStage.pause.test.tsx (3) — 확인 없이는 중단되지 않음, '계속 진행' 시 미실행, 중단과 종료가 서로 다른 콜백을 부름.

마지막 테스트에서 다이얼로그 확인 버튼과 헤더 버튼의 이름이 둘 다 '종료' 라 조회가 모호해진다. within(dialog) 로 한정했다.

vitest 124/124 · eslint 0 · tsc · build 통과.

남는 제품 결정 (이 PR 범위 밖)

탭을 그냥 닫은 경우는 여전히 hasAnswer 기준으로 COMPLETED 가 된다. 현실의 이탈은 버튼 클릭보다 탭 닫기가 많으므로, 이어하기가 정말 유용하려면 스위퍼 정책을 바꿔야 한다:

  • 지금: 답변 있으면 COMPLETED(부분 피드백 생성) — 방치된 면접에서 뭐라도 건지려는 의도된 선택
  • 대안: 답변이 있어도 INTERRUPTED(이어하기 가능) — 대신 자동 피드백은 사라진다

기존의 의도적 동작을 없애는 변경이라 임의로 하지 않았다. 판단 부탁드린다.

영향 범위

점검 중 발견: `useSessionLifecycle` 의 `interrupt` 뮤테이션이 **어디서도 호출되지 않는다.**
라이브 화면의 유일한 이탈 경로는 '종료'(COMPLETED, 되돌릴 수 없음, 즉시 피드백)뿐이었다.

그 결과 어제 만든 이어하기(#180)가 사실상 도달 불가였다. INTERRUPTED 는 스위퍼가
**답변이 하나도 없는** 방치 세션에만 붙이기 때문이다(`hasAnswer ? COMPLETED : INTERRUPTED`).
즉 '이어하기' 가 닿는 건 아무것도 답하지 않고 떠난 경우뿐 — 정작 이어하고 싶은
"2개 답하고 자리를 비운" 경우는 COMPLETED 로 굳어 피드백까지 만들어진다.

- 헤더에 '잠시 중단' 추가 → 확인 후 `interrupt` → INTERRUPTED
- 그 직후 화면이 종료 패널로 바뀌고, 거기 이미 있는 '이어서 진행하기'(#180)로 바로 복귀 가능
- 확인 문구에서 종료와의 차이를 분명히 한다(대화 보존 / 피드백 미생성 / 나중에 재진입)

테스트 `InterviewStage.pause.test.tsx` (3) — 확인 없이는 중단되지 않음, '계속 진행' 시 미실행,
중단과 종료가 서로 다른 콜백을 부름(다이얼로그 확인 버튼과 헤더 버튼의 이름이 같아
다이얼로그 범위로 한정해 조회).
@i3months
i3months merged commit ef4c54c into dev Aug 20, 2026
4 of 5 checks passed
@i3months
i3months deleted the feature/pause-interview branch August 20, 2026 05:42
i3months added a commit to i3months/stackup that referenced this pull request Aug 28, 2026
직전 PR(Team-StackUp#190) 제목에 작은따옴표(`'잠시 중단'`)가 들어가자 notify 잡이 실패했다:

    curl: (3) bad range specification in URL position 253

`${{ github.event.pull_request.title }}` 를 작은따옴표로 감싼 셸 문자열 안에 그대로
끼워 넣고 있었다. `${{ }}` 는 셸 실행 **전에** 치환되므로, 제목에 따옴표가 있으면 그 자리에서
문자열이 끝나고 나머지가 셸 토큰으로 해석된다.

깨지는 것만이 문제가 아니다. 같은 이유로 **러너에서 임의 명령을 실행할 수 있다**
(GitHub Actions script injection). 이 잡에는 `DISCORD_WEBHOOK` 시크릿이 env 로 들어온다.
fork PR 에는 시크릿이 전달되지 않지만, 같은 저장소 브랜치에서는 전달된다.

- 사용자 제어 값(제목·브랜치·actor)을 전부 `env:` 로만 넘긴다 — 러너가 직접 주입하므로
  셸이 그 내용을 파싱하지 않는다
- JSON 은 `jq --arg` 가 만든다 — 따옴표·개행·백슬래시가 알아서 이스케이프된다
- Discord embed title 상한(256자)에 맞춰 자른다
- `curl -f` 추가. 지금까지는 Discord 가 400 을 돌려줘도 잡이 성공으로 끝나 잘못된 페이로드를
  알 수 없었다
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