Files
portfolio-hub/docs/batches/bat-006_20260520_token-surface-code-fixes/planning.md
T
genichinandClaude Sonnet 4.6 c815ce39b6 feat: dcy-003/004 토큰 surface 개편 및 daemon lifecycle 정책 구현 (BAT-006/007)
BAT-006 (REQ-016/017/018):
- client token 발급 경로 제거 (issue_client_token, POST /auth/tokens, 관련 스키마/테스트)
- service-token rotate unique index revoked_at IS NULL 조건 추가 (Alembic CONCURRENTLY 마이그레이션)
- POST /auth/service-tokens body daemon_id forward 누락 보정 (1-line fix)

BAT-007 (REQ-022/023):
- daemon deactivate 시 바인딩 service token 자동 revoke (CLI --force 옵션 + revoke_tokens_by_daemon_id)
- NULL daemon_id legacy token 진단 CLI (migrate-null-daemon --dry-run)

거버넌스 문서: dcy-003/004 Discovery, REQ-016~023/025~032 신규, BAT-006/007 전체 산출물

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 01:03:39 +00:00

3.3 KiB

BAT-006 Planning

  • Status: confirmed
  • Batch: BAT-006
  • Profile: standard

Included REQ

  • REQ-016: client token 발급 경로 코드 폐지 (Interface, High)
  • REQ-017: service-token rotate unique index 보강 (Migration, High)
  • REQ-018: POST /auth/service-tokens daemon_id forward 보정 (Interface, High)

Delivery Plan

  1. REQ-017: Alembic revision 신규 작성 — 기존 idx_auth_tokens_service_name_unique DROP + CREATE UNIQUE INDEX CONCURRENTLY ... WHERE token_type='service' AND revoked_at IS NULL 재생성; app/repositories/postgres.py:161-167 ensure_schema() index 조건 동기화
  2. REQ-018: app/api/auth_routes.py:131-137 issue_service_token() 호출에 daemon_id=payload.daemon_id 추가
  3. REQ-016: POST /auth/tokens 라우트 블록 제거; app/services/auth_service.py:issue_client_token 및 관련 헬퍼 제거; app/schemas/auth.py:CreateClientTokenRequest·IssuedClientTokenResponse 제거
  4. 테스트:
    • tests/test_service_token_rotate_integration.py 신규 (REQ-017 AC-1~3, 실 DB docker-compose.local-test.yml 의존)
    • tests/test_auth.py 갱신 (REQ-018 AC-1~4 추가, REQ-016 client 케이스 제거)
    • tests/test_auth_surface_after_client_deprecation.py 신규 (REQ-016 AC-1/2/4 검증)
    • tests/test_daemon_registry.py 갱신 (REQ-017 AC-4 rotate 회귀)

Dependencies

  • Internal:
    • dcy-003 OQ-5 결정: token_type='client' 게이트는 REQ-016 코드 제거 이후에도 v1 API에 유지 (env token 침투 방어)
    • REQ-017 결함 증거: REL-006 verification 실패 기록 (temp/20260519_old_sdlc/releases/rel-006_...)
    • app/api/auth_routes.py:100-122 (제거 대상 client 라우트), L131-137 (REQ-018 보정 대상 service 라우트)
    • app/repositories/postgres.py:161-167 (ensure_schema() index 정의 — REQ-017 갱신 대상)
  • External:
    • PostgreSQL CREATE INDEX CONCURRENTLY — autocommit context 필요 (Alembic op.execute 직접 SQL)
    • 실 DB 환경 docker-compose.local-test.yml — REQ-017 AC-1~3 검증용

Design Gate

  • Design Required Before Implementation: yes
  • Reason: REQ-017 CONCURRENTLY migration 실행 패턴(Alembic autocommit handling), REQ-016 코드 제거 범위(service 메서드·스키마·테스트 경계), token_type 게이트 유지 범위를 design.md에서 확정해야 구현 시 누락 없이 진행 가능

Milestones

  1. design.md confirmed — migration 패턴, 제거 대상 목록, 테스트 전략 확정
  2. REQ-017 migration 작성 + ensure_schema 갱신 + rotate 회귀 통과
  3. REQ-018 1-line fix + HTTP daemon_id forward 테스트 통과
  4. REQ-016 코드 제거 + grep AC-1 검증 (0건) + 회귀 suite 전체 통과
  5. pytest 전체 통과 (regression 없음)

Risks

  • R-1 (High): CONCURRENTLY migration — autocommit 외부 실행 필수. Alembic connection.execution_options(isolation_level="AUTOCOMMIT") 또는 op.execute() 직접 패턴 설계 필요. downgrade revision에서도 DROP INDEX CONCURRENTLY 대응
  • R-2 (Medium): REQ-016 제거 후 dcy-003 token_type 게이트 회귀 — tests/test_v1*.py 중 client token 픽스처가 있으면 함께 제거/대체 필요. grep으로 잔여 참조 0건 확인
  • R-3 (Low): REQ-018 fix 후 기존 test_auth.py에 daemon_id 검증 케이스 부재 시 AC-4 HTTP/CLI 동등성 누락 — 신규 테스트 케이스로 해소