기간: 2026-03-26 | CTO Lead + Runtime(3) + QA(9)
| 항목 | 내용 |
|------|------|
| 시작 | 2026-03-26 |
| 완료 | 2026-03-26 |
| 변경 파일 | docs/specs/DASH-schema-v1.json (+280 lines), scripts/validate-dash.sh (+200 lines), docs/specs/versioning-policy.md (+60 lines) |
| 핵심 결정 | JSON Schema Draft-07 채택 (ajv/jsonschema 최대 호환) |
| 핵심 결정 | Dash ID 3+ 세그먼트 요구 (Android package 컨벤션) |
| 핵심 결정 | 스키마 버전 MAJOR만 파일명에 포함 (DASH-schema-v1.json) |
| 이슈 없음 | - |
DASH-schema-v1.json 주요 설계 결정:
additionalProperties: false 전 레이어 적용 — 오타로 인한 무음 실패 방지allOf + if/then 패턴으로 타입별 필수 필드 분기^[a-z][a-z0-9]*(\\.[a-z][a-z0-9-]*){2,}$ (3+ 세그먼트)^[a-z][a-z0-9]*(\\.[a-z][a-z0-9_]*)+$^[A-Z][A-Za-z0-9]+\\.v\\d+$ (예: WeatherData.v1)| 항목 | 내용 |
|------|------|
| 시작 | 2026-03-26 |
| 완료 | 2026-03-26 |
| 변경 파일 | docs/specs/DASH-template.md (+150 lines), docs/specs/sample-dashes/weather-dash.md (+80 lines), app/src/main/java/com/theuniverse/launcher/dash/DashManifest.kt (+270 lines) |
| 핵심 결정 | DashManifest.validate() 로직: cross-layer 제약을 데이터 클래스 init 외부에서 처리 |
| 핵심 결정 | TriggerCondition: sealed class 패턴 (runtime instanceof check 가능) |
| 핵심 결정 | DashValidationResult: sealed class (Valid / Invalid with errors list) |
| 이슈 | Kotlin entries 사용 (enum.values() deprecated in Kotlin 1.9+) |
DashManifest.kt 레이어 구조:
DashManifest├── DashMeta
│ ├── DashCategory (enum, 12종)
│ └── isValidId(), isValidSemver()
├── DashTrigger
│ └── TriggerCondition (sealed class)
│ ├── Always
│ ├── Time(start, end, days?)
│ ├── Location(lat, lon, radiusM, name?)
│ ├── TopicMatch(topics)
│ └── OrchestratorCall(keywords, confidence)
├── DashSkin
│ └── DashSize (enum: MINI, STANDARD, EXPANDED)
├── DashSkill
│ ├── DashPermission (enum, 16종)
│ ├── DashApi (enum, 16종)
│ └── ResourceQuota(memoryMb, networkKbPerMin, cpuPercent)
└── DashProtocol
└── ProtocolTopic(topic, schema)
| 항목 | 내용 |
|------|------|
| 시작 | 2026-03-26 |
| 완료 | 2026-03-26 |
| 변경 파일 | app/src/test/java/com/theuniverse/launcher/dash/DashSchemaParserTest.kt (+300 lines) |
| 핵심 결정 | JUnit4 사용 (기존 프로젝트 표준 — JUnit5 불필요) |
| 핵심 결정 | assertIs 인라인 헬퍼 — JUnit5 없이 타입 체크 |
| 이슈 | 최초 실행: meta_invalidId_failsValidation FAIL — "com.example" (2세그먼트)이 유효로 처리됨 |
| 해결 | DashMeta.isValidId() regex + → {2,} (3+ 세그먼트 요구), JSON Schema 동기화 |
테스트 커버리지:
Meta Layer: 8개 테스트 (id, semver, category, keywords)Trigger Layer: 11개 테스트 (Always, Time, Location, TopicMatch, OrchestratorCall)
Skin Layer: 5개 테스트 (sizes, composableEntry, defaultSize validation)
Skill Layer: 7개 테스트 (permissions, APIs, quota)
Protocol Layer:6개 테스트 (topic format, schema format, pub/sub overlap, import path)
Integration: 4개 테스트 (fullManifest validation: Weather Dash, minimum valid)
─────────────────────────────────────────────
합계: 41 + 1(ExampleUnitTest) = 42 ALL PASS
| 순서 | From | To | 전달 내용 | 시점 |
|------|------|----|----------|------|
| 1 | CTO | Runtime | DASH-schema-v1.json 완료 → 데이터 클래스 구현 착수 | 2026-03-26 |
| 2 | Runtime | QA | DashManifest.kt 완료 → 단위 테스트 작성 착수 | 2026-03-26 |
| 3 | QA | CTO | 테스트 FAIL → ID regex 수정 요청 (3+ 세그먼트) | 2026-03-26 |
| 4 | CTO | QA | regex 수정 완료 (DashMeta.kt + DASH-schema-v1.json) | 2026-03-26 |
| 5 | QA → | ALL | 42/42 ALL PASS 확인 → 스프린트 완료 | 2026-03-26 |