Skip to content

[Fix] 자소서 분석 상태 저장 및 데모데이 결과 노출 정합성 개선 - #253

Merged
whc9999 merged 2 commits into
devfrom
fix/demo-day-analysis-status-contract
Jul 31, 2026
Merged

[Fix] 자소서 분석 상태 저장 및 데모데이 결과 노출 정합성 개선#253
whc9999 merged 2 commits into
devfrom
fix/demo-day-analysis-status-contract

Conversation

@whc9999

@whc9999 whc9999 commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

✨ 어떤 이유로 PR를 하셨나요?

  • feature 병합
  • 버그 수정(아래에 issue #를 남겨주세요)
  • 코드 개선
  • 코드 수정
  • 배포
  • 기타(아래에 자세한 내용 기입해주세요)

📋 세부 내용 - 왜 해당 PR이 필요한지 작업 내용을 자세하게 설명해주세요

  • 유효한 PROVEN 문항 분석을 저장하고 개선문을 비우도록 처리
  • 답변에 이미 언급된 MISSING 후보를 핵심 토큰 기준으로 제거
  • 동일 문항의 직접 충돌 FABRICATED를 대표 한 건으로 제한
  • Java 분석 프롬프트와 fixed few-shot의 상태 계약 정렬
  • 데모 공고, 자기소개서, 운영 가이드, 예상 응답 및 평가 CSV 추가
  • 네 상태 저장·조회와 문장 인덱스 검증 테스트 보강

📸 작업 화면 스크린샷

⚠️ PR하기 전에 확인해주세요

  • 로컬테스트를 진행하셨나요?
  • 머지할 브랜치를 확인하셨나요?
  • 관련 label을 선택하셨나요?

🚨 관련 이슈 번호 [ ]

Summary by CodeRabbit

  • 개선 사항

    • 자기소개서 분석에서 이미 언급된 키워드는 누락 항목에서 제외됩니다.
    • 근거가 충분한 평가 결과는 강점과 문항별 분석에 정확히 반영됩니다.
    • 조작된 내용과 중복 평가의 표시가 문항별 기준에 맞게 정리됩니다.
    • 분석 결과의 상태와 개선 피드백이 일관되게 저장·표시됩니다.
  • 문서

    • 데모데이용 채용공고, 자기소개서, 예상 결과를 추가했습니다.
    • 시연 절차, 운영 점검, 분석 라벨 설명 및 장애 대응 가이드를 제공합니다.
    • 분석 규칙과 반복 실행·검증 결과를 문서화했습니다.

- 유효한 PROVEN 문항 분석을 저장하고 개선문을 비우도록 처리
- 답변에 이미 언급된 MISSING 후보를 핵심 토큰 기준으로 제거
- 동일 문항의 직접 충돌 FABRICATED를 대표 한 건으로 제한
- Java 분석 프롬프트와 fixed few-shot의 상태 계약 정렬
- 데모 공고, 자기소개서, 운영 가이드, 예상 응답 및 평가 CSV 추가
- 네 상태 저장·조회와 문장 인덱스 검증 테스트 보강
@whc9999 whc9999 self-assigned this Jul 31, 2026
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@whc9999, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 32 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 80e7c303-8434-47da-bb21-5e10b065bb8f

📥 Commits

Reviewing files that changed from the base of the PR and between 32e8e44 and 858b2c0.

📒 Files selected for processing (13)
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/evaluation/EvaluationAnalysisBatchService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClient.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisExecutionPayload.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProvider.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRules.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/evaluation/EvaluationAnalysisBatchServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/FewShotPromptProviderTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRulesTest.java
📝 Walkthrough

Walkthrough

분석 프롬프트가 PROVEN 평가 문장을 반환하도록 변경되었습니다. 서비스는 유효한 PROVEN 결과를 보존하고, 답변에 포함된 누락 키워드와 중복·허위 분석을 필터링합니다. 데모 입력, 기대 결과, 운영 절차와 테스트도 추가·갱신되었습니다.

Changes

분석 상태 처리

Layer / File(s) Summary
AI 평가 문장 계약
src/main/java/.../service/ai/AnalysisAiClient.java, src/main/resources/ai/analysis/fewshot-prompt-block.txt, src/test/.../service/ai/*
답변이 있는 문항마다 1~3개의 대표 평가 문장을 반환하도록 변경했습니다. proven 상태를 허용하고 improvementnull로 처리합니다.
누락 키워드 검증
src/main/java/.../service/sanitization/AnalysisSanitizationRules.java, src/main/java/.../service/core/AnalysisService.java, src/main/java/.../evaluation/EvaluationAnalysisBatchService.java, 관련 테스트
전체 답변에서 키워드 언급 여부를 정규화된 직접 포함과 핵심 토큰 일치율로 판정합니다. 이미 언급된 키워드는 최종 결과에서 제외합니다.
분석 결과 필터링 및 저장
src/main/java/.../service/core/AnalysisService.java, src/main/java/.../evaluation/EvaluationAnalysisBatchService.java, 관련 테스트
유효한 PROVEN 분석을 보존합니다. 모순된 PROVEN 분석과 문항별 중복 FABRICATED 분석을 제외합니다.
데모 자료와 운영 검증
docs/demo-day/*
채용공고, 자기소개서, 기대 분석 JSON, 운영 가이드와 분석 설계 보고서를 추가했습니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested reviewers: shinae1023

Sequence Diagram(s)

sequenceDiagram
  participant AnalysisService
  participant AnalysisAiClient
  participant AnalysisSanitizationRules
  participant EvaluationAnalysisBatchService
  AnalysisService->>AnalysisAiClient: 자기소개서 및 채용공고 분석 요청
  AnalysisAiClient-->>AnalysisService: 상태별 questionAnalyses와 missingKeywords
  AnalysisService->>AnalysisSanitizationRules: 답변 내 키워드 언급 여부 확인
  AnalysisSanitizationRules-->>AnalysisService: 필터링 대상 키워드 반환
  AnalysisService->>EvaluationAnalysisBatchService: 분석 후보 전달
  EvaluationAnalysisBatchService-->>AnalysisService: 최종 상태별 결과 반환
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 자소서 분석 상태 저장과 데모데이 결과 노출의 정합성 개선이라는 주요 변경 사항을 명확하게 설명합니다.
Description check ✅ Passed 변경 목적, 세부 작업, 테스트 및 사전 확인 항목을 작성해 템플릿을 대부분 충족합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/demo-day-analysis-status-contract

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai 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.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java (1)

327-344: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

동적 few-shot 예시의 출력 계약을 통일하세요.

두 테스트의 선택 사례는 비어 있지 않은 답변에 빈 questionAnalyses를 사용합니다. 새 계약은 모든 non-empty question에 1~3개의 대표 분석을 요구합니다.

  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java#L327-L344: selectedCase 출력에 원문 substring과 유효한 상태를 포함하세요.
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/FewShotPromptProviderTest.java#L27-L33: 선택 fixture와 저장된 few-shot 검증이 같은 계약을 사용하도록 수정하세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java`
around lines 327 - 344, Update the selectedCase fixture in
AnalysisAiClientTest.java:327-344 to include the original-answer substring and a
valid status, with 1–3 representative question analyses for the non-empty
answer. Update the selection fixture and persisted few-shot assertions in
FewShotPromptProviderTest.java:27-33 to use the same output contract, ensuring
both tests validate consistent non-empty question analysis data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClient.java`:
- Around line 189-197: Update the TWO_PASS flow in buildCandidatePrompt and
buildAcceptedQuestionAnalyses so StrengthCandidate entries can be finalized as
per-question PROVEN analyses, with improvement set to null, and apply the 1–3
candidate limit independently for each question rather than globally. Keep
MENTIONED and FABRICATED handling intact, and ensure MISSING is not emitted if
it violates the questionAnalyses status contract.

In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java`:
- Around line 449-453: 두 저장 경로에서 근거 없는 PROVEN 결과를 저장하지 않도록 수정하세요.
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java:449-453의
PROVEN 처리에서 reason이 null 또는 빈 문자열인지 먼저 검증하고, 상태와 일치하는 유효한 reason만 저장하게 하세요. 동일한
검증을
src/main/java/com/jobdri/jobdri_api/domain/analysis/evaluation/EvaluationAnalysisBatchService.java:274-278에도
적용하고, 두 경로에 null 및 빈 문자열 회귀 테스트를 추가하세요.
- Around line 243-251: Update finalizeAnalysis so question validation,
combinedAnswers, missing-keyword filtering, and QuestionAnalysis validation all
use one immutable answer snapshot. Before finalization begins, recalculate and
compare the database questions’ answer fingerprint with the snapshot from
AnalysisExecutionPayload, rejecting or aborting when they differ; otherwise
reuse that verified snapshot throughout instead of mixing payload answers with
newly loaded DB questions.

In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRules.java`:
- Around line 112-113: In
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRules.java
lines 112-113, update the composite-keyword sanitization condition to rely only
on MIN_KEYWORD_TOKEN_MATCH_RATIO and remove the matchCount >= 3 bypass. In
src/test/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRulesTest.java
lines 131-134, change the partial-match case expectation to false.

---

Outside diff comments:
In
`@src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java`:
- Around line 327-344: Update the selectedCase fixture in
AnalysisAiClientTest.java:327-344 to include the original-answer substring and a
valid status, with 1–3 representative question analyses for the non-empty
answer. Update the selection fixture and persisted few-shot assertions in
FewShotPromptProviderTest.java:27-33 to use the same output contract, ensuring
both tests validate consistent non-empty question analysis data.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5b8f0044-5a85-4d11-8fd8-6d11e8b9698f

📥 Commits

Reviewing files that changed from the base of the PR and between 9da8aa5 and 32e8e44.

⛔ Files ignored due to path filters (2)
  • docs/demo-day/demo-ai-repeat-results.csv is excluded by !**/*.csv
  • src/test/resources/evaluation/demo-day-cases.csv is excluded by !**/*.csv
📒 Files selected for processing (15)
  • docs/demo-day/demo-analysis-report.md
  • docs/demo-day/demo-cover-letter.md
  • docs/demo-day/demo-expected-analysis.json
  • docs/demo-day/demo-job-posting.txt
  • docs/demo-day/demo-operator-guide.md
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/evaluation/EvaluationAnalysisBatchService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClient.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRules.java
  • src/main/resources/ai/analysis/fewshot-prompt-block.txt
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/evaluation/EvaluationAnalysisBatchServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/AnalysisAiClientTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/ai/FewShotPromptProviderTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisSanitizationRulesTest.java

- TWO_PASS 강점 후보를 문항별 PROVEN 분석으로 변환
- questionAnalyses 최대 개수 제한을 문항별로 적용
- MISSING 상태가 문장 분석에 포함되지 않도록 프롬프트와 후처리 계약 통일
- PROVEN의 null, 빈 문자열 및 모순된 reason 저장 차단
- 최초 실행 답변 스냅샷과 완료 시점 DB 답변 fingerprint 불일치 차단
- 복합 missing keyword 판정을 토큰 일치 비율 기준으로 통일
- few-shot 및 운영·평가 저장 경로 회귀 테스트 보강
@whc9999
whc9999 merged commit a5969a7 into dev Jul 31, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant