Repository navigation
docs: QA 회차와 런타임 증거를 저장소 정본으로 이관 [base: develop] - #1098
Conversation
1차(7/19)·2차(7/28) 회차 문서를 노션 QA DB 에서 옮기고, 현재 QA 상태를 한자리에 정리한 status.md 를 신설한다. 노션 원본에는 이 문서를 가리키는 링크만 남긴다. status.md 는 QA 를 네 층(자동 검증·PR 리뷰·런타임 실측·회차)으로 나눠 각 워터마크를 적고, 기능별 커버리지와 3차 QA 우선순위를 담았다. 증거 대장(.codex/qa-evidence)은 기록기가 8/20 에 생겨 그 이전 3주치가 남지 않았고 .gitignore 대상이라 로컬에만 있다. 총량 근거로 쓰지 말 것을 문서에 명시했다. 실제 QA 는 7/28~8/24 내내 있었고, 실측 흔적이 담긴 이슈만 180건이다. 2차 QA 발견 42건은 이슈 #560~#639 로 등재돼 있고 현재 33건 해결됐다.
304줄 중 절반이 절차 문서였고, 뒤쪽 83줄은 앱잼 시절 템플릿이 그대로 남아 현재 관행과 어긋나 있었다. 분리 — 비개발자 APK 배포 125줄을 docs/release/distribution.md 로, 스크린샷 baseline 37줄을 docs/testing/screenshot.md 로 옮긴다. 교체 — 삭제한 컨벤션은 전부 실측과 달랐다. XML 네이밍 예시 (@+id/tvPostNovelTitle)는 Compose 프로젝트에 해당 없고, 브랜치 언더바 규칙(feat/post_novel)은 실제 fix/910 형식과 다르며, 커밋 타입 ([FEAT] 이모지)은 Conventional Commits 로 바뀐 지 오래다. '리뷰 2명 승인'도 실제 ruleset 은 승인 1건 + 필수 체크 8종이다. 이슈·PR 템플릿 본문은 .github/ 에 파일로 있어 중복이었다. 추가 — 상단에 모듈 구조와 docs/ 문서 지도를 둔다. 모듈은 settings.gradle.kts 기준이며 삭제된 core:di·core:startup 은 뺐다.
노션 팀 홈 캘린더를 8/29 마감으로 적었으나 실측하니 틀렸다. "QA마무리?" Task 의 날짜 속성은 2026-08-23 이고, 담당자·본문 없이 "시작 전" 상태로 남아 있는 미정 메모다. 캘린더 셀 순서를 잘못 읽어 23일 칸 항목을 29일 것으로 본 오독이었다. 3차 QA 에 정해진 기한이 없음을 명시하고, 착수 시점은 결함 진척과 커버리지 갭으로 판단하도록 적는다.
2026-08-25 04:20~04:40 KST, dev 서버 폐쇄 시간대를 조건으로 활용해 실패 경로에 집중한 오프라인 순회를 돌렸다. develop 4e0a648 를 Pixel_7_Claude_QA 에 클린 설치하고 만료 access + 유효 refresh 를 주입해 '세션은 있으나 서버가 죽은' 상태로 검증했다. 수정 확인 5건 — 2차 QA #21·#25·#26, 1차 QA #3·#9. 재현 4건 — #708 설정, #714 타임레터, #716 마음의 기록(서버·내부 IP 노출 포함), 첫 진입 요청 중복. 신규 등재 1건 — #1100 추억 플레이리스트 빈 목록 안내 부재. 가장 큰 발견은 같은 서버 무응답 조건에서 실패 처리가 기능마다 네 갈래로 갈린다는 것이다. 개별 PR 리뷰로는 드러나지 않고 기능 간 대조에서만 보이므로, 회차 QA 를 따로 두는 근거가 된다.
Sadturtleman
left a comment
There was a problem hiding this comment.
지적
-
[blocking] 옮긴
docs/testing/screenshot.md가 존재하지 않는 태스크를 그대로 들고 갑니다 — #1082 이 지금 고치는 바로 그 줄입니다.$ git show origin/docs/1088-qa-records:docs/testing/screenshot.md | sed -n '14,17p' ./gradlew :core:ui:updateScreenshotTest \ :app:updateScreenshotTest \ ← app 모듈엔 screenshotTest 소스가 없다 :feature:onboarding:presentation:updateScreenshotTest \ :feature:afternote:presentation:updateScreenshotTest:feature:home:presentation·:feature:receiver:presentation두 모듈이 빠져 있는 것도 그대로입니다 (screenshot.yml은 5개 모듈을 검증). 문서를 옮기는 PR 이 낡은 내용을 새 파일로 이관하면, #1082 이 머지된 뒤 이 PR 이 들어갈 때 고쳐진 README 는 삭제되고 낡은 사본만 남습니다.두 PR 이 같은 내용을 서로 다른 파일에서 다루니, 이 PR 에서 옮긴 문서 쪽에 #1082 의 수정(죽은
:app2건 제거 + 누락 2모듈 추가 + 「정본은screenshot.yml」 명시)을 반영해 주세요. 저는 #1082 를 방금 승인했습니다.제가 오늘 이 문서대로 실행해 본 결과이기도 합니다 —
:feature:receiver:presentation·:feature:home:presentationbaseline 을 갱신해야 했는데 문서의 명령 목록에는 둘 다 없었습니다. -
[normal]
docs/qa/assumptions.md(#897) 와의 관계가 문서 지도에 없습니다.docs/qa/에status.md·round-1.md·round-2.md가 들어오면서 기존assumptions.md와 같은 디렉터리를 쓰게 됩니다. 파일은 그대로 두신 걸 확인했지만, README 의 문서 지도와status.md어디에도 언급이 없어 «QA 기록은 여기» 를 읽은 사람이 그 파일을 못 찾습니다. 한 줄 링크면 됩니다 — 그 파일은 «명세가 침묵해 추측으로 진행한 항목» 을 모으는 곳이라 QA 현황과 같이 읽혀야 합니다.
나머지는 이견 없습니다
- 노션 원본을 지우지 않고 링크만 남긴 판단, README 를 304→111줄로 줄이고 절차 문서를
docs/로 뺀 구성 모두 좋습니다. - 1·2차 회차를 결함 건수까지 옮겨 «어디까지 했는지» 를 셀 수 있게 만든 것이 이 PR 의 핵심 값이라 봅니다.
|
이 PR 은
|
- README 는 이관 후 축약본(이 PR)을 유지 - docs/release/distribution.md: develop 수동 배포 제거(#1029)와 릴리스 PR 범위 자동 산출(release-scope.yml)을 반영, develop 에 없는 deployment-decision.yml 참조 제거 - docs/testing/screenshot.md: 스크린샷 대상 모듈 목록(home·receiver 추가, :app: 제거)과 정본 안내 반영 - 두 문서의 워크플로 링크는 docs 하위 기준 상대경로로 보정
같은 리비전(develop 4e0a648)으로 15:09~15:15 KST 에 이어서 실측했다. 수정 확인 — refresh 무효(1107)를 인증 거절로 분류해 세션 정리. 새벽의 통신 실패 시 세션 유지와 합쳐 만료·거절·일시실패 3분류가 의도대로 갈린다. 받은 기록함 문구·빈 값 안내(2차 QA #32, 1차 QA O6)도 해소. 재현 — #599 발신자 카드 재시작 소실, #607 등록에 HTTP 요청 0건. 서버가 정상 응답하는 상태에서 재현해 네트워크 실패가 원인이 아님을 확인했다. 신규 등재 — #1126 동시 재발급 경합. #701 에는 프로세스 백그라운드 복귀 축을 코멘트로 덧붙였다.
에뮬레이터에 화면잠금·지문을 등록해 애프터노트 조회 인증 게이트를 통과한 뒤 성공 경로를 돌렸다. 목록·상세·수정·저장 왕복이 전부 정상이고 1차 QA #1(등록 500)·#2(실패 무음)는 재현되지 않는다. 해소 확인 — 2차 QA #22/#679 수정 진입 수신자 prefill, 2차 QA #33 서버 항목(수신자 이름·관계), #690 카드 아이콘. #706 은 CLOSED 인데 재발했다. 같은 검증 에러가 연속되면 안내가 발행되지 않고, 에러 값이 바뀌어야 다시 뜬다. 후속 #1127 로 등록했다. 3차 순회 총계는 증거 39건 · 수정 확인 13건 · 재현 11건 · 신규 3건이다.
admin 계정 승인 API 로 2차 QA 이래 못 보던 '승인 이후 화면' 구간을 열어 검증했다. curl 로 서류 제출·승인까지 무대를 세우고 그 뒤를 앱으로 보는 방식(무대는 우회, 검증 대상은 앱). - #915 는 FE 버그가 아니라 서버 계약 미반영 — contentLength 필수화가 BE 27fa442(8/9)에서 들어왔고 FE DTO 가 안 따라갔다. - 승인해도 수신자가 기록을 못 보는 건 #607(record-boxes 미사용) 탓 — 서버 APPROVED 를 읽는 경로가 없어 카드가 '열람 불가' 에 고정되고 열람 신청이 다시 서류 화면으로 되돌아간다. #599·#612 와 한 뿌리. 세 결함이 겹쳐 admin 승인이 수신자에게 도달하지 못한다.
발신자 토큰으로 전달 조건까지 설정해(무대) 수신자 애프터노트 열람을 열고 작성자 원본과 대조했다. 수신자가 받는 SOCIAL 애프터노트 상세에 credentials(계정 ID·비번)가 없다. 작성자는 저장했는데 수신자 응답에서 빠진다. actions 는 오지만 대상 계정이 없어 사후 계정 인계가 성립하지 않는다. BE #98(7/30 완료로 닫힘)과 동일 증상이라 회귀로 판단, BE 레포에 재현 코멘트로 재오픈 요청했다(담당 sooooa16). FE 결함 아님. 전달 조건(RECEIVER_REQUEST)+admin 승인 경로는 정상 동작을 확인했다.
두 건 다 이미 닫혀 있습니다 — 근거만 적습니다1. [blocking]
|
…-readme # Conflicts: # README.md
…-readme # Conflicts: # README.md
|
/review-response 두 변경 요청을 최신
현재 HEAD |
@Sadturtleman의 더 늦은 승인(review #5040325166)을 최종 판정으로 사용합니다. 저장소 정책은 PR 전체에서 가장 최근의 APPROVED/CHANGES_REQUESTED 판정을 우선합니다.
QA 회차 문서와 커밋별 런타임 증거를 Git으로 추적하는 저장소 정본으로 모읍니다. 최신
develop의 빌드 셋업과 개발 규칙은 보존하고, 길어진 배포·스크린샷 안내는 전용 문서로 분리했습니다.무엇이 바뀌나
docs/qa/round-1.md,round-2.md,status.md에 회차 이력·현재 커버리지·3차 QA 진행 상태를 정리했습니다.docs/qa/evidence/<full-head-sha>.json34건과manifest.json으로 1:1 이관했습니다..github/scripts/qa-evidence.mjs가 원본 필드 정규화, 민감정보 비식별화, 동일 HEAD 덮어쓰기 방지, manifest 해시 생성·검증을 담당합니다.qa-device-profile.sh --json은 공개 증거에 넣을 수 있도록 로컬 serial과 AVD 이름을 출력하지 않습니다.docs/release/distribution.md,docs/testing/screenshot.md로 분리했습니다.이관 검증
head_sha·result·scenario·not_covered34/34, 나머지 공개 가능한 관찰은details에 보존앱 잠금 PIN라벨 6/6 및 문장부호 placeholder 보존, 실제 인증값 6종 잔존 0건기존 리뷰 반영
findings50건과not_covered6건이 있어 전 기능 순회 완료로 보지는 않습니다.assumptions.md, 증거 대장, 기기 baseline을 README·status에서 연결했습니다.develop의 빌드 셋업과 개발 규칙을 보존하면서, 기존 release keystore 인계·WIF 권한 경계·origin/main검증·Play runbook 및 스크린샷 validate/generate/apply 절차를 전용 문서로 복원했습니다.검증
node --test .github/scripts/*.test.mjs— 295/295 통과node .github/scripts/qa-evidence.mjs verify <원본 34건> docs/qa/evidence— 34/34 통과scripts/repository-quality.sh— 통과scripts/test-qa-device-profile.sh+ ShellCheck — 통과./gradlew :build-logic:test— 통과git diff --check— 통과QA Metadata
{ "scope": "covered-by-ci", "exclusionReason": "Compose 화면과 앱 사용자 흐름은 바꾸지 않고 QA 증거 변환기, 문서, 공개용 기기 JSON 출력만 변경한다.", "androidTest": { "required": false, "reason": "Android 런타임 경계를 변경하지 않으며 동일 입력과 출력 경계를 Node 및 셸 회귀 테스트로 직접 검증한다. 모든 동일 저장소 PR에 적용되는 기기 회귀 실행은 별도로 유지한다." }, "evidence": [ { "kind": "test", "ref": ".github/scripts/qa-evidence.test.mjs", "assertion": "비식별화, 1:1 manifest, 덮어쓰기 방지, 내장 JSON 구조와 공개 corpus 34건을 검증한다.", "input": "민감정보와 JSON-like 문장을 포함한 fixture 및 공개 QA 증거 34건", "boundary": "원본 정규화부터 redaction, 파일 생성, manifest 해시, 공개 스키마 검증까지", "observation": "QA evidence 테스트와 전체 Node 테스트가 통과했다." }, { "kind": "test", "ref": "scripts/test-qa-device-profile.sh", "assertion": "공개 JSON에는 serial과 AVD 이름이 없고 화면 재현 정보는 유지된다.", "input": "단일·복수 에뮬레이터와 화면 override를 모사한 adb fixture", "boundary": "기기 선택과 status --json 직렬화 출력", "observation": "셸 회귀 테스트와 ShellCheck가 통과했다." } ] }병합 뒤 정리
.codex/qa-evidence만 삭제합니다.Closes #1242