Files
hyungi 7cc38e8a4a fix(ds-app): category-counts 계약 정정 — 합성된 shape 을 라이브 실측으로 재캡처
라이브 결선 첫 실로그인에서 decode 실패(Key 'total' not found) 진단:
서버 /documents/stats/category-counts 는 Pydantic response model 없는
raw dict 반환({counts:{category:n}, library_pending_suggestions}) — 초기
계약 추출('실 Pydantic 에서 추출')이 이 엔드포인트에선 shape 을 합성
(total/by_domain/review_pending/pipeline_failed = 실재하지 않음).

- CategoryCounts 모델 = 실측 shape + total 파생 접근자(counts 합)
- fixture 2사본(contract/fixtures + DSKit Resources) = CAPTURED_LIVE 재캡처
- DashboardView 스켈레톤 정합(카테고리 분포 + 한국어 라벨, 본격 재설계는 FU-E)
- CONTRACT.md 해당 행 정정 주석

전 엔드포인트 라이브 shape 전수 대조(토큰 생성 후 11종 curl + shape_diff):
stats 외 진짜 drift 0 — documents/tree·search·memos·digest·auth_me·detail·
content 일치. original_filename/duplicate_* 부재 = S1 미배포(optional 이라
무해, 배포 시 해소) / md_frontmatter·memo_task_state = JSONValue 오픈 shape
데이터 차이(무해) / duplicates 422 = S1 라우트 미배포(예상).

검증: swift test 82/82 + shape_diff (shape identical) + xcodebuild PASS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 00:55:59 +00:00
..

DS App Contract (S1 인터페이스 동결) — v0.1

S1·S2·S3 동시 출발선. 앱(S3)은 실 백엔드/실 LLM 없이 이 디렉토리만 보고 빌드한다.

contract/
  CONTRACT.md            ← 엔드포인트 + 요청/응답 shape 동결 스펙 (읽기 시작점)
  fixtures/              ← 응답 JSON 박제 (앱 프리뷰/디코딩 테스트가 로드)
    auth_login.json            POST /auth/login
    auth_me.json               GET  /auth/me
    documents_list.json        GET  /documents/         (DocumentListResponse)
    document_detail.json       GET  /documents/{id}     (md_status=completed — MD-first 렌더)
    document_detail_pending_md.json  GET /documents/{id} (md_status=pending — extracted_text 폴백 케이스)
    document_content.json      GET  /documents/{id}/content
    documents_tree.json        GET  /documents/tree
    documents_stats.json       GET  /documents/stats/category-counts
    documents_duplicates.json  GET  /documents/duplicates   [S1-ADD] 중복검사
    search.json                GET  /search/
    ask.json                   GET  /search/ask
    memos_list.json            GET  /memos/
    memo_detail.json           GET  /memos/{id}
    digest.json                GET  /digest

동결 원칙

  • 모든 shape는 실제 GPU 백엔드 Pydantic 모델에서 추출(지어내지 않음). [S1-ADD] 필드만 신규.
  • 앱 모델(Swift Codable)은 위 fixtures를 그대로 디코딩할 수 있어야 한다 = 1차 수용 테스트.
  • 통합 시 fixture ↔ 실 응답 call-shape regression으로 대조.

[S1-ADD] (S1이 추가할 신규 — 앱은 옵셔널 디코딩)

  • original_filename, duplicate_of, duplicate_count (DocumentResponse/Detail)
  • GET /documents/duplicates (중복검사 개선 트랙)
  • Word/Excel/이미지/오디오 → md_content 채우기 (MD-first 전포맷 — marker는 현재 PDF 전용)

다음

  • S3: 이 fixtures를 디코딩하는 Swift Codable 모델 + API client(프로토콜) → macOS 앱.
  • S1: [S1-ADD] 구현 + 위 shape 유지(깨면 version bump).
  • S2: /search/ask?backend= + 온디바이스 provider 추상화(AIProvider).