ci(S15P11A705-154): infra action pin·보존 문서·dev 준비를 정합화한다 - #40
Merged
Conversation
세 건 모두 파일이 겹치지 않는 후속 정합이다. infra#82 가 병합되며 canonical SHA 가 16bfae0 로 확정됐다. 기존 pin 84458bf 는 병합 전 브랜치 commit 이라 infra main 과 diverged 상태였다. workflow 와 contract test 의 ACTION 상수는 같이 움직여야 하므로 양쪽을 함께 바꿨다. 대상 SHA 에서 action 입력 계약(policy·revision)이 동일함을 직접 확인했다. ai#39 가 sealed-secret-handoff 리포트를 86줄에서 42줄로 덮어써 docs/implements/README.md 의 보존 원칙을 위반했다. 현재 내용은 그대로 두고 상단에 상태 노트를, 하단에 대체된 구현의 설계 근거를 얹어 복원한다. 복원 방식은 ai#39 코멘트에서 인프라와 합의한 것이다. AI 파트 인원 합류에 따라 main·dev 2단 구성을 준비한다. ai-ci 트리거만 양쪽으로 넓히고 image publish 조건은 main 으로 유지한다 — infra 의 ai-image-update.yaml 이 source branch 를 main 으로 어서션한다. dev 브랜치 생성과 branch protection 은 이 PR 병합 후 중앙이 수행한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Jul 30, 2026
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.
요약
S15P11A705-154후속 정합 3건이다. 서로 파일이 겹치지 않아 한 PR로 묶었다.①
infra#82병합으로 확정된 canonical action SHA 로 pin 갱신, ②ai#39가 덮어쓴보존 문서 복원, ③
main·dev2단 브랜치 준비(브랜치 생성·protection 은 중앙 몫).도메인 코드·DB·앱 동작 변경 없음 — CI 설정·규약·문서만 바뀐다.
Jira (필수)
S15P11A705-154— https://ssafy.atlassian.net/browse/S15P11A705-154inframain과 일치하고, 보존 원칙 위반이 복원되며,dev도입 시 CI·규약이 즉시 성립하는 상태변경 사항
① Infra action pin (
84458bf3→16bfae0d).github/workflows/seal-runtime-secrets.ymlinfra#82병합 commit 으로. 기존84458bf3은 병합 전 브랜치 commit 이라inframain과 diverged 였고action.yml내용도 달랐다tests/test_runtime_secret_contract.pyACTION상수를 동일 SHA 로. 이 상수는 workflow 의uses문자열과 정확히 일치해야 step 을 찾으므로 한쪽만 바꾸면 테스트가 깨진다(아래 RED)대상 SHA 의 입력 계약을 직접 확인했다.
policy·revision두 입력의 이름·필수여부·설명과
branch·pull_request_url두 출력이 byte 단위로 동일하다. 유일한차이는 back OAuth
CLIENT_ID3종의unset방어 추가와 알파벳 정렬로,ai-devpolicy 와 무관하다. 따라서
Need Decision아님.② 보존 규칙 위반 복원
ai#39가docs/implements/2026-07-29-sealed-secret-handoff.md를 86줄에서 42줄로덮어썼다.
docs/implements/README.md가 "완료된 항목도 삭제하지 않고 상태 표시만갱신합니다" 를 규정하므로 위반이다.
복원 방식은 ai#39 코멘트에서 인프라와
합의한 그대로다 — 현재 내용을 지우지 않고 상태 노트를 얹는다.
docs/implements/2026-07-29-sealed-secret-handoff.md상태: 대체(구현 주체 이관) — 설계 근거는 보존노트. 하단에 「대체된 구현의 설계 근거(S15P11A705-96· 보존)」 절로 인프라가 지목한 4건(--raw선택·중간 평문 YAML 회피·strict scope·기동 검증 근거) 복원. 7키→3키 축소 경위와 이전 판 미결 3건의 현재 상태도 표로 남김docs/implements/README.mdI24인벤토리 행을 이관 사실 반영해 갱신. 그 과정에서I24·I25를 헤더 없는 별도 표로 끊고 있던 빈 줄도 제거diff 는 +101/−1 이고 유일한 삭제 줄은 갱신된 action SHA 다. 42줄 전부 보존되며
문서는 142줄이 됐다.
③ dev 브랜치 도입 준비
.github/workflows/ai-ci.ymlpull_request·push트리거를[main, dev]로.image-publish의if는refs/heads/main그대로 유지하고, 왜 비대칭인지 주석으로 못박음CONTRIBUTING.md45행dev로. 2단 구성(dev통합 /main배포)과 publish 가main전용인 이유를 명시CONTRIBUTING.md98행dev는 일상 병합 대상,main은dev릴리스 병합 전용이며 관리자 포함 보호 적용CONTRIBUTING.md116행dev로publish 를
dev로 옮기지 않았다.infra의ai-image-update.yaml이test "$SOURCE_BRANCH" = main으로 어서션하므로 넓히면 GitOps 반영이 거부된다. 이근거를 workflow 주석과
CONTRIBUTING.md양쪽에 남겼다.테스트 / 검증
Docker 가 기동 상태였으므로 pgvector Testcontainers 를 포함한 전체 suite 를 실행했다.
생략한 검증 없음.
RED
pin 을 한쪽만 바꾸면 깨진다는 것을 실측했다. workflow 를 옛 SHA 로 되돌리고 테스트는
새 SHA 를 기대하게 둔 상태:
next(step for step in job["steps"] if step.get("uses") == ACTION)가 매칭에 실패해StopIteration이다. 두 파일을 함께 바꿔야 하는 이유가 이것이다.GREEN
test_ci_image_publish_contract.py는 트리거가 아니라image-publish의if를어서션한다(
github.ref == 'refs/heads/main'포함 여부). 조건을 유지했으므로 ③ 에따른 테스트 수정이 필요 없고, 되레 publish 를
dev로 넓히려는 시도를 이 테스트가막아 준다.
Regression
ruff check .—All checks passed!(exit 0)python -m compileall app tools— exit 0pytest --cov=app --cov-branch --cov-report=term-missing— 74 passed, exit 0,TOTAL 77% (693 stmt / 150 miss / 102 branch).
app/변경이 없어 커버리지는main과 동일없으나 Docker 29.6.1 로 전체 suite 를 돌려 DB 테스트를 건너뛰지 않았다
검증 커밋:
2822816· 분기 기준mainb171f8f리뷰 포인트
16bfae0d가 맞는 pin 인가.infra#82의 merge commit 이자inframain과identical임을 확인했다. 태그가 아니라 merge commit 을 pin 하는 현재 방식을유지했다 — 태그 이동 위험을 피하려는 기존 판단으로 이해했다.
action.yml의inputs/outputs블록 동일성까지 봤다.ai-dev의 키 집합은action.yml이 아니라 infra 의 guardrails 스크립트가들고 있어 이 PR 에서 판정하지 않았다 — 아래 「범위 밖」의 3키/7키 미결과 같은
사안이다.
과 과거 7키 사이에서 혼란하지 않도록 축소 경위를 넣었다. 과하다고 보면 축소 경위
절만 빼도 합의는 충족된다.
CONTRIBUTING.md가dev를 전제하는데 브랜치가 아직 없다. 이 PR 자체가main대상인 이유다(지시된 준비 PR). 병합~dev생성 사이 짧은 구간에는 문서가존재하지 않는 브랜치를 가리킨다. 순서를 뒤집으려면
dev를 먼저 만들어야 하는데그건 중앙 소관이라 이 PR 에서 하지 않았다.
ai-ci를devpush 에서도 돌리는 비용.dev병합마다 check 가 한 번 더 돈다.cancel-in-progress는pull_request에서만 참이라devpush 는 순차 완료된다 —의도한 동작인지 확인 바란다.
리스크
infra소유 계약을 따라가는 방향이며 입력 계약 동일성을확인했다. 봉인 workflow 는 실행하지 않았다 — 실제 sealing 결과는 여전히 미검증이고,
그 판정은 Environment·토큰 준비 완료 후 수동
workflow_dispatch시점이다.contract test 가 이를 계속 어서션한다.
mainpush 전용 유지).dev트리거추가는 check 실행 범위만 넓힌다. 다만
main의 branch protection 이 strictai-ci / check를 요구하므로,dev생성 후dev에도 동일 보호를 걸기 전까지는dev가 무보호 상태다 — 중앙 후속 작업에 포함돼야 한다.범위 밖 / 후속
이번 PR에서 다루지 않는 항목:
dev브랜치 생성·기본 브랜치 변경·branch protection — 지시대로 중앙이 이 PR병합 후 수행한다.
dev에도 strictai-ci / check를 걸어야 한다.docs/development/workflow.md의main참조 4곳(4·8·33·53행) — 이 PR 이 지정한5개 파일 밖이라 손대지 않았다. 병합 직후
CONTRIBUTING.md와 불일치한다("최신 main에서 독립 브랜치 생성").
docs/proposals/P4452행도 동일. 후속 티켓필요 — 규약 정본은
CONTRIBUTING.md이므로 문서 마찰이지 동작 결함은 아니다.ai#39에서 질의한infra의tools/validate_ai_dev_prerequisites.pyREQUIRED_RUNTIME_KEYS(7키)와docs/ai-dev-prerequisites.md의 8-key schema 가 3키 기준으로 갱신될지 아직회신 없음. 갱신 전에는 봉인 workload gate 가 열리지 않는다.
infra소관.infra문서가 6파일을 전제하나backdev에 8개(
V4·V5추가). 백엔드 소관으로 관측만 전달된 상태.ai#32— 금지 범위라 건드리지 않았다.후속 Jira: 위 2번(문서 정합)은 AI 파트 신규 티켓 필요. 3·4번은
infra·back소관.영구 문서
docs/implements/2026-07-29-sealed-secret-handoff.md— 상태 노트 + 대체된 구현의설계 근거 보존(본 PR 항목 ②)
docs/implements/README.md— 개별 리포트 표에 누락 행 추가,I24인벤토리 갱신CONTRIBUTING.md— 브랜치 전략·병합 조건 2단화(본 PR 항목 ③)관련 GitHub Issue (선택)
16bfae0d)