04. 체크리스트와 테스트¶
4.1 상태 표기¶
PASS: 실제 실행 결과와 근거가 남아 있는 상태입니다.FAIL: 실제 실행 결과가 기대와 다른 상태입니다.미검증: 테스트 방법은 정했지만 아직 실행하지 않은 상태입니다.구현 예정: 테스트할 기능이 아직 없는 상태입니다.재검증 필요: 코드나 환경이 바뀌어 같은 조건에서 이전 결과를 다시 확인해야 하는 상태입니다.
4.2 기능 체크리스트¶
| 요구사항 ID | 점검 항목 | 테스트 방법 | 기대 결과 | 실제 결과 | 상태 | 근거 |
|---|---|---|---|---|---|---|
FR-USER-01 |
회원가입·로그인 | 정상·중복·잘못된 아이디와 비밀번호로 요청 | 유효한 사용자만 생성·로그인 | HTTP 흐름, 계정·IP 제한, 경합과 차단 뒤 저장 증폭 방지 테스트 통과 | PASS | tests/unit/accounts_catalog/test_accounts_http.py, tests/integration/test_login_throttle_concurrency.py |
FR-USER-03 |
본인 소개글·비밀번호 변경 | 본인과 다른 사용자 세션으로 변경 시도 | 본인만 허용 | 본인 전용 URL, 세션 epoch, IDOR·CSRF 테스트 통과 | PASS | 계정 HTTP·보안 테스트 |
FR-PRODUCT-01 |
상품 등록 | 정상·경계·잘못된 상품과 이미지 제출 | 유효한 상품만 저장 | 가격·판매 상태·재인코딩과 우회 입력 테스트 통과 | PASS | 상품 view·이미지·보안 테스트 |
FR-PRODUCT-02 |
본인 상품 관리 | 타인 상품 수정·삭제 시도 | 타인은 거부 | 소유자 재확인, 버전 충돌과 IDOR 테스트 통과 | PASS | tests/unit/accounts_catalog/test_catalog_views.py |
FR-PRODUCT-03 |
목록·상세 조회 | 비회원과 회원으로 공개·비노출 상품 조회 | 공개 상품만 노출 | DB 시각 기반 비노출 SQL 필터와 상세 404 테스트 통과 | PASS | 상품 view·보안·제재 테스트 |
FR-CHAT-01 |
전체 채팅 | 인증·비인증 사용자의 연결과 전송 | 인증 사용자만 허용 | 저장 후 전달·ACK, 속도 제한, 장애 이력 수렴 테스트 통과 | PASS | tests/integration/test_chat_resilience.py |
FR-CHAT-02 |
1대1 채팅 | 참여자와 제3자의 입장·이력 조회 | 두 참여자만 허용 | 정확히 두 참여자 방, 제3자 거부와 휴면 수신 차단 테스트 통과 | PASS | 채팅 unit·security 테스트 |
FR-REPORT-01 |
사용자·상품 신고 | 정상·자기·중복·기준 미달 신고 | 유효 신고만 집계 | 필수 사유, 대상·맥락·자격·중복 검증 테스트 통과 | PASS | 신고 HTTP·서비스 테스트 |
FR-REPORT-02 |
가역 제재 | 임계값 전후와 만료 시각 확인 | 한 번만 적용되고 만료 후 해제 | 동시 다섯 신고에서 제재·소비·감사 한 건과 DB 시각 만료 확인 | PASS | tests/integration/test_moderation_concurrency.py |
4.3 보안 체크리스트¶
| 보안 요구사항 ID | 점검 항목 | 테스트 방법 | 기대 결과 | 실제 결과 | 상태 | 근거 |
|---|---|---|---|---|---|---|
SR-AUTH-01 |
비밀번호 평문 저장 여부 | 사용자 생성 뒤 저장값과 비밀번호 검증 확인 | 원문이 저장되지 않고 올바른 비밀번호만 검증 | Django 단방향 해시 저장 확인 | PASS | ACCT-PASSWORD-001 |
SR-AUTH-02 |
로그인 무차별 대입 | 계정·IP 기준 경계와 병렬 실패 요청 | 기준 초과 시 일반화된 제한 응답 | DB 권위 제한, 병렬 직렬화, 오래된 상태 정리와 일반 오류 확인 | PASS | 계정 unit·동시성 테스트 |
SR-AUTHZ-01 |
인증 없는 보호 기능 접근 | 로그아웃 상태로 보호 URL/API 요청 | 로그인 또는 403으로 차단 | 계정·상품·신고 보호 URL 음성 테스트 통과 | PASS | tests/security/test_cycle1_http_security.py |
SR-AUTHZ-01 |
타인 프로필·상품·신고 수정 | 다른 사용자 객체 ID로 변경 요청 | 403 또는 존재를 숨긴 404 | 타인 상품 변경 404와 참여자 전용 채팅 테스트 통과 | PASS | HTTP·채팅 테스트 |
SR-INPUT-01 |
SQL Injection | 로그인 입력에 SQL 형태 문자열 전달 | 입력을 데이터로 처리하고 인증·DB 상태가 변하지 않음 | 잘못된 아이디로 일반 거부되고 기존 사용자 행 유지 | PASS | tests/security/test_cycle1_http_security.py |
SR-INPUT-01 |
XSS | 상품·소개글·채팅에 스크립트성 문자열 입력 | text로 저장되고 화면에서 escape | 템플릿 escape와 채팅 textContent 회귀 테스트 통과 |
PASS | tests/security/test_cycle1_http_security.py |
SR-SESSION-01 |
CSRF | 토큰 없는 상태 변경 요청과 위조 Origin 요청 | 403으로 차단 | 상태 변경 POST의 CSRF와 WebSocket 정확 Origin 테스트 통과 | PASS | 독립 보안 스위트 |
SR-UPLOAD-01 |
파일 업로드 우회 | 확장자/MIME 불일치, SVG, 손상·과대 파일 | 전부 거부하고 실행되지 않음 | 완전 디코딩·재인코딩, 메타데이터 제거와 우회 입력 거부 확인 | PASS | 상품 이미지·보안 테스트 |
SR-CHAT-01 |
WebSocket 인증·Origin·방 권한 | 비인증, null/위조 Origin, 제3자 방 접근 | 연결 또는 frame 단계에서 차단 | 정확 Origin, 참여자·현재 상태 재검증과 휴면 수신 차단 확인 | PASS | 채팅 unit·security 테스트 |
SR-ERROR-01 |
내부 정보 노출 | 400·403·404·500 응답과 로그 확인 | 비밀값·내부 경로·상세 예외 없음 | 로그인·신고 일반 오류와 비밀번호 로그 음성 테스트 통과, 운영 500 화면은 별도 확인 필요 | 미검증 | 운영 오류 응답 수동 확인 필요 |
4.4 자동화 테스트와 수동 테스트¶
자동화 대상¶
- 모델 제약과 서비스 단위 테스트
- HTTP 인증·권한·CSRF·입력값 통합 테스트
- WebSocket 인증·Origin·참여자·재전송 테스트
- 신고 임계값과 동시성 테스트
- 마이그레이션 생성 여부와
django check --deploy - 의존성·비밀값·정적 분석 점검
수동 대상¶
- 회원가입부터 상품·채팅·신고까지의 브라우저 흐름
- 오류 메시지와 화면 출력의 민감정보·XSS 여부
- 이미지 표시와 메타데이터 제거 결과
- 휴면·비노출 전후 화면과 만료 후 복구
- Docker Compose 시작·재시작·백업·복구
4.5 2차 개발 검증 계약¶
이 표는 구현 전에 확정한 검증 계약을 보존하면서 현재 실행 상태를 함께 표시합니다. 2차 기능의 제품 코드는 현재 main에 반영되어 있지만, 아래 세부 Test-ID를 모두 같은 조건으로 재실행했다는 뜻은 아닙니다. 2026-07-22 통합 실행과 PR #43·#44 CI 결과는 4.6과 4.7에 따로 기록했습니다.
모의 내부 잔액 이체¶
| 계획 Test-ID | 연결 정책 | 유형 | 실행할 조건 | 기대 결과 | 상태 |
|---|---|---|---|---|---|
C2-TRF-SEED-001 |
이체-범위-01 |
경계·멱등성 | 신규·기존 회원의 계정 생성을 처음·반복·병렬 실행하고 같은 계정에 TRANSFER·COMPENSATION 생성 |
회원당 계정 한 개, 초기 100,000.00, 사용자 +100,000.00·SEED_RESERVE -100,000.00의 합계 0 journal이 정확히 한 번만 생성되고 SEED 전용 부분 고유 제약은 다른 journal을 허용 |
미검증 |
C2-TRF-CLOSE-001 |
이체-계정-01 |
HTTP·동시성 | 비인증/CSRF, 잔액 0.01/0.00, 최초/반복 종료, 종료 우선·incoming/outgoing 이체 우선 barrier | 401/403, nonempty 409, 최초·반복 204; 각 순서의 원장·감사 ID/수는 유지되고 종료 감사만 성공 시 1건 | 미검증 |
C2-TRF-UNIT-001 |
이체-금액-01, 이체-잔액-01 |
HTTP·경계 | amount JSON 숫자/지수/부호/소수와 허용 문자열, 금액 1..99,999,999 정수 경계·잔액 cap 경계 | 형식 400 INVALID_REQUEST, 업무 거부 422 TRANSFER_NOT_ALLOWED, 정확한 경계 201; 거부는 잔액·journal 불변 |
미검증 |
C2-TRF-AUTH-001 |
이체-대상-01 |
권한 | 비인증 요청, 다른 발신자 위조, 자기·미존재·휴면·닫힌 발신자 또는 수취인 | 서버가 세션 행위자와 DB 현재 시각의 계정 상태를 다시 확인하고 일반화된 오류로 거부 | 미검증 |
C2-TRF-IDEM-001 |
이체-멱등-01 |
HTTP·멱등성 | recipient/정수 amount/UUID grammar, payload 차이, 병렬·응답 유실·롤백 뒤 재요청; 성공 201과 부족 잔액 422 저장 뒤 잔액·계정 상태 변경 및 BLOCKED 전환 후 같은 키를 순차·병렬 재요청 | 저장된 201·5필드 body와 422 TRANSFER_NOT_ALLOWED·오류 body를 BLOCKED 중에도 각각 그대로 반환하고 이체·journal·잔액·중복 감사 0, 새 키만 503, 다른 payload 409, 롤백 키만 한 번 처리 |
미검증 |
C2-TRF-CONC-001 |
이체-동시성-01 |
동시성 | 100,000.00에서 80,000.00씩 병렬 이체, 반대 방향 요청, 같은 키 요청과 계정 종료를 섞어 실행 | 고정 잠금 순서로 음수·중복·교착 누수가 없고 예시에서는 정확히 한 이체만 성공해 발신 잔액 20,000.00 | 미검증 |
C2-TRF-FAULT-001 |
이체-원자성-01, 이체-동시성-01 |
장애·복구 | 빈/1/3항목·합계 불일치 journal 커밋, 저장 지점 예외, 40001·40P01 최초+재시도 3회, 그 밖의 오류 |
deferred trigger가 비정상 journal을 거부하고 허용 SQLSTATE만 총 네 번 시도하며 모든 실패는 부분 상태 0건 | 미검증 |
C2-TRF-LEDGER-001 |
이체-원자성-01, 이체-보정-01, 이체-대사-01 |
불변식·복구 | journal/entry DB trigger, safety shared 새 이체와 exclusive BLOCKED 전환 barrier, 전환 뒤 새 키와 저장된 201·422 키 요청, 잘못된 incident·불일치 잔존·정상 재개 | trigger 거부, 전환 전 새 요청만 완료, 전환 뒤 늦은 커밋 0·새 키 503·저장 결과 동일 재현, 전체 불일치 0+정확 incident에서만 OPEN | 미검증 |
동시성·롤백 검증은 SQLite 대체 환경이 아닌 실제 PostgreSQL에서 실행합니다. 성공 뒤에는 계정 두 행, 이체 한 행, 상쇄되는 원장 두 행, 감사 한 건을 함께 조회해 확인합니다. 직접 수정·삭제 경로가 없는지도 확인합니다.
금액·cap fixture에는 직접 balance UPDATE를 사용하지 않습니다. test maintainer는 실제 posting 서비스로 합계 0 COMPENSATION journal과 온라인 잔액을 한 트랜잭션에서 만들어 경계 잔액을 준비합니다. 시작 전 reconciliation 불일치가 0건인지 확인하고, 성공·거부·경합 뒤에도 같은 대사를 수행합니다.
상품 검색¶
| 계획 Test-ID | 연결 정책 | 유형 | 실행할 조건 | 기대 결과 | 상태 |
|---|---|---|---|---|---|
C2-SRCH-VIS-001 |
검색-공개-01 |
권한·음성 | 같은 검색어를 공개/비노출 상품과 소유자 소개·신고·채팅·관리 메모에 각각 두고 비회원·회원·소유자·관리자로 검색 | 일반 검색은 공개 상품 제목·설명만 일치하고 비노출·금지 도메인은 결과·건수에 없으며 응답 필드는 상품 ID·제목·가격·상태·이미지·시각 allowlist뿐 | 미검증 |
C2-SRCH-INPUT-001 |
검색-입력-01 |
경계·입력 | migration backfill, 생성/수정 서비스, raw DB에 조합/분해 한글을 각각 저장하고 NFC/NFD 검색어·100/101자·C0/C1을 조합 | 저장값은 NFC, raw NFD는 DB CHECK 거부, 저장/검색어 네 조합은 같은 결과, 정규화 뒤 101자·제어문자는 상품 쿼리 전 400 | 미검증 |
C2-SRCH-FILTER-001 |
검색-필터-01 |
HTTP·조합 | status=available\|sold, min_price, max_price 허용 경계와 잘못된 상태·가격 |
허용 필드는 AND 결합한 HTML 200, 잘못된 값은 상품 쿼리 전 HTML 400 | 미검증 |
C2-SRCH-ORDER-001 |
검색-정렬-01 |
HTTP·결정성 | 생략/newest, price_asc, price_desc, 동률, 임의 값, 반복 조회 |
세 wire 값만 HTML 200이고 ID 내림차순 tie-break, 그 밖은 400 | 미검증 |
C2-SRCH-PAGE-001 |
검색-페이지-01 |
HTTP·페이지 | page 생략·1·2·3·500·501·매우 큰 값·소수·문자 |
1..500은 HTML 200, 501/형식 오류는 상품 쿼리 전 HTML 400, 결과 ID·건수 정확 | 미검증 |
C2-SRCH-RESOURCE-001 |
검색-입력-01, 검색-페이지-01 |
자원 제한 | CaptureQueriesContext를 검색 서비스 호출에만 둘러 0·20·대량 결과의 500쪽과 501쪽·매우 큰 값을 측정 |
middleware/auth/session 제외 서비스 블록에서 1..500은 count+slice 최대 2회·20행, 501 이상은 상품 쿼리 0회 | 미검증 |
정렬·페이지 테스트는 예상 상품 ID 순서를 고정해 비교합니다. 비노출 만료 경계는 애플리케이션 시각이 아니라 PostgreSQL 현재 시각으로 검증합니다. 목록 건수와 실제 행에 같은 가시성 조건이 적용되는지도 확인합니다.
관리자 기능¶
| 계획 Test-ID | 연결 정책 | 유형 | 실행할 조건 | 기대 결과 | 상태 |
|---|---|---|---|---|---|
C2-ADM-DENY-001 |
관리-최소권한-01 |
HTTP·권한 | reports/audit/apply/release/grant/revoke를 비인증·권한 부족·범위 밖·미존재로 요청 | HTML 비인증 302, staff/codename/meta-scope 부족 403, 범위 밖·미존재 404, 상태 변화 없음 | 미검증 |
C2-ADM-REQ-001 |
관리-재인증-01 |
경계·음성 | UTC 시각을 고정해 재인증 299·300·301초, GET, CSRF 없음, 사유 trim/NFC 후 9·10·500·501 code point·공백·C0/C1, stale version | 299·300초, 정규화한 10·500자, POST+CSRF, 최신 version을 모두 만족할 때만 처리 | 미검증 |
C2-ADM-MATRIX-001 |
관리-최소권한-01 |
HTTP·최소 권한 | reports/audit의 정확한 query, apply/release의 target_type=user\|product·양의 10진 ID·form, grant의 네 일반 codename allowlist, 추가·미지 필드와 권한/grant 조합 |
정확한 query/form·wire 값과 codename+grant만 HTML 200, 입력·추가 필드 400, 권한 403, 미존재·범위 밖 404, stale 409, 감사 장애 503 | 미검증 |
C2-ADM-GRANT-001 |
관리-범위-01, 관리-재인증-01 |
HTTP·권한 수명 | AdminScopeGrant grant/revoke form, moderation.manage_admin_scope, 299/300/301초, stale version, 자기 변경; --reason 경계·전용 역할·유효 관리자 0/1명·감사 실패·서로 다른 후보의 동시 bootstrap barrier |
정상 200; 입력/재인증 400, meta-scope/자기 403, stale/중복 409; bootstrap은 advisory lock 안 0명 재검사 뒤 permission+감사 각 1건만 커밋하고 패자는 결정적 거부, 감사 실패는 둘 다 0 | 미검증 |
C2-ADM-PRIV-001 |
관리-범위-01 |
개인정보·무결성 | 비밀번호/hash/session/secret, 채팅 본문, 모의 잔액·원장·감사 수정·삭제 시도 | 금지 필드를 표시하지 않고 불변 데이터와 콘텐츠의 대필 수정·물리 삭제 진입점을 제공하지 않음 | 미검증 |
C2-ADM-AUDIT-001 |
관리-감사-01 |
감사 결과 | 성공·권한 거부·version 충돌을 각각 실행 | 업무 결과마다 민감값 없는 DB 감사 정확히 1건과 기대 상태 코드가 남음 | 미검증 |
C2-ADM-AUDIT-FAIL-001 |
관리-감사-01 |
감사 장애 | 상태 변경 중 감사 INSERT 실패, 기존 감사 UPDATE·DELETE | INSERT 실패는 HTTP 503·업무 변경 0·DB 감사 0·상관 ID 오류, UPDATE·DELETE는 원본 불변으로 DB 거부 | 미검증 |
C2-ADM-APPLY-RACE-001 |
관리-가역성-01, 관리-중복-01 |
적용 경합 | 같은 대상 제재를 barrier로 병렬 적용 | 활성 제재 1·적용 성공 감사 1, 패자는 기존 결과를 반환하고 기간·기록 수를 늘리지 않음 | 미검증 |
C2-ADM-EXPIRY-001 |
관리-가역성-01, 관리-중복-01 |
만료 경계 | DB 시각을 적용 직후·만료 직전·정확한 만료·직후로 고정하고 각 시각에 release POST | 활성 수 1·1·0·0, 자연 만료 자체의 기록 0; 만료 전 해제는 SanctionRelease·성공 감사 각 1건, 만료 시각 이후 해제는 409·충돌 감사 1건·SanctionRelease 0건, 원본 보존 |
미검증 |
C2-ADM-RELEASE-RACE-001 |
관리-가역성-01, 관리-중복-01 |
해제 경합 | 활성 제재를 barrier로 병렬 조기 해제하고 반복 요청 | 활성 0, SanctionRelease 1, 해제 성공 감사 1이며 패자·반복은 저장 결과만 반환 |
미검증 |
공통 회귀·마이그레이션·근거 기준¶
- 2차 모델의 전진 적용과 직전 상태 롤백은 실제 PostgreSQL에서 검증하며, 실패 중간 상태나 데이터 유실이 없어야 합니다.
- 검색·관리·이체의 모든 HTTP 상태 변경에서 CSRF, 서버 측 권한, 일반화된 오류, 민감정보 비기록을 다시 확인합니다.
- 2차 구현 뒤 기존 1차 사용자·상품·채팅·신고·가역 제재 전체를 다시 실행해 회귀가 0건인지 확인합니다.
- 각 결과에는 Test-ID, 연결된 요구사항·정책·위협 ID, 검증 대상 버전, 실행 절차와 환경, 도구 버전, 시작·종료 시각, 기대값·실제값, 실패 뒤 수정·재검증을 남깁니다.
- 동시성·장애 테스트는 요청별 결과와 최종 DB 불변식 조회를 함께 보존합니다. 공개 보고서에는 비밀값·세션·개인정보·로컬 절대 경로를 제거한 근거만 연결합니다.
- 구현 전 설계 문서나 테스트 이름만 있는 것은 실행 근거가 아닙니다. 현재는 제품 코드가 구현된 항목을
구현됨으로 표시하고, 같은 Test-ID의 상세 실행을 확인한 항목만PASS로 표시합니다.
4.6 현재 실제 실행 결과¶
2026-07-16에 현재 1차 애플리케이션을 대상으로 아래 검증을 실행했습니다.
| 대상 | 명령 | 결과 | 판단 범위 |
|---|---|---|---|
| 전체 자동 테스트 | pytest -q |
170 tests, 217 subtests PASS | 사용자·상품·채팅·신고 정상·음성·경계·경합, 보안 설정과 2차 상세 정책 구조 |
| Django 설정 | python src/manage.py check |
PASS | 현재 테스트 설정 |
| 운영 보안 설정 | python src/manage.py check --deploy --fail-level WARNING |
PASS | 명시적 운영 환경 변수 사용 |
| 마이그레이션 | python src/manage.py makemigrations --check --dry-run |
변경 없음 | 모델과 마이그레이션 일치 |
| PostgreSQL 적용 | python src/manage.py migrate --noinput |
PASS | 실제 PostgreSQL 컨테이너 |
| 의존성 취약점 | 전체 의존성 그룹 점검 | pytest 9.0.3 적용 뒤 취약점 없음 | 개발·검증 의존성 |
| 비밀값 | 고정 버전 스캐너로 전체 Git 이력 점검 | 누출 없음 | 현재와 과거 Git 이력 |
.env 없는 Compose |
docker compose config, 이미지 빌드, 마이그레이션, up -d --wait |
PASS | 선택적 .env, 로컬 기본값, 앱·DB·Redis healthy |
| 서비스 상태와 정적 자산 | Compose 실행 후 /readyz/, /static/chat/chat.js 요청 |
모두 HTTP 200, 채팅 자산은 text/javascript |
앱·PostgreSQL 연결과 DEBUG 정적 자산 제공 |
| 재시작과 복구 | 앱·DB·Redis 재시작, PostgreSQL 백업·복원 | 재시작 복구 PASS; 복원 뒤 사용자 1명, 상품 1개, 마이그레이션 24개 일치 | 컨테이너와 데이터 복구 |
전체 170개와 하위 사례 217개는 실제 PostgreSQL·Redis 컨테이너에 연결해 실행했습니다. 계정·IP 로그인 제한 경합, 인증·IDOR·CSRF·XSS, 이미지 우회, WebSocket Origin·참여자·재전송·휴면 수신 차단, Redis 장애 이력 수렴, 동시 제재·만료, 마이그레이션 일치와 2차 상세 정책 구조를 확인했습니다. .env 파일 없이 기본 애플리케이션 Compose와 별도 테스트 Compose 오버레이에서 설정 해석, 이미지 빌드, 마이그레이션, 서비스 healthy 상태, loopback 전용 테스트 의존성, 미디어 지속성, 준비 상태 전체 제한 시간·다중 주소 대체, 재시작 복구와 백업·복원을 확인했습니다. 외부 터널 서비스는 실행하지 않았으므로 이 보고서의 검증 근거에는 포함하지 않았습니다. 이 수치는 당시 실행 결과이며 최신 main의 필수 CI 결과는 다음 절에 별도로 기록합니다.
4.7 2026-07-22 통합 최종 검증¶
검증 대상은 통합 leader head 38a5c87에서 시작한 작업 트리입니다. 전체 matrix는 한 번 실행했으며, 실패는 숨기지 않고 원인을 수정한 뒤 실패 범위만 다시 실행했습니다.
| 단계 | 최초 실행 결과 | 원인과 보정 | 실패 범위 재실행 |
|---|---|---|---|
전체 pytest -q |
307 PASS, 4 FAIL, subtest 448 PASS | 두 catalog 404 테스트는 공통 navigation의 URL namespace 결합 때문에 오류 화면 렌더링이 실패했습니다. 나머지 두 건은 구현 뒤에도 남은 미구현 구조 oracle이었습니다. navigation을 고정 same-origin 경로로 만들고 oracle을 현재 authority app·정책 추적으로 갱신했습니다. |
실패한 정확한 node 4개, 4 PASS |
| Django·migration | check PASS, drift 없음, migrate --noinput 적용할 변경 없음 |
보정 없음 | 해당 없음 |
| PostgreSQL backup→빈 DB restore | dump와 restore는 성공했으나 최초 비교 명령이 설치하지 않은 dblink 확장에 의존해 FAIL |
확장 없는 psql 비교로 바꾸고 빈 matrix_restore DB에 다시 복원 |
migration 39개·public table 45개가 원본과 일치, PASS |
| 고정 browser toolchain | 최초 harness에서 xz, 다음 harness에서 pip 부재로 제품 테스트 전 FAIL |
Playwright digest 고정 container에 필요한 압축·Python 설치 도구를 명시하고 Node 22.23.0, Python 3.12.13, uv 0.11.29를 검증 | toolchain contract PASS, desktop/mobile Playwright·axe 4 PASS |
| G017 verifier | 변경 전 집중 실행 12 PASS, 전체 pytest에서 포함 실행 | required check를 정확한 6개로 고정하고 conversation resolution, same-SHA 단조 release state와 immutable failure를 검증 | 전체 실패 범위와 별개로 verifier test는 PASS 유지 |
최종적으로 제품·보안 테스트 실패는 남지 않았습니다. 최초 full invocation은 다시 실행하지 않았으며, 307 PASS / 4 FAIL과 보정 뒤 4 PASS를 하나의 311 PASS 결과로 합쳐 쓰지 않았습니다. 실제 tag 생성, RC·formal promotion, Latest 변경, 공개 release 검증과 generic PDF 산출은 이 검증에서 수행하지 않았고 G019의 exact-main qualification 범위로 남겼습니다.
4.8 현재 main의 PR 검증¶
현재 main에 포함된 후속 변경은 별도 PR에서 필수 CI를 통과했습니다. 이는 로컬에서 실행한 전체 matrix의 수치를 새로 쓰는 근거가 아니라, 해당 PR head에 대한 GitHub Actions 결과입니다.
| PR | 변경 | 실행 | 결과 |
|---|---|---|---|
| #43 | 상품 채팅 연결 상태, 전역 가로형 로고, 정수 원화 송금 | run 30038923030 |
governance-title, unit, integration-postgres-redis, security, migration, browser-a11y 6개 모두 PASS; merge d94bade6d904ee16cbdfdad95920b4a5ff66ca63 |
| #44 | 반복적인 open→abnormal-close 재연결 한도 보정 | run 30039390145 |
위 6개 모두 PASS; merge 1467092302f789f802114f62d4d3dcfcf1b13be8 |
PR #43·#44의 browser-a11y는 홈·상품·가입·계정 화면과 정적 자산을 확인했습니다. 실제 로컬 WebSocket을 끊었다가 복구하는 수동 브라우저 캡처는 로컬 서버가 실행되지 않아 이 기록에 추가하지 않았습니다. 해당 동작은 chat.js의 연결 상태·재시도 정책과 CI unit 검증을 근거로 삼고, 실제 배포 프록시·TLS 종단은 여전히 별도 확인 대상입니다.