SPRINT

Sprint S01 Implementation Log

기간: 2026-03-26 | CTO Lead + Runtime(3) + QA(9)

에이전트별 작업 기록

CTO Lead — 태스크 #1, #6, #7

| 항목 | 내용 |

|------|------|

| 시작 | 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 전 레이어 적용 — 오타로 인한 무음 실패 방지
  • TriggerCondition: JSON Schema allOf + if/then 패턴으로 타입별 필수 필드 분기
  • Dash ID pattern: ^[a-z][a-z0-9]*(\\.[a-z][a-z0-9-]*){2,}$ (3+ 세그먼트)
  • ProtocolTopic topic pattern: ^[a-z][a-z0-9]*(\\.[a-z][a-z0-9_]*)+$
  • ProtocolTopic schema pattern: ^[A-Z][A-Za-z0-9]+\\.v\\d+$ (예: WeatherData.v1)

  • Runtime Agent — 태스크 #2, #3, #4

    | 항목 | 내용 |

    |------|------|

    | 시작 | 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)


    QA Agent — 태스크 #5

    | 항목 | 내용 |

    |------|------|

    | 시작 | 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 |