feat: 설계 문서 추가
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
a6588890cf1eed348dc6d679515d0a403839416945a40fac1369963f7ee58167 docs/superpowers/specs/2026-08-11-mongodb-document-persistence-platform-design.md
|
||||
d2897d321ed6868e46f02f5e5d327425a48ff285b532d10923323477a395d6de docs/superpowers/plans/2026-08-11-mongodb-document-persistence-platform-implementation-plan.md
|
||||
f677e44fcf138b38154c27230d6322d4c18919f5960fc30c07f03cea40758acd docs/superpowers/plans/2026-08-11-mongodb-advanced-capabilities-expansion-plan.md
|
||||
e8fa3d09372956ad65a1984c2fd3b4d30c34896593a34bc40eb5d147cbc593a8 README.md
|
||||
d196c4e4c1510273e29f9f7267ab74bce32f3da59a40a3d6f1615b9c32428745 VALIDATION.md
|
||||
a5e807fd4416a718818729ea37222cdf104c58962cac5154e1e5976011b03f12 validate_mongodb_docs.py
|
||||
@@ -0,0 +1,42 @@
|
||||
# MongoDB Superpowers 문서 패키지
|
||||
|
||||
이 패키지는 첨부된 `MongoDB 문서 영속성 플랫폼 심층 리서치`를 요구사항 원본으로 사용해 작성한 설계서와 구현 계획서다.
|
||||
|
||||
## 파일
|
||||
|
||||
```text
|
||||
docs/superpowers/specs/2026-08-11-mongodb-document-persistence-platform-design.md
|
||||
docs/superpowers/plans/2026-08-11-mongodb-document-persistence-platform-implementation-plan.md
|
||||
docs/superpowers/plans/2026-08-11-mongodb-advanced-capabilities-expansion-plan.md
|
||||
VALIDATION.md
|
||||
validate_mongodb_docs.py
|
||||
MANIFEST.sha256
|
||||
```
|
||||
|
||||
## 적용 가정
|
||||
|
||||
```text
|
||||
Java 21
|
||||
Gradle Kotlin DSL
|
||||
Spring Boot 4.1 BOM
|
||||
Spring Data MongoDB 5.1
|
||||
Boot-managed MongoDB Java Driver
|
||||
MongoDB 8.0 primary certification
|
||||
MongoDB 7.0 compatibility
|
||||
root package: io.backend.skeleton.mongodb
|
||||
stable modules: modules/mongodb
|
||||
advanced modules: modules/mongodb-advanced
|
||||
```
|
||||
|
||||
실제 Backend Skeleton 저장소 구조가 입력에 포함되지 않았으므로 파일 경로는 위 가정에 따라 확정했다. 적용 시 기존 version catalog와 공통 build logic에 경로만 매핑하고 공개 계약과 신뢰성 의미론은 유지한다.
|
||||
|
||||
## 실행 순서
|
||||
|
||||
```text
|
||||
Stable Implementation Plan Task 1~50
|
||||
→ Stable Release Gate
|
||||
→ Advanced Plan Task 1~15
|
||||
→ capability별 Promotion Gate
|
||||
```
|
||||
|
||||
Stable 구현 전에 Advanced 모듈을 Starter에 추가하지 않는다.
|
||||
@@ -0,0 +1,737 @@
|
||||
# MongoDB Superpowers 문서 정적 검증 결과
|
||||
|
||||
## 결과
|
||||
|
||||
```text
|
||||
SUMMARY | total=687 pass=687 fail=0
|
||||
```
|
||||
|
||||
| 항목 | 값 |
|
||||
|---|---:|
|
||||
| 설계서 행 수 | 1303 |
|
||||
| Stable 구현 계획서 행 수 | 3943 |
|
||||
| Advanced 구현 계획서 행 수 | 1139 |
|
||||
| Stable Task | 50 |
|
||||
| Advanced Task | 15 |
|
||||
| Stable Create 경로 | 252 |
|
||||
| Advanced Create 경로 | 77 |
|
||||
|
||||
## 검증 범위
|
||||
|
||||
```text
|
||||
설계 핵심 결정 존재
|
||||
Task 번호 연속성
|
||||
모든 Task의 Files·Interfaces·Implementation requirements
|
||||
모든 Task의 Step 1~5
|
||||
Task별 실패·통과 예상 결과와 Commit
|
||||
Create 경로 중복·충돌
|
||||
Markdown code fence 균형
|
||||
TODO·TBD·FIXME 부재
|
||||
범용 Mongo Repository 실제 선언 부재
|
||||
Runtime arbitrary runCommand public API 부재
|
||||
Stable API V1 strict와 Replica Set 기준
|
||||
Transaction body retry와 commit retry 분리
|
||||
Change Stream at-least-once 계약
|
||||
TTL cleanup-only 계약
|
||||
GridFS compatibility-only 계약
|
||||
Stable·Advanced dependency 격리
|
||||
MongoDB 7.0·8.0 호환 Matrix
|
||||
Advanced actual topology promotion gate
|
||||
```
|
||||
|
||||
## 전체 검사 로그
|
||||
|
||||
```text
|
||||
PASS | design exists
|
||||
PASS | stable plan exists
|
||||
PASS | advanced plan exists
|
||||
PASS | design purpose
|
||||
PASS | domain ownership
|
||||
PASS | no generic repository design
|
||||
PASS | stable api strict
|
||||
PASS | local replica set
|
||||
PASS | standalone smoke only
|
||||
PASS | bson manifest
|
||||
PASS | transaction retry separation
|
||||
PASS | change stream at least once
|
||||
PASS | ttl cleanup only
|
||||
PASS | gridfs compatibility only
|
||||
PASS | driver native observability
|
||||
PASS | stable task count | 50
|
||||
PASS | stable task sequence | [1, 2, 3]...[48, 49, 50]
|
||||
PASS | stable task 1 has **Files:**
|
||||
PASS | stable task 1 has **Interfaces:**
|
||||
PASS | stable task 1 has **Implementation requirements:**
|
||||
PASS | stable task 1 has **Step 1:
|
||||
PASS | stable task 1 has **Step 2:
|
||||
PASS | stable task 1 has **Step 3:
|
||||
PASS | stable task 1 has **Step 4:
|
||||
PASS | stable task 1 has **Step 5:
|
||||
PASS | stable task 1 has commit
|
||||
PASS | stable task 1 has expected result
|
||||
PASS | stable task 2 has **Files:**
|
||||
PASS | stable task 2 has **Interfaces:**
|
||||
PASS | stable task 2 has **Implementation requirements:**
|
||||
PASS | stable task 2 has **Step 1:
|
||||
PASS | stable task 2 has **Step 2:
|
||||
PASS | stable task 2 has **Step 3:
|
||||
PASS | stable task 2 has **Step 4:
|
||||
PASS | stable task 2 has **Step 5:
|
||||
PASS | stable task 2 has commit
|
||||
PASS | stable task 2 has expected result
|
||||
PASS | stable task 3 has **Files:**
|
||||
PASS | stable task 3 has **Interfaces:**
|
||||
PASS | stable task 3 has **Implementation requirements:**
|
||||
PASS | stable task 3 has **Step 1:
|
||||
PASS | stable task 3 has **Step 2:
|
||||
PASS | stable task 3 has **Step 3:
|
||||
PASS | stable task 3 has **Step 4:
|
||||
PASS | stable task 3 has **Step 5:
|
||||
PASS | stable task 3 has commit
|
||||
PASS | stable task 3 has expected result
|
||||
PASS | stable task 4 has **Files:**
|
||||
PASS | stable task 4 has **Interfaces:**
|
||||
PASS | stable task 4 has **Implementation requirements:**
|
||||
PASS | stable task 4 has **Step 1:
|
||||
PASS | stable task 4 has **Step 2:
|
||||
PASS | stable task 4 has **Step 3:
|
||||
PASS | stable task 4 has **Step 4:
|
||||
PASS | stable task 4 has **Step 5:
|
||||
PASS | stable task 4 has commit
|
||||
PASS | stable task 4 has expected result
|
||||
PASS | stable task 5 has **Files:**
|
||||
PASS | stable task 5 has **Interfaces:**
|
||||
PASS | stable task 5 has **Implementation requirements:**
|
||||
PASS | stable task 5 has **Step 1:
|
||||
PASS | stable task 5 has **Step 2:
|
||||
PASS | stable task 5 has **Step 3:
|
||||
PASS | stable task 5 has **Step 4:
|
||||
PASS | stable task 5 has **Step 5:
|
||||
PASS | stable task 5 has commit
|
||||
PASS | stable task 5 has expected result
|
||||
PASS | stable task 6 has **Files:**
|
||||
PASS | stable task 6 has **Interfaces:**
|
||||
PASS | stable task 6 has **Implementation requirements:**
|
||||
PASS | stable task 6 has **Step 1:
|
||||
PASS | stable task 6 has **Step 2:
|
||||
PASS | stable task 6 has **Step 3:
|
||||
PASS | stable task 6 has **Step 4:
|
||||
PASS | stable task 6 has **Step 5:
|
||||
PASS | stable task 6 has commit
|
||||
PASS | stable task 6 has expected result
|
||||
PASS | stable task 7 has **Files:**
|
||||
PASS | stable task 7 has **Interfaces:**
|
||||
PASS | stable task 7 has **Implementation requirements:**
|
||||
PASS | stable task 7 has **Step 1:
|
||||
PASS | stable task 7 has **Step 2:
|
||||
PASS | stable task 7 has **Step 3:
|
||||
PASS | stable task 7 has **Step 4:
|
||||
PASS | stable task 7 has **Step 5:
|
||||
PASS | stable task 7 has commit
|
||||
PASS | stable task 7 has expected result
|
||||
PASS | stable task 8 has **Files:**
|
||||
PASS | stable task 8 has **Interfaces:**
|
||||
PASS | stable task 8 has **Implementation requirements:**
|
||||
PASS | stable task 8 has **Step 1:
|
||||
PASS | stable task 8 has **Step 2:
|
||||
PASS | stable task 8 has **Step 3:
|
||||
PASS | stable task 8 has **Step 4:
|
||||
PASS | stable task 8 has **Step 5:
|
||||
PASS | stable task 8 has commit
|
||||
PASS | stable task 8 has expected result
|
||||
PASS | stable task 9 has **Files:**
|
||||
PASS | stable task 9 has **Interfaces:**
|
||||
PASS | stable task 9 has **Implementation requirements:**
|
||||
PASS | stable task 9 has **Step 1:
|
||||
PASS | stable task 9 has **Step 2:
|
||||
PASS | stable task 9 has **Step 3:
|
||||
PASS | stable task 9 has **Step 4:
|
||||
PASS | stable task 9 has **Step 5:
|
||||
PASS | stable task 9 has commit
|
||||
PASS | stable task 9 has expected result
|
||||
PASS | stable task 10 has **Files:**
|
||||
PASS | stable task 10 has **Interfaces:**
|
||||
PASS | stable task 10 has **Implementation requirements:**
|
||||
PASS | stable task 10 has **Step 1:
|
||||
PASS | stable task 10 has **Step 2:
|
||||
PASS | stable task 10 has **Step 3:
|
||||
PASS | stable task 10 has **Step 4:
|
||||
PASS | stable task 10 has **Step 5:
|
||||
PASS | stable task 10 has commit
|
||||
PASS | stable task 10 has expected result
|
||||
PASS | stable task 11 has **Files:**
|
||||
PASS | stable task 11 has **Interfaces:**
|
||||
PASS | stable task 11 has **Implementation requirements:**
|
||||
PASS | stable task 11 has **Step 1:
|
||||
PASS | stable task 11 has **Step 2:
|
||||
PASS | stable task 11 has **Step 3:
|
||||
PASS | stable task 11 has **Step 4:
|
||||
PASS | stable task 11 has **Step 5:
|
||||
PASS | stable task 11 has commit
|
||||
PASS | stable task 11 has expected result
|
||||
PASS | stable task 12 has **Files:**
|
||||
PASS | stable task 12 has **Interfaces:**
|
||||
PASS | stable task 12 has **Implementation requirements:**
|
||||
PASS | stable task 12 has **Step 1:
|
||||
PASS | stable task 12 has **Step 2:
|
||||
PASS | stable task 12 has **Step 3:
|
||||
PASS | stable task 12 has **Step 4:
|
||||
PASS | stable task 12 has **Step 5:
|
||||
PASS | stable task 12 has commit
|
||||
PASS | stable task 12 has expected result
|
||||
PASS | stable task 13 has **Files:**
|
||||
PASS | stable task 13 has **Interfaces:**
|
||||
PASS | stable task 13 has **Implementation requirements:**
|
||||
PASS | stable task 13 has **Step 1:
|
||||
PASS | stable task 13 has **Step 2:
|
||||
PASS | stable task 13 has **Step 3:
|
||||
PASS | stable task 13 has **Step 4:
|
||||
PASS | stable task 13 has **Step 5:
|
||||
PASS | stable task 13 has commit
|
||||
PASS | stable task 13 has expected result
|
||||
PASS | stable task 14 has **Files:**
|
||||
PASS | stable task 14 has **Interfaces:**
|
||||
PASS | stable task 14 has **Implementation requirements:**
|
||||
PASS | stable task 14 has **Step 1:
|
||||
PASS | stable task 14 has **Step 2:
|
||||
PASS | stable task 14 has **Step 3:
|
||||
PASS | stable task 14 has **Step 4:
|
||||
PASS | stable task 14 has **Step 5:
|
||||
PASS | stable task 14 has commit
|
||||
PASS | stable task 14 has expected result
|
||||
PASS | stable task 15 has **Files:**
|
||||
PASS | stable task 15 has **Interfaces:**
|
||||
PASS | stable task 15 has **Implementation requirements:**
|
||||
PASS | stable task 15 has **Step 1:
|
||||
PASS | stable task 15 has **Step 2:
|
||||
PASS | stable task 15 has **Step 3:
|
||||
PASS | stable task 15 has **Step 4:
|
||||
PASS | stable task 15 has **Step 5:
|
||||
PASS | stable task 15 has commit
|
||||
PASS | stable task 15 has expected result
|
||||
PASS | stable task 16 has **Files:**
|
||||
PASS | stable task 16 has **Interfaces:**
|
||||
PASS | stable task 16 has **Implementation requirements:**
|
||||
PASS | stable task 16 has **Step 1:
|
||||
PASS | stable task 16 has **Step 2:
|
||||
PASS | stable task 16 has **Step 3:
|
||||
PASS | stable task 16 has **Step 4:
|
||||
PASS | stable task 16 has **Step 5:
|
||||
PASS | stable task 16 has commit
|
||||
PASS | stable task 16 has expected result
|
||||
PASS | stable task 17 has **Files:**
|
||||
PASS | stable task 17 has **Interfaces:**
|
||||
PASS | stable task 17 has **Implementation requirements:**
|
||||
PASS | stable task 17 has **Step 1:
|
||||
PASS | stable task 17 has **Step 2:
|
||||
PASS | stable task 17 has **Step 3:
|
||||
PASS | stable task 17 has **Step 4:
|
||||
PASS | stable task 17 has **Step 5:
|
||||
PASS | stable task 17 has commit
|
||||
PASS | stable task 17 has expected result
|
||||
PASS | stable task 18 has **Files:**
|
||||
PASS | stable task 18 has **Interfaces:**
|
||||
PASS | stable task 18 has **Implementation requirements:**
|
||||
PASS | stable task 18 has **Step 1:
|
||||
PASS | stable task 18 has **Step 2:
|
||||
PASS | stable task 18 has **Step 3:
|
||||
PASS | stable task 18 has **Step 4:
|
||||
PASS | stable task 18 has **Step 5:
|
||||
PASS | stable task 18 has commit
|
||||
PASS | stable task 18 has expected result
|
||||
PASS | stable task 19 has **Files:**
|
||||
PASS | stable task 19 has **Interfaces:**
|
||||
PASS | stable task 19 has **Implementation requirements:**
|
||||
PASS | stable task 19 has **Step 1:
|
||||
PASS | stable task 19 has **Step 2:
|
||||
PASS | stable task 19 has **Step 3:
|
||||
PASS | stable task 19 has **Step 4:
|
||||
PASS | stable task 19 has **Step 5:
|
||||
PASS | stable task 19 has commit
|
||||
PASS | stable task 19 has expected result
|
||||
PASS | stable task 20 has **Files:**
|
||||
PASS | stable task 20 has **Interfaces:**
|
||||
PASS | stable task 20 has **Implementation requirements:**
|
||||
PASS | stable task 20 has **Step 1:
|
||||
PASS | stable task 20 has **Step 2:
|
||||
PASS | stable task 20 has **Step 3:
|
||||
PASS | stable task 20 has **Step 4:
|
||||
PASS | stable task 20 has **Step 5:
|
||||
PASS | stable task 20 has commit
|
||||
PASS | stable task 20 has expected result
|
||||
PASS | stable task 21 has **Files:**
|
||||
PASS | stable task 21 has **Interfaces:**
|
||||
PASS | stable task 21 has **Implementation requirements:**
|
||||
PASS | stable task 21 has **Step 1:
|
||||
PASS | stable task 21 has **Step 2:
|
||||
PASS | stable task 21 has **Step 3:
|
||||
PASS | stable task 21 has **Step 4:
|
||||
PASS | stable task 21 has **Step 5:
|
||||
PASS | stable task 21 has commit
|
||||
PASS | stable task 21 has expected result
|
||||
PASS | stable task 22 has **Files:**
|
||||
PASS | stable task 22 has **Interfaces:**
|
||||
PASS | stable task 22 has **Implementation requirements:**
|
||||
PASS | stable task 22 has **Step 1:
|
||||
PASS | stable task 22 has **Step 2:
|
||||
PASS | stable task 22 has **Step 3:
|
||||
PASS | stable task 22 has **Step 4:
|
||||
PASS | stable task 22 has **Step 5:
|
||||
PASS | stable task 22 has commit
|
||||
PASS | stable task 22 has expected result
|
||||
PASS | stable task 23 has **Files:**
|
||||
PASS | stable task 23 has **Interfaces:**
|
||||
PASS | stable task 23 has **Implementation requirements:**
|
||||
PASS | stable task 23 has **Step 1:
|
||||
PASS | stable task 23 has **Step 2:
|
||||
PASS | stable task 23 has **Step 3:
|
||||
PASS | stable task 23 has **Step 4:
|
||||
PASS | stable task 23 has **Step 5:
|
||||
PASS | stable task 23 has commit
|
||||
PASS | stable task 23 has expected result
|
||||
PASS | stable task 24 has **Files:**
|
||||
PASS | stable task 24 has **Interfaces:**
|
||||
PASS | stable task 24 has **Implementation requirements:**
|
||||
PASS | stable task 24 has **Step 1:
|
||||
PASS | stable task 24 has **Step 2:
|
||||
PASS | stable task 24 has **Step 3:
|
||||
PASS | stable task 24 has **Step 4:
|
||||
PASS | stable task 24 has **Step 5:
|
||||
PASS | stable task 24 has commit
|
||||
PASS | stable task 24 has expected result
|
||||
PASS | stable task 25 has **Files:**
|
||||
PASS | stable task 25 has **Interfaces:**
|
||||
PASS | stable task 25 has **Implementation requirements:**
|
||||
PASS | stable task 25 has **Step 1:
|
||||
PASS | stable task 25 has **Step 2:
|
||||
PASS | stable task 25 has **Step 3:
|
||||
PASS | stable task 25 has **Step 4:
|
||||
PASS | stable task 25 has **Step 5:
|
||||
PASS | stable task 25 has commit
|
||||
PASS | stable task 25 has expected result
|
||||
PASS | stable task 26 has **Files:**
|
||||
PASS | stable task 26 has **Interfaces:**
|
||||
PASS | stable task 26 has **Implementation requirements:**
|
||||
PASS | stable task 26 has **Step 1:
|
||||
PASS | stable task 26 has **Step 2:
|
||||
PASS | stable task 26 has **Step 3:
|
||||
PASS | stable task 26 has **Step 4:
|
||||
PASS | stable task 26 has **Step 5:
|
||||
PASS | stable task 26 has commit
|
||||
PASS | stable task 26 has expected result
|
||||
PASS | stable task 27 has **Files:**
|
||||
PASS | stable task 27 has **Interfaces:**
|
||||
PASS | stable task 27 has **Implementation requirements:**
|
||||
PASS | stable task 27 has **Step 1:
|
||||
PASS | stable task 27 has **Step 2:
|
||||
PASS | stable task 27 has **Step 3:
|
||||
PASS | stable task 27 has **Step 4:
|
||||
PASS | stable task 27 has **Step 5:
|
||||
PASS | stable task 27 has commit
|
||||
PASS | stable task 27 has expected result
|
||||
PASS | stable task 28 has **Files:**
|
||||
PASS | stable task 28 has **Interfaces:**
|
||||
PASS | stable task 28 has **Implementation requirements:**
|
||||
PASS | stable task 28 has **Step 1:
|
||||
PASS | stable task 28 has **Step 2:
|
||||
PASS | stable task 28 has **Step 3:
|
||||
PASS | stable task 28 has **Step 4:
|
||||
PASS | stable task 28 has **Step 5:
|
||||
PASS | stable task 28 has commit
|
||||
PASS | stable task 28 has expected result
|
||||
PASS | stable task 29 has **Files:**
|
||||
PASS | stable task 29 has **Interfaces:**
|
||||
PASS | stable task 29 has **Implementation requirements:**
|
||||
PASS | stable task 29 has **Step 1:
|
||||
PASS | stable task 29 has **Step 2:
|
||||
PASS | stable task 29 has **Step 3:
|
||||
PASS | stable task 29 has **Step 4:
|
||||
PASS | stable task 29 has **Step 5:
|
||||
PASS | stable task 29 has commit
|
||||
PASS | stable task 29 has expected result
|
||||
PASS | stable task 30 has **Files:**
|
||||
PASS | stable task 30 has **Interfaces:**
|
||||
PASS | stable task 30 has **Implementation requirements:**
|
||||
PASS | stable task 30 has **Step 1:
|
||||
PASS | stable task 30 has **Step 2:
|
||||
PASS | stable task 30 has **Step 3:
|
||||
PASS | stable task 30 has **Step 4:
|
||||
PASS | stable task 30 has **Step 5:
|
||||
PASS | stable task 30 has commit
|
||||
PASS | stable task 30 has expected result
|
||||
PASS | stable task 31 has **Files:**
|
||||
PASS | stable task 31 has **Interfaces:**
|
||||
PASS | stable task 31 has **Implementation requirements:**
|
||||
PASS | stable task 31 has **Step 1:
|
||||
PASS | stable task 31 has **Step 2:
|
||||
PASS | stable task 31 has **Step 3:
|
||||
PASS | stable task 31 has **Step 4:
|
||||
PASS | stable task 31 has **Step 5:
|
||||
PASS | stable task 31 has commit
|
||||
PASS | stable task 31 has expected result
|
||||
PASS | stable task 32 has **Files:**
|
||||
PASS | stable task 32 has **Interfaces:**
|
||||
PASS | stable task 32 has **Implementation requirements:**
|
||||
PASS | stable task 32 has **Step 1:
|
||||
PASS | stable task 32 has **Step 2:
|
||||
PASS | stable task 32 has **Step 3:
|
||||
PASS | stable task 32 has **Step 4:
|
||||
PASS | stable task 32 has **Step 5:
|
||||
PASS | stable task 32 has commit
|
||||
PASS | stable task 32 has expected result
|
||||
PASS | stable task 33 has **Files:**
|
||||
PASS | stable task 33 has **Interfaces:**
|
||||
PASS | stable task 33 has **Implementation requirements:**
|
||||
PASS | stable task 33 has **Step 1:
|
||||
PASS | stable task 33 has **Step 2:
|
||||
PASS | stable task 33 has **Step 3:
|
||||
PASS | stable task 33 has **Step 4:
|
||||
PASS | stable task 33 has **Step 5:
|
||||
PASS | stable task 33 has commit
|
||||
PASS | stable task 33 has expected result
|
||||
PASS | stable task 34 has **Files:**
|
||||
PASS | stable task 34 has **Interfaces:**
|
||||
PASS | stable task 34 has **Implementation requirements:**
|
||||
PASS | stable task 34 has **Step 1:
|
||||
PASS | stable task 34 has **Step 2:
|
||||
PASS | stable task 34 has **Step 3:
|
||||
PASS | stable task 34 has **Step 4:
|
||||
PASS | stable task 34 has **Step 5:
|
||||
PASS | stable task 34 has commit
|
||||
PASS | stable task 34 has expected result
|
||||
PASS | stable task 35 has **Files:**
|
||||
PASS | stable task 35 has **Interfaces:**
|
||||
PASS | stable task 35 has **Implementation requirements:**
|
||||
PASS | stable task 35 has **Step 1:
|
||||
PASS | stable task 35 has **Step 2:
|
||||
PASS | stable task 35 has **Step 3:
|
||||
PASS | stable task 35 has **Step 4:
|
||||
PASS | stable task 35 has **Step 5:
|
||||
PASS | stable task 35 has commit
|
||||
PASS | stable task 35 has expected result
|
||||
PASS | stable task 36 has **Files:**
|
||||
PASS | stable task 36 has **Interfaces:**
|
||||
PASS | stable task 36 has **Implementation requirements:**
|
||||
PASS | stable task 36 has **Step 1:
|
||||
PASS | stable task 36 has **Step 2:
|
||||
PASS | stable task 36 has **Step 3:
|
||||
PASS | stable task 36 has **Step 4:
|
||||
PASS | stable task 36 has **Step 5:
|
||||
PASS | stable task 36 has commit
|
||||
PASS | stable task 36 has expected result
|
||||
PASS | stable task 37 has **Files:**
|
||||
PASS | stable task 37 has **Interfaces:**
|
||||
PASS | stable task 37 has **Implementation requirements:**
|
||||
PASS | stable task 37 has **Step 1:
|
||||
PASS | stable task 37 has **Step 2:
|
||||
PASS | stable task 37 has **Step 3:
|
||||
PASS | stable task 37 has **Step 4:
|
||||
PASS | stable task 37 has **Step 5:
|
||||
PASS | stable task 37 has commit
|
||||
PASS | stable task 37 has expected result
|
||||
PASS | stable task 38 has **Files:**
|
||||
PASS | stable task 38 has **Interfaces:**
|
||||
PASS | stable task 38 has **Implementation requirements:**
|
||||
PASS | stable task 38 has **Step 1:
|
||||
PASS | stable task 38 has **Step 2:
|
||||
PASS | stable task 38 has **Step 3:
|
||||
PASS | stable task 38 has **Step 4:
|
||||
PASS | stable task 38 has **Step 5:
|
||||
PASS | stable task 38 has commit
|
||||
PASS | stable task 38 has expected result
|
||||
PASS | stable task 39 has **Files:**
|
||||
PASS | stable task 39 has **Interfaces:**
|
||||
PASS | stable task 39 has **Implementation requirements:**
|
||||
PASS | stable task 39 has **Step 1:
|
||||
PASS | stable task 39 has **Step 2:
|
||||
PASS | stable task 39 has **Step 3:
|
||||
PASS | stable task 39 has **Step 4:
|
||||
PASS | stable task 39 has **Step 5:
|
||||
PASS | stable task 39 has commit
|
||||
PASS | stable task 39 has expected result
|
||||
PASS | stable task 40 has **Files:**
|
||||
PASS | stable task 40 has **Interfaces:**
|
||||
PASS | stable task 40 has **Implementation requirements:**
|
||||
PASS | stable task 40 has **Step 1:
|
||||
PASS | stable task 40 has **Step 2:
|
||||
PASS | stable task 40 has **Step 3:
|
||||
PASS | stable task 40 has **Step 4:
|
||||
PASS | stable task 40 has **Step 5:
|
||||
PASS | stable task 40 has commit
|
||||
PASS | stable task 40 has expected result
|
||||
PASS | stable task 41 has **Files:**
|
||||
PASS | stable task 41 has **Interfaces:**
|
||||
PASS | stable task 41 has **Implementation requirements:**
|
||||
PASS | stable task 41 has **Step 1:
|
||||
PASS | stable task 41 has **Step 2:
|
||||
PASS | stable task 41 has **Step 3:
|
||||
PASS | stable task 41 has **Step 4:
|
||||
PASS | stable task 41 has **Step 5:
|
||||
PASS | stable task 41 has commit
|
||||
PASS | stable task 41 has expected result
|
||||
PASS | stable task 42 has **Files:**
|
||||
PASS | stable task 42 has **Interfaces:**
|
||||
PASS | stable task 42 has **Implementation requirements:**
|
||||
PASS | stable task 42 has **Step 1:
|
||||
PASS | stable task 42 has **Step 2:
|
||||
PASS | stable task 42 has **Step 3:
|
||||
PASS | stable task 42 has **Step 4:
|
||||
PASS | stable task 42 has **Step 5:
|
||||
PASS | stable task 42 has commit
|
||||
PASS | stable task 42 has expected result
|
||||
PASS | stable task 43 has **Files:**
|
||||
PASS | stable task 43 has **Interfaces:**
|
||||
PASS | stable task 43 has **Implementation requirements:**
|
||||
PASS | stable task 43 has **Step 1:
|
||||
PASS | stable task 43 has **Step 2:
|
||||
PASS | stable task 43 has **Step 3:
|
||||
PASS | stable task 43 has **Step 4:
|
||||
PASS | stable task 43 has **Step 5:
|
||||
PASS | stable task 43 has commit
|
||||
PASS | stable task 43 has expected result
|
||||
PASS | stable task 44 has **Files:**
|
||||
PASS | stable task 44 has **Interfaces:**
|
||||
PASS | stable task 44 has **Implementation requirements:**
|
||||
PASS | stable task 44 has **Step 1:
|
||||
PASS | stable task 44 has **Step 2:
|
||||
PASS | stable task 44 has **Step 3:
|
||||
PASS | stable task 44 has **Step 4:
|
||||
PASS | stable task 44 has **Step 5:
|
||||
PASS | stable task 44 has commit
|
||||
PASS | stable task 44 has expected result
|
||||
PASS | stable task 45 has **Files:**
|
||||
PASS | stable task 45 has **Interfaces:**
|
||||
PASS | stable task 45 has **Implementation requirements:**
|
||||
PASS | stable task 45 has **Step 1:
|
||||
PASS | stable task 45 has **Step 2:
|
||||
PASS | stable task 45 has **Step 3:
|
||||
PASS | stable task 45 has **Step 4:
|
||||
PASS | stable task 45 has **Step 5:
|
||||
PASS | stable task 45 has commit
|
||||
PASS | stable task 45 has expected result
|
||||
PASS | stable task 46 has **Files:**
|
||||
PASS | stable task 46 has **Interfaces:**
|
||||
PASS | stable task 46 has **Implementation requirements:**
|
||||
PASS | stable task 46 has **Step 1:
|
||||
PASS | stable task 46 has **Step 2:
|
||||
PASS | stable task 46 has **Step 3:
|
||||
PASS | stable task 46 has **Step 4:
|
||||
PASS | stable task 46 has **Step 5:
|
||||
PASS | stable task 46 has commit
|
||||
PASS | stable task 46 has expected result
|
||||
PASS | stable task 47 has **Files:**
|
||||
PASS | stable task 47 has **Interfaces:**
|
||||
PASS | stable task 47 has **Implementation requirements:**
|
||||
PASS | stable task 47 has **Step 1:
|
||||
PASS | stable task 47 has **Step 2:
|
||||
PASS | stable task 47 has **Step 3:
|
||||
PASS | stable task 47 has **Step 4:
|
||||
PASS | stable task 47 has **Step 5:
|
||||
PASS | stable task 47 has commit
|
||||
PASS | stable task 47 has expected result
|
||||
PASS | stable task 48 has **Files:**
|
||||
PASS | stable task 48 has **Interfaces:**
|
||||
PASS | stable task 48 has **Implementation requirements:**
|
||||
PASS | stable task 48 has **Step 1:
|
||||
PASS | stable task 48 has **Step 2:
|
||||
PASS | stable task 48 has **Step 3:
|
||||
PASS | stable task 48 has **Step 4:
|
||||
PASS | stable task 48 has **Step 5:
|
||||
PASS | stable task 48 has commit
|
||||
PASS | stable task 48 has expected result
|
||||
PASS | stable task 49 has **Files:**
|
||||
PASS | stable task 49 has **Interfaces:**
|
||||
PASS | stable task 49 has **Implementation requirements:**
|
||||
PASS | stable task 49 has **Step 1:
|
||||
PASS | stable task 49 has **Step 2:
|
||||
PASS | stable task 49 has **Step 3:
|
||||
PASS | stable task 49 has **Step 4:
|
||||
PASS | stable task 49 has **Step 5:
|
||||
PASS | stable task 49 has commit
|
||||
PASS | stable task 49 has expected result
|
||||
PASS | stable task 50 has **Files:**
|
||||
PASS | stable task 50 has **Interfaces:**
|
||||
PASS | stable task 50 has **Implementation requirements:**
|
||||
PASS | stable task 50 has **Step 1:
|
||||
PASS | stable task 50 has **Step 2:
|
||||
PASS | stable task 50 has **Step 3:
|
||||
PASS | stable task 50 has **Step 4:
|
||||
PASS | stable task 50 has **Step 5:
|
||||
PASS | stable task 50 has commit
|
||||
PASS | stable task 50 has expected result
|
||||
PASS | advanced task count | 15
|
||||
PASS | advanced task sequence | [1, 2, 3]...[13, 14, 15]
|
||||
PASS | advanced task 1 has **Files:**
|
||||
PASS | advanced task 1 has **Interfaces:**
|
||||
PASS | advanced task 1 has **Implementation requirements:**
|
||||
PASS | advanced task 1 has **Step 1:
|
||||
PASS | advanced task 1 has **Step 2:
|
||||
PASS | advanced task 1 has **Step 3:
|
||||
PASS | advanced task 1 has **Step 4:
|
||||
PASS | advanced task 1 has **Step 5:
|
||||
PASS | advanced task 1 has commit
|
||||
PASS | advanced task 1 has expected result
|
||||
PASS | advanced task 2 has **Files:**
|
||||
PASS | advanced task 2 has **Interfaces:**
|
||||
PASS | advanced task 2 has **Implementation requirements:**
|
||||
PASS | advanced task 2 has **Step 1:
|
||||
PASS | advanced task 2 has **Step 2:
|
||||
PASS | advanced task 2 has **Step 3:
|
||||
PASS | advanced task 2 has **Step 4:
|
||||
PASS | advanced task 2 has **Step 5:
|
||||
PASS | advanced task 2 has commit
|
||||
PASS | advanced task 2 has expected result
|
||||
PASS | advanced task 3 has **Files:**
|
||||
PASS | advanced task 3 has **Interfaces:**
|
||||
PASS | advanced task 3 has **Implementation requirements:**
|
||||
PASS | advanced task 3 has **Step 1:
|
||||
PASS | advanced task 3 has **Step 2:
|
||||
PASS | advanced task 3 has **Step 3:
|
||||
PASS | advanced task 3 has **Step 4:
|
||||
PASS | advanced task 3 has **Step 5:
|
||||
PASS | advanced task 3 has commit
|
||||
PASS | advanced task 3 has expected result
|
||||
PASS | advanced task 4 has **Files:**
|
||||
PASS | advanced task 4 has **Interfaces:**
|
||||
PASS | advanced task 4 has **Implementation requirements:**
|
||||
PASS | advanced task 4 has **Step 1:
|
||||
PASS | advanced task 4 has **Step 2:
|
||||
PASS | advanced task 4 has **Step 3:
|
||||
PASS | advanced task 4 has **Step 4:
|
||||
PASS | advanced task 4 has **Step 5:
|
||||
PASS | advanced task 4 has commit
|
||||
PASS | advanced task 4 has expected result
|
||||
PASS | advanced task 5 has **Files:**
|
||||
PASS | advanced task 5 has **Interfaces:**
|
||||
PASS | advanced task 5 has **Implementation requirements:**
|
||||
PASS | advanced task 5 has **Step 1:
|
||||
PASS | advanced task 5 has **Step 2:
|
||||
PASS | advanced task 5 has **Step 3:
|
||||
PASS | advanced task 5 has **Step 4:
|
||||
PASS | advanced task 5 has **Step 5:
|
||||
PASS | advanced task 5 has commit
|
||||
PASS | advanced task 5 has expected result
|
||||
PASS | advanced task 6 has **Files:**
|
||||
PASS | advanced task 6 has **Interfaces:**
|
||||
PASS | advanced task 6 has **Implementation requirements:**
|
||||
PASS | advanced task 6 has **Step 1:
|
||||
PASS | advanced task 6 has **Step 2:
|
||||
PASS | advanced task 6 has **Step 3:
|
||||
PASS | advanced task 6 has **Step 4:
|
||||
PASS | advanced task 6 has **Step 5:
|
||||
PASS | advanced task 6 has commit
|
||||
PASS | advanced task 6 has expected result
|
||||
PASS | advanced task 7 has **Files:**
|
||||
PASS | advanced task 7 has **Interfaces:**
|
||||
PASS | advanced task 7 has **Implementation requirements:**
|
||||
PASS | advanced task 7 has **Step 1:
|
||||
PASS | advanced task 7 has **Step 2:
|
||||
PASS | advanced task 7 has **Step 3:
|
||||
PASS | advanced task 7 has **Step 4:
|
||||
PASS | advanced task 7 has **Step 5:
|
||||
PASS | advanced task 7 has commit
|
||||
PASS | advanced task 7 has expected result
|
||||
PASS | advanced task 8 has **Files:**
|
||||
PASS | advanced task 8 has **Interfaces:**
|
||||
PASS | advanced task 8 has **Implementation requirements:**
|
||||
PASS | advanced task 8 has **Step 1:
|
||||
PASS | advanced task 8 has **Step 2:
|
||||
PASS | advanced task 8 has **Step 3:
|
||||
PASS | advanced task 8 has **Step 4:
|
||||
PASS | advanced task 8 has **Step 5:
|
||||
PASS | advanced task 8 has commit
|
||||
PASS | advanced task 8 has expected result
|
||||
PASS | advanced task 9 has **Files:**
|
||||
PASS | advanced task 9 has **Interfaces:**
|
||||
PASS | advanced task 9 has **Implementation requirements:**
|
||||
PASS | advanced task 9 has **Step 1:
|
||||
PASS | advanced task 9 has **Step 2:
|
||||
PASS | advanced task 9 has **Step 3:
|
||||
PASS | advanced task 9 has **Step 4:
|
||||
PASS | advanced task 9 has **Step 5:
|
||||
PASS | advanced task 9 has commit
|
||||
PASS | advanced task 9 has expected result
|
||||
PASS | advanced task 10 has **Files:**
|
||||
PASS | advanced task 10 has **Interfaces:**
|
||||
PASS | advanced task 10 has **Implementation requirements:**
|
||||
PASS | advanced task 10 has **Step 1:
|
||||
PASS | advanced task 10 has **Step 2:
|
||||
PASS | advanced task 10 has **Step 3:
|
||||
PASS | advanced task 10 has **Step 4:
|
||||
PASS | advanced task 10 has **Step 5:
|
||||
PASS | advanced task 10 has commit
|
||||
PASS | advanced task 10 has expected result
|
||||
PASS | advanced task 11 has **Files:**
|
||||
PASS | advanced task 11 has **Interfaces:**
|
||||
PASS | advanced task 11 has **Implementation requirements:**
|
||||
PASS | advanced task 11 has **Step 1:
|
||||
PASS | advanced task 11 has **Step 2:
|
||||
PASS | advanced task 11 has **Step 3:
|
||||
PASS | advanced task 11 has **Step 4:
|
||||
PASS | advanced task 11 has **Step 5:
|
||||
PASS | advanced task 11 has commit
|
||||
PASS | advanced task 11 has expected result
|
||||
PASS | advanced task 12 has **Files:**
|
||||
PASS | advanced task 12 has **Interfaces:**
|
||||
PASS | advanced task 12 has **Implementation requirements:**
|
||||
PASS | advanced task 12 has **Step 1:
|
||||
PASS | advanced task 12 has **Step 2:
|
||||
PASS | advanced task 12 has **Step 3:
|
||||
PASS | advanced task 12 has **Step 4:
|
||||
PASS | advanced task 12 has **Step 5:
|
||||
PASS | advanced task 12 has commit
|
||||
PASS | advanced task 12 has expected result
|
||||
PASS | advanced task 13 has **Files:**
|
||||
PASS | advanced task 13 has **Interfaces:**
|
||||
PASS | advanced task 13 has **Implementation requirements:**
|
||||
PASS | advanced task 13 has **Step 1:
|
||||
PASS | advanced task 13 has **Step 2:
|
||||
PASS | advanced task 13 has **Step 3:
|
||||
PASS | advanced task 13 has **Step 4:
|
||||
PASS | advanced task 13 has **Step 5:
|
||||
PASS | advanced task 13 has commit
|
||||
PASS | advanced task 13 has expected result
|
||||
PASS | advanced task 14 has **Files:**
|
||||
PASS | advanced task 14 has **Interfaces:**
|
||||
PASS | advanced task 14 has **Implementation requirements:**
|
||||
PASS | advanced task 14 has **Step 1:
|
||||
PASS | advanced task 14 has **Step 2:
|
||||
PASS | advanced task 14 has **Step 3:
|
||||
PASS | advanced task 14 has **Step 4:
|
||||
PASS | advanced task 14 has **Step 5:
|
||||
PASS | advanced task 14 has commit
|
||||
PASS | advanced task 14 has expected result
|
||||
PASS | advanced task 15 has **Files:**
|
||||
PASS | advanced task 15 has **Interfaces:**
|
||||
PASS | advanced task 15 has **Implementation requirements:**
|
||||
PASS | advanced task 15 has **Step 1:
|
||||
PASS | advanced task 15 has **Step 2:
|
||||
PASS | advanced task 15 has **Step 3:
|
||||
PASS | advanced task 15 has **Step 4:
|
||||
PASS | advanced task 15 has **Step 5:
|
||||
PASS | advanced task 15 has commit
|
||||
PASS | advanced task 15 has expected result
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-design.md code fences balanced | 132
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-design.md no TODO markers
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-design.md no wildcard create paths
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-implementation-plan.md code fences balanced | 504
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-implementation-plan.md no TODO markers
|
||||
PASS | 2026-08-11-mongodb-document-persistence-platform-implementation-plan.md no wildcard create paths
|
||||
PASS | 2026-08-11-mongodb-advanced-capabilities-expansion-plan.md code fences balanced | 150
|
||||
PASS | 2026-08-11-mongodb-advanced-capabilities-expansion-plan.md no TODO markers
|
||||
PASS | 2026-08-11-mongodb-advanced-capabilities-expansion-plan.md no wildcard create paths
|
||||
PASS | stable no duplicate create paths
|
||||
PASS | advanced no duplicate create paths
|
||||
PASS | stable and advanced create paths do not collide
|
||||
PASS | no real generic repository declaration
|
||||
PASS | no public arbitrary run command
|
||||
PASS | stable starter excludes advanced
|
||||
PASS | unknown commit body retry forbidden
|
||||
PASS | mongo seven and eight matrix
|
||||
PASS | advanced actual topology gate
|
||||
SUMMARY | total=687 pass=687 fail=0
|
||||
```
|
||||
|
||||
## 검증 한계
|
||||
|
||||
현재 검증은 설계서와 구현 계획서의 정적 구조·일관성 검사다. 실제 Backend Skeleton 저장소가 제공되지 않았으므로 Gradle configuration, compile, Spring Context, MongoDB Replica Set, failover, sharded cluster, Atlas/KMS, performance와 Git commit은 실행하지 않았다.
|
||||
+1139
File diff suppressed because it is too large
Load Diff
+3943
File diff suppressed because it is too large
Load Diff
+1303
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,73 @@
|
||||
from pathlib import Path
|
||||
import re
|
||||
import sys
|
||||
|
||||
ROOT = Path(__file__).resolve().parent
|
||||
DESIGN = ROOT / 'docs/superpowers/specs/2026-08-11-mongodb-document-persistence-platform-design.md'
|
||||
PLAN = ROOT / 'docs/superpowers/plans/2026-08-11-mongodb-document-persistence-platform-implementation-plan.md'
|
||||
ADV = ROOT / 'docs/superpowers/plans/2026-08-11-mongodb-advanced-capabilities-expansion-plan.md'
|
||||
|
||||
checks = []
|
||||
|
||||
def check(name, condition, detail=''):
|
||||
checks.append((name, bool(condition), detail))
|
||||
|
||||
texts = {p.name: p.read_text(encoding='utf-8') for p in (DESIGN, PLAN, ADV)}
|
||||
design = texts[DESIGN.name]
|
||||
plan = texts[PLAN.name]
|
||||
adv = texts[ADV.name]
|
||||
|
||||
check('design exists', DESIGN.exists())
|
||||
check('stable plan exists', PLAN.exists())
|
||||
check('advanced plan exists', ADV.exists())
|
||||
check('design purpose', 'MongoDB 문서 영속성 플랫폼 설계서' in design)
|
||||
check('domain ownership', '도메인이 `@Document`, Repository' in design)
|
||||
check('no generic repository design', '범용 `CommonMongoRepository<T, ID>`를 만들지 않는다' in design)
|
||||
check('stable api strict', 'Stable API V1' in design and 'apiStrict=true' in design)
|
||||
check('local replica set', 'Single-node Replica Set' in design)
|
||||
check('standalone smoke only', 'Standalone은 smoke test' in design)
|
||||
check('bson manifest', 'BSON 표현 Manifest' in design)
|
||||
check('transaction retry separation', 'Transaction 본문 Retry와 Commit Retry를 분리' in design)
|
||||
check('change stream at least once', 'at-least-once projector' in design)
|
||||
check('ttl cleanup only', 'TTL은 물리 cleanup' in design)
|
||||
check('gridfs compatibility only', 'GridFS는 compatibility adapter' in design)
|
||||
check('driver native observability', 'Driver native ObservabilitySettings' in design)
|
||||
|
||||
for label, text, expected in [('stable', plan, 50), ('advanced', adv, 15)]:
|
||||
nums = [int(x) for x in re.findall(r'^### Task (\d+):', text, re.M)]
|
||||
check(f'{label} task count', len(nums) == expected, f'{len(nums)}')
|
||||
check(f'{label} task sequence', nums == list(range(1, expected + 1)), str(nums[:3]) + '...' + str(nums[-3:]))
|
||||
sections = re.split(r'(?=^### Task \d+:)', text, flags=re.M)[1:]
|
||||
for idx, section in enumerate(sections, 1):
|
||||
for marker in ['**Files:**', '**Interfaces:**', '**Implementation requirements:**',
|
||||
'**Step 1:', '**Step 2:', '**Step 3:', '**Step 4:', '**Step 5:']:
|
||||
check(f'{label} task {idx} has {marker}', marker in section)
|
||||
check(f'{label} task {idx} has commit', 'git commit -m' in section)
|
||||
check(f'{label} task {idx} has expected result', 'Expected:' in section)
|
||||
|
||||
for name, text in texts.items():
|
||||
check(f'{name} code fences balanced', text.count('```') % 2 == 0, str(text.count('```')))
|
||||
check(f'{name} no TODO markers', not re.search(r'\b(TODO|TBD|FIXME)\b', text))
|
||||
check(f'{name} no wildcard create paths', not re.search(r'- Create: `[^`]*[\*?][^`]*`', text))
|
||||
|
||||
for label, text in [('stable', plan), ('advanced', adv)]:
|
||||
created = re.findall(r'- Create: `([^`]+)`', text)
|
||||
duplicates = sorted({p for p in created if created.count(p) > 1})
|
||||
check(f'{label} no duplicate create paths', not duplicates, ', '.join(duplicates))
|
||||
|
||||
stable_created = set(re.findall(r'- Create: `([^`]+)`', plan))
|
||||
advanced_created = set(re.findall(r'- Create: `([^`]+)`', adv))
|
||||
check('stable and advanced create paths do not collide', not (stable_created & advanced_created),
|
||||
', '.join(sorted(stable_created & advanced_created)))
|
||||
check('no real generic repository declaration', not re.search(r'public\s+interface\s+(Common|Generic)MongoRepository', design + plan + adv))
|
||||
check('no public arbitrary run command', not re.search(r'public\s+[^\n]+\s+runCommand\s*\(', design + plan + adv))
|
||||
check('stable starter excludes advanced', 'no advanced module' in plan.lower() and 'Stable Starter' in adv)
|
||||
check('unknown commit body retry forbidden', 'UnknownTransactionCommitResult' in plan and '업무 본문을 재실행하지 않는다' in plan)
|
||||
check('mongo seven and eight matrix', 'MongoDB 7.0' in plan and 'MongoDB 8.0' in plan)
|
||||
check('advanced actual topology gate', 'actual topology' in adv.lower() or '실제 topology' in adv)
|
||||
|
||||
failed = [c for c in checks if not c[1]]
|
||||
for name, ok, detail in checks:
|
||||
print(('PASS' if ok else 'FAIL') + ' | ' + name + ((' | ' + detail) if detail else ''))
|
||||
print(f'SUMMARY | total={len(checks)} pass={len(checks)-len(failed)} fail={len(failed)}')
|
||||
sys.exit(1 if failed else 0)
|
||||
Reference in New Issue
Block a user