f995f8739f
feat(saju-lab): interpret/prompt + schema — 12항목 + 궁합 SYSTEM_PROMPT (8 tests)
2026-05-25 20:21:07 +09:00
cad65dc869
feat(saju-lab): config + Pydantic 모델 + db.py CRUD (saju + compat) — 10 tests
2026-05-25 20:18:19 +09:00
f4f518fc80
feat(saju-lab): compatibility.py — 두 사주 궁합 점수 + breakdown
...
- saju-web/app/compatibility/result/page.tsx의 calculateCompatibility() 1:1 매핑
- 알고리즘: base 50 ± (일간 오행 same/produce/overcome) ± (일지 6합/3합/충), clamp [0,100]
- breakdown: day_master_element + branch_interaction (delta + relation/flags + description)
- 17 unit tests passed (헬퍼 9개 + 통합 8개), 438/438 total
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 20:14:47 +09:00
db1f69c7a5
feat(saju-lab): daeun.py — 대운 8개 계산 (30/30 reference)
2026-05-25 20:09:46 +09:00
ebfade655a
feat(saju-lab): analysis.py — 오행/신강신약/용신/세운 (30/30 reference)
...
- calculate_detailed_element_balance: 가중치 오행 점수 (천간 1.0, 본기 1.0, 중기 0.5, 여기 0.3)
- calculate_element_score: 오행 비율 (%) — JS Math.round 호환
- analyze_day_master_strength: 신강/신약/중화 + score + reasons
(월령 득령/실령, 통근, 투출, 오행 비율 4단계 평가)
- estimate_yongshin: 용신/희신/기신 + explanation
(신강 → 식상/재성/관살 중 약한 2개, 신약 → 인성/비겁 중 약한 것, 중화 → 5행 중 약한 2개)
- calculate_seun: 올해 세운 + 4주 지지와 충/합 매핑
- perform_full_analysis: 위 5종 + branch_interactions + shinsal + gongmang + hidden_stems 통합
saju-web/lib/ai-interpretation.ts 와 1:1 매핑, 30 reference fixture 모두 통과 (180/180).
전체 saju-lab 테스트 389/389 passed.
JS Math.round 와 Python round() 의 banker-rounding 차이 보정을 위해 _js_round 헬퍼 추가.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 20:00:36 +09:00
234ccfe857
feat(saju-lab): shinsal.py — 지장간/신살/공망/지지 상호작용
2026-05-25 19:54:21 +09:00
3f0b7bcd74
feat(saju-lab): core.py — 60갑자 + 십성 + 십이운성 + calculate_saju (30/30 reference pass)
2026-05-25 19:48:28 +09:00
f91a74237b
feat(saju-lab): lunar.py — 음력↔양력 변환 (sxtwl)
2026-05-25 19:39:06 +09:00
95243a7f1f
fix(saju-lab): reference fixture 재생성 (solarlunar gzMonth 기반 + xfail 제거)
...
이전 fixture는 saju-web `getCurrentSolarTerm` 루프 버그로 30 케이스 모두 month branch='丑'으로 고정되어 검증 불가했음. saju-web을 임시 패치(solarlunar.gzMonth 직접 사용)하여 재생성한 뒤 패치는 되돌렸음. 결과: 12개 unique month branch + sxtwl과 49 테스트 전부 PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 19:35:49 +09:00
07b5c32f2f
feat(saju-lab): solar_terms.py — sxtwl 기반 24절기 + 月支 매핑
2026-05-25 19:28:33 +09:00
4ddcd75453
feat(saju-lab): calculator/constants.py — 천간/지지/오행/지장간 상수
2026-05-25 19:20:34 +09:00
018459db88
feat(saju-lab): reference fixture 30 케이스 (TS 엔진 결과 추출)
2026-05-25 19:18:22 +09:00
42182014f0
feat(saju-lab): 스캐폴딩 — Dockerfile + requirements + 디렉토리 구조
2026-05-25 18:58:41 +09:00
03edfb04aa
refactor(agent-office): tarot 모듈 제거 (tarot-lab으로 cutover 완료)
...
- DELETE: app/tarot/ 디렉토리 (pipeline, prompt, schema 모듈)
- DELETE: app/routers/tarot.py (FastAPI 라우터)
- DELETE: 4개 tarot 테스트 파일 (test_tarot_*.py)
- MODIFY: app/main.py — tarot 라우터 import + register 제거
- MODIFY: app/models.py — 5개 Tarot* 클래스 제거
- MODIFY: app/config.py — 4개 TAROT_* 환경변수 제거
- MODIFY: app/db.py — 6개 tarot_readings CRUD 함수 제거
KEEP:
- tarot_readings CREATE TABLE 블록 (DB 호환성)
- CREATE INDEX ... tarot_readings 인덱스 2개
- scripts/migrate_tarot_to_lab.py (cutover 마이그레이션)
- tests/test_migrate_tarot.py (마이그레이션 테스트)
테스트: 88 pass (migrate_tarot tests 포함)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 18:54:12 +09:00
8b0c12b595
feat(deploy): tarot-lab 5위치(SERVICES/BUILD/CONTAINER/HEALTH/DATA) 동기화
2026-05-25 18:43:34 +09:00
e52e47fe3b
feat(nginx): /api/tarot/ → tarot-lab:8000 라우팅 추가
2026-05-25 18:42:33 +09:00
8d25a1467a
feat(docker-compose): tarot-lab 컨테이너 추가 (18250 포트)
2026-05-25 18:41:08 +09:00
901d3535ee
feat(agent-office): tarot_readings 1회성 마이그레이션 스크립트 (3 테스트)
2026-05-25 18:35:36 +09:00
91caddb4b2
feat(tarot-lab): main.py + 5 라우트 테스트 (총 21 tests 통과)
2026-05-25 18:32:37 +09:00
abdfcbb144
feat(tarot-lab): pipeline.py 이관 + 6 테스트 통과
2026-05-25 18:30:00 +09:00
a94c73b134
feat(tarot-lab): prompt.py + schema.py 이관 + 검증 테스트 6건
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 18:26:08 +09:00
387d2465b0
feat(tarot-lab): db.py CRUD 5 + init_db (테스트 4건 통과)
2026-05-25 18:23:44 +09:00
4073370e1b
feat(tarot-lab): config + Pydantic 모델 5개 추출
2026-05-25 18:20:30 +09:00
1775f7dd2d
feat(tarot-lab): 스캐폴딩 — Dockerfile + requirements + pytest
2026-05-25 18:18:37 +09:00
677d05fc31
docs(plan): saju-lab 신설 + tarot-lab 분리 구현 plan
...
- Phase 1 (Task 1~12): tarot 코드 복사 + 모듈 평탄화 + DB 마이그레이션 + agent-office cutover + web-ui URL 변경
- Phase 2 (Task 13~29): saju 계산 엔진 TS→Python 포팅 (reference fixture 30) + Claude 12항목 해석 + DB + 라우터 + UI 시안 후 진행
- 총 29 task, 각 5~10 step bite-sized, TDD + 빈번한 commit
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 17:58:11 +09:00
d87ad2421d
docs(spec): saju-lab 신설 + tarot-lab 분리 마이그레이션 설계
...
- saju-web (Next.js+Supabase+OpenAI) → saju-lab (Python FastAPI+SQLite+Claude)
- agent-office 내 tarot 모듈 → 독립 tarot-lab 컨테이너 분리
- Phase 1 tarot 분리 (DB 마이그레이션 스크립트 + cutover)
- Phase 2 saju 신설 (TS→Python 계산엔진 포팅 + 사주/궁합 v1)
- 포트: tarot-lab 18250, saju-lab 18300
- API: /api/tarot/*, /api/saju/* 완전 이전
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-25 17:23:12 +09:00
20691b5057
fix(tarot): Claude 응답 시간 단축 + nginx timeout 정리
...
504 Gateway Timeout 근본 원인은 DSM Reverse Proxy의 60s 기본 timeout
(agent-office는 200 OK 정상 응답했으나 client 도달 전 DSM이 끊음).
사용자 측 DSM Reverse Proxy timeout 늘리기 별도 필요.
코드 측 대응:
- pipeline.py max_tokens 2048 → 1400 (응답 시간 단축, 3-card spread 충분)
- pipeline.py에 latency_ms·tokens 로그 출력 (모니터링)
- nginx /api/agent-office/에 proxy_send_timeout 300s, proxy_connect_timeout 60s
추가 (proxy_read_timeout은 WebSocket 위해 86400s 유지)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 15:43:27 +09:00
3bf87a93fb
feat(agent-office): /api/agent-office/tarot 5 endpoint (T6)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:23:52 +09:00
4623c68d4e
feat(agent-office): Tarot Claude 파이프라인 + reroll 1회 (T5)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:18:42 +09:00
f79dc87d75
feat(agent-office): Tarot 응답 스키마 검증 (T4)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:13:38 +09:00
d4302acb6a
feat(agent-office): Tarot SYSTEM_PROMPT + user message builder (T3)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:11:12 +09:00
b7fd98c8c7
feat(agent-office): Tarot Pydantic 모델 + config 추가 (T2)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:07:48 +09:00
0b29283043
feat(agent-office): tarot_readings 테이블 + CRUD (T1)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:03:47 +09:00
9dba1e74b0
docs(plan): tarot-lab v1 implementation plan
...
18 task — agent-office 6 (DB·모델·프롬프트·스키마·파이프라인·라우터) + web-ui 11 (자산·카드·hooks·컴포넌트·CSS·페이지·라우팅) + 통합 검증 1.
TDD per task — 실패 테스트 → 구현 → 통과 → 커밋 워크플로우.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 23:59:13 +09:00
4c9fe11fc9
docs(spec): tarot-lab v1 — 카드 시각 효과(글로우/플립)는 v2로 분리
...
사용자 피드백: 카드 이미지 자산 도착 후 보강 — hover glow, 3D 뒤집기 애니메이션, sparkle particles.
v1은 hover lift + fade-in 등 미니멀 모션만.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 23:47:09 +09:00
a356a5895f
docs(spec): tarot-lab v1 design
...
랜딩(/tarot) + 오늘의 카드 + 3장 스프레드 + 히스토리 4 페이지.
agent-office 확장으로 tarot_readings 테이블 + interpret/save/list/patch/delete 5 endpoint.
Claude Sonnet 4.6 + evidence·interactions 기반 근거 해석 프롬프트.
켈틱 10장·카드 이미지 정식 매핑·텔레그램 push는 v2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 23:44:42 +09:00
2e042e18c5
fix(image-lab): env 변수를 다른 -lab과 동일하게 정렬 (TZ + :- defaults)
2026-05-23 11:51:38 +09:00
83e74ad1f4
fix(image-lab): volume mount을 video-lab과 동일한 ${RUNTIME_PATH}/data/image로 통일
2026-05-23 11:48:24 +09:00
b70caddff1
feat(image-lab): Dockerfile + compose entry + scripts 6위치 + nginx 차단
...
Task 5 of Video Studio backend plan. Wires image-lab Python code (T1-T4)
into NAS Docker infrastructure on port 18802.
- image-lab/Dockerfile (python:3.12-slim + uvicorn)
- image-lab/requirements.txt (fastapi, redis, httpx)
- image-lab/env.example (INTERNAL_API_KEY, IMAGE_DATA_DIR, REDIS_URL, CORS)
- docker-compose.yml: image-lab service block (port 18802, redis depends_on,
healthcheck, volume ${RUNTIME_PATH}/image-data:/app/data) + frontend
depends_on entry
- scripts/deploy-nas.sh: SERVICES += image-lab
- scripts/deploy.sh: BUILD_TARGETS/CONTAINER_NAMES/HEALTH_ENDPOINTS += image-lab,
DATA_DIRS += image
- nginx/default.conf: /api/internal/image/ 3-layer block (IP allowlist +
deny all + X-Internal-Key forward) mirroring /api/internal/video/
Plan-B-Video lesson: 6-location registration enforced per
feedback_nas_deploy_paths.md rule 3 to avoid 'transferring dockerfile: 2B'
deploy failure.
Tests: image-lab pytest 11 passed (no regression).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 11:46:45 +09:00
d6e34973a4
feat(image-lab): generate/tasks/providers 엔드포인트 (video-lab 복제)
2026-05-23 11:41:47 +09:00
7007c90665
feat(image-lab): /api/internal/image/update webhook (video-lab 복제)
2026-05-23 11:37:33 +09:00
ca7a502514
feat(image-lab): verify_internal_key (video-lab 복제)
2026-05-23 11:34:03 +09:00
dc471ecc60
feat(image-lab): image_tasks 테이블 + CRUD (video-lab 복제)
2026-05-23 11:31:02 +09:00
e91715bf2c
docs(plan): video-studio Plan 1 — image-render 포트 18714(task-watcher 충돌 회피) + scripts 6위치 등재 step 추가
2026-05-23 11:28:21 +09:00
1e4c1b42b7
fix(insta-lab): 프롬프트 템플릿 GET이 미저장 시 코드 기본값 반환
...
slate_writer/category_seeds가 DB에 없으면 404 대신 생성 파이프라인이
실제 폴백하는 코드 기본값(card_writer.DEFAULT_PROMPT,
DEFAULT_CATEGORY_SEEDS)을 is_default=true로 반환. 편집 UI가 마스터
프롬프트를 표시·수정 가능. 미지정 이름은 여전히 404. 테스트 4건.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 02:50:33 +09:00
0190a6c206
feat(agent-office): 인스타 큐레이터 후보를 중복 제거 + 신뢰도 0.7+ 필터
...
_dedup_and_filter_keywords: score>=0.7만 남기고 동일 keyword 중복 제거
(최고 score 유지) 후 내림차순. _push_keyword_candidates가 이 필터를 거쳐
"확실한 것만" 전송, 후보 없으면 안내 메시지. 헬퍼 테스트 5건.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 02:50:33 +09:00
6ef4160da2
fix(stock): AI 뉴스 호재/악재 명확히 구분
...
(1) 부호 게이트: top_pos는 score>0, top_neg는 score<0만 분류해 양수(호재)
종목이 악재란에 채워지는 문제 제거. 중립(0)은 양쪽 모두 제외.
(2) 프롬프트: reason을 score 부호와 같은 방향 근거만 쓰도록 명시 —
호재 평가에 악재 내용, 악재 평가에 호재 내용 혼입 금지.
부호 게이트 회귀 테스트 2건 추가.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 02:50:18 +09:00
078c9f008a
fix(agent-office): /agents/{id}/tasks response에 tasks/items 양쪽 키 유지 (backward compat)
2026-05-23 02:12:50 +09:00
918151bda8
feat(agent-office): GET /agents/{id}/tasks에 task_type/days 필터 추가
2026-05-23 02:11:28 +09:00
2ce6721c35
fix(tests): fresh_db fixture가 매 test마다 db.DB_PATH 재패치 (cross-file isolation)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-23 02:08:01 +09:00