ci(S15P11A705-154): profile 리터럴 대조를 CI 로 옮기고 WORKLOG 를 메운다 - #41
Closed
colosair wants to merge 2 commits into
Closed
Conversation
두 건이다. 파일이 겹치지 않는다. WORKLOG 에 ai#40 줄이 없었다. ai#39 가 남긴 S15P11A705-154 줄은 그 PR 것이고 ai#40(action pin 갱신·보존 기록 복원·dev 준비)은 별개 작업이라 규약상 한 줄이 더 필요하다. BD-39 는 Embedding Profile 정본을 back 의 application.yml 리터럴로 두는 (a)안을 택하면서 "두 값이 같다"를 지켜야 할 명제로 명시했다. back#98 리뷰가 그 명제를 지키는 장치가 사람의 눈뿐이라고 지적했다. (a)안은 그대로 두고 대조만 기계로 옮긴다 — 리뷰가 함께 제안한 기동 시 대조는 채택 대상이 아니다. back 도 ai 도 public 저장소라 raw endpoint 를 무인증으로 읽는다. 토큰을 주지 않는 것이 경계다 — 주면 이 잡이 타 레포 접근 권한을 상시로 들고 다닌다. 비교 대상은 런타임 값이 아니라 선언된 리터럴이다. 양쪽 다 환경변수 덮어쓰기를 허용하므로, 프로세스 환경이 결과를 바꾸면 CI 가 무엇을 검증하는지 알 수 없게 된다. ai 쪽은 Settings 를 인스턴스화하지 않고 필드 선언만 읽는다. 조회 실패도 exit 1 이다. "확인하지 못했다"를 통과로 처리하면 사람의 눈을 CI 로 옮긴 의미가 없다. 실제 두 값이 같은 동안 이 잡은 늘 초록이라, 대조기가 불일치를 잡는 능력 자체는 검증되지 않은 채 남는다. tests/test_embedding_profile_parity.py 14 케이스가 고정 입력으로 그것을 못박는다 — 네트워크를 타지 않는다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
이 커밋은 다음 커밋에서 되돌린다. embedding-profile-parity 잡이 실제로 불일치를 잡는지 CI 에서 확인하기 위한 것이다. v1 -> v2 만 바꿨으므로 config.py 자체의 profile 정합 검증(model/dimension/distance 토큰 포함)은 그대로 통과한다 — 새 잡을 검증하는 것이고 기존 검증기를 건드리는 것이 아니다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Member
Author
|
티켓 이 PR 에서 관측한 CI RED(run |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
ai#40병합 후속 두 건이다. 파일이 겹치지 않아 한 PR로 묶었다. ①docs/WORKLOG.md에빠져 있던
ai#40줄을 채운다. ② BD-39가 *"두 값이 같다"*고 명시한 명제를 사람의 눈대신 CI가 지키게 한다. 앱 동작·DB·계약 변경 없음 — CI 잡 하나와 검증 코드, 문서 한 줄.
Jira (필수)
S15P11A705-154— https://ssafy.atlassian.net/browse/S15P11A705-154ai#40이 작업 로그에 남고, Embedding Profile 리터럴 드리프트가 사람의확인 없이 CI에서 잡히는 상태
변경 사항
docs/WORKLOG.mdai#40(action pin 갱신·보존 기록 복원·dev준비) 한 줄 추가.ai#39가 남긴S15P11A705-154줄은 그 PR 것이고ai#40은 별개 작업이라 규약상 한 줄이 더 필요하다. 이 PR 자신의 줄도 함께 추가한다 — 같은 누락을 다시 만들지 않기 위함tools/check_embedding_profile_parity.pyback의application.yml을 무인증 raw endpoint로 읽고ai의Settings필드 선언과 비교, 불일치·조회실패 모두 exit 1tests/test_embedding_profile_parity.py.github/workflows/ai-ci.ymlembedding-profile-parity잡 추가.check와 독립 실행배경 — 왜 CI 잡인가
back#98리뷰의 지적을 그대로 옮기면, BD-39가 (c)안(기동 시 FastAPI 조회)을 기각한근거는 *"상대 값을 받아 상대에게 되돌려 주면 대조가 항상 통과한다"*인데, 이는 상대
값을 채택하는 것에 대한 반박으로는 맞지만 상대 값과 대조하는 것까지 배제한다는
것이다. 그리고 현재 상태에서 *"두 값이 같다"*를 지키는 장치는 사람의 눈뿐이다.
이 PR은 리뷰가 제안한 두 안 중 값싼 쪽만 취한다.
back의application.yml리터럴이다. 이 PR은ai의값을 정본으로 승격하지 않고, 어느 쪽도 상대 값을 채택하지 않는다.
ai에 Profile을 노출하는 엔드포인트가 필요한 별도 협의 사안이다.리뷰 포인트
back값을 읽는 경로 — 무인증 raw endpoint. 두 레포가 모두 public이라(
gh api repos/Team-PinLog/back --jq .visibility→public) 토큰 없이 읽힌다.토큰을 쓰지 않은 것은 편의가 아니라 경계다 — 이 잡에 credential을 주면
aiCI가타 레포 접근 권한을 상시로 들고 다닌다. 반대로
back이 private으로 바뀌면 이 잡은조회 실패로 exit 1 하며 조용히 통과하지 않는다.
back의dev로 잡았다.back의 기본 브랜치이자 통합 브랜치다.배포 대상인 릴리스 브랜치가 아니라
dev를 읽는 것은 드리프트를 가장 이르게잡으려는 선택인데, 대가가 있다 —
back의dev커밋 하나가 우리 PR CI를붉게 만들 수 있다. 드리프트 감지기의 본질이라고 판단했지만 이 결합이 과하다고
보면 릴리스 브랜치로 낮추는 것이 대안이다.
허용하므로(
${VAR:default}/Field(alias=...)), 프로세스 환경이 결과를 바꾸면CI가 무엇을 검증하는지 알 수 없게 된다.
ai쪽은Settings()를 인스턴스화하지않고
Settings.model_fields[...].default만 읽는다 — 인스턴스화는 환경변수를 읽고profile 정합 검증까지 돌린다.
test_ai_side_reads_the_declared_literal_not_the_environment가PINLOG_EMBEDDING_PROFILE을 세팅해도 선언값이 이긴다는 것을 고정한다.${VAR}형태 모두 exit 1이다. "확인하지 못했다"를 초록으로 두면 사람의 눈을 CI로옮긴 의미가 사라진다. 다만 이 때문에 GitHub raw endpoint 장애가 PR을 막을 수
있다 — 재시도를 넣지 않은 것은 드리프트 알람의 신뢰도를 낮추지 않으려는 판단이다.
check와 독립 실행(needs없음). 순차로 묶으면 테스트가 깨진 PR에서 계약드리프트가 보이지 않고, 반대로 이 잡의 네트워크 실패가 테스트 신호를 가리지도
않는다. 대신 아래 「범위 밖」 1번을 봐 주세요 — 지금은 필수 체크가 아니다.
"대조기가 불일치를 잡는가"는 검증되지 않은 채 남는다.
tests/test_embedding_profile_parity.py14케이스가 고정 입력으로 그 능력을 못박고,
test_mismatch_is_detected_between_the_two_sides가한쪽만 어긋난 경우를 직접 단언한다.
테스트 / 검증
RED — 잡이 실제로 불일치를 잡는 것을 관측
양방향으로 실측했다. 한쪽만 보면 대조기가 상대 값을 그대로 되읽고 있는 경우를
놓친다.
back쪽을 어긋냄 (3-small-1536→3-large-3072픽스처):ai쪽을 어긋냄 (실제backdev대상,config.py기본값 임시 변경):둘 다 되돌린 뒤
git diff --stat app/core/config.py무출력으로 복원을 확인했다.CI에서의 RED 관측 결과는 아래 「CI」 항목에 런 ID로 기록한다.
GREEN
Regression
ruff check .—All checks passed!(exit 0)python -m compileall app tools— exit 0pytest --cov=app --cov-branch --cov-report=term-missing— 88 passed, exit 0(74 → 88, 신규 14). TOTAL 77% (693 stmt/150 miss/102 branch)
없으나 Docker 29.6.1로 전체 suite를 돌려 DB 테스트를 건너뛰지 않았다
app/변경이 없어 커버리지는main과 동일하다. 신규 코드는tools/라--cov=app집계 대상이 아니고, 그 대신 14케이스 단위 테스트로 덮었다.
검증 커밋:
79dfebc· 분기 기준main518b2bf리스크
바꾸지 않는다. BD-39 문서 미개정.
05 §7.1에 공개된 Profile 문자열이고credential을 쓰지 않는다.
의존하므로 그 장애가 PR을 막을 수 있고,
backdev의 변경이 우리 CI를 붉게만들 수 있다. 둘 다 의도된 트레이드오프이며 리뷰 포인트 2·4에 적었다.
범위 밖 / 후속
이번 PR에서 다루지 않는 항목:
main(과dev)의 branch protection이 요구하는것은 strict
ai-ci / check하나이므로,ai-ci / embedding profile parity는 지금은PR에 붉게 보이지만 병합을 막지는 못한다. 실제로 게이트가 되려면 중앙이 required
status에 추가해야 한다 — branch protection은 중앙 소관이라 손대지 않았다. 후속 필요.
ai에 Profile 노출 엔드포인트가 필요하며 AI·백엔드 협의 사안이다.docs/development/workflow.md4·8·33·53행과P4452행의main참조 —ai#40이CONTRIBUTING.md를dev기준으로 바꾼 뒤로 불일치 상태다.ai#40패킷에서 이미 올린 항목이며 이 PR 범위 밖이다. 후속 티켓 필요.
back소관 — 리뷰가 지적한embeddingProfile빈 문자열 기동 검사,distinctByRecord의match == null가드, 테스트 구멍 3건.back레포 변경은금지 범위다.
docs소관 —08 §1.5상태 코드 표에503과 새error.code2종 미등록.후속 Jira: 1번(required status 추가)은 중앙, 3번은 AI 파트 신규 티켓, 4·5번은
back·docs소관.영구 문서
docs/WORKLOG.md—ai#40줄과 이 PR 줄tools/·tests/신규 파일은 구현물이라 별도 implements 리포트를 만들지 않았다. 잡의판단 근거(무인증 경로·
devref·선언값 비교·실패를 통과로 두지 않음)는 스크립트docstring과 workflow 주석에 두었고, 이 PR 본문이 리뷰 기록으로 남는다.
관련 GitHub Issue (선택)