Repository navigation
codex/general-job-api - #114
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dae2ab0d96
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
danjee2009
left a comment
There was a problem hiding this comment.
검토 범위: 일반 직군 자료 저장·검증, 분석 요청 구성, 면접 직무 스냅샷과 질문 준비 흐름. 확인한 전체 PR diff와 PR 설명을 기준으로 정적 검토했습니다. 이 실행에서는 테스트를 다시 돌리지 않았습니다. 확인된 추가 지적 사항은 없습니다.
비개발·일반 직군 분석 결과(schemaVersion 2)에는 major가 없고 jobRole만 있어 DrawnSet.major가 늘 비었다. 그래서 사이클 대기를 이어갈 때 비개발 직무의 재작성 요청에 jobRole이 빠지고, 일반 직군 스냅샷과 자료 직무가 달라도 409로 막지 못했다. major가 없으면 jobRole을 읽는다(v1 개발 결과는 그대로). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # src/test/java/repit/repit_api_server/domain/userdata/feedback/dto/request/FeedbackMultiRequestSerializationTest.java # src/test/java/repit/repit_api_server/domain/userdata/feedback/dto/request/FeedbackSoloRequestSerializationTest.java
getMetaData가 저장된 첫 문서를 fileUrl로 내보내 첫 문서가 이력서·경력기술서면 /getMetaData가 그것을 포트폴리오로 보이고 /isPortfolio가 포트폴리오 없이도 true를 줬다. MaterialsResponse.toAnalysisInput()처럼 종류로 고른다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| String major = userMajor != null ? userMajor : drawn.major(); | ||
| if (representative != null && representative.isInterviewSnapshot()) { | ||
| major = representative.getMajor().name(); | ||
| userJobTitle = representative.getJobTitle(); | ||
| if (drawn.major() != null && !major.equals(UserJobMajors.normalize(drawn.major()))) { |
There was a problem hiding this comment.
[P1] v2 종합 데이터에서 drawn.major()가 항상 null이라 콜백 경로의 직무가 빠집니다
drawn.major()는 QuestionPoolService.drawn()이 종합 데이터의 profile.major를 읽은 값입니다. 그런데 Analysis #52의 profile v2(비개발·일반 직군)에는 major가 없고 jobRole만 있어서, v2 종합 데이터에서는 이 값이 항상 null입니다.
- 비개발 IT 직무(DATA_ANALYST 등)의 첫 면접처럼 사이클을 기다렸다가
resumeWaiting→startTailor(interview, null, null, tailor)로 이어지면major가 null이 됩니다. 그러면 테일러 요청에jobRole이 빠지고, Analysis는specialist_job(None)이라 개발 직군 시스템 프롬프트로 질문을 다시 씁니다. - 191줄의 직무 불일치 검사도 v2에서는 늘 건너뜁니다. 예를 들어 GEN_FINANCE → GEN_STRATEGY로 바꾼 뒤 새 분석이 실패하면
latestCompleted가 예전 재무 종합 데이터를 고릅니다. 이때 409가 나지 않고 재무 사이클 질문으로 전략 면접이 준비됩니다.
drawn()에서 major가 없으면 jobRole을 읽도록 해야 합니다.
| if (job.requiresJobTitle()) { | ||
| if (title == null) { | ||
| errors.add(error("jobTitle", Reason.JOB_TITLE_REQUIRED, null)); | ||
| } else if (title.length() > MAX_JOB_TITLE || CONTROL_CHARACTER.matcher(title).find()) { |
There was a problem hiding this comment.
[P2] API 검사를 통과한 직무명이 Analysis /profile에서 계속 422가 될 수 있습니다
여기서는 \p{Cntrl}(ASCII 제어문자)만 막습니다. 그런데 Analysis ProfileRequest._validate_documents는 str.isprintable()로 검사해서 다음 문자도 거부합니다.
- U+3000 전각 공백
- NBSP(U+00A0)
- ZWJ(U+200D)
- C1 제어문자(U+0080~U+009F)
예를 들어 브랜드 마케터(전각 공백)는 저장은 되지만 분석 요청은 매번 422입니다. 저장 응답은 analysis: failed가 되고, 종합 데이터가 없으면 면접 준비의 launchIfMissing도 같은 422로 매번 실패합니다. 사용자는 원인을 알 수 없습니다.
두 서버의 허용 문자 기준을 맞춰야 합니다. InterviewJobSnapshotService의 같은 검사도 포함입니다.
#113
Task
jobTitle·coverLetters와 WORK_SAMPLE을 materials 검증·저장·분석에 연결합니다. 자소서만 있어도 분석하며 같은 자료는 재분석하지 않습니다.검증
./gradlew test: 948 passed / 0 failed / 0 skipped (Java21, 일회용 PostgreSQL16, 외부 서버/S3 더미 설정)git diff --check통과ETC
main@6acc8e4. auth → Analysis → Chat → API → Web 순서로 병합하며 이 PR은 API 단계입니다. 선행 PR 병합 전에 병합하지 않습니다.docs/general-job-implementation.md. 배포·병합·운영 DB 변경·유료 모델 호출 없음. 타 서버 실제 E2E·모델 품질 검증은 남아 있습니다.Closes #113