Skip to content

codex/general-job-api - #114

Merged
kimwuju merged 4 commits into
mainfrom
codex/general-job-api
Oct 20, 2026
Merged

kimwuju merged 4 commits into
mainfrom
codex/general-job-api

Conversation

@danjee2009

Copy link
Copy Markdown
Member

#113

Task

  • 일반 6직군의 jobTitle·coverLetters와 WORK_SAMPLE을 materials 검증·저장·분석에 연결합니다. 자소서만 있어도 분석하며 같은 자료는 재분석하지 않습니다.
  • 비개발 선행 C-3·C-5·C-7·C-8을 함께 구현해 profile에 저장된 전체 자료를 전송하고, persona 15개 전공 및 테일러·채점·Chat 계약을 확장합니다.
  • 첫 일반 면접 준비에서 TECH 면접관을 면접별 복제하고 직무명·직무를 고정합니다. 대기 재개·재시도·채점·Chat은 같은 값을 사용하며 공유/과거 면접관은 변경하지 않습니다.

검증

  • ./gradlew test: 948 passed / 0 failed / 0 skipped (Java21, 일회용 PostgreSQL16, 외부 서버/S3 더미 설정)
  • V39 비개발9코드 → V40 일반15코드·직무명·면접별 snapshot 필드 적용
  • 자소서 단독 저장·동일내용 생략·직무명/답 변경·저장복구 비교·IT 새 키 생략·multipart·대기 재개 및 OSIV 선조회 후 동시 첫 시작/원본·과거 면접 보존 테스트
  • 자체·독립 코드 리뷰 지적 반영, git diff --check 통과

ETC

  • 기준 main@6acc8e4. auth → Analysis → Chat → API → Web 순서로 병합하며 이 PR은 API 단계입니다. 선행 PR 병합 전에 병합하지 않습니다.
  • 01-overview §3.1의 15개 직무와 JobRole/Major, §3.3의 일반4종/IT WORK_SAMPLE 금지, §3.4의 자료·직무명·자소서 규칙과 신규 Reason6개를 대조했습니다.
  • G-A31 보완: persona는 공유될 수 있어 면접 전용 복제본을 저장하며 선택 목록/직접 면접관 조회/새 면접 선택에서는 제외합니다. 행 잠금 후 refresh로 OSIV stale FK를 방지합니다.
  • 상세 가정·검증: docs/general-job-implementation.md. 배포·병합·운영 DB 변경·유료 모델 호출 없음. 타 서버 실제 E2E·모델 품질 검증은 남아 있습니다.

Closes #113

@danjee2009
danjee2009 marked this pull request as ready for review October 19, 2026 23:39
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-19T23:42:46.111404Z dae2ab0 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread src/main/java/repit/repit_api_server/domain/metadata/service/MetaService.java Outdated

@danjee2009 danjee2009 left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

검토 범위: 일반 직군 자료 저장·검증, 분석 요청 구성, 면접 직무 스냅샷과 질문 준비 흐름. 확인한 전체 PR diff와 PR 설명을 기준으로 정적 검토했습니다. 이 실행에서는 테스트를 다시 돌리지 않았습니다. 확인된 추가 지적 사항은 없습니다.

kimwuju and others added 3 commits October 20, 2026 20:09
비개발·일반 직군 분석 결과(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>
@kimwuju
kimwuju merged commit 4223095 into main Oct 20, 2026
1 check passed
Comment on lines +187 to +191
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()))) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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의 같은 검사도 포함입니다.

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.

feat: 일반 직군 자료·면접 계약 확장

2 participants