Schedule Milestone PRD and UX Spec
이 문서는 1차 마일스톤인 “사용자 설정값을 받아 고정청정 스케줄을 생성”하는 기능을 제품/UX/개발 공통 기준으로 정리한다.
1. 배경과 목표
1차 마일스톤은 사용자의 음성 입력을 Cloud LLM Server로 보내고, Cloud에서 Gemini STT로 텍스트화한 뒤, Schedule Agent가 멀티턴으로 필요한 slot을 채워 고정청정 스케줄 API를 호출하는 것이다.
핵심 목표:
- 사용자는 자연어로 스케줄을 요청한다.
- 시스템은 부족한 값만 되묻는다.
- 필수 slot이 모두 채워지기 전에는 API를 호출하지 않는다.
- 완료 시 실제 schedule 생성 결과를 확인한다.
- 고정청정 등록 구조를 기반으로 다른 스케줄 기능의 등록/수정/삭제/조회를 확장한다.
2. 전제와 비범위
| 항목 | 기준 |
|---|---|
| 네트워크 | Cloud 연결과 인터넷 연결 완료 상태를 가정 |
| 인입 조건 | 온디바이스에서 schedule 관련 기능으로 분류된 경우 |
| STT | Cloud에서 Gemini STT API 사용 |
| 멀티턴 | 온디바이스의 기존 Cloud 멀티턴 상태를 재사용 |
| 1차 실행 | 고정청정 스케줄 등록 |
| 비범위 | 오프라인 STT fallback, 모든 스케줄 adapter 동시 구현, proactive schedule suggestion |
3. Schedule 기능 목록도 slot이다
고정청정만 보면 안 된다. 사용자가 “스케줄 등록해줘”라고 말하면 무엇을 스케줄할지부터 모를 수 있다. 따라서 schedule_function 자체가 첫 번째 핵심 slot이다.
| slot | 설명 | 예시 |
|---|---|---|
schedule_function |
어떤 기능의 스케줄인지 | 고정청정, 이동청정, 웰컴, 웨이크업, 릴렉스, 공기질맵, 보안 |
operation |
등록/수정/삭제/조회 | 등록, 바꿔줘, 지워줘, 확인해줘 |
repeat_days |
반복 요일/날짜 | 매일, 평일, 주말, 토요일 |
start_time |
시작 시각 | 오전 10시, 밤 8시 반 |
end_time |
종료 시각 | 아침 7시까지 |
target_area |
대상 공간 | 안방, 거실, 아이들 방 |
mode_options |
기능별 옵션 | 풍량, 청정 모드, 보안 모드 |
enabled |
활성화 여부 | true |
4. 1차 기능 범위
Must
| 기능 | 완료 기준 |
|---|---|
| Cloud audio ingress | on-device schedule gate를 통과한 음성을 Cloud가 받음 |
| Gemini STT | 음성에서 transcript 생성 |
| Schedule Agent | transcript와 slot_state를 병합 |
| Missing slot follow-up | 부족한 slot만 질문 |
| Existing multiturn reuse | 질문형 response로 기존 isCloudContinue/multiTurnBusy 흐름 유지 |
| Fixed cleaning adapter | 모든 필수 slot이 채워지면 고정청정 API payload 생성 |
| Result confirmation | schedule 생성 성공/실패 결과 반환 |
Should
| 기능 | 이유 |
|---|---|
| 기능별 slot registry | 다른 schedule 기능 확장 기반 |
| 수정/삭제/조회 operation 분리 | 등록 성공 후 같은 구조 재사용 |
| API adapter capability flag | 아직 adapter 없는 schedule 기능을 안전하게 안내 |
Could
| 기능 | 이유 |
|---|---|
| 사용자 선호 반복값 memory | 반복 schedule UX 단축 |
| proactive schedule suggestion | 장기 방향 |
5. UX 흐름
5.1 모든 slot이 있는 경우
사용자: 평일 밤 10시부터 아침 7시까지 안방 고정청정 예약해줘
Cloud: transcript 생성
Schedule Agent: schedule_function=fixed_cleaning, operation=create, repeat_days=weekday, start_time=22:00, end_time=07:00, target_area=안방
Cloud: fixed cleaning schedule API 호출
응답: 평일 밤 10시부터 아침 7시까지 안방 고정청정 스케줄을 등록했어요.
5.2 기능이 빠진 경우
사용자: 스케줄 등록해줘
시스템: 어떤 기능을 스케줄로 등록할까요? 고정청정, 이동청정, 웨이크업 중에서 선택할 수 있어요.
사용자: 고정청정
시스템: 언제 실행할까요?
5.3 시간이 빠진 경우
사용자: 안방 고정청정 매일 예약해줘
시스템: 몇 시부터 몇 시까지 실행할까요?
사용자: 밤 10시부터 아침 7시까지
시스템: 매일 밤 10시부터 아침 7시까지 안방 고정청정 스케줄을 등록했어요.
5.4 operation이 다른 경우
사용자: 내일 아침 고정청정 예약 지워줘
시스템: 어떤 고정청정 예약을 삭제할까요? 등록된 예약을 확인해드릴게요.
삭제/수정/조회는 1차 등록 구조가 안정화된 뒤 같은 slot registry와 workflow 상태를 재사용한다.
6. On-device와 Cloud 책임 분리
| 계층 | 책임 |
|---|---|
| On-device Schedule Gate | schedule 관련 기능으로 분류된 경우에만 Cloud schedule path 진입 |
| On-device Multiturn | 기존 isCloudContinue, multiTurnBusy, 질문형 response 흐름 재사용 |
| Cloud STT | Gemini STT로 transcript 생성 |
| Cloud Schedule Workflow | workflow_id, slot_state, missing_slots 유지 |
| Schedule Agent | slot 추출, 부족한 값 판단, 다음 질문 생성 |
| Schedule Relay/API Adapter | 필수 slot 완료 후 실제 API payload 변환 |
| Schedule Server/DeviceAgent | 스케줄 생성/수정/삭제/조회 실행 |
7. 응답 계약
slot 부족:
{
"response": "몇 시부터 몇 시까지 실행할까요?",
"there_is_question_mark": "true",
"workflow_id": "sch_001",
"schedule_workflow_status": "collecting_slots",
"slot_state": {
"collected_slots": {
"schedule_function": "fixed_cleaning",
"operation": "create",
"target_area": "안방",
"repeat_days": "daily"
},
"missing_slots": ["start_time", "end_time"]
}
}
slot 완료:
{
"response": "안방 고정청정 스케줄을 등록했어요.",
"there_is_question_mark": "false",
"workflow_id": "sch_001",
"schedule_workflow_status": "completed",
"result_kind": "success",
"schedule_id": "schedule_123"
}
8. 수용 기준
| 기준 | PASS 조건 |
|---|---|
| Gate | 비스케줄 발화가 schedule workflow로 들어오지 않음 |
| STT | Cloud에서 transcript가 생성되고 workflow에 저장됨 |
| Slot filling | 필수 slot이 없을 때 API를 호출하지 않음 |
| Follow-up | 질문형 response와 slot_state가 같이 내려감 |
| Multiturn reuse | on-device가 기존 Cloud 멀티턴 상태로 다음 음성을 Cloud에 보냄 |
| API execution | 고정청정 필수 slot 완료 후 relay/API 호출 |
| Completion | 생성 성공값을 받고 workflow 종료 |
| Extension | 다른 schedule 기능은 schedule_function과 adapter flag로 확장 가능 |