{
  "meta": {
    "name": "Skydio defense UI model",
    "version": "0.1.0",
    "source": "Outside reading of public skydio.com marketing screenshots (ISR Command, Security Command / Flight Deck, Base Security, Border Security, X10D controller), pulled 2026-11-09. Not Skydio's internal model; colors are approximations.",
    "layers": ["tokens", "ontology", "components", "principles"]
  },

  "tokens": {
    "surface": { "s0": "#0F0F10", "s1": "#171718", "s2": "#1F2021", "s3": "#2A2B2D", "s4": "#36383A" },
    "text": { "primary": "#F2F2F2", "secondary": "#A3A3A3" },
    "signal": {
      "action-blue": { "value": "#1A6CF0", "means": ["own aircraft", "primary action", "selected mode", "flown route"] },
      "alert-red":   { "value": "#DF2A2F", "means": ["stop / pause / return", "live", "hostile", "requires attention", "airspace limit"] },
      "ok-green":    { "value": "#2A9A4A", "means": ["active", "ready for flight", "detector on", "battery healthy"] },
      "reticle":     { "value": "#1FE3A2", "means": ["AI lock on subject", "active tool indicator"] },
      "focus-amber": { "value": "#F5B400", "means": ["operator focus / selected entity", "tracked subject", "zoom level", "ETA / info toast"] },
      "poi-purple":  { "value": "#9A5CF0", "means": ["operator-dropped point of interest"] }
    },
    "affiliation_2525": { "hostile": "#FF8080", "friend": "#80E0FF", "unknown": "#FFFF80", "neutral": "#AAFFAA" },
    "type": {
      "ui":    { "family": "Inter-like grotesk", "use": "names and labels people wrote, sentence case" },
      "hud":   { "family": "monospace", "use": "telemetry values with units" },
      "tak":   { "family": "monospace, uppercase, tracked", "use": "anything shown in or sent to TAK" },
      "system_caps": { "use": "system-authored titles: alert types, work orders" }
    },
    "radius": { "control": "2-4px", "max": "4px" },
    "touch_target": { "desktop": "28px", "controller": "44px" }
  },

  "contexts": {
    "surfaces": ["desktop", "controller"],
    "panes": {
      "desktop": ["nav", "list", "map", "feeds"],
      "controller": ["left-rail", "video", "right-rail", "bottom-bar", "flyout"]
    },
    "dialects": ["skydio", "tak"],
    "tasks": ["monitor", "triage", "respond", "track", "plan", "review"]
  },

  "entities": [
    { "id": "Organization", "lane": "place",
      "meaning": "The customer program you are working inside. It sets who can see what.",
      "attributes": ["name", "logo", "deployment"],
      "states": [],
      "render": { "nav": "NavRail.footer" } },

    { "id": "Site", "lane": "place",
      "meaning": "A physical place you are responsible for; the top-level grouping for patrols and docks.",
      "attributes": ["name", "boundary", "docks"],
      "states": [],
      "render": { "list": "Collapsible.header", "map": "extent" } },

    { "id": "Sector", "lane": "place", "aliases": ["Zone", "Area"],
      "meaning": "A piece of a site with its own owner and patrol cadence; incidents report where they are by sector.",
      "attributes": ["name", "polygon", "site"],
      "states": ["normal", "alerting"],
      "render": { "map": "Polygon", "list": "MissionItem.sector", "detail": "IncidentDetail.area" } },

    { "id": "AirspaceLimit", "lane": "place", "aliases": ["TFR", "Geofence"],
      "meaning": "A place you may not fly, or may fly only under conditions. It overrides plans.",
      "attributes": ["polygon", "altitude_cap", "window"],
      "states": ["inactive", "active"],
      "render": { "map": "Polygon.hatched.red", "list": "Badge.tfr" } },

    { "id": "Dock", "lane": "assets",
      "meaning": "A fixed home that launches, recovers and charges an aircraft with no one on site.",
      "attributes": ["name", "site", "aircraft", "weather"],
      "states": ["ready", "launching", "empty", "offline"],
      "render": { "list": "AssetItem", "map": "DockMarker", "alert": "LaunchCard" } },

    { "id": "Aircraft", "lane": "assets",
      "meaning": "The drone. The one entity that moves, so most of the screen is about where it is, how healthy it is and what it sees.",
      "attributes": ["callsign", "battery_pct", "hal_ft", "agl_ft", "speed_mph", "heading_deg", "link", "nav_sources", "flight_time_left"],
      "states": ["ready", "launching", "flying", "holding", "returning", "relieved"],
      "render": { "map": "DroneMarker", "feeds": "FeedTile", "hud_desktop": "HUD.compact", "hud_controller": "HUD.full", "list": "AssetItem", "tak": "ReliefLink + PipCard" },
      "required_controls_when": { "state": ["launching", "flying", "holding"], "controls": ["Stop", "ReturnToHome"] } },

    { "id": "Sensor", "lane": "assets", "aliases": ["Payload", "Camera", "Attachment"],
      "meaning": "What the aircraft can sense or do. Choosing a sensor or attachment changes what you can learn and how you can intervene.",
      "attributes": ["type", "mode", "palette", "zoom", "recording"],
      "states": ["off", "on", "recording"],
      "render": { "feeds": "CamStack", "controller": "CaptureRail + ThermalMenu", "attachments": "AttachmentBar" } },

    { "id": "Operator", "lane": "people", "aliases": ["Pilot", "Responder"],
      "meaning": "The person accountable. Rank and name appear because accountability is personal.",
      "attributes": ["name", "rank", "role", "assigned_aircraft"],
      "states": ["available", "piloting", "responding"],
      "render": { "list": "Initials", "feeds": "FeedTile.pilot", "detail": "IncidentDetail.claimedBy" } },

    { "id": "WorkOrder", "lane": "tasking",
      "meaning": "The formal request that authorizes a mission, in the unit's own vocabulary.",
      "attributes": ["id", "requester", "sector"],
      "states": ["open", "scheduled", "done"],
      "render": { "list": "MissionItem.titlePrefix" } },

    { "id": "Mission", "lane": "tasking", "subtypes": ["patrol", "response", "overwatch", "relief"],
      "meaning": "A unit of planned work for an aircraft. Patrol is recurring; response is incident-triggered; overwatch holds on a subject; relief swaps aircraft without losing coverage.",
      "attributes": ["type", "aircraft", "route", "cadence", "start_time"],
      "states": ["scheduled", "upcoming", "active", "paused", "done"],
      "overlay_states": ["needs_attention"],
      "render": { "list": "PatrolCard | OperationItem | MissionItem", "controller": "ReliefBar (relief)", "tak": "IsrToast (relief)" } },

    { "id": "Route", "lane": "tasking",
      "meaning": "The path a mission flies; its shape is how operators recognize a mission at a glance.",
      "attributes": ["polyline", "waypoints", "altitude"],
      "states": ["planned", "in_progress"],
      "render": { "map": "Polyline (flown=action-blue, ahead=white)", "list": "MissionItem.thumbnail" } },

    { "id": "Waypoint", "lane": "tasking",
      "meaning": "An ordered checkpoint; 'Next: East Building' tells you where the aircraft is headed.",
      "attributes": ["index", "position", "action"],
      "states": ["pending", "reached"],
      "render": { "map": "RouteMarker", "list": "PatrolCard.next" } },

    { "id": "Integration", "lane": "triggers",
      "meaning": "Another system Skydio listens to or talks to (IDS, VMS, CAD, counter-UAS, TAK). Tells you whether to trust a signal.",
      "attributes": ["vendor", "type", "direction"],
      "states": ["connected", "degraded"],
      "render": { "alert": "IncidentCard.sourceLabel" } },

    { "id": "SensorAlert", "lane": "triggers",
      "meaning": "A single signal from an integration. On its own it is evidence, not yet a decision.",
      "attributes": ["sensor", "type", "time", "position"],
      "states": ["new", "grouped"],
      "render": { "alert": "IncidentCard.sensorRow" } },

    { "id": "Incident", "lane": "triggers",
      "meaning": "One or more alerts treated as one situation that needs a person. This is where accountability attaches.",
      "attributes": ["id", "title", "area", "coordinates", "claimed_by", "response_status"],
      "states": ["new", "claimed", "responding", "resolved"],
      "render": { "list": "IncidentCard", "detail": "IncidentDetail", "map": "EventMarker.alert" },
      "required_fields": ["source", "age", "claimed_by", "close_action"] },

    { "id": "Stream", "lane": "perception",
      "meaning": "The live or recorded view from a sensor. The primary evidence, and shareable outside the operations center.",
      "attributes": ["aircraft", "sensor", "live", "share_link", "share_expiry"],
      "states": ["live", "recording", "shared", "ended"],
      "render": { "feeds": "FeedTile + LiveTag", "share": "StreamShare" } },

    { "id": "Detection", "lane": "perception",
      "meaning": "Something the onboard AI found. Cheap and frequent, so the UI counts detections more than it announces them.",
      "attributes": ["class", "confidence", "box", "time"],
      "states": ["seen", "dismissed", "promoted"],
      "render": { "feeds": "Reticle", "list": "PatrolCard.counts", "map": "EventMarker.class" } },

    { "id": "Subject", "lane": "perception", "aliases": ["Track", "Target"],
      "meaning": "A detection a person decided matters. It gets followed, labeled and handed off between aircraft.",
      "attributes": ["class", "affiliation", "track_mode", "owner_aircraft"],
      "states": ["tracking", "lost", "handed_off"],
      "render": { "feeds": "BoundingBox", "controller": "Flyout.shadow" } },

    { "id": "Marker", "lane": "perception", "aliases": ["CoT", "POI"],
      "meaning": "A point shared with the whole force over TAK; it becomes part of everyone's common picture.",
      "attributes": ["affiliation", "mgrs", "author"],
      "states": ["local", "published", "stale"],
      "render": { "map": "CoTMarker", "tak": "CoTMarker + GridReadout" },
      "dialect": "tak" }
  ],

  "relationships": [
    { "from": "Organization", "verb": "operates",      "to": "Site",        "card": "1:n" },
    { "from": "Site",         "verb": "divides into",  "to": "Sector",      "card": "1:n" },
    { "from": "AirspaceLimit","verb": "constrains",    "to": "Sector",      "card": "n:n", "note": "Constraint wins over plan; surfaced as Mission overlay state." },
    { "from": "Site",         "verb": "hosts",         "to": "Dock",        "card": "1:n" },
    { "from": "Dock",         "verb": "houses",        "to": "Aircraft",    "card": "1:1" },
    { "from": "Aircraft",     "verb": "carries",       "to": "Sensor",      "card": "1:n" },
    { "from": "Operator",     "verb": "pilots",        "to": "Aircraft",    "card": "1:n", "note": "One operator supervises many aircraft." },
    { "from": "WorkOrder",    "verb": "tasks",         "to": "Mission",     "card": "1:n" },
    { "from": "Mission",      "verb": "assigned to",   "to": "Aircraft",    "card": "n:1", "note": "One active mission per aircraft." },
    { "from": "Mission",      "verb": "follows",       "to": "Route",       "card": "n:1" },
    { "from": "Route",        "verb": "made of",       "to": "Waypoint",    "card": "1:n", "ordered": true },
    { "from": "Integration",  "verb": "emits",         "to": "SensorAlert", "card": "1:n" },
    { "from": "SensorAlert",  "verb": "opens",         "to": "Incident",    "card": "n:1" },
    { "from": "Incident",     "verb": "dispatches",    "to": "Mission",     "card": "1:n", "subtype": "response" },
    { "from": "Operator",     "verb": "claims",        "to": "Incident",    "card": "1:n" },
    { "from": "Sensor",       "verb": "produces",      "to": "Stream",      "card": "1:n" },
    { "from": "Stream",       "verb": "analyzed to",   "to": "Detection",   "card": "1:n" },
    { "from": "Detection",    "verb": "promoted to",   "to": "Subject",     "card": "n:1", "requires": "human decision" },
    { "from": "Subject",      "verb": "shared as",     "to": "Marker",      "card": "1:1" },
    { "from": "Marker",       "verb": "publishes to",  "to": "TAK",         "card": "n:1", "dialect_switch": "tak" }
  ],

  "state_machines": {
    "Aircraft": { "flow": ["ready", "launching", "flying", "relieved", "returning", "ready"], "interrupts": { "any_airborne": "holding (via Stop)" } },
    "Mission":  { "flow": ["scheduled", "upcoming", "active", "done"], "overlay": "needs_attention (airspace limit, failed checkpoint)" },
    "Incident": { "flow": ["new", "claimed", "responding", "resolved"], "guard": "resolved requires claimed_by" },
    "Perception": { "flow": ["Detection", "Subject", "Marker", "published"], "note": "Each step needs more human judgment and reaches more people." }
  },

  "principles": [
    { "id": "P01", "name": "Color is a signal, never decoration", "level": "hard",
      "must": ["Choose every non-neutral color from tokens.signal by meaning"],
      "never": ["Use signal colors for decoration, branding, charts or empty states"],
      "check": "Every colored element maps to an entity state." },
    { "id": "P02", "name": "Red is reserved for stop, hostile, and live", "level": "hard",
      "must": ["Render filled-red Stop or ReturnToHome in every container showing an airborne aircraft"],
      "never": ["Filled red for admin-destructive actions"],
      "check": "redCount(aircraftContainer) >= 1; unmappedRed == 0" },
    { "id": "P03", "name": "One entity, one identity, every pane", "level": "hard",
      "must": ["Bind selection to entity id; apply focus-amber to every rendering of that id", "One focused entity per operator"],
      "check": "All renderings of focused id carry focus treatment." },
    { "id": "P04", "name": "Layout follows the response loop", "level": "hard",
      "must": ["Desktop pane order nav → list → map → feeds", "Fleet commands under the map; per-aircraft commands inside the feed"],
      "never": ["Multi-aircraft commands inside a single aircraft container"] },
    { "id": "P05", "name": "Lead with state", "level": "hard",
      "must": ["State is the first readable element of every entity card", "Time-bound states show time (start, elapsed or ETA)"],
      "check": "No entity card without a state badge or label." },
    { "id": "P06", "name": "Machine data looks like machine data", "level": "hard",
      "must": ["Telemetry in mono with units", "System-authored titles in caps"],
      "never": ["Measurement without unit", "Coordinate without format"] },
    { "id": "P07", "name": "Speak the destination's dialect", "level": "hard",
      "must": ["Entities shared over CoT use standard 2525 shape and fill", "dialect=tak switches type to tak voice and location to MGRS"],
      "never": ["Restyle or recolor affiliation symbols"] },
    { "id": "P08", "name": "Density changes by device; vocabulary doesn't", "level": "hard",
      "must": ["Controller tools on screen edges, targets >= 44px, video center clear", "One shared abbreviation dictionary"],
      "never": ["Same function under different names on different surfaces"] },
    { "id": "P09", "name": "Overlays carry their own contrast", "level": "soft",
      "must": ["Map symbols have >= 2px white or black stroke", "Text over imagery sits on a scrim >= 55% opacity"],
      "never": ["Rely on fill alone over imagery"] },
    { "id": "P10", "name": "Every alert has a source, an owner, a clock and an end", "level": "hard",
      "must": ["Incident shows source, age, claimed_by, close action", "Response status is the first editable field"],
      "check": "Incident never renders without claimed_by or 'unclaimed'." },
    { "id": "P11", "name": "Cards share a three-row grammar", "level": "soft",
      "must": ["Row 1 identity + state; row 2 where + next; row 3 who + health + counts", "State badge top-right, actions in a fixed position"] },
    { "id": "P12", "name": "Quiet surfaces, sharp edges", "level": "soft",
      "must": ["Nest surfaces one step lighter per level"],
      "never": ["Radius > 4px on controls", "Shadows on in-pane cards", "Pill-shaped status badges"] }
  ],

  "abbreviations": {
    "HAL": "height above launch", "AGL": "above ground level", "VIO": "visual-inertial odometry (GPS-free navigation)",
    "GPS": "satellite navigation", "MH": "mesh radio link", "FUS": "fused link status", "NAV": "navigation status",
    "MGRS": "Military Grid Reference System", "CoT": "Cursor on Target", "TAK": "Team Awareness Kit",
    "TFR": "temporary flight restriction", "RTH": "return to home", "FFC": "flat-field correction", "IDS": "intrusion detection system",
    "WO": "work order", "ISR": "intelligence, surveillance and reconnaissance"
  }
}
