{
  "contract_version": "deviceagent.capability-catalog.v1",
  "evidence": {
    "deviceagent_repo": "a1-packages-mr6",
    "deviceagent_branch": "task_manager",
    "deviceagent_base_sha": "be187133ac5b",
    "observed_at": "2026-07-29",
    "schema": "deviceagent-agentic-capability-card.schema.json"
  },
  "runtime_binding_manifest": {
    "contract_version": "deviceagent-cloud-runtime-binding.v1",
    "binding_policy": "Capability Card IDs describe scenario semantics. Cloud capability IDs, specialist routes, and workflow primitives are explicit runtime bindings rather than assumed name equality.",
    "bindings": [
      {
        "capability_id": "move_to_room",
        "binding_status": "connected",
        "cloud_capability_ids": ["move_to_room"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "return_to_station",
        "binding_status": "connected",
        "cloud_capability_ids": ["return_to_station"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "start_room_cleaning",
        "binding_status": "connected",
        "cloud_capability_ids": ["stationary_purify"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "stop_cleaning",
        "binding_status": "connected",
        "cloud_capability_ids": ["stationary_purify"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "air_quality_assessment",
        "binding_status": "connected",
        "cloud_capability_ids": ["check_air_quality"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "security_patrol",
        "binding_status": "connected",
        "cloud_capability_ids": ["security_patrol"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "live_view",
        "binding_status": "blocked",
        "cloud_capability_ids": [],
        "route_families": [],
        "workflow_primitives": []
      },
      {
        "capability_id": "voice_content",
        "binding_status": "partial",
        "cloud_capability_ids": [],
        "route_families": ["DEF", "FRG", "STM", "ETR"],
        "workflow_primitives": []
      },
      {
        "capability_id": "schedule_workflow",
        "binding_status": "connected",
        "cloud_capability_ids": [],
        "route_families": ["SCH"],
        "workflow_primitives": ["scheduleTask", "scheduleWorkflow"]
      },
      {
        "capability_id": "after_step_delay",
        "binding_status": "connected",
        "cloud_capability_ids": [],
        "route_families": ["ODL"],
        "workflow_primitives": ["after_step"]
      },
      {
        "capability_id": "product_interaction",
        "binding_status": "partial",
        "cloud_capability_ids": ["product_interaction"],
        "route_families": ["ODL"],
        "workflow_primitives": ["interSchedule"],
        "remaining_gaps": [
          "registered schedule_id grounding is not projected into Planner context"
        ]
      },
      {
        "capability_id": "vital_sign_session",
        "binding_status": "connected",
        "cloud_capability_ids": ["vital_signs"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "device_health_assessment",
        "binding_status": "connected",
        "cloud_capability_ids": [
          "battery_status",
          "error_history",
          "filter_management"
        ],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "spatial_context_assessment",
        "binding_status": "connected",
        "cloud_capability_ids": ["movement_status"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "perception_presence_assessment",
        "binding_status": "partial",
        "cloud_capability_ids": [],
        "route_families": [],
        "workflow_primitives": ["semantic_observation"]
      },
      {
        "capability_id": "connectivity_assessment",
        "binding_status": "connected",
        "cloud_capability_ids": ["wifi_status"],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "device_setting",
        "binding_status": "connected",
        "cloud_capability_ids": [
          "airflow_setting",
          "screen_brightness",
          "sound_setting",
          "sensor_sensitivity",
          "ai_mode",
          "uv_led",
          "voice_recognition",
          "night_mode",
          "manner_mode",
          "privacy_mode",
          "language_setting",
          "voice_gender",
          "temperature_unit",
          "home_theme",
          "all_time_mode_toggle"
        ],
        "route_families": ["ODL"],
        "workflow_primitives": []
      },
      {
        "capability_id": "experience_supervision",
        "binding_status": "connected",
        "cloud_capability_ids": [
          "task_manager_status",
          "task_manager_control"
        ],
        "route_families": ["ODL"],
        "workflow_primitives": [
          "experience_supervisor",
          "bounded_replan"
        ]
      }
    ]
  },
  "capabilities": [
    {
      "capability_id": "move_to_room",
      "display_name": "지정 공간 이동",
      "domain": "mobility",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager.MovementTaskExecutor",
        "task_methods": ["setMoveTo"],
        "domain_methods": ["moveToArea", "moveToPosition"],
        "queue": "movement",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": ["targetRoom", "areaId", "positionId"],
        "optional": ["x", "y", "theta", "timeoutMs"]
      },
      "context_reads": [
        "spatial.map.available",
        "policy.map_edit.active",
        "spatial.map.rooms",
        "spatial.location",
        "spatial.movement",
        "battery",
        "environment.cleaning"
      ],
      "resources": {
        "exclusive": ["amr_motion"],
        "shared": ["map", "battery"]
      },
      "lifecycle": {
        "accepted_evidence": ["STARTED"],
        "completion_targets": ["movement.arrived"],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 120000,
        "cancel_method": "stopMovement",
        "compensation_method": "stopMovement"
      },
      "safety": {
        "device_gates": [
          "runtime room catalog match",
          "map not editing",
          "strict coordinate validation",
          "device motion policy"
        ],
        "privacy": "none"
      },
      "composition": {
        "may_follow": ["stop_cleaning"],
        "may_overlap": ["voice_content"],
        "replan_on": [
          "movement timeout",
          "obstacle or drive error",
          "battery low",
          "ambiguous room",
          "map changed"
        ],
        "known_gaps": [
          "partial room-name resolution can be ambiguous",
          "accepted cancel is not yet guaranteed physical stop evidence"
        ]
      }
    },
    {
      "capability_id": "return_to_station",
      "display_name": "스테이션 복귀",
      "domain": "mobility",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager.MovementTaskExecutor",
        "task_methods": ["returnToStation"],
        "domain_methods": ["returnToStation", "dock"],
        "queue": "movement",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": [],
        "optional": ["timeoutMs"]
      },
      "context_reads": ["spatial.location.is_on_station", "spatial.movement", "battery"],
      "resources": {
        "exclusive": ["amr_motion"],
        "shared": ["map", "battery"]
      },
      "lifecycle": {
        "accepted_evidence": ["STARTED"],
        "completion_targets": ["movement.stationCharging"],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 120000,
        "cancel_method": "stopMovement",
        "compensation_method": "stopMovement"
      },
      "safety": {
        "device_gates": ["station location available", "device motion policy"],
        "privacy": "none"
      },
      "composition": {
        "may_follow": [
          "stop_cleaning",
          "security_patrol",
          "product_interaction"
        ],
        "may_overlap": ["voice_content"],
        "replan_on": [
          "station unavailable",
          "dock timeout",
          "drive error",
          "battery critical"
        ],
        "known_gaps": [
          "physical charging evidence must remain distinct from command acceptance"
        ]
      }
    },
    {
      "capability_id": "start_room_cleaning",
      "display_name": "공간 청정 시작",
      "domain": "cleaning",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager.CleaningAmpTaskExecutor",
        "task_methods": ["setAirCleanerOperation"],
        "domain_methods": [
          "startBasicAirClear",
          "startSelectiveAirClear",
          "startAirSensorAirClear"
        ],
        "queue": "cleaning",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": ["action"],
        "optional": [
          "mode",
          "speed",
          "ai",
          "targetRoom",
          "areaId",
          "cleanMinTimeMs",
          "cleanMaxTimeMs",
          "timeoutMs"
        ]
      },
      "context_reads": [
        "environment.cleaning",
        "spatial.location",
        "environment.air_quality",
        "battery",
        "task_manager"
      ],
      "resources": {
        "exclusive": ["cleaning_actuator"],
        "shared": ["air_sensor", "amr_motion", "voice_audio_output"]
      },
      "lifecycle": {
        "accepted_evidence": ["STARTED", "cleaning.started"],
        "completion_targets": [
          "cleaning.stopped",
          "cleaning.reportDone"
        ],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 1200000,
        "cancel_method": "setAirCleanerOperation",
        "compensation_method": "setAirCleanerOperation"
      },
      "safety": {
        "device_gates": [
          "cleaning admission policy",
          "battery policy",
          "main state compatibility"
        ],
        "privacy": "none"
      },
      "composition": {
        "may_follow": ["move_to_room", "air_quality_assessment"],
        "may_overlap": ["voice_content", "air_quality_assessment"],
        "replan_on": [
          "cleaning start rejected",
          "air quality not improving",
          "PUI stop",
          "battery low",
          "movement requested"
        ],
        "known_gaps": [
          "PUI stop must be correlated to the active managed task",
          "cleaning and movement overlap policy differs by cleaning mode",
          "basic cleaning defaults to cleanMinTimeMs 0 while cleaning.stopped is the default completion target"
        ]
      }
    },
    {
      "capability_id": "stop_cleaning",
      "display_name": "청정 중지",
      "domain": "cleaning",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager.CleaningAmpTaskExecutor",
        "task_methods": ["stopCleaning", "ampStop"],
        "domain_methods": ["stopAirClear"],
        "queue": "cleaning",
        "execution_mode": "QUEUED_WAIT"
      },
      "inputs": {
        "required": [],
        "optional": ["timeoutMs"]
      },
      "context_reads": ["environment.cleaning"],
      "resources": {
        "exclusive": ["cleaning_actuator"],
        "shared": []
      },
      "lifecycle": {
        "accepted_evidence": ["STARTED"],
        "completion_targets": ["cleaning.stopped"],
        "terminal_events": ["COMPLETED", "FAILED"],
        "timeout_ms": 30000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": ["none"],
        "privacy": "none"
      },
      "composition": {
        "may_follow": ["start_room_cleaning"],
        "may_overlap": [],
        "replan_on": ["stop timeout", "cleaning state remains active"],
        "known_gaps": [
          "physical stop evidence must be preserved for PUI stop",
          "stopCleaning and ampStop are registered task methods but are not mapped by LegacyCommandAdapter"
        ]
      }
    },
    {
      "capability_id": "air_quality_assessment",
      "display_name": "공기질 해석",
      "domain": "environment",
      "maturity": "M2_OBSERVABLE",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "Cloud A2A with DevicePlanningContextProvider evidence",
        "task_methods": [],
        "domain_methods": ["AirQualityManager snapshot"],
        "queue": "state",
        "execution_mode": "DIRECT"
      },
      "inputs": {
        "required": [],
        "optional": ["targetRoom", "comparisonWindowMs"]
      },
      "context_reads": [
        "environment.air_quality",
        "spatial.location",
        "spatial.map.rooms",
        "environment.cleaning"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["air_sensor"]
      },
      "lifecycle": {
        "accepted_evidence": ["fresh context snapshot"],
        "completion_targets": ["air_quality.snapshotAvailable"],
        "terminal_events": [],
        "timeout_ms": 5000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": ["sensor freshness", "sensor availability"],
        "privacy": "summarize user-facing interpretation; do not read raw field names aloud"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": ["start_room_cleaning", "voice_content"],
        "replan_on": ["stale sensor", "sensor unavailable", "unexpected trend"],
        "known_gaps": [
          "device_context.v1 lacks per-room historical trend",
          "sensor warmup and source freshness are represented for the current device-wide sample, but per-room historical freshness is not",
          "platform-signed sample cadence and TTL policy are not verified"
        ]
      }
    },
    {
      "capability_id": "security_patrol",
      "display_name": "보안 순찰",
      "domain": "security",
      "maturity": "M2_OBSERVABLE",
      "planner_exposure": "terminal_step_only",
      "runtime": {
        "owner": "DeviceAgent.WssManager",
        "task_methods": [
          "checkSecurityBasicAvailability",
          "startSecurityMode",
          "pauseSecurityMode",
          "resumeSecurityMode",
          "stopSecurityMode"
        ],
        "domain_methods": [
          "start",
          "pause",
          "resume",
          "stop",
          "verifyPin",
          "verifyFace"
        ],
        "queue": "security",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": ["securityMode"],
        "optional": ["areaIds", "userId", "timeoutMs"]
      },
      "context_reads": [
        "battery",
        "spatial.map",
        "spatial.location",
        "policy.privacy",
        "policy.home_lock",
        "network",
        "security",
        "perception"
      ],
      "resources": {
        "exclusive": [
          "camera",
          "vision_pipeline",
          "amr_motion",
          "security_session"
        ],
        "shared": ["network", "voice_audio_output"]
      },
      "lifecycle": {
        "accepted_evidence": ["security.started"],
        "completion_targets": [
          "security.started",
          "security.patrolCompleted",
          "security.stopped"
        ],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 120000,
        "cancel_method": "stopSecurityMode",
        "compensation_method": "stopSecurityMode"
      },
      "safety": {
        "device_gates": [
          "WSS subscription",
          "PIN configured",
          "privacy disabled",
          "home lock policy",
          "map available",
          "camera and drive health",
          "network policy"
        ],
        "privacy": "raw frames remain local; upload only encrypted event assets"
      },
      "composition": {
        "may_follow": ["schedule_workflow"],
        "may_overlap": ["voice_content"],
        "replan_on": [
          "person detected",
          "verification failed",
          "low light",
          "battery low",
          "AWS disconnected",
          "drive failure",
          "voice session started"
        ],
        "known_gaps": [
          "platform-signed physical WSS lifecycle E2E is not verified",
          "the current test device is blocked by WSS subscription and PIN provisioning",
          "camera, vision, motion, and security ownership is not yet unified in a shared resource lease registry"
        ]
      }
    },
    {
      "capability_id": "live_view",
      "display_name": "원격 실시간 보기",
      "domain": "streaming",
      "maturity": "NO_GO",
      "planner_exposure": "blocked",
      "runtime": {
        "owner": "DeviceAgent.StreamingManager",
        "task_methods": [],
        "domain_methods": [
          "startStreamingMode",
          "stopStreamingMode",
          "changeAmrManualMode",
          "movementControl",
          "rotate"
        ],
        "queue": "streaming",
        "execution_mode": "DOMAIN_ONLY"
      },
      "inputs": {
        "required": ["userId", "roomId", "signedUrl", "correlationId"],
        "optional": ["expiresAtMs"]
      },
      "context_reads": [
        "streaming",
        "policy.privacy",
        "application.vital_sign",
        "security",
        "perception",
        "network"
      ],
      "resources": {
        "exclusive": [
          "camera",
          "vision_pipeline",
          "amr_manual_motion",
          "streaming_session"
        ],
        "shared": ["network"]
      },
      "lifecycle": {
        "accepted_evidence": ["domain start callback"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 30000,
        "cancel_method": "stopStreamingMode",
        "compensation_method": "stopStreamingMode"
      },
      "safety": {
        "device_gates": [
          "explicit user consent",
          "signature permission",
          "Binder UID/package/certificate verification",
          "signed URL freshness",
          "VitalSign not running"
        ],
        "privacy": "video is never included in general LLM context"
      },
      "composition": {
        "may_follow": ["security_patrol"],
        "may_overlap": [],
        "replan_on": [
          "consent missing",
          "caller authentication failed",
          "network failure",
          "signed URL expired"
        ],
        "known_gaps": [
          "exported Binder service lacks complete enforced authentication",
          "not registered in TaskManager",
          "no canonical streaming terminal event"
        ]
      }
    },
    {
      "capability_id": "voice_content",
      "display_name": "대화·정보·콘텐츠 세션",
      "domain": "voice_llm",
      "maturity": "M2_OBSERVABLE",
      "planner_exposure": "terminal_step_only",
      "runtime": {
        "owner": "on-device Agent and Cloud A2A",
        "task_methods": [
          "setChangeLlmStatus",
          "setLlmTts",
          "stopLlm",
          "stopTts"
        ],
        "domain_methods": ["STT", "Cloud LLM", "on-device LLM", "TTS"],
        "queue": "ai",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": ["contentGoal"],
        "optional": ["language", "guideType", "sessionId"]
      },
      "context_reads": ["voice_llm", "task_manager", "policy", "network"],
      "resources": {
        "exclusive": ["microphone", "voice_session"],
        "shared": ["speaker", "network"]
      },
      "lifecycle": {
        "accepted_evidence": ["LLM state transition", "TTS request accepted"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 30000,
        "cancel_method": "stopLlm",
        "compensation_method": "stopTts"
      },
      "safety": {
        "device_gates": ["voice session policy", "privacy", "LLM readiness"],
        "privacy": "send semantic device summaries, not raw video or unrestricted logs"
      },
      "composition": {
        "may_follow": [
          "air_quality_assessment",
          "start_room_cleaning",
          "security_patrol"
        ],
        "may_overlap": ["start_room_cleaning", "move_to_room"],
        "replan_on": [
          "voice interruption",
          "Cloud unavailable",
          "LLM reinitializing",
          "user cancellation"
        ],
        "known_gaps": [
          "TTS request completion is not playback completion",
          "native model readiness and death are not proven by the reported pipeline status",
          "platform-signed semantic observation delivery and voice interruption E2E are not verified"
        ]
      }
    },
    {
      "capability_id": "schedule_workflow",
      "display_name": "일회성 작업 예약",
      "domain": "schedule",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager",
        "task_methods": [],
        "framework_methods": [
          "scheduleTask",
          "scheduleWorkflow",
          "cancelScheduledTask"
        ],
        "domain_methods": ["AlarmManager exact admission"],
        "queue": "schedule",
        "execution_mode": "QUEUED_WAIT"
      },
      "inputs": {
        "required": ["triggerAtMs", "targetMethod"],
        "optional": [
          "missedRunGraceMs",
          "requiresCloudDecision",
          "conditions",
          "payload"
        ]
      },
      "context_reads": [
        "task_manager",
        "battery",
        "core.main_state",
        "policy"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["alarm_scheduler", "task_store"]
      },
      "lifecycle": {
        "accepted_evidence": ["scheduled record persisted"],
        "completion_targets": [],
        "terminal_events": ["CANCELLED", "BLOCKED"],
        "timeout_ms": 30000,
        "cancel_method": "cancelScheduledTask",
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "trigger time validation",
          "missed run policy",
          "admission context refresh"
        ],
        "privacy": "none"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": [],
        "replan_on": [
          "TASK_MANAGER_BUSY",
          "MISSED_RUN_EXPIRED",
          "CAPABILITY_UNAVAILABLE",
          "STATE_CONDITION_FAILED"
        ],
        "known_gaps": [
          "BLOCKED is emitted by scheduled admission, not every generic task failure",
          "Cloud decision requests need durable callback delivery"
        ]
      }
    },
    {
      "capability_id": "after_step_delay",
      "display_name": "이전 단계 완료 후 지연",
      "domain": "schedule",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager workflow runtime",
        "task_methods": [],
        "framework_methods": ["submitWorkflow", "cancelWorkflow"],
        "domain_methods": ["after_step trigger", "step_completed condition"],
        "queue": "workflow",
        "execution_mode": "QUEUED_WAIT"
      },
      "inputs": {
        "required": ["trigger.type=after_step", "trigger.stepId", "delayMs"],
        "optional": ["conditions"]
      },
      "context_reads": ["task_manager.workflow_step_state"],
      "resources": {
        "exclusive": [],
        "shared": ["task_store"]
      },
      "lifecycle": {
        "accepted_evidence": ["WORKFLOW_STEP_WAITING"],
        "completion_targets": ["dependency step completed and delay elapsed"],
        "terminal_events": [
          "WORKFLOW_STEP_STARTED",
          "WORKFLOW_STEP_COMPLETED",
          "FAILED",
          "CANCELLED"
        ],
        "timeout_ms": 0,
        "cancel_method": "cancelWorkflow",
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "dependency step exists",
          "dependency completed",
          "delayMs is non-negative"
        ],
        "privacy": "none"
      },
      "composition": {
        "may_follow": ["move_to_room", "start_room_cleaning"],
        "may_overlap": [],
        "replan_on": [
          "dependency missing",
          "dependency failed",
          "workflow cancelled"
        ],
        "known_gaps": [
          "domain state must still be rechecked when the delayed step is admitted"
        ]
      }
    },
    {
      "capability_id": "product_interaction",
      "display_name": "제품 Interaction",
      "domain": "interaction",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent Schedule and Interaction domain",
        "task_methods": ["interSchedule"],
        "domain_methods": [
          "welcomeWeather",
          "welcomeCleaning",
          "wakeUpBasic",
          "wakeUpWeather",
          "relax"
        ],
        "queue": "interaction",
        "execution_mode": "ASYNC"
      },
      "inputs": {
        "required": ["interactionType"],
        "optional": ["targetRoom", "scheduleId", "timeoutMs"]
      },
      "context_reads": [
        "spatial.location",
        "spatial.movement",
        "battery",
        "network",
        "policy"
      ],
      "resources": {
        "exclusive": ["interaction_session"],
        "shared": ["amr_motion", "speaker", "network"]
      },
      "lifecycle": {
        "accepted_evidence": ["interaction.started"],
        "completion_targets": ["interaction.completed"],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 1200000,
        "cancel_method": "interSchedule",
        "compensation_method": "interSchedule"
      },
      "safety": {
        "device_gates": [
          "interaction policy",
          "target location available",
          "device state compatible"
        ],
        "privacy": "content requests follow voice and account privacy policy"
      },
      "composition": {
        "may_follow": ["schedule_workflow"],
        "may_overlap": [],
        "replan_on": [
          "arrival failure",
          "content unavailable",
          "user not present",
          "interaction cancelled"
        ],
        "known_gaps": [
          "internal stages should remain domain-owned rather than re-expanded by Planner"
        ]
      }
    },
    {
      "capability_id": "vital_sign_session",
      "display_name": "바이탈사인 앱 세션",
      "domain": "application",
      "maturity": "M2_OBSERVABLE",
      "planner_exposure": "terminal_step_only",
      "runtime": {
        "owner": "Launcher and VitalSign application",
        "task_methods": ["setLauncherScreen"],
        "domain_methods": ["setAppStatus"],
        "queue": "state",
        "execution_mode": "QUEUED_WAIT"
      },
      "inputs": {
        "required": ["screenName=vitalSign"],
        "optional": ["sessionId", "timeoutMs"]
      },
      "context_reads": [
        "core.main_state",
        "application.vital_sign",
        "streaming",
        "security"
      ],
      "resources": {
        "exclusive": ["camera", "display", "vital_sign_session"],
        "shared": ["speaker"]
      },
      "lifecycle": {
        "accepted_evidence": ["app.sessionStarted"],
        "completion_targets": ["app.sessionEnded"],
        "terminal_events": [],
        "timeout_ms": 0,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "streaming not active",
          "security policy compatible",
          "application available"
        ],
        "privacy": "typed measurement results require explicit result contract and consent"
      },
      "composition": {
        "may_follow": ["move_to_room", "after_step_delay"],
        "may_overlap": [],
        "replan_on": [
          "user cancelled",
          "application closed",
          "measurement timeout",
          "resource conflict"
        ],
        "known_gaps": [
          "app session end does not distinguish measurement success from cancellation",
          "no typed measurement result event",
          "timeout must not be treated as success"
        ]
      }
    },
    {
      "capability_id": "device_health_assessment",
      "display_name": "기기 건강 상태 평가",
      "domain": "maintenance",
      "maturity": "M0_INTERNAL",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "DeviceAgent managers and TaskResourceMonitor",
        "task_methods": [
          "getBatteryInfo",
          "getFirmwareVersion",
          "getDeviceStatus"
        ],
        "domain_methods": [
          "filter status",
          "part usage",
          "thermal",
          "CPU/RAM pressure",
          "error state"
        ],
        "queue": "device_info",
        "execution_mode": "DIRECT"
      },
      "inputs": {
        "required": [],
        "optional": ["assessmentWindowMs"]
      },
      "context_reads": [
        "battery",
        "maintenance",
        "resource",
        "network",
        "recent_events"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["device_state"]
      },
      "lifecycle": {
        "accepted_evidence": ["fresh context snapshot"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 5000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": ["source freshness", "diagnostic disclosure policy"],
        "privacy": "summarize health state; do not expose internal identifiers or raw logs"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": ["move_to_room", "start_room_cleaning"],
        "replan_on": [
          "thermal high",
          "CPU high",
          "RAM pressure high",
          "battery low",
          "repeated domain failures"
        ],
        "known_gaps": [
          "most maintenance and resource fields are absent from device_context.v1",
          "TaskResourcePolicy is opt-in and only covers CPU, RAM, and thermal"
        ]
      }
    },
    {
      "capability_id": "spatial_context_assessment",
      "display_name": "공간·위치 상태 평가",
      "domain": "mobility",
      "maturity": "M2_OBSERVABLE",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "DeviceAgent.DevicePlanningContextProvider with MapManager and MovingController",
        "task_methods": ["reqmap", "isMapFilePresent"],
        "framework_methods": ["getDevicePlanningContext"],
        "domain_methods": [
          "MapManager area catalog",
          "MovingController current position"
        ],
        "queue": "state",
        "execution_mode": "DIRECT"
      },
      "inputs": {
        "required": [],
        "optional": ["targetRoom", "requiredFreshnessMs"]
      },
      "context_reads": [
        "spatial.map",
        "spatial.location",
        "spatial.movement",
        "policy.map_edit"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["map", "device_state"]
      },
      "lifecycle": {
        "accepted_evidence": ["fresh device_context snapshot"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 5000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "runtime room catalog available",
          "location freshness",
          "map edit state known"
        ],
        "privacy": "Planner receives semantic room identity; raw coordinates remain runtime grounding data"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": [
          "move_to_room",
          "start_room_cleaning",
          "product_interaction"
        ],
        "replan_on": [
          "location stale",
          "map revision changed",
          "room identity ambiguous",
          "map editing active"
        ],
        "known_gaps": [
          "device_context.v1 has snapshot-level rather than field-level freshness",
          "strict coordinate and ambiguous room validation remain admission responsibilities"
        ]
      }
    },
    {
      "capability_id": "perception_presence_assessment",
      "display_name": "사람 존재·조도 의미 관찰",
      "domain": "vision",
      "maturity": "M0_INTERNAL",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "DeviceAgent.VisionAIManager and WssVisionObserver",
        "task_methods": [],
        "domain_methods": [
          "Vision object report",
          "WSS sustained person detection",
          "low-light detection"
        ],
        "queue": "vision",
        "execution_mode": "DOMAIN_ONLY"
      },
      "inputs": {
        "required": [],
        "optional": ["observationPurpose"]
      },
      "context_reads": [
        "perception.person",
        "perception.low_light",
        "perception.camera_health",
        "policy.privacy"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["camera", "vision_pipeline"]
      },
      "lifecycle": {
        "accepted_evidence": ["debounced local semantic event"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 0,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "privacy policy",
          "camera health",
          "domain-owned confidence and debounce"
        ],
        "privacy": "raw frame, bbox, face data, and unrestricted detection reports never enter general LLM context"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": ["product_interaction", "security_patrol"],
        "replan_on": [
          "person absent after bounded wait",
          "presence uncertain",
          "low light",
          "camera unavailable",
          "privacy enabled"
        ],
        "known_gaps": [
          "semantic perception events are not exposed in device_context.v1",
          "general Planner subscription contract is not implemented",
          "Vision callback null handling and disconnect cleanup require hardening"
        ]
      }
    },
    {
      "capability_id": "connectivity_assessment",
      "display_name": "AWS·네트워크 연결 상태 평가",
      "domain": "system",
      "maturity": "M0_INTERNAL",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "IotAgent.AWSIoTMQTTClient and DeviceAgent cached callbacks",
        "task_methods": [],
        "domain_methods": [
          "AWS IoT connect",
          "auto reconnect",
          "MQTT command and response topics",
          "Wi-Fi state"
        ],
        "queue": "state",
        "execution_mode": "DOMAIN_ONLY"
      },
      "inputs": {
        "required": [],
        "optional": ["requiredFreshnessMs"]
      },
      "context_reads": [
        "network.aws",
        "network.wifi",
        "network.last_success",
        "network.last_error"
      ],
      "resources": {
        "exclusive": [],
        "shared": ["network"]
      },
      "lifecycle": {
        "accepted_evidence": ["transport callback with observation time"],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 5000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "freshness known",
          "cached state distinguished from live probe",
          "credentials never exposed"
        ],
        "privacy": "Planner receives connectivity semantics only; endpoints, credentials, signed URLs, and raw MQTT payloads stay local"
      },
      "composition": {
        "may_follow": [],
        "may_overlap": [
          "schedule_workflow",
          "product_interaction",
          "security_patrol",
          "voice_content"
        ],
        "replan_on": [
          "AWS disconnected",
          "Wi-Fi disconnected",
          "outbox backlog",
          "callback stale"
        ],
        "known_gaps": [
          "current AWS connection value is a callback cache rather than a live probe",
          "transport connected, subscription ready, and publish acknowledgement health are not represented separately",
          "ordered durable event outbox process-restart replay is not verified on a platform-signed device"
        ]
      }
    },
    {
      "capability_id": "device_setting",
      "display_name": "기기 설정 조회·변경",
      "domain": "system",
      "maturity": "M3_MANAGED",
      "planner_exposure": "direct_step",
      "runtime": {
        "owner": "DeviceAgent.TaskManager FrameworkCommandBridge",
        "task_methods": ["getConfig", "setConfig", "getConfiguration"],
        "domain_methods": ["DeviceAgent setting registry"],
        "queue": "settings",
        "execution_mode": "QUEUED_WAIT"
      },
      "inputs": {
        "required": ["configKey"],
        "optional": [
          "configValue",
          "expectedCurrentValue",
          "postCheck",
          "timeoutMs"
        ]
      },
      "context_reads": [
        "core.main_state",
        "policy",
        "task_manager",
        "capabilities"
      ],
      "resources": {
        "exclusive": ["settings_write"],
        "shared": ["device_state"]
      },
      "lifecycle": {
        "accepted_evidence": ["STARTED"],
        "completion_targets": [],
        "terminal_events": ["COMPLETED", "FAILED", "CANCELLED"],
        "timeout_ms": 30000,
        "cancel_method": null,
        "compensation_method": "setConfig(previousValue)"
      },
      "safety": {
        "device_gates": [
          "config key allowlist",
          "value enum validation",
          "main state compatibility",
          "post-check for user-visible settings"
        ],
        "privacy": "sensitive account and credential settings are never Planner-writeable"
      },
      "composition": {
        "may_follow": [
          "device_health_assessment",
          "spatial_context_assessment"
        ],
        "may_overlap": [],
        "replan_on": [
          "config key unsupported",
          "value invalid",
          "post-check mismatch",
          "policy blocked"
        ],
        "known_gaps": [
          "post-check coverage differs by config key",
          "Planner must select semantic setting capability rather than raw arbitrary keys"
        ]
      }
    },
    {
      "capability_id": "experience_supervision",
      "display_name": "경험 목표 유지·의미 결정",
      "domain": "system",
      "maturity": "M0_INTERNAL",
      "planner_exposure": "context_only",
      "runtime": {
        "owner": "Cloud A2A Experience Supervisor",
        "task_methods": [],
        "domain_methods": [
          "choose semantic outcome",
          "bounded replan",
          "request focused clarification"
        ],
        "queue": "orchestration",
        "execution_mode": "DIRECT"
      },
      "inputs": {
        "required": [
          "goal",
          "allowedOutcomes"
        ],
        "optional": [
          "successCriteria",
          "replanBudget",
          "stepResults"
        ]
      },
      "context_reads": [
        "experience.goal",
        "experience.step_results",
        "experience.observations",
        "task_manager",
        "capabilities"
      ],
      "resources": {
        "exclusive": [],
        "shared": [
          "workflow_state"
        ]
      },
      "lifecycle": {
        "accepted_evidence": [
          "typed observation set"
        ],
        "completion_targets": [],
        "terminal_events": [],
        "timeout_ms": 10000,
        "cancel_method": null,
        "compensation_method": null
      },
      "safety": {
        "device_gates": [
          "all required facts known and fresh",
          "allowed outcome enum",
          "bounded replan budget",
          "DeviceAgent admission remains authoritative"
        ],
        "privacy": "Only policy-filtered semantic facts and typed step results are exposed to the Cloud decision."
      },
      "composition": {
        "may_follow": [
          "device_health_assessment",
          "air_quality_assessment",
          "spatial_context_assessment",
          "perception_presence_assessment",
          "connectivity_assessment"
        ],
        "may_overlap": [],
        "replan_on": [
          "goal changed",
          "required fact unknown or stale",
          "capability blocked",
          "local retry exhausted",
          "user intervention"
        ],
        "known_gaps": [
          "the decision-to-plan bridge is connected and common orchestration dispatch is connected, but platform-signed physical replan E2E is not verified",
          "workflow persistence and console observability do not yet expose the complete replan plan history",
          "typed step outputs are not preserved end to end for every mixed workflow"
        ]
      }
    }
  ]
}
