SPECIFICATION

=== META LAYER ===

Required: id, name, version, category, keywords, author

Optional: icon, description, min_api

meta:

id: com.example.my-dash # reverse-domain ID (lowercase, dots & hyphens only)

name: My Dash # display name (max 64 chars)

version: 1.0.0 # semver MAJOR.MINOR.PATCH

category: utility # utility|communication|productivity|entertainment|

# health|finance|travel|social|smart_home|education|food|sports

keywords: [keyword1, keyword2] # 1–20 search keywords (include Korean + English)

icon: res/drawable/ic_my_dash.png # drawable resource path

author: developer@example.com # author name or email

description: |

Brief description for Dash Store listing.

Triggers: keyword1, keyword2, ...

Do NOT use for: [specify exclusions]

min_api: 26 # minimum Android API (default: 26)

=== TRIGGER LAYER ===

Conditions under which Orchestrator activates this Dash (OR logic).

Condition types: always | time | location | topic_match | orchestrator_call

trigger:

conditions:

- type: always # activate whenever conditions permit

# - type: time # time-of-day window

# start: "07:00" # HH:MM 24h

# end: "09:00"

# days: [1,2,3,4,5] # 1=Mon...7=Sun (omit for every day)

# - type: location # geographic region

# lat: 37.5665

# lon: 126.9780

# radius_m: 500

# name: Gwanghwamun

# - type: topic_match # activated by P2P bus messages

# topics:

# - schedule.new

# - location.change

# - type: orchestrator_call # keyword-based Orchestrator activation

# keywords: [keyword1, keyword2]

# confidence: 0.8 # minimum confidence score (default: 0.8)

=== SKIN LAYER ===

UI rendering configuration.

skin:

sizes: [mini, standard] # mini | standard | expanded (at least one)

theme_aware: true # adapt to dark/light system theme

composable_entry: MyDashSkin # root @Composable function name (PascalCase)

default_size: standard # initial placement size

# Optional aspect ratio hints (W:H in grid units)

# aspect_ratio:

# mini: "2:1"

# standard: "2:2"

# expanded: "4:3"

=== SKILL LAYER ===

Business logic and sandboxing constraints.

skill:

entry: MyDashSkill # DashSkill implementation class name (PascalCase)

permissions: [] # network|location_coarse|location_fine|contacts|calendar|

# camera|microphone|storage_read|storage_write|notifications|

# phone_state|sms|bluetooth|nfc|biometric|health

local_state: false # true = uses Room DB for persistent state

allowed_apis: [] # weather_api|location_service|calendar_service|contacts_service|

# notification_service|audio_service|sensor_service|

# network_service|storage_service|camera_service|

# media_service|health_service|payment_service|

# nfc_service|bluetooth_service|claude_api

# Optional resource quotas (Orchestrator enforces these)

# quota:

# memory_mb: 32 # default 32 MB

# network_kb_per_min: 512 # default 512 KB/min (0 = offline-only)

# cpu_percent: 10 # default 10%

=== PROTOCOL LAYER ===

Inter-Dash communication and Fusion compatibility.

protocol:

publish: [] # topics this Dash publishes

# - topic: my.topic.name # dot-separated namespace (lowercase)

# schema: MyData.v1 # schema name from shared registry

subscribe: [] # topics this Dash subscribes to

# - topic: other.topic.name

# schema: OtherData.v1

fusible_with: [] # category IDs or Dash IDs this can Fuse with

imports: [] # schema files from shared registry

# - schemas/MyData.v1.json


My Dash — 실행 지식 (Execution Knowledge)

동작 규칙 (Behavior Rules)

  • 기본 상태: [default behavior description]
  • [trigger] 수신 시: [response behavior]
  • 사용자 탭 시: [tap behavior]
  • API 연동 (API Integration)

  • 사용 API: [API name or endpoint]
  • 캐시 정책: [refresh interval]
  • 오프라인 폴백: [fallback behavior]
  • 데이터 스키마 (Data Schemas)

    // [topic name] message schema
    

    {

    "field": "type"

    }

    접근성 (Accessibility)

  • TalkBack: [content description]
  • 터치 타겟: 최소 48dp
  • 모션 감소 모드: [alternative behavior]