Experience Goal Composer Live Slice 2026-08-02
이 문서는 Experience Workflow의 첫 번째 제한적 live 경로를 코드, 계약, 비용, 검증 결과 기준으로 고정한다. 목표는 간접적인 사용자 목표를 문장별 규칙으로 처리하는 것이 아니라, Main Router의 의미 판단과 effect catalog를 이용해 안전한 콘텐츠 응답까지 연결하는 것이다.
1. 이번 구현의 범위
검증 입력은 목적에 따라 세 종류로 나눈다.
# Experience 목표 위임 + 상태 관찰 + 조정
지금 내 상태와 주변 환경을 살펴보고 잠깐 편하게 쉴 수 있도록 필요한 걸 알아서 도와줘
# 현재 응답에서 수행 가능한 content effect
내 상황에 맞춰 지금 바로 편하게 쉴 수 있는 짧은 호흡 안내를 알아서 해줘
# 비입장 대조군
안녕
잠깐 편하게 쉬게 도와줘
현재 content_only live tier의 기대 결과는 다음 두 갈래다.
- 현재 응답으로 제공 가능한 content effect가 있으면 DEF가 그 부분만 즉시 수행한다.
- 전체 목표에 상태 조회나 기기 변경이 포함됐지만 plan/effect 검증이 끝나지 않으면 Experience 전체 활성화를 차단한다.
- 차단된 Experience 후보에서 Planner가 기기 step을 제안해도 dispatch gate가
device_task_requests와device_workflow_requests를 0으로 만든다. - 단순 인사나 일반적인 한 번의 대화 요청은 Experience로 승격하지 않는다.
이 경로는 사용자 발화의 특정 단어나 어미를 매칭하지 않는다. 입력 문장의 의미, Router가 선택한 owner/skill, canonical effect, provider metadata가 함께 일치해야 활성화된다.
2. 전체 흐름
User utterance
-> Main Router LLM
|- owner / skill
|- semantic experience_request
`- existing plan
-> Goal Composer
|- canonical effect lookup
|- exact selected-skill provider match
|- live tier / consent / side-effect gate
`- safe content contribution, or no plan
-> Experience activation gate
|- activated: validated plan만 실행 경계로 전달
`- blocked: candidate 기기 request 전부 억제
-> DEF/FRG content execution or safe blocked response
-> route_result / TaskManager terminal evidence
-> workflow effect completion when fully activated
Main Router는 의미 판단을 소유한다. Goal Composer는 새로운 추론기가 아니라 Router 결과와 catalog의 정합성을 검사하는 deterministic composer다.
3. 안전 경계
content_only Goal Composer가 plan을 만들 수 있는 조건은 모두 다음과 같다.
| 경계 | 조건 |
|---|---|
| Provider 종류 | skill provider |
| Skill 정합 | Router가 선택한 selected_skill과 exact match |
| Live tier | content_only |
| 부수 효과 | 없음 |
| 동의 | 불필요 |
| 완료 권위 | route_result 단일 권위 |
| 기존 plan | 비어 있거나 안전하게 교체 가능한 owner cloud step 1개 |
| 금지 대상 | device target, action, device task, condition, dependency, input binding |
| Step 상한 | 최대 4개, 현재 대표 경로는 1개 |
따라서 Goal Composer는 이동, 청정, 바이탈사인, 설정 변경 같은 기기 action을
새로 만들 수 없다. 이 작업들은 기존 Planner가 capability catalog를 근거로 만든
plan과 TaskManager 실행 계약을 그대로 사용한다. 또한 admission이
candidate이지만 Experience activation이 activated가 아니면, 기존 경로가
만든 기기 task도 최종 dispatch 직전에 억제한다.
4. Live Tier
Catalog provider는 실행 위험에 따라 세 단계로 구분한다.
| Tier | Provider 수 | 현재 허용 | 의미 |
|---|---|---|---|
content_only |
2 | 로컬 live | DEF 휴식 안내, FRG 최신 정보 합성 |
non_motion |
10 | 차단 | 상태 조회, 고정 청정, 화면·소리·모드 변경 |
full |
4 | 차단 | 이동, 복귀, 바이탈사인, story foreground session |
실행 설정은 다음 환경 변수로 제한한다.
A2A_EXPERIENCE_WORKFLOW_MODE=live
A2A_EXPERIENCE_LIVE_TIER=content_only
높은 tier provider가 catalog에 존재해도 현재 live tier보다 높으면
experience_activation에서 차단된다. catalog 등록과 실행 허용은 별도 결정이다.
5. 사용자 응답 계약
직접 수행 가능한 Goal은 일반적인 “무엇을 도와드릴까요?” 후속 질문으로 끝내지 않는다. 응답 계약은 다음 행동을 요구한다.
experience_response_contract:
response_mode: direct_goal_fulfillment
suppress_generic_follow_up: true
device_action_claim_allowed: false
DEF 응답은 다음 원칙을 따른다.
- 바로 실행 가능한 짧은 안내를 제공한다.
- 시스템 내부의 context, effect, provider, metadata 명칭을 발화하지 않는다.
- 실제로 수행하지 않은 기기 동작을 완료했다고 주장하지 않는다.
- 사용자가 추가 확인을 요구하지 않은 경우 질문으로 끝내지 않는다.
- “나중에 해주겠다”는 미래 약속 대신 현재 응답에서 가치가 완결되게 한다.
Gemini structured output의 schema 위반 가능성도 실행 시점에 검증한다. 정상 응답은
그대로 사용하며, case=1, there_is_question_mark=false, 질문 문장부호 금지
계약을 위반한 경우에만 effect catalog에 정의된 안전 content 산출물로 대체한다.
이 fallback은 사용자 발화 패턴이 아니라 선택된 canonical effect에 귀속되며,
추가 모델 호출이나 추가 토큰을 사용하지 않는다.
6. 완료 증거
완전히 활성화된 콘텐츠 step의 완료는 별도 task callback이 아니라 해당 agent의
route_result가 권위다.
route_result
-> owner route + selected skill
-> plan에서 유일한 대응 step 확인
-> terminal event COMPLETED
-> bound effect completed
명시적 task_step_id가 없는 경우에도 route와 skill metadata로 정확히 하나의
step만 식별될 때만 연결한다. 후보가 0개 또는 2개 이상이면 임의 추정하지 않는다.
7. 호출, 토큰, 지연 예산
| 경로 | 추가 모델 호출 | 추가 모델 토큰 | 상한 |
|---|---|---|---|
| Experience 비활성 | 0 | 0 | Composer 미실행 |
| Goal Composer | 0 | 0 | 25 ms 예산, 최대 4 step |
| Supervisor decision | decision event에서만 1 | 계측 | 최대 3회, 출력 400 token |
| Replanner | action=replan일 때만 1 |
계측 | 최대 4개 새 step, 출력 800 token |
정상 QUEUED, RUNNING, PROGRESS마다 LLM을 호출하지 않는다. 호출량과 usage는
trace의 Composer, Supervisor, Replanner metrics에서 분리해 확인한다.
8. 검증 결과
2026-08-02 최종 회귀 결과:
| Suite | 결과 |
|---|---|
| Experience admission/workflow/Supervisor | 66 passed |
| DEF/FRG prompt contract | 7 passed |
| Orchestrator task plan | 43 passed |
| Local Lambda shim | 38 passed |
| 집중 회귀 합계 | 154 passed |
| Cloud 전체 suite | 738 passed, 47 skipped |
검증에는 다음 항목이 포함된다.
- direct DEF Goal 응답 contract
- catalog 기반 content plan 생성
- 기존 device/action/dependency plan 비변경
content_onlylive tier 허용과 상위 tier 차단- Experience 비활성 경로의 Composer 비용 0
- Supervisor와 Replanner 호출·토큰·지연 계측
- route/skill metadata 기반 terminal effect correlation
- 콘텐츠 경로에서 device request 0
- Experience activation 실패 시 candidate device request 최종 억제
- direct content 응답 schema 위반 시 catalog 기반 무호출 fallback
테스트는 저장소 루트의 test.py 이름 충돌을 피하기 위해 discovery로 실행한다.
A2A_VALIDATION_MODE=direct_gemini \
.venv/bin/python -m unittest discover -s test \
-p 'test_experience_workflow.py'
Live Gemini + 연결 기기 E2E
| 입력/변형 | 결과 | 기기 요청 |
|---|---|---|
| 상태·환경 관찰을 포함한 휴식 목표 r13 | effect_coverage_invalid_binding, 안전 차단 |
task 0, workflow 0 |
| 같은 목표 반복 r14 | 동일 gate 재현, Planner 제안 task 1건 억제 | task 0, workflow 0 |
| 짧은 호흡 안내 r15 | DEF content 직접 제공, 질문 없음 | task 0, workflow 0 |
안녕 대조군 |
Experience 미입장, Composer 미실행 | task 0, workflow 0 |
| 단순 휴식 요청 대조군 | single_action_only, Experience 미입장 |
task 0, workflow 0 |
r13/r14에서 Composer 처리시간은 각각 1.183ms, 0.952ms였고 추가 모델 호출과 추가 토큰은 0이었다. r15는 1.611ms였으며, 모델 응답 계약 위반이 catalog fallback으로 수렴했다. Planner의 Experience 출력 예산은 JSON 절단 재시도를 피하기 위해 1,664 output token으로 고정했으며 Composer가 별도 재호출하지 않는다.
이번 E2E는 연결된 기기의 context 수신과 local shim 경로까지 포함한다. 다만
content_only tier에서는 물리 이동이나 설정 변경을 성공시키는 것이 목적이
아니며, 해당 요청이 안전하게 차단되는지를 검증한다.
Full tier 물리 E2E 판정
주방으로 이동한 다음 스테이션으로 복귀해줘 복합 실행은 Planner plan,
TaskManager step callback, workflow COMPLETED까지 반환됐다. 그러나 사용자의
육안 관찰에서 실제 주방 이동이 확인되지 않았으므로 물리 성공으로 판정하지 않는다.
이후 주방으로 이동해줘 단일 실행을 별도 세션으로 재검증했다.
| 증거 계층 | 관찰 결과 | 판정 |
|---|---|---|
| Planner/dispatch | ODL device_execution_bridge, setMoveTo, areaId=1 생성 |
통과 |
| TaskManager | STARTED 후 COMPLETED callback 수신 |
통과 |
| AMR 위치 | (-0.30, 0.00)에서 (1.85, -3.29)까지 연속 변화 |
통과 |
| DeviceAgent 도착 | notifyArrived areaId=1 수신 |
통과 |
| 육안 물리 위치 | 사용자 확인 필요 | 미확정 |
따라서 callback과 localization 변화만으로 physical_pass를 선언하지 않는다.
최종 판정에는 사람의 육안 확인 또는 독립적인 외부 위치 증거가 추가로 필요하다.
단일 ODL 명령이 Experience 후보 최소 범위에 미달하는 경우에도 일반 기기 명령을
차단하던 회귀는 owner_dispatch_policy=owner_fallback 계약으로 수정했다.
이 fallback은 발화 문자열 규칙이 아니라 admission/activation 결과에 따른 실행
소유권 결정이다. 동의, 안전 정책, 불완전한 effect binding처럼 실제 차단이 필요한
경우는 계속 blocked로 유지한다.
9. Go / No-Go
| 범위 | 판단 | 근거 |
|---|---|---|
로컬 content_only 응답 기여 |
Go | 0 추가 Composer 호출, 질문형 계약 fallback, 집중 회귀 통과 |
| Experience 후보 실행 차단 | Go | activation 실패 시 proposed device task 억제 E2E 확인 |
| Experience 전체 Goal 활성화 | 제한적 No-Go | live Gemini plan의 effect binding 안정성 부족 |
non_motion live |
No-Go | 실제 상태·설정 callback과 사용자 동의 경계 추가 검증 필요 |
full live |
No-Go | TaskManager·AMR 증거는 확보했지만 물리 위치의 독립 확인과 바이탈·foreground session 검증이 필요 |
| 제품 기본 활성화 | No-Go | tier 확대, 반복 E2E, rollback gate 미완료 |
10. 다음 Gate
- Router가 생성하는 step
effect_bindings의 catalog 정합률을 shadow로 계측 - Text Console에서 Goal, plan, activation block, 억제된 request 수를 한 trace로 표시
non_motionprovider는 observation callback과 사용자 동의 계약을 먼저 검증- full Goal activation 성공률과 false-admission 비율이 gate를 통과한 뒤에만 tier 확대