{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":33,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":33,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1792572865512,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 레지스트리와 런타임 집합이 같으면 위반이 없다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"레지스트리와 런타임 집합이 같으면 위반이 없다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 행 하나를 뺀 레지스트리면 선언 없음 위반이 1이다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"음성: 행 하나를 뺀 레지스트리면 선언 없음 위반이 1이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 레지스트리에 없는 경로가 런타임에 있으면 미지 경로 위반이 1이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 레지스트리에 없는 경로가 런타임에 있으면 미지 경로 위반이 1이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 레지스트리에만 있는 행은 런타임 부재 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"레지스트리에만 있는 행은 런타임 부재 위반이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 예외 경로가 런타임 집합에 없어도 위반이 0이다 (예외가 누락 검사를 덮는다)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 예외 경로가 런타임 집합에 없어도 위반이 0이다 (예외가 누락 검사를 덮는다)"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 예외 경로 7개와 접두 /swagger/ 아래 경로는 위반이 아니다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"예외 경로 7개와 접두 /swagger/ 아래 경로는 위반이 아니다"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 음성: /swagger-admin 과 /swagger-admin/x 는 예외가 아니라 미지 경로 위반이다 (접두 경계)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: /swagger-admin 과 /swagger-admin/x 는 예외가 아니라 미지 경로 위반이다 (접두 경계)"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 음성: 예외 경로의 다른 메서드(DELETE /health · POST /live)는 예외가 아니라 미지 경로 위반이다 (메서드 경계)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 예외 경로의 다른 메서드(DELETE /health · POST /live)는 예외가 아니라 미지 경로 위반이다 (메서드 경계)"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 warn 은 던지지 않고 Logger.warn 을 한 번 부른다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"warn 은 던지지 않고 Logger.warn 을 한 번 부른다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성(리뷰 R1): warn 에서 위반 0건이면 Logger.log 한 줄로 모드와 대조 행 수를 남기고 warn 은 부르지 않는다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"음성(리뷰 R1): warn 에서 위반 0건이면 Logger.log 한 줄로 모드와 대조 행 수를 남기고 warn 은 부르지 않는다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 fail 은 던진다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"fail 은 던진다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 라우터 스택 없음 입력과 수집 0건 입력은 단언 불능 위반 1건이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 라우터 스택 없음 입력과 수집 0건 입력은 단언 불능 위반 1건이다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 단언 불능은 warn 에서 던지지 않고 fail 에서 던진다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"음성: 단언 불능은 warn 에서 던지지 않고 fail 에서 던진다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 라우터 스택이 없는 Express 앱은 단언 불능으로 세고 부팅을 멈추지 않는다 (warn)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 라우터 스택이 없는 Express 앱은 단언 불능으로 세고 부팅을 멈추지 않는다 (warn)"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: fail 모드에서 라우터 스택이 없는 앱은 단언 불능으로 던진다 (fail-open 금지)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: fail 모드에서 라우터 스택이 없는 앱은 단언 불능으로 던진다 (fail-open 금지)"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":68,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 실제 라우터: 최소 Nest 모듈의 GET /zz-probe 를 수집하고 빈 레지스트리에서 미지 경로 1건이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"실제 라우터: 최소 Nest 모듈의 GET /zz-probe 를 수집하고 빈 레지스트리에서 미지 경로 1건이다"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 음성: 목록 밖 와일드카드 핸들러(/zz-export/*)는 수집에서 빠지지 않고 미지 경로 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 목록 밖 와일드카드 핸들러(/zz-export/*)는 수집에서 빠지지 않고 미지 경로 위반이다"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 실제 Swagger 경로: setupSwagger 가 만든 문서 경로(-json · -yaml · 접두)는 예외표로 덮여 위반이 없다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"실제 Swagger 경로: setupSwagger 가 만든 문서 경로(-json · -yaml · 접두)는 예외표로 덮여 위반이 없다"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 미들웨어 2층 + @Get(*) 핸들러 = 핸들러 GET /* 1건만 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"미들웨어 2층 + @Get(*) 핸들러 = 핸들러 GET /* 1건만 위반이다"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 음성: 미들웨어 층 없이 @Get(*) 핸들러만 있으면 GET /* 가 위반이다 (기준 개수로 가리지 않는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 미들웨어 층 없이 @Get(*) 핸들러만 있으면 GET /* 가 위반이다 (기준 개수로 가리지 않는다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 음성: 미들웨어 층이 1개로 줄고 핸들러가 남으면 위반이 숨지 않는다 (슬롯 빌림 금지)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 미들웨어 층이 1개로 줄고 핸들러가 남으면 위반이 숨지 않는다 (슬롯 빌림 금지)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (M4 · 1509 반례)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (M4 · 1509 반례) 미선언 와일드카드 핸들러는 위반으로 잡힌다 (미들웨어 2층은 빼고 핸들러 층은 남긴다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"미선언 와일드카드 핸들러는 위반으로 잡힌다 (미들웨어 2층은 빼고 핸들러 층은 남긴다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다) 음성(리뷰 R1 codex): 미들웨어 1층 + 미선언 @All(*) 면 핸들러 층 ACL 이 위반으로 남는다 (층 수 2 로 가리지 않는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성(리뷰 R1 codex): 미들웨어 1층 + 미선언 @All(*) 면 핸들러 층 ACL 이 위반으로 남는다 (층 수 2 로 가리지 않는다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다)"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다) 미들웨어 2층 + 미선언 @All(*): 미들웨어 두 층은 빠지고 핸들러 층의 GET /* 가 1건 위반으로 남는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"미들웨어 2층 + 미선언 @All(*): 미들웨어 두 층은 빠지고 핸들러 층의 GET /* 가 1건 위반으로 남는다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 main.ts 는 listen 앞에서 비주석 부팅 단언 호출을 정확히 한 번 한다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"main.ts 는 listen 앞에서 비주석 부팅 단언 호출을 정확히 한 번 한다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 음성: 호출을 주석 처리하면 호출 0건이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 호출을 주석 처리하면 호출 0건이다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 음성: 호출을 listen 뒤로 옮기면 before 가 거짓이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 호출을 listen 뒤로 옮기면 before 가 거짓이다"},{"ancestorTitles":["접근 계약 실제 AppModule 대조"],"duration":1692,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 AppModule 대조 실제 AppModule: setupSwagger 를 붙인 앱이 fail 단언을 통과하고 미선언 핸들러가 없다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"실제 AppModule: setupSwagger 를 붙인 앱이 fail 단언을 통과하고 미선언 핸들러가 없다"},{"ancestorTitles":["접근 계약 범위 선언 (M6b Task 5)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 범위 선언 (M6b Task 5) 현재 레지스트리는 범위 선언 누락 위반이 0건이다 (골든 목록 대조)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"현재 레지스트리는 범위 선언 누락 위반이 0건이다 (골든 목록 대조)"},{"ancestorTitles":["접근 계약 범위 선언 (M6b Task 5)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 범위 선언 (M6b Task 5) 범위 선언 누락 1건: 신규 영업 자동 칸 행 하나를 더한 사본은 위반이 1이다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"범위 선언 누락 1건: 신규 영업 자동 칸 행 하나를 더한 사본은 위반이 1이다"},{"ancestorTitles":["접근 계약 범위 선언 (M6b Task 5)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 범위 선언 (M6b Task 5) 범위 선언 누락 1건: 저자 선언(author) 이면 신규 행도 위반이 아니다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"범위 선언 누락 1건: 저자 선언(author) 이면 신규 행도 위반이 아니다"},{"ancestorTitles":["접근 계약 범위 선언 (M6b Task 5)"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 범위 선언 (M6b Task 5) 범위 필드가 없는 행은 조용히 통과하지 않고 단언 불능으로 센다 (fail-closed)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"범위 필드가 없는 행은 조용히 통과하지 않고 단언 불능으로 센다 (fail-closed)"},{"ancestorTitles":["접근 계약 범위 선언 (M6b Task 5)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 범위 선언 (M6b Task 5) fail 모드는 던진다: 범위 선언 누락 위반이 있으면 부팅 단언이 멈춘다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"fail 모드는 던진다: 범위 선언 누락 위반이 있으면 부팅 단언이 멈춘다"}],"endTime":1792572867717,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.spec.ts","startTime":1792572865639,"status":"passed","summary":""}],"wasInterrupted":false}
