---
name: jd-engine-main
description: 6개 직무 카테고리(출판/편집디자인, 건축/BIM, 영상/멀티미디어, 게임 콘텐츠, 소프트웨어 개발, UI/UX)의 채용공고 시장 분석을 통합 관리하는 라우터·디스패처 스킬. 단일 카테고리 실행, 멀티 카테고리 병렬 실행, 시계열 트렌드 비교, 크로스 카테고리 통합 대시보드를 모두 처리합니다. 각 카테고리는 독립적인 서브 스킬(jd-publishing, jd-architecture, jd-video, jd-game, jd-software, jd-uiux)로 구현되어 있어 카테고리별 독자 진화가 가능합니다. 트리거 - "리서치 엔진 실행", "직무 시장 분석", "여러 카테고리 채용 동향 비교", "월간 트렌드 리포트", "스케줄링된 분석", "트렌드 비교", "크로스 카테고리 분석".
user-invocable: true
---

# JD Research Engine — 메인 스킬

## 시스템 구성

이 스킬은 **라우터**입니다. 실제 분석 로직은 6개의 서브 스킬에 있고, 메인은 다음만 담당합니다:

1. 사용자 의도 → 실행 모드 결정
2. 카테고리 선택 → 해당 서브 스킬 호출
3. 결과 수집 → 통합 대시보드 생성
4. 시계열 DB write 조정
5. 트렌드 비교 (이번 실행 vs 직전 실행)

```
jd-engine-main (this skill)
├── 호출 ▼
│   jd-publishing      (출판/편집 디자인)
│   jd-architecture    (건축/BIM 설계)
│   jd-video           (영상/멀티미디어)
│   jd-game            (게임 콘텐츠)
│   jd-software        (소프트웨어 개발)
│   jd-uiux            (UI/UX 디자인)
└── 외부 의존성:
    ├── history/{slug}/YYYYMMDD.json  (시계열 DB)
    ├── tools/score_calculator.py     (점수 계산)
    ├── tools/trend_comparator.py     (시계열 비교)
    └── tools/csv_exporter.py         (CSV 내보내기)
```

---

## 실행 모드 (4종)

### 모드 1: single — 단일 카테고리 분석
```
입력 예시: "BIM 시장 분석", "출판/편집 100건"
프로세스: 1개 서브 스킬 호출 → 1개 리포트 + 시계열 DB write
산출물: {slug}_score_report_YYYYMMDD.md
```

### 모드 2: multi — 여러 카테고리 병렬 + 통합 대시보드
```
입력 예시: "6개 카테고리 모두 분석", "디자인 4종 비교"
프로세스: N개 서브 스킬 병렬 호출 → 통합 대시보드 + N개 시계열 DB write
산출물: cross_dashboard_YYYYMMDD.md + N개 카테고리 리포트
```

### 모드 3: trend — 시계열 트렌드 비교 (Same category, time vs time)
```
입력 예시: "건축 분야 지난달 대비 변화", "출판 카테고리 트렌드"
프로세스: history/{slug}/ 의 최근 N개 레코드 → 변화량 분석
산출물: {slug}_trend_report_YYYYMMDD.md (DB write 없음 — 읽기 전용)
```

### 모드 4: cross — 횡단 비교 (특정 지표 6개 카테고리 비교)
```
입력 예시: "AI 요구율을 6개 카테고리 비교", "신입 진입 장벽 비교"
프로세스: 6개 history 폴더에서 최신 레코드만 읽어 특정 필드 비교
산출물: cross_metric_{metric_name}_YYYYMMDD.md
```

---

## Step 0: 입력 처리

### 0-1. unattended 모드 감지

호출 메시지에 다음 표시가 있으면 **사용자 질문 없이 진행**:
- `--unattended` 플래그
- `trigger: scheduled-weekly` 또는 `trigger: scheduled-monthly`
- `from: scheduler` 메타데이터

스케줄링된 실행은 사전에 정해진 카테고리·건수·기간으로 실행되어야 합니다. 사용자가 cron에서 깰 수 없습니다.

### 0-2. interactive 모드: 1회만 묻기

unattended가 아니면 `ask_user_input_v0`를 **단일 호출**로 묶어서 다음을 확인:

| 질문 | 옵션 | 디폴트 |
|------|------|------|
| 실행 모드 | single / multi / trend / cross | 입력에서 추론 |
| 카테고리 | 6개 중 다중 선택 | 입력에서 추출 |
| 카테고리당 목표 건수 | 50 / 100 / 150 | 100 |
| 수집 기간 | 30일 / 90일 / 180일 | 30일 |
| 시계열 DB write 여부 | Y / N (모드 3은 N 강제) | Y |

**추론이 명확하면 묻지 않고 디폴트로 진행** — 예: "6개 모두 분석" → mode=multi, 카테고리=전체, 100건, 30일, write=Y

---

## Step 1: 카테고리 슬러그 정규화

| 사용자 표현 | 슬러그 | 호출할 서브 스킬 |
|-----------|------|-------------|
| "출판", "편집디자인", "북디자인" | `jd-publishing` | jd-publishing |
| "건축", "BIM", "Revit", "건축설계" | `jd-architecture` | jd-architecture |
| "영상", "멀티미디어", "모션그래픽" | `jd-video` | jd-video |
| "게임", "게임 디자인", "원화" | `jd-game` | jd-game |
| "개발", "백엔드", "프론트엔드", "SW" | `jd-software` | jd-software |
| "UI", "UX", "프로덕트 디자인" | `jd-uiux` | jd-uiux |

---

## Step 2: 디스패치 (모드별 분기)

### 모드 1 (single)
```
1. 카테고리 1개 → 해당 서브 스킬 호출
   인자: {n_target, period_days, write_db: true, baseline: <auto-load>}
2. 서브 스킬이 자체적으로 6단계 파이프라인 실행
3. 메인은 결과 JSON 받아서 시계열 DB에 write
4. 점수 리포트 생성 + present_files
```

### 모드 2 (multi)
```
1. N개 카테고리 → N개 서브 스킬을 병렬 호출
   - 동시 실행 한도: 카테고리 6개, 카테고리당 플랫폼 4개
2. 모든 서브 스킬 완료 대기
3. 통합 대시보드 생성:
   - master table (카테고리 한눈에 비교)
   - AI 요구율 순위
   - 평균 연봉 순위
   - 공통 키워드 vs 고유 키워드
4. 모든 카테고리 시계열 DB write
5. 모든 산출물 present_files (메인은 통합 대시보드 → 카테고리별 리포트 순)
```

**부분 실패 처리:** N개 중 M개만 성공해도 통합 대시보드는 생성. 실패한 카테고리는 별도 표기.

### 모드 3 (trend)
```
1. 카테고리 1개 + 비교 기간 (1주/1개월/3개월) 결정
2. history/{slug}/ 에서 해당 기간의 모든 레코드 로드
3. tools/trend_comparator.py 실행:
   - 키워드 빈도 변화율
   - 신규 등장 키워드 / 사라진 키워드
   - 점수 순위 변동
   - AI 요구율 추이
4. 변화 알림 트리거 (±15% medium / ±30% high / 신규 키워드 ≥3개)
5. 트렌드 리포트 생성 (DB write 없음)
```

### 모드 4 (cross)
```
1. 비교할 지표 결정 (ai_required_ratio / new_vs_exp_ratio / avg_salary_max 등)
2. 6개 history 폴더에서 최신 레코드만 로드
3. 해당 필드만 추출 → 비교 차트 + 인사이트
4. cross_metric_{name} 리포트 생성
```

---

## Step 3: 시계열 DB write 규칙

서브 스킬이 반환한 결과 객체를 `history/_schema.json` 형식으로 변환하여 저장:

```
경로: history/{slug}/{YYYYMMDD}.json
정책: append-only. 같은 날 재실행 시 파일명에 -HHMM 접미사 추가.
예시: jd-architecture-20260427.json
       jd-architecture-20260427-1530.json (당일 2번째 실행)
```

**자동 baseline 로드:**
서브 스킬 호출 직전에, 해당 카테고리의 직전 실행 결과를 자동 로드하여 인자로 전달.
서브 스킬은 이 baseline을 사용해 트렌드 분석을 수행합니다.

---

## Step 4: 알림 트리거 (변화 감지)

다음 조건에서 리포트 상단에 ⚠️ 알림 박스 추가:

| 조건 | 등급 |
|------|----|
| 어떤 지표든 ±30% 이상 변동 | high |
| 어떤 지표든 ±15% 이상 변동 | medium |
| 신규 키워드 ≥ 3개 등장 | medium |
| 파싱 성공률 < 50% | high (데이터 신뢰도 경고) |
| TOP10 순위에서 ±5위 이상 변동 | medium |

high 등급은 외부 알림 채널로도 전송 (Slack/이메일, `tools/notifier.py` 참조).

---

## Step 5: 산출물 표준 형식

### 모드 1 산출물
```
{slug}_score_report_YYYYMMDD.md       메인 점수 리포트
{slug}_keyword_stats_YYYYMMDD.csv     키워드 통계 CSV
{slug}_priority_top10_YYYYMMDD.csv    우선순위 TOP10 CSV
history/{slug}/YYYYMMDD.json          시계열 DB 레코드
```

### 모드 2 산출물
```
cross_dashboard_YYYYMMDD.md           통합 대시보드 (메인)
cross_master_table_YYYYMMDD.csv       6개 카테고리 비교 CSV
[각 카테고리별 모드 1 산출물 N세트]
```

### 모드 3 산출물
```
{slug}_trend_report_YYYYMMDD.md       트렌드 리포트
{slug}_trend_chart_YYYYMMDD.csv       시계열 데이터 CSV
[알림 트리거 시] notify_log.txt        알림 발화 로그
```

### 모드 4 산출물
```
cross_metric_{metric}_YYYYMMDD.md     횡단 비교 리포트
```

---

## 점수 계산 공식 (모든 카테고리 공통)

```
priority_score = 0.4 × frequency_ratio
              + 0.3 × required_ratio
              + 0.2 × ai_weight
              + 0.1 × high_salary_ratio
```

- `frequency_ratio`: 전체 공고 중 해당 키워드 등장 비율
- `required_ratio`: 등장한 공고 중 "필수"로 명시된 비율
- `ai_weight`: AI 도구 키워드면 1.0, 일반 스킬이면 0.5
- `high_salary_ratio`: 평균 이상 연봉 공고 중 해당 키워드 등장 비율

`tools/score_calculator.py`가 이 계산을 수행합니다 (서브 스킬과 메인 모두 사용).

---

## 실패 처리

| 실패 상황 | 처리 |
|---------|----|
| 서브 스킬 1개 실패 (모드 2) | 나머지로 통합 대시보드 생성, 실패 카테고리 명시 |
| 서브 스킬 모두 실패 | 에러 리포트 + 마지막 성공 history 안내 |
| history 폴더 비어있음 (모드 3) | "비교 baseline 없음 — 모드 1로 첫 실행 권장" |
| 스키마 검증 실패 | 디폴트 필드로 보정 + 한계 표기 |
| 외부 스케줄러 호출에 카테고리 미지정 | `default_categories` (메인 SKILL의 설정값) 사용 |

---

## 외부 스케줄러 인터페이스

`schedulers/runner.py`가 이 스킬을 호출할 때 사용하는 표준 인자:

```yaml
mode: multi              # single / multi / trend / cross
categories:              # 슬러그 리스트
  - jd-publishing
  - jd-architecture
  - jd-video
  - jd-game
  - jd-software
  - jd-uiux
n_target: 100
period_days: 30
write_db: true
trigger: scheduled-weekly
notify_on_change: true
```

`schedulers/` 디렉토리에 GitHub Actions YAML, crontab 예제, Python runner 3종이 준비되어 있습니다.

---

## 주의사항

- **카테고리 추가 시:** 새 서브 스킬 1개 작성 → 본 SKILL.md의 슬러그 매핑 표에 추가 → 메인 코드 수정 불필요
- **시계열 DB는 단일 진실 출처:** 모든 트렌드 분석은 history/ 폴더 기반. 메모리에 baseline을 들고 있지 않음
- **저작권 준수:** 공고 원문 발췌는 카테고리당 15단어 이내, 출처별 1회
- **PII 비식별화:** 채용담당자 개인 연락처는 모든 산출물에서 제외
- **신뢰도 표기 필수:** 모든 리포트 말미에 confidence 등급 명시
- **한국어 작성:** 모든 리포트 한국어, 기술 용어는 영문 병기 허용
- **부분 실패 시에도 산출물 생성:** 데이터 일부만 있어도 가능한 한 완성
