Skip to content

fix(ci): 릴리스 QA 포인트 generic fallback 제거 — PR 단위 구조화 입력 게이트 #809

Closed

Description

@OnlyReadOneBook

📜 Overview (Required)

#726은 Firebase 릴리스 노트에 포함 이슈와 QA 포인트 섹션이 비어 있지 않도록 만들었다.

하지만 QA 포인트의 원천이 개별 PR 본문이라, 명시적인 QA 포인트를 찾지 못하면 다음 generic 문구가 만들어진다.

#<이슈 번호> 관련 동작을 재현하고 수정 후 기대 결과가 충족되는지 확인

이 문구는 형식상 비어 있지 않아 게이트를 통과하지만, 테스터가 알아야 할 사전조건·행동·기대 결과가 없다. 앱 런타임과 무관한 CI 이슈를 앱 QA에서 제외할 근거도, 기존 CI가 이미 같은 경계를 검증했는지 판정할 근거도 PR 본문에 남지 않는다.

배포할 때마다 사람이 이슈·PR·diff를 다시 읽지 않아도 근거가 있는 실행 가능한 QA 목록이 남도록, PR 단위에서 구조화 입력을 강제한다.

✅ 완료 조건

1. PR별 구조화된 QA 원천

사용자 동작에 영향을 주는 develop 대상 PR은 다음 필드를 구조화해 제공한다.

  • scope: app-runtime / release-only / ci-only / covered-by-ci
  • precondition: 계정·데이터·네트워크 등 실행 전 상태
  • action: 테스터가 수행할 구체적인 행동
  • expected: 관찰 가능한 기대 결과
  • risk: 실패 시 사용자 영향
  • evidence: 이슈·테스트·스크린샷·실측 등 판단 근거

앱 QA가 필요 없는 변경은 빈 QA 문구 대신 exclusionReason을 필수로 둔다.

2. 결정적 검증 게이트

  • 사용자 노출 변경에서 구조화 필드가 빠지거나 generic fallback 문구만 있으면 통과시키지 않는다.
  • ci-only·covered-by-ci는 제외 이유와 동일 입력·경계·관찰 결과를 검증하는 job/evidence가 있어야 한다.
  • generic fallback은 릴리스 노트에 쓰지 않는다 — 사람이 옛 문구를 복붙하는 경로도 렌더러에서 막는다.
  • 게이트 도입 이전에 생성된 PR은 소급 차단하지 않는다.
  • 스크립트 단위 테스트가 CI에서 실행된다.

📌 Related

📍 Note (Optional)

  • 이 이슈는 QA 원천의 품질을 PR 단위에서 강제하는 범위다. 배포 시점 판단과 Firebase 배포 자체는 다루지 않는다.
  • 원래 완료 조건에 있던 «배포 경계의 AI 의미 감사»와 «PR fix(ci): Review Assign 자동 assignee 제거 [base: develop] #802 회귀 fixture»는 토대가 사라져 범위에서 제외했다. 근거는 아래 코멘트.

Activity

  1. OnlyReadOneBook commented on Aug 24, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    완료조건 3·4(AI 의미 감사) 철회 — 범위를 1·2 로 좁힌다

    PR #810 을 develop 에 맞추면서 AI 의미 감사 쪽을 걷어냈다. 근거를 남긴다.

    전제가 무너졌다. 이 이슈가 감사를 얹으려던 자리는 deployment-decision.yml 의 배포 판정이었는데, develop 이 그 워크플로 자체를 걷어냈다 (d657a04). 판정 16건이 전부 같은 값이었고 workflow_dispatch 실행이 3건뿐이라 "판정은 쓰이지 않았다" 는 실측이 근거였다. 배포 시점은 릴리스 PR 을 여는 사람이 정하는 것으로 확정됐고, 산출물은 release-scope.yml 이 채우는 포함 이슈 목록 하나로 정리됐다.

    방침과도 어긋난다. 그 정리로 README 에 "별도 API나 유료 AI를 호출하지 않으며 기존 GitHub Actions 실행량만 사용한다" 가 명시됐다. 개인 Copilot 좌석을 쓰는 감사는 이 방침의 예외를 새로 만드는 일이라, 되살리려면 방침을 먼저 다시 정해야 한다. COPILOT_PERSONAL_TOKEN 도 미등록이라 지금 머지해도 항상 human_review_required 로만 끝난다.

    원래 문제의식이 어디로 갔는지.

    #809 가 지적한 것 지금 어디서 다루나
    CI 이슈를 앱 QA 에서 제외 게이트의 ci-only·covered-by-ci scope + 제외 근거 강제 (완료조건 1·2)
    generic fallback 이 게이트를 통과 게이트와 릴리스 노트 렌더러 양쪽에서 차단 (완료조건 1·2)
    실행 가능한 QA 문장 PR 본문의 precondition·action·expected 강제 (완료조건 1·2)
    중복 사용자 흐름 병합·우선순위 미해결. release-scope.yml 이 초안만 채우고 사람이 릴리스 PR 본문에서 다듬는 구조로 배정됐다

    마지막 줄만 남는데, 이건 자동화가 아니라 사람 몫으로 이미 설계에 반영된 상태다. 그래서 후속 이슈를 따로 만들지 않는다 — 되살릴 근거가 생기면(유료 AI 방침 재결정, 또는 사람 몫으로 둔 병합이 실제로 문제를 일으킬 때) 그때 이 코멘트를 출발점으로 새로 연다.

    완료조건 4(PR #802 회귀 fixture)는 감사 파이프라인 전체를 돌리는 fixture라 함께 빠진다. 게이트 쪽 회귀는 qa-metadata.test.mjs 8개와 열린 PR 53건 전수 실행으로 대체했다.

  2. changed the title [-]fix(ci): 릴리스 QA 포인트 generic fallback 제거 — 구조화 입력·AI 의미 감사[/-] [+]fix(ci): 릴리스 QA 포인트 generic fallback 제거 — PR 단위 구조화 입력 게이트[/+] on Aug 25, 2026
  3. OnlyReadOneBook commented on Aug 25, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    범위 축소 — 완료조건 3·4 를 제외했다

    이 이슈가 근거로 삼던 파일이 develop 에 더는 없다.

    d657a0492 (ci: 배포 판정 코멘트를 릴리스 PR 범위 산출로 대체한다) 가 다음을 지웠다.

    삭제 대체
    .github/scripts/evaluate-deployment-decision.mjs .github/scripts/render-release-scope.mjs
    .github/scripts/evaluate-deployment-decision.test.mjs .github/scripts/render-release-scope.test.mjs
    .github/workflows/deployment-decision.yml .github/workflows/release-scope.yml
    $ git ls-tree -r --name-only origin/develop | grep deployment-decision
    (없음)
    

    원 완료조건 3(«배포 경계의 AI 의미 감사»)과 4(«PR #802 를 PR #805 기준점으로 재계산하는 회귀 fixture»)는 둘 다 그 배포 판정 산출물 위에 얹혀 있었다. 판정이 사라졌으므로 감사할 입력도, 재계산할 기준점도 없다. 배포 시점은 이제 릴리스 PR 을 여는 사람이 정한다.

    COPILOT_PERSONAL_TOKEN 도 미등록이라, 감사 코드를 그대로 머지했다면 항상 human_review_required 로만 끝났을 것이다.

    남긴 범위 (1·2) 는 오히려 보완적이다

    develop 의 release-scope.yml 은 «QA 포인트는 비어 있을 때만 초안을 채우고 사람이 쓴 문장은 보존» 으로 갔다. 그렇다면 그 초안의 원천 품질을 PR 단위에서 강제하는 쪽에 값이 있다 — 이 이슈가 처음부터 지적한 generic fallback 문구가 바로 그 초안이다.

    구현은 #810 이며, 감사 쪽 약 1,400줄을 걷어내 develop 대비 575줄로 줄인 상태다.

    3·4 를 되살려야 한다면

    배포 판단 경로가 다시 생기는 시점에 별도 이슈로 열면 된다. 지금 되살릴 대상이 없어 이 이슈에 남겨 두면 영구 미완으로 남는다.

  4. added a commit that references this issue on Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions